chore(lms): lms userlist handler should be working now
This commit is contained in:
parent
902bb71a22
commit
0a43acbfad
@ -5,5 +5,8 @@ TableLmsReceived: Erhalten
|
|||||||
CsvColumnLmsIdent: E-Lernen Identifikator, einzigartig pro Qualifikation und Teilnehmer
|
CsvColumnLmsIdent: E-Lernen Identifikator, einzigartig pro Qualifikation und Teilnehmer
|
||||||
CsvColumnLmsSuccess: Zeitstempel der erfolgreichen Teilnahme
|
CsvColumnLmsSuccess: Zeitstempel der erfolgreichen Teilnahme
|
||||||
CsvColumnLmsFailed: User was blocked by LMS, usually due to too many attempts
|
CsvColumnLmsFailed: User was blocked by LMS, usually due to too many attempts
|
||||||
|
LmsUserlistInsert: Neuer LMS User
|
||||||
|
LmsUserlistUpdate: Aktualisierung von LMS User
|
||||||
LmsResultInsert: Neues LMS Ergebnis
|
LmsResultInsert: Neues LMS Ergebnis
|
||||||
LmsResultCsvExceptionDuplicatedKey: CSV Import fand uneindeutigen Schlüssel
|
LmsResultCsvExceptionDuplicatedKey: CSV Import fand uneindeutigen Schlüssel
|
||||||
|
LmsUserlistCsvExceptionDuplicatedKey: CSV Import fand uneindeutigen Schlüssel
|
||||||
@ -5,5 +5,8 @@ TableLmsReceived: Received
|
|||||||
CsvColumnLmsIdent: E-Learing identifier, unique for each qualfication and user
|
CsvColumnLmsIdent: E-Learing identifier, unique for each qualfication and user
|
||||||
CsvColumnLmsSuccess: Timestamp of successful completion
|
CsvColumnLmsSuccess: Timestamp of successful completion
|
||||||
CsvColumnLmsFailed: Blockier durch LMS, üblicherweise wegen zu vieler Fehlversuche
|
CsvColumnLmsFailed: Blockier durch LMS, üblicherweise wegen zu vieler Fehlversuche
|
||||||
|
LmsUserlistInsert: New LMS User
|
||||||
|
LmsUserlistUpdate: Update of LMS User
|
||||||
LmsResultInsert: New LMS result
|
LmsResultInsert: New LMS result
|
||||||
LmsResultCsvExceptionDuplicatedKey: CSV import with ambiguous key
|
LmsResultCsvExceptionDuplicatedKey: CSV import with ambiguous key
|
||||||
|
LmsUserlistCsvExceptionDuplicatedKey: CSV import with ambiguous key
|
||||||
@ -107,6 +107,7 @@ LmsUserlist
|
|||||||
ident LmsIdent
|
ident LmsIdent
|
||||||
failed Bool
|
failed Bool
|
||||||
timestamp UTCTime default=now()
|
timestamp UTCTime default=now()
|
||||||
|
UniqueLmsUserlist qualification ident
|
||||||
deriving Generic
|
deriving Generic
|
||||||
|
|
||||||
-- LmsResult stores LMS upload for later processing only
|
-- LmsResult stores LMS upload for later processing only
|
||||||
|
|||||||
@ -112,7 +112,7 @@ deriveJSON defaultOptions
|
|||||||
} ''LmsResultCsvAction
|
} ''LmsResultCsvAction
|
||||||
|
|
||||||
data LmsResultCsvException
|
data LmsResultCsvException
|
||||||
= LmsResultCsvExceptionDuplicatedKey
|
= LmsResultCsvExceptionDuplicatedKey -- TODO: this is not used anywhere?!
|
||||||
deriving (Show, Generic, Typeable)
|
deriving (Show, Generic, Typeable)
|
||||||
|
|
||||||
instance Exception LmsResultCsvException
|
instance Exception LmsResultCsvException
|
||||||
@ -185,9 +185,9 @@ mkResultTable sid qsh qid = do
|
|||||||
{ lmsResultInsertIdent = csvLRTident dbCsvNew
|
{ lmsResultInsertIdent = csvLRTident dbCsvNew
|
||||||
, lmsResultInsertSuccess = csvLRTsuccess dbCsvNew
|
, lmsResultInsertSuccess = csvLRTsuccess dbCsvNew
|
||||||
}
|
}
|
||||||
DBCsvDiffNew{dbCsvNewKey = Just _, dbCsvNew = _} -> error "UniqueLmsResult was found, but the key no longer exists."
|
DBCsvDiffNew{dbCsvNewKey = Just _, dbCsvNew = _} -> error "UniqueLmsResult was found, but the key no longer exists." -- TODO: how can this ever happen? Check Pagination-Code
|
||||||
DBCsvDiffMissing{} -> return () -- no deletion
|
DBCsvDiffMissing{} -> return () -- no deletion
|
||||||
DBCsvDiffExisting{} -> return () -- no merge
|
DBCsvDiffExisting{} -> return () -- no merge TODO!!! ADD MERGE DUE TO Uniqueness!
|
||||||
, dbtCsvClassifyAction = \LmsResultInsertData{} -> LmsResultInsert
|
, dbtCsvClassifyAction = \LmsResultInsertData{} -> LmsResultInsert
|
||||||
, dbtCsvCoarsenActionClass = \LmsResultInsert -> DBCsvActionNew -- there is only one action: insert into table
|
, dbtCsvCoarsenActionClass = \LmsResultInsert -> DBCsvActionNew -- there is only one action: insert into table
|
||||||
, dbtCsvValidateActions = return () -- no validation, since this is an automatic upload, i.e. no user to review error
|
, dbtCsvValidateActions = return () -- no validation, since this is an automatic upload, i.e. no user to review error
|
||||||
@ -207,7 +207,7 @@ mkResultTable sid qsh qid = do
|
|||||||
-- queueDBJob?? -- todo
|
-- queueDBJob?? -- todo
|
||||||
-- audit
|
-- audit
|
||||||
return $ LmsResultR sid qsh
|
return $ LmsResultR sid qsh
|
||||||
, dbtCsvRenderKey = \_ LmsResultInsertData{..} -> do
|
, dbtCsvRenderKey = \_ LmsResultInsertData{..} -> do -- TODO: i18n
|
||||||
[whamlet|
|
[whamlet|
|
||||||
$newline never
|
$newline never
|
||||||
Ident #{getLmsIdent lmsResultInsertIdent} #
|
Ident #{getLmsIdent lmsResultInsertIdent} #
|
||||||
|
|||||||
@ -56,8 +56,30 @@ instance CsvColumnsExplained LmsUserlistTableCsv where
|
|||||||
single k v = singletonMap k [whamlet|_{v}|]
|
single k v = singletonMap k [whamlet|_{v}|]
|
||||||
|
|
||||||
|
|
||||||
|
data LmsUserlistCsvActionClass = LmsUserlistInsert | LmsUserlistUpdate
|
||||||
|
deriving (Eq, Ord, Read, Show, Generic, Typeable, Enum, Bounded)
|
||||||
|
embedRenderMessage ''UniWorX ''LmsUserlistCsvActionClass id
|
||||||
|
|
||||||
|
data LmsUserlistCsvAction = LmsUserlistInsertData { lmsUserlistInsertIdent :: LmsIdent, lmsUserlistInsertFailed :: Bool }
|
||||||
|
| LmsUserlistUpdateData { lmsUserlistInsertIdent :: LmsIdent, lmsUserlistInsertFailed :: Bool }
|
||||||
|
deriving (Eq, Ord, Read, Show, Generic, Typeable)
|
||||||
|
|
||||||
|
deriveJSON defaultOptions
|
||||||
|
{ constructorTagModifier = camelToPathPiece'' 2 1 -- LmsUserlistInsertData -> insert
|
||||||
|
, fieldLabelModifier = camelToPathPiece' 2 -- lmsUserlistInsertIdent -> insert-ident | lmsUserlistInsertFailed -> insert-failed
|
||||||
|
, sumEncoding = TaggedObject "action" "data"
|
||||||
|
} ''LmsUserlistCsvAction
|
||||||
|
|
||||||
|
|
||||||
|
data LmsUserlistCsvException
|
||||||
|
= LmsUserlistCsvExceptionDuplicatedKey -- TODO: this is not used anywhere?!
|
||||||
|
deriving (Show, Generic, Typeable)
|
||||||
|
|
||||||
|
instance Exception LmsUserlistCsvException
|
||||||
|
embedRenderMessage ''UniWorX ''LmsUserlistCsvException id
|
||||||
|
|
||||||
mkUserlistTable :: SchoolId -> QualificationShorthand -> QualificationId -> DB (Any, Widget)
|
mkUserlistTable :: SchoolId -> QualificationShorthand -> QualificationId -> DB (Any, Widget)
|
||||||
mkUserlistTable _sid qsh qid = do
|
mkUserlistTable sid qsh qid = do
|
||||||
dbtCsvName <- csvFilenameLmsUserlist qsh
|
dbtCsvName <- csvFilenameLmsUserlist qsh
|
||||||
let dbtCsvSheetName = dbtCsvName
|
let dbtCsvSheetName = dbtCsvName
|
||||||
let
|
let
|
||||||
@ -100,7 +122,65 @@ mkUserlistTable _sid qsh qid = do
|
|||||||
doEncode' = LmsUserlistTableCsv
|
doEncode' = LmsUserlistTableCsv
|
||||||
<$> view (_dbrOutput . _entityVal . _lmsUserlistIdent)
|
<$> view (_dbrOutput . _entityVal . _lmsUserlistIdent)
|
||||||
<*> view (_dbrOutput . _entityVal . _lmsUserlistFailed)
|
<*> view (_dbrOutput . _entityVal . _lmsUserlistFailed)
|
||||||
dbtCsvDecode = Nothing -- TODO !!! continue here !!! CSV Import is the purpose of this page! Just save to DB, create Job to deal with it later!
|
dbtCsvDecode = Just DBTCsvDecode {..}
|
||||||
|
where
|
||||||
|
dbtCsvRowKey = \LmsUserlistTableCsv{csvLULident} ->
|
||||||
|
fmap E.Value . MaybeT . getKeyBy $ UniqueLmsUserlist qid csvLULident
|
||||||
|
dbtCsvComputeActions = \case -- shows a diff first
|
||||||
|
DBCsvDiffNew{dbCsvNew} -> do
|
||||||
|
yield $ LmsUserlistInsertData
|
||||||
|
{ lmsUserlistInsertIdent = csvLULident dbCsvNew
|
||||||
|
, lmsUserlistInsertFailed = csvLULfailed dbCsvNew
|
||||||
|
}
|
||||||
|
DBCsvDiffExisting{dbCsvNew = LmsUserlistTableCsv{..}} -> do
|
||||||
|
yield $ LmsUserlistUpdateData
|
||||||
|
{ lmsUserlistInsertIdent = csvLULident
|
||||||
|
, lmsUserlistInsertFailed = csvLULfailed
|
||||||
|
}
|
||||||
|
DBCsvDiffMissing{} -> return () -- no deletion
|
||||||
|
dbtCsvClassifyAction = \case
|
||||||
|
LmsUserlistInsertData{} -> LmsUserlistInsert
|
||||||
|
LmsUserlistUpdateData{} -> LmsUserlistUpdate
|
||||||
|
dbtCsvCoarsenActionClass = \case
|
||||||
|
LmsUserlistInsert -> DBCsvActionNew
|
||||||
|
LmsUserlistUpdate -> DBCsvActionExisting
|
||||||
|
dbtCsvValidateActions = return () -- no validation, since this is an automatic upload, i.e. no user to review error
|
||||||
|
dbtCsvExecuteActions = do
|
||||||
|
C.mapM_ $ \actionData -> do
|
||||||
|
now <- liftIO getCurrentTime
|
||||||
|
void $ upsert LmsUserlist
|
||||||
|
{
|
||||||
|
lmsUserlistQualification = qid
|
||||||
|
, lmsUserlistIdent = lmsUserlistInsertIdent actionData
|
||||||
|
, lmsUserlistFailed = lmsUserlistInsertFailed actionData
|
||||||
|
, lmsUserlistTimestamp = now
|
||||||
|
}
|
||||||
|
[
|
||||||
|
LmsUserlistFailed =. lmsUserlistInsertFailed actionData -- TODO: should we allow a reset from failed: True to False?
|
||||||
|
, LmsUserlistTimestamp =. now
|
||||||
|
]
|
||||||
|
return $ LmsUserlistR sid qsh
|
||||||
|
dbtCsvRenderKey = const $ \case
|
||||||
|
LmsUserlistInsertData{..} -> do -- TODO: i18n
|
||||||
|
[whamlet|
|
||||||
|
$newline never
|
||||||
|
Insert: Course for Ident #{getLmsIdent lmsUserlistInsertIdent} #
|
||||||
|
$if lmsUserlistInsertFailed
|
||||||
|
is closed due to failure.
|
||||||
|
$else
|
||||||
|
is open.
|
||||||
|
|]
|
||||||
|
LmsUserlistUpdateData{..} -> do -- TODO: i18n
|
||||||
|
[whamlet|
|
||||||
|
$newline never
|
||||||
|
Update: Course for Ident #{getLmsIdent lmsUserlistInsertIdent} #
|
||||||
|
$if lmsUserlistInsertFailed
|
||||||
|
is now closed due to failure.
|
||||||
|
$else
|
||||||
|
is still open.
|
||||||
|
|]
|
||||||
|
dbtCsvRenderActionClass = toWidget <=< ap getMessageRender . pure
|
||||||
|
dbtCsvRenderException = ap getMessageRender . pure :: LmsUserlistCsvException -> DB Text
|
||||||
dbtExtraReps = []
|
dbtExtraReps = []
|
||||||
|
|
||||||
userlistDBTableValidator = def
|
userlistDBTableValidator = def
|
||||||
|
|||||||
@ -1 +1,2 @@
|
|||||||
|
LMS Result
|
||||||
^{lmsTable}
|
^{lmsTable}
|
||||||
|
|||||||
@ -1 +1,2 @@
|
|||||||
|
LMS Userlist
|
||||||
^{lmsTable}
|
^{lmsTable}
|
||||||
|
|||||||
@ -1 +1,5 @@
|
|||||||
|
LMS Overview
|
||||||
|
|
||||||
|
!!!THIS PAGE IS NOT YET FUNCTIONAL!!!
|
||||||
|
|
||||||
^{lmsTable}
|
^{lmsTable}
|
||||||
|
|||||||
Reference in New Issue
Block a user