Merge pull request #465 from eikek/language-per-request

Language per request
This commit is contained in:
mergify[bot] 2020-11-23 22:22:51 +00:00 committed by GitHub
commit e314eea42d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 145 additions and 14 deletions

View File

@ -67,7 +67,8 @@ object OUpload {
validFileTypes: Seq[MimeType], validFileTypes: Seq[MimeType],
skipDuplicates: Boolean, skipDuplicates: Boolean,
fileFilter: Glob, fileFilter: Glob,
tags: List[String] tags: List[String],
language: Option[Language]
) )
case class UploadData[F[_]]( case class UploadData[F[_]](
@ -125,11 +126,19 @@ object OUpload {
_ <- checkExistingItem(itemId, account.collective) _ <- checkExistingItem(itemId, account.collective)
files <- right(data.files.traverse(saveFile).map(_.flatten)) files <- right(data.files.traverse(saveFile).map(_.flatten))
_ <- checkFileList(files) _ <- checkFileList(files)
lang <- right(store.transact(RCollective.findLanguage(account.collective))) lang <- data.meta.language match {
case Some(lang) => right(lang.pure[F])
case None =>
right(
store
.transact(RCollective.findLanguage(account.collective))
.map(_.getOrElse(Language.German))
)
}
meta = ProcessItemArgs.ProcessMeta( meta = ProcessItemArgs.ProcessMeta(
account.collective, account.collective,
itemId, itemId,
lang.getOrElse(Language.German), lang,
data.meta.direction, data.meta.direction,
data.meta.sourceAbbrev, data.meta.sourceAbbrev,
data.meta.folderId, data.meta.folderId,

View File

@ -35,7 +35,9 @@ case class ScanMailboxArgs(
// set a list of tags to apply to new item // set a list of tags to apply to new item
tags: Option[List[String]], tags: Option[List[String]],
// a glob filter for the mail subject // a glob filter for the mail subject
subjectFilter: Option[Glob] subjectFilter: Option[Glob],
// the language for extraction and analysis
language: Option[Language]
) )
object ScanMailboxArgs { object ScanMailboxArgs {

View File

@ -277,7 +277,8 @@ object ScanMailboxTask {
Seq.empty, Seq.empty,
true, true,
args.fileFilter.getOrElse(Glob.all), args.fileFilter.getOrElse(Glob.all),
args.tags.getOrElse(Nil) args.tags.getOrElse(Nil),
args.language
) )
data = OUpload.UploadData( data = OUpload.UploadData(
multiple = false, multiple = false,

View File

@ -3826,6 +3826,12 @@ components:
A glob to filter attachments to import by subject. A glob to filter attachments to import by subject.
type: string type: string
format: glob format: glob
language:
description: |
The language used for text extraction and analysis when
processing mails.
type: string
format: language
ImapSettingsList: ImapSettingsList:
description: | description: |
@ -4601,6 +4607,9 @@ components:
The `tags` input allows to provide tags that should be applied The `tags` input allows to provide tags that should be applied
to the item being created. This only works if the tags already to the item being created. This only works if the tags already
exist. It is possible to specify their ids or names. exist. It is possible to specify their ids or names.
The `language` of the document may be specified, otherwise the
one from settings is used.
required: required:
- multiple - multiple
properties: properties:
@ -4621,6 +4630,9 @@ components:
fileFilter: fileFilter:
type: string type: string
format: glob format: glob
language:
type: string
format: language
Collective: Collective:
description: | description: |

View File

@ -326,13 +326,17 @@ trait Conversions {
validFileTypes, validFileTypes,
m.skipDuplicates.getOrElse(false), m.skipDuplicates.getOrElse(false),
m.fileFilter.getOrElse(Glob.all), m.fileFilter.getOrElse(Glob.all),
m.tags.map(_.items).getOrElse(Nil) m.tags.map(_.items).getOrElse(Nil),
m.language
) )
) )
) )
) )
.getOrElse( .getOrElse(
(true, UploadMeta(None, sourceName, None, validFileTypes, false, Glob.all, Nil)) (
true,
UploadMeta(None, sourceName, None, validFileTypes, false, Glob.all, Nil, None)
)
.pure[F] .pure[F]
) )

