refactor(lms): lms decoding delimiter is fully optional now
This commit is contained in:
parent
b99629b97d
commit
d174f39530
@ -125,10 +125,10 @@ ldap:
|
|||||||
|
|
||||||
ldap-re-test-failover: 60
|
ldap-re-test-failover: 60
|
||||||
|
|
||||||
lms:
|
lms-direct:
|
||||||
upload-headedness: "_env:LMSUPLOADHEADEDNESS:true"
|
upload-header: "_env:LMSUPLOADHEADER:true"
|
||||||
upload-delimiter: "_env:LMSUPLOADDELIMITER:,"
|
upload-delimiter: "_env:LMSUPLOADDELIMITER:"
|
||||||
download-headedness: "_env:LMSDOWNLOADHEADEDNESS:true"
|
download-header: "_env:LMSDOWNLOADHEADER:true"
|
||||||
download-delimiter: "_env:LMSDOWNLOADDELIMITER:,"
|
download-delimiter: "_env:LMSDOWNLOADDELIMITER:,"
|
||||||
download-cr-lf: "_env:LMSDOWNLOADCRLF:true"
|
download-cr-lf: "_env:LMSDOWNLOADCRLF:true"
|
||||||
|
|
||||||
|
|||||||
@ -262,15 +262,11 @@ postLmsResultDirectR sid qsh = do
|
|||||||
(_params, files) <- runRequestBody
|
(_params, files) <- runRequestBody
|
||||||
(status, msg) <- case files of
|
(status, msg) <- case files of
|
||||||
[(fhead,file)] -> do
|
[(fhead,file)] -> do
|
||||||
LmsConf{..} <- getsYesod $ view _appLmsConf
|
lmsDecoder <- getLmsCsvDecoder
|
||||||
let fmtOpts = def { csvDelimiter = lmsUploadDelimiter
|
|
||||||
, csvIncludeHeader = lmsUploadHeadedness
|
|
||||||
}
|
|
||||||
csvOpts = def { csvFormat = fmtOpts }
|
|
||||||
runDBJobs $ do
|
runDBJobs $ do
|
||||||
qid <- getKeyBy404 $ SchoolQualificationShort sid qsh
|
qid <- getKeyBy404 $ SchoolQualificationShort sid qsh
|
||||||
enr <- try $ runConduit $ fileSource file
|
enr <- try $ runConduit $ fileSource file
|
||||||
.| decodeCsvWith csvOpts
|
.| lmsDecoder
|
||||||
.| foldMC (saveResultCsv qid) 0
|
.| foldMC (saveResultCsv qid) 0
|
||||||
case enr of
|
case enr of
|
||||||
Left (e :: SomeException) -> do -- catch all to avoid ok220 in case of any error
|
Left (e :: SomeException) -> do -- catch all to avoid ok220 in case of any error
|
||||||
|
|||||||
@ -258,15 +258,11 @@ postLmsUserlistDirectR sid qsh = do
|
|||||||
(_params, files) <- runRequestBody
|
(_params, files) <- runRequestBody
|
||||||
(status, msg) <- case files of
|
(status, msg) <- case files of
|
||||||
[(fhead,file)] -> do
|
[(fhead,file)] -> do
|
||||||
LmsConf{..} <- getsYesod $ view _appLmsConf
|
lmsDecoder <- getLmsCsvDecoder
|
||||||
let fmtOpts = def { csvDelimiter = lmsUploadDelimiter
|
|
||||||
, csvIncludeHeader = lmsUploadHeadedness
|
|
||||||
}
|
|
||||||
csvOpts = def { csvFormat = fmtOpts }
|
|
||||||
runDBJobs $ do
|
runDBJobs $ do
|
||||||
qid <- getKeyBy404 $ SchoolQualificationShort sid qsh
|
qid <- getKeyBy404 $ SchoolQualificationShort sid qsh
|
||||||
enr <- try $ runConduit $ fileSource file
|
enr <- try $ runConduit $ fileSource file
|
||||||
.| decodeCsvWith csvOpts
|
.| lmsDecoder
|
||||||
.| foldMC (saveUserlistCsv qid) 0
|
.| foldMC (saveUserlistCsv qid) 0
|
||||||
case enr of
|
case enr of
|
||||||
Left (e :: SomeException) -> do
|
Left (e :: SomeException) -> do
|
||||||
@ -286,4 +282,3 @@ postLmsUserlistDirectR sid qsh = do
|
|||||||
$logWarnS "LMS" msg
|
$logWarnS "LMS" msg
|
||||||
return (badRequest400, msg)
|
return (badRequest400, msg)
|
||||||
sendResponseStatus status msg
|
sendResponseStatus status msg
|
||||||
|
|
||||||
@ -170,9 +170,9 @@ getLmsUsersDirectR sid qsh = do
|
|||||||
--csvRenderedHeader = lmsUserTableCsvHeader
|
--csvRenderedHeader = lmsUserTableCsvHeader
|
||||||
--cvsRendered = CsvRendered {..}
|
--cvsRendered = CsvRendered {..}
|
||||||
csvRendered = toCsvRendered lmsUserTableCsvHeader $ lmsUser2csv . entityVal <$> lms_users
|
csvRendered = toCsvRendered lmsUserTableCsvHeader $ lmsUser2csv . entityVal <$> lms_users
|
||||||
fmtOpts = def { csvDelimiter = lmsDownloadDelimiter
|
fmtOpts = def { csvIncludeHeader = lmsDownloadHeader
|
||||||
|
, csvDelimiter = lmsDownloadDelimiter
|
||||||
, csvUseCrLf = lmsDownloadCrLf
|
, csvUseCrLf = lmsDownloadCrLf
|
||||||
, csvIncludeHeader = lmsDownloadHeadedness
|
|
||||||
}
|
}
|
||||||
csvOpts = def { csvFormat = fmtOpts }
|
csvOpts = def { csvFormat = fmtOpts }
|
||||||
csvSheetName <- csvFilenameLmsUser qsh
|
csvSheetName <- csvFilenameLmsUser qsh
|
||||||
|
|||||||
@ -1,7 +1,8 @@
|
|||||||
{-# OPTIONS -Wno-redundant-constraints #-} -- needed for Getter
|
{-# OPTIONS -Wno-redundant-constraints #-} -- needed for Getter
|
||||||
|
|
||||||
module Handler.Utils.LMS
|
module Handler.Utils.LMS
|
||||||
( csvLmsIdent
|
( getLmsCsvDecoder
|
||||||
|
, csvLmsIdent
|
||||||
, csvLmsTimestamp
|
, csvLmsTimestamp
|
||||||
, csvLmsBlocked
|
, csvLmsBlocked
|
||||||
, csvLmsSuccess
|
, csvLmsSuccess
|
||||||
@ -21,11 +22,27 @@ module Handler.Utils.LMS
|
|||||||
|
|
||||||
import Import
|
import Import
|
||||||
import Handler.Utils
|
import Handler.Utils
|
||||||
|
import Handler.Utils.Csv
|
||||||
|
import Data.Csv (HasHeader(..), FromRecord)
|
||||||
|
|
||||||
import qualified Database.Esqueleto.Legacy as E
|
import qualified Database.Esqueleto.Legacy as E
|
||||||
|
|
||||||
import Control.Monad.Random.Class (uniform)
|
import Control.Monad.Random.Class (uniform)
|
||||||
import Control.Monad.Trans.Random (evalRandTIO)
|
import Control.Monad.Trans.Random (evalRandTIO)
|
||||||
|
|
||||||
|
|
||||||
|
getLmsCsvDecoder :: (MonadHandler m, HandlerSite m ~ UniWorX, MonadThrow m, FromNamedRecord csv, FromRecord csv) => Handler (ConduitT ByteString csv m ())
|
||||||
|
getLmsCsvDecoder = do
|
||||||
|
LmsConf{..} <- getsYesod $ view _appLmsConf
|
||||||
|
if | Just upDelim <- lmsUploadDelimiter -> do
|
||||||
|
let fmtOpts = def { csvDelimiter = upDelim
|
||||||
|
, csvIncludeHeader = lmsUploadHeader
|
||||||
|
}
|
||||||
|
csvOpts = def { csvFormat = fmtOpts }
|
||||||
|
return $ decodeCsvWith csvOpts
|
||||||
|
| lmsUploadHeader -> return decodeCsv
|
||||||
|
| otherwise -> return $ decodeCsvPositional NoHeader
|
||||||
|
|
||||||
-- generic Column names
|
-- generic Column names
|
||||||
csvLmsIdent :: IsString a => a
|
csvLmsIdent :: IsString a => a
|
||||||
csvLmsIdent = fromString "user" -- "Benutzerkennung"
|
csvLmsIdent = fromString "user" -- "Benutzerkennung"
|
||||||
@ -121,4 +138,3 @@ randomLMSpw :: MonadIO m => m Text
|
|||||||
randomLMSpw = randomText extra lengthPassword
|
randomLMSpw = randomText extra lengthPassword
|
||||||
where
|
where
|
||||||
extra = "_-+*.:;=!?#"
|
extra = "_-+*.:;=!?#"
|
||||||
|
|
||||||
@ -304,10 +304,10 @@ data LdapConf = LdapConf
|
|||||||
} deriving (Show)
|
} deriving (Show)
|
||||||
|
|
||||||
data LmsConf = LmsConf
|
data LmsConf = LmsConf
|
||||||
{ lmsUploadDelimiter :: Char
|
{ lmsUploadHeader :: Bool
|
||||||
, lmsUploadHeadedness :: Bool
|
, lmsUploadDelimiter :: Maybe Char
|
||||||
|
, lmsDownloadHeader :: Bool
|
||||||
, lmsDownloadDelimiter :: Char
|
, lmsDownloadDelimiter :: Char
|
||||||
, lmsDownloadHeadedness :: Bool
|
|
||||||
, lmsDownloadCrLf :: Bool
|
, lmsDownloadCrLf :: Bool
|
||||||
} deriving (Show)
|
} deriving (Show)
|
||||||
|
|
||||||
@ -492,11 +492,11 @@ deriveFromJSON
|
|||||||
|
|
||||||
instance FromJSON LmsConf where
|
instance FromJSON LmsConf where
|
||||||
parseJSON = withObject "LmsConf" $ \o -> do
|
parseJSON = withObject "LmsConf" $ \o -> do
|
||||||
lmsUploadDelimiter <- o .: "upload-delimiter"
|
lmsUploadHeader <- o .: "upload-header"
|
||||||
lmsUploadHeadedness <- o .: "upload-headedness"
|
lmsUploadDelimiter <- o .:? "upload-delimiter"
|
||||||
lmsDownloadDelimiter <- o .: "download-delimiter"
|
lmsDownloadHeader <- o .: "download-header"
|
||||||
lmsDownloadHeadedness <- o .: "download-headedness"
|
lmsDownloadDelimiter <- o .: "download-delimiter"
|
||||||
lmsDownloadCrLf <- o .: "download-cr-lf"
|
lmsDownloadCrLf <- o .: "download-cr-lf"
|
||||||
return LmsConf{..}
|
return LmsConf{..}
|
||||||
|
|
||||||
makeLenses_ ''LmsConf
|
makeLenses_ ''LmsConf
|
||||||
@ -597,7 +597,7 @@ instance FromJSON AppSettings where
|
|||||||
Ldap.Tls host _ -> not $ null host
|
Ldap.Tls host _ -> not $ null host
|
||||||
Ldap.Plain host -> not $ null host
|
Ldap.Plain host -> not $ null host
|
||||||
appLdapConf <- P.fromList . mapMaybe (assertM nonEmptyHost) <$> o .:? "ldap" .!= []
|
appLdapConf <- P.fromList . mapMaybe (assertM nonEmptyHost) <$> o .:? "ldap" .!= []
|
||||||
appLmsConf <- o .: "lms"
|
appLmsConf <- o .: "lms-direct"
|
||||||
appAvsConf <- assertM (not . null . avsPass) <$> o .:? "avs"
|
appAvsConf <- assertM (not . null . avsPass) <$> o .:? "avs"
|
||||||
appLprConf <- o .: "lpr"
|
appLprConf <- o .: "lpr"
|
||||||
appSmtpConf <- assertM (not . null . smtpHost) <$> o .:? "smtp"
|
appSmtpConf <- assertM (not . null . smtpHost) <$> o .:? "smtp"
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user