View File

@ -116,7 +116,8 @@ object ScanMailboxRoutes {
settings.itemFolder, settings.itemFolder,
settings.fileFilter, settings.fileFilter,
settings.tags.map(_.items), settings.tags.map(_.items),
settings.subjectFilter settings.subjectFilter,
settings.language
) )
) )
) )
@ -147,6 +148,7 @@ object ScanMailboxRoutes {
task.args.itemFolder, task.args.itemFolder,
task.args.tags.map(StringList.apply), task.args.tags.map(StringList.apply),
task.args.fileFilter, task.args.fileFilter,
task.args.subjectFilter task.args.subjectFilter,
task.args.language
) )
} }

View File

@ -17,7 +17,6 @@ import File.Select
import Html exposing (..) import Html exposing (..)
import Html.Attributes exposing (..) import Html.Attributes exposing (..)
import Html.Events exposing (..) import Html.Events exposing (..)
import Json.Decode as D
import Util.Html exposing (onDragEnter, onDragLeave, onDragOver, onDropFiles) import Util.Html exposing (onDragEnter, onDragLeave, onDragOver, onDropFiles)
@ -119,9 +118,7 @@ view model =
] ]
[ div [ class "ui icon header" ] [ div [ class "ui icon header" ]
[ i [ class "mouse pointer icon" ] [] [ i [ class "mouse pointer icon" ] []
, div [ class "content" ] , text "Drop files here"
[ text "Drop files here"
]
] ]
, div [ class "ui horizontal divider" ] , div [ class "ui horizontal divider" ]
[ text "Or" [ text "Or"

View File

@ -20,12 +20,14 @@ import Api.Model.Tag exposing (Tag)
import Api.Model.TagList exposing (TagList) import Api.Model.TagList exposing (TagList)
import Comp.CalEventInput import Comp.CalEventInput
import Comp.Dropdown exposing (isDropdownChangeMsg) import Comp.Dropdown exposing (isDropdownChangeMsg)
import Comp.FixedDropdown
import Comp.IntField import Comp.IntField
import Comp.StringListInput import Comp.StringListInput
import Comp.YesNoDimmer import Comp.YesNoDimmer
import Data.CalEvent exposing (CalEvent) import Data.CalEvent exposing (CalEvent)
import Data.Direction exposing (Direction(..)) import Data.Direction exposing (Direction(..))
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.Language exposing (Language)
import Data.UiSettings exposing (UiSettings) import Data.UiSettings exposing (UiSettings)
import Data.Validated exposing (Validated(..)) import Data.Validated exposing (Validated(..))
import Html exposing (..) import Html exposing (..)
@ -64,6 +66,8 @@ type alias Model =
, existingTags : List String , existingTags : List String
, fileFilter : Maybe String , fileFilter : Maybe String
, subjectFilter : Maybe String , subjectFilter : Maybe String
, languageModel : Comp.FixedDropdown.Model Language
, language : Maybe Language
} }
@ -96,6 +100,8 @@ type Msg
| TagDropdownMsg (Comp.Dropdown.Msg Tag) | TagDropdownMsg (Comp.Dropdown.Msg Tag)
| SetFileFilter String | SetFileFilter String
| SetSubjectFilter String | SetSubjectFilter String
| LanguageMsg (Comp.FixedDropdown.Msg Language)
| RemoveLanguage
initWith : Flags -> ScanMailboxSettings -> ( Model, Cmd Msg ) initWith : Flags -> ScanMailboxSettings -> ( Model, Cmd Msg )
@ -138,6 +144,9 @@ initWith flags s =
|> Maybe.withDefault [] |> Maybe.withDefault []
, fileFilter = s.fileFilter , fileFilter = s.fileFilter
, subjectFilter = s.subjectFilter , subjectFilter = s.subjectFilter
, languageModel =
Comp.FixedDropdown.init (List.map mkLanguageItem Data.Language.all)
, language = Maybe.andThen Data.Language.fromString s.language
} }
, Cmd.batch , Cmd.batch
[ Api.getImapSettings flags "" ConnResp [ Api.getImapSettings flags "" ConnResp
@ -188,6 +197,9 @@ init flags =
, existingTags = [] , existingTags = []
, fileFilter = Nothing , fileFilter = Nothing
, subjectFilter = Nothing , subjectFilter = Nothing
, languageModel =
Comp.FixedDropdown.init (List.map mkLanguageItem Data.Language.all)
, language = Nothing
} }
, Cmd.batch , Cmd.batch
[ Api.getImapSettings flags "" ConnResp [ Api.getImapSettings flags "" ConnResp
@ -197,6 +209,11 @@ init flags =
) )
mkLanguageItem : Language -> Comp.FixedDropdown.Item Language
mkLanguageItem lang =
Comp.FixedDropdown.Item lang (Data.Language.toName lang)
--- Update --- Update
@ -242,6 +259,7 @@ makeSettings model =
List.map .id els List.map .id els
|> StringList |> StringList
|> Just |> Just
, language = Maybe.map Data.Language.toIso3 model.language
} }
in in
Data.Validated.map3 make Data.Validated.map3 make
@ -597,6 +615,25 @@ update flags msg model =
, Cmd.none , Cmd.none
) )
LanguageMsg lm ->
let
( dm, sel ) =
Comp.FixedDropdown.update lm model.languageModel
in
( { model
| languageModel = dm
, language = Util.Maybe.or [ sel, model.language ]
}
, NoAction
, Cmd.none
)
RemoveLanguage ->
( { model | language = Nothing }
, NoAction
, Cmd.none
)
--- View --- View
@ -835,6 +872,29 @@ disappear then.
[ text "Choose tags that should be applied to items." [ text "Choose tags that should be applied to items."
] ]
] ]
, div [ class "field" ]
[ label []
[ text "Language"
]
, div [ class "ui action input" ]
[ Html.map LanguageMsg
(Comp.FixedDropdown.viewStyled "fluid"
(Maybe.map mkLanguageItem model.language)
model.languageModel
)
, a
[ class "ui icon button"
, href "#"
, onClick RemoveLanguage
]
[ i [ class "delete icon" ] []
]
]
, div [ class "small-info" ]
[ text "Used for text extraction and text analysis. The "
, text "collective's default language is used, if not specified here."
]
]
, div [ class "ui dividing header" ] , div [ class "ui dividing header" ]
[ text "Schedule" [ text "Schedule"
] ]

View File

@ -9,11 +9,14 @@ module Page.Upload.Data exposing
, isIdle , isIdle
, isLoading , isLoading
, isSuccessAll , isSuccessAll
, mkLanguageItem
, uploadAllTracker , uploadAllTracker
) )
import Api.Model.BasicResult exposing (BasicResult) import Api.Model.BasicResult exposing (BasicResult)
import Comp.Dropzone import Comp.Dropzone
import Comp.FixedDropdown
import Data.Language exposing (Language)
import Dict exposing (Dict) import Dict exposing (Dict)
import File exposing (File) import File exposing (File)
import Http import Http
@ -30,6 +33,8 @@ type alias Model =
, loading : Dict String Int , loading : Dict String Int
, dropzone : Comp.Dropzone.Model , dropzone : Comp.Dropzone.Model
, skipDuplicates : Bool , skipDuplicates : Bool
, languageModel : Comp.FixedDropdown.Model Language
, language : Maybe Language
} }
@ -49,6 +54,11 @@ dropzoneSettings =
} }
mkLanguageItem : Language -> Comp.FixedDropdown.Item Language
mkLanguageItem lang =
Comp.FixedDropdown.Item lang (Data.Language.toName lang)
emptyModel : Model emptyModel : Model
emptyModel = emptyModel =
{ incoming = True { incoming = True
@ -59,6 +69,10 @@ emptyModel =
, loading = Dict.empty , loading = Dict.empty
, dropzone = Comp.Dropzone.init dropzoneSettings , dropzone = Comp.Dropzone.init dropzoneSettings
, skipDuplicates = True , skipDuplicates = True
, languageModel =
Comp.FixedDropdown.init
(List.map mkLanguageItem Data.Language.all)
, language = Nothing
} }
@ -71,6 +85,7 @@ type Msg
| Clear | Clear
| DropzoneMsg Comp.Dropzone.Msg | DropzoneMsg Comp.Dropzone.Msg
| ToggleSkipDuplicates | ToggleSkipDuplicates
| LanguageMsg (Comp.FixedDropdown.Msg Language)
isLoading : Model -> File -> Bool isLoading : Model -> File -> Bool

View File

@ -3,13 +3,15 @@ module Page.Upload.Update exposing (update)
import Api import Api
import Api.Model.ItemUploadMeta import Api.Model.ItemUploadMeta
import Comp.Dropzone import Comp.Dropzone
import Comp.FixedDropdown
import Data.Flags exposing (Flags) import Data.Flags exposing (Flags)
import Data.Language
import Dict import Dict
import Http import Http
import Page.Upload.Data exposing (..) import Page.Upload.Data exposing (..)
import Ports
import Set exposing (Set) import Set exposing (Set)
import Util.File exposing (makeFileId) import Util.File exposing (makeFileId)
import Util.Maybe
update : Maybe String -> Flags -> Msg -> Model -> ( Model, Cmd Msg, Sub Msg ) update : Maybe String -> Flags -> Msg -> Model -> ( Model, Cmd Msg, Sub Msg )
@ -39,6 +41,7 @@ update sourceId flags msg model =
else else
Just "outgoing" Just "outgoing"
, language = Maybe.map Data.Language.toIso3 model.language
} }
fileids = fileids =
@ -151,6 +154,19 @@ update sourceId flags msg model =
in in
( { model | files = nextFiles, dropzone = m2 }, Cmd.map DropzoneMsg c2, Sub.none ) ( { model | files = nextFiles, dropzone = m2 }, Cmd.map DropzoneMsg c2, Sub.none )
LanguageMsg lm ->
let
( dm, sel ) =
Comp.FixedDropdown.update lm model.languageModel
in
( { model
| languageModel = dm
, language = Util.Maybe.or [ sel, model.language ]
}
, Cmd.none
, Sub.none
)
setCompleted : Model -> String -> Set String setCompleted : Model -> String -> Set String
setCompleted model fileid = setCompleted model fileid =

View File

@ -1,6 +1,7 @@
module Page.Upload.View exposing (view) module Page.Upload.View exposing (view)
import Comp.Dropzone import Comp.Dropzone
import Comp.FixedDropdown
import Comp.Progress import Comp.Progress
import Dict import Dict
import File exposing (File) import File exposing (File)
@ -219,5 +220,17 @@ renderForm model =
, label [] [ text "Skip files already present in docspell" ] , label [] [ text "Skip files already present in docspell" ]
] ]
] ]
, div [ class "inline field" ]
[ label [] [ text "Language:" ]
, Html.map LanguageMsg
(Comp.FixedDropdown.view
(Maybe.map mkLanguageItem model.language)
model.languageModel
)
, div [ class "small-info" ]
[ text "Used for text extraction and analysis. The collective's "
, text "default language is used if not specified here."
]
]
] ]
] ]