chore(lms): lmsUser Overview reworked to newfound purpose. work in progress, compiles

This commit is contained in:
Steffen Jost 2022-04-12 13:32:23 +02:00
parent 06201bc22e
commit 2326b077c9
2 changed files with 58 additions and 65 deletions

View File

@ -31,7 +31,7 @@ Qualification
-- - Flag "interner Mitarbeiter" wird von Know-How ignoriert / nicht ausgewertet (legacy) -- - Flag "interner Mitarbeiter" wird von Know-How ignoriert / nicht ausgewertet (legacy)
QualificationPrecondition QualificationPrecondition
qualification QualificationId -- AND: not unique, ie. qualification can have multiple required preconditions qualification QualificationId OnDeleteCascade OnUpdateCascade -- AND: not unique, ie. qualification can have multiple required preconditions
required [QualificationId] -- OR : alternatives, any one will suffice required [QualificationId] -- OR : alternatives, any one will suffice
continuous Bool -- expiring precondition removes qualification continuous Bool -- expiring precondition removes qualification
deriving Generic deriving Generic
@ -45,7 +45,7 @@ QualificationEdit
deriving Generic deriving Generic
QualificationUser QualificationUser
user UserId user UserId OnDeleteCascade OnUpdateCascade
qualification QualificationId OnDeleteCascade OnUpdateCascade qualification QualificationId OnDeleteCascade OnUpdateCascade
validUntil Day validUntil Day
lastRefresh Day -- lastRefresh > validUntil possible, if Qualification^elearningOnly == False lastRefresh Day -- lastRefresh > validUntil possible, if Qualification^elearningOnly == False
@ -90,7 +90,7 @@ QualificationUser
LmsUser LmsUser
qualification QualificationId OnDeleteCascade OnUpdateCascade qualification QualificationId OnDeleteCascade OnUpdateCascade
user UserId user UserId OnDeleteCascade OnUpdateCascade
ident LmsIdent -- must be unique accross all LMS courses! ident LmsIdent -- must be unique accross all LMS courses!
pin Text pin Text
resetPin Bool default=false -- should pin be reset? resetPin Bool default=false -- should pin be reset?
@ -123,7 +123,7 @@ LmsResult
-- Logs all processed rows from LmsUserlist and LmsResult -- Logs all processed rows from LmsUserlist and LmsResult
LmsAudit LmsAudit
qualification QualificationId qualification QualificationId OnDeleteCascade OnUpdateCascade
ident LmsIdent ident LmsIdent
notificationType LmsStatus -- LmsBlocked Day | LmsSuccess Day notificationType LmsStatus -- LmsBlocked Day | LmsSuccess Day
received UTCTime -- timestamp from LmsUserlist/LmsResult received UTCTime -- timestamp from LmsUserlist/LmsResult

View File

@ -133,45 +133,35 @@ getLmsEditR = postLmsEditR
postLmsEditR = error "TODO" postLmsEditR = error "TODO"
type LmsResultTableExpr = ( E.SqlExpr (Entity Qualification) type LmsTableExpr = ( E.SqlExpr (Entity QualificationUser)
`E.InnerJoin` E.SqlExpr (Entity LmsResult) `E.InnerJoin` E.SqlExpr (Entity User)
) `E.LeftOuterJoin` E.SqlExpr (Maybe (Entity LmsUser)) ) `E.LeftOuterJoin` E.SqlExpr (Maybe (Entity LmsUser))
`E.LeftOuterJoin` E.SqlExpr (Maybe (Entity User))
queryQualification :: LmsResultTableExpr -> E.SqlExpr (Entity Qualification) queryQualUser :: LmsTableExpr -> E.SqlExpr (Entity QualificationUser)
queryQualification = $(sqlIJproj 2 1) . $(sqlLOJproj 3 1) queryQualUser = $(sqlIJproj 2 1) . $(sqlLOJproj 2 1)
queryLmsResult :: LmsResultTableExpr -> E.SqlExpr (Entity LmsResult) queryUser :: LmsTableExpr -> E.SqlExpr (Entity User)
queryLmsResult = $(sqlIJproj 2 2) . $(sqlLOJproj 3 1) queryUser = $(sqlIJproj 2 2) . $(sqlLOJproj 2 1)
queryLmsUser :: LmsResultTableExpr -> E.SqlExpr (Maybe (Entity LmsUser)) queryLmsUser :: LmsTableExpr -> E.SqlExpr (Maybe (Entity LmsUser))
queryLmsUser = $(sqlLOJproj 3 2) queryLmsUser = $(sqlLOJproj 2 2)
queryUser :: LmsResultTableExpr -> E.SqlExpr (Maybe (Entity User)) type LmsTableData = DBRow (Entity QualificationUser, Entity User, Maybe (Entity LmsUser))
queryUser = $(sqlLOJproj 3 3)
type LmsResultTableData = DBRow (Entity Qualification, Entity LmsResult, Maybe (Entity LmsUser), Maybe (Entity User)) resultQualUser :: Lens' LmsTableData (Entity QualificationUser)
resultQualUser = _dbrOutput . _1
instance HasEntity LmsResultTableData LmsResult where resultUser :: Lens' LmsTableData (Entity User)
hasEntity = _dbrOutput . _2 resultUser = _dbrOutput . _2
{- MaybeHasUser only! resultLmsUser :: Traversal' LmsTableData (Entity LmsUser)
instance HasUser LmsResultTableData where
hasUser = resultUser . _entityVal
-}
resultQualification :: Lens' LmsResultTableData (Entity Qualification)
resultQualification = _dbrOutput . _1
resultLmsResult :: Lens' LmsResultTableData (Entity LmsResult)
resultLmsResult = _dbrOutput . _2
resultLmsUser :: Traversal' LmsResultTableData (Entity LmsUser)
resultLmsUser = _dbrOutput . _3 . _Just resultLmsUser = _dbrOutput . _3 . _Just
resultUser :: Traversal' LmsResultTableData (Entity User) instance HasEntity LmsTableData User where
resultUser = _dbrOutput . _4 . _Just hasEntity = resultUser
instance HasUser LmsTableData where
hasUser = resultUser . _entityVal
mkLmsTable :: QualificationId -> DB (Any, Widget) mkLmsTable :: QualificationId -> DB (Any, Widget)
mkLmsTable qid = do mkLmsTable qid = do
@ -179,44 +169,47 @@ mkLmsTable qid = do
resultDBTable = DBTable{..} resultDBTable = DBTable{..}
where where
dbtSQLQuery = runReaderT $ do dbtSQLQuery = runReaderT $ do
qualification <- asks queryQualification qualUser <- asks queryQualUser
lmsResult <- asks queryLmsResult user <- asks queryUser
lmsUser <- asks queryLmsUser lmsUser <- asks queryLmsUser
user <- asks queryUser
lift $ do lift $ do
E.on $ qualification E.^. QualificationId E.==. lmsResult E.^. LmsResultQualification E.on $ user E.^. UserId E.==. qualUser E.^. QualificationUserUser
E.on $ lmsUser E.?. LmsUserIdent E.==. E.just (lmsResult E.^. LmsResultIdent) E.on $ user E.^. UserId E.=?. lmsUser E.?. LmsUserUser
E.on $ lmsUser E.?. LmsUserUser E.==. user E.?. UserId E.where_ $ E.val qid E.==. qualUser E.^. QualificationUserQualification
E.where_ $ qualification E.^. QualificationId E.==. E.val qid E.&&. E.val qid E.=?. lmsUser E.?. LmsUserQualification
return (qualification, lmsResult, lmsUser, user) return (qualUser, user, lmsUser)
dbtRowKey = queryLmsResult >>> (E.^. LmsResultId) dbtRowKey = queryUser >>> (E.^. UserId)
dbtProj = dbtProjFilteredPostId -- TODO: or dbtProjSimple what is the difference? dbtProj = dbtProjFilteredPostId -- TODO: or dbtProjSimple what is the difference?
dbtColonnade = dbColonnade $ mconcat dbtColonnade = dbColonnade $ mconcat
[ sortable (Just "user") (i18nCell MsgTableLmsUser) $ -- \(preview resultUser -> entuser) -> maybeCell entuser (cellHasUserLink AdminUserR) [ sortable (Just "user") (i18nCell MsgTableLmsUser) $ cellHasUserLink AdminUserR
foldMap (cellHasUserLink AdminUserR) . (^? resultUser) , sortable (Just "email") (i18nCell MsgTableEmail) cellHasEMail
, sortable (Just "email") (i18nCell MsgTableEmail) $ -- \(preview $ resultUser . _entityVal -> user) -> maybeCell user cellHasEMail --, sortable (Just csvLmsIdent) (i18nCell MsgTableLmsIdent) $ \(preview $ resultLmsUser . _entityVal . _lmsUserIdent . _getLmsIdent -> ident) -> textCell ident
foldMap cellHasEMail . (^? resultUser) --, sortable (Just csvLmsSuccess) (i18nCell MsgTableLmsSuccess) $ \(view $ resultLmsResult . _entityVal . _lmsResultSuccess -> success) -> dayCell success
, sortable (Just csvLmsIdent) (i18nCell MsgTableLmsIdent) $ \(view $ resultLmsResult . _entityVal . _lmsResultIdent . _getLmsIdent -> ident) -> textCell ident
, sortable (Just csvLmsSuccess) (i18nCell MsgTableLmsSuccess) $ \(view $ resultLmsResult . _entityVal . _lmsResultSuccess -> success) -> dayCell success
] -- TODO: add more columns for manual debugging view !!! ] -- TODO: add more columns for manual debugging view !!!
dbtSorting = Map.fromList dbtSorting = Map.fromList
[ ("user" , SortColumn $ queryUser >>> (E.?. UserDisplayName)) [ ("user" , SortColumn $ queryUser >>> (E.^. UserDisplayName))
, ("email" , SortColumn $ queryUser >>> (E.?. UserEmail)) , ("email" , SortColumn $ queryUser >>> (E.^. UserEmail))
, (csvLmsIdent , SortColumn $ queryLmsResult >>> (E.^. LmsResultIdent)) --
-- , (csvLmsSuccess, SortColumn $ queryLmsResult >>> (E.^. LmsResultSuccess)) -- , (csvLmsIdent , SortColumn $ queryLmsUser >>> (E.^. LmsResultIdent))
, (csvLmsSuccess, SortColumn $ views (to queryLmsResult) (E.^. LmsResultSuccess)) -- , (csvLmsSuccess, SortColumn $ queryLmsResult >>> (E.^. LmsResultSuccess))
-- , (csvLmsSuccess, SortColumn $ views (to queryLmsResult) (E.^. LmsResultSuccess))
] ]
dbtFilter = Map.fromList -- where single = uncurry Map.singleton
[ ("user" , FilterColumn . E.mkContainsFilterWith Just $ views (to queryUser) (E.?. UserDisplayName)) dbtFilter = mconcat
, ("email" , FilterColumn . E.mkContainsFilterWith Just $ views (to queryUser) (E.?. UserEmail)) [ single $ fltrUserNameEmail queryUser
, (csvLmsIdent , FilterColumn . E.mkContainsFilterWith LmsIdent $ views (to queryLmsResult) (E.^. LmsResultIdent)) --("user" , FilterColumn . E.mkContainsFilterWith Just $ views (to queryUser) (E.^. UserDisplayName))
, (csvLmsSuccess, FilterColumn . E.mkExactFilter $ views (to queryLmsResult) (E.^. LmsResultSuccess)) -- , ("email" , FilterColumn . E.mkContainsFilterWith Just $ views (to queryUser) (E.^. UserEmail))
-- , (csvLmsIdent , FilterColumn . E.mkContainsFilterWith LmsIdent $ views (to queryLmsResult) (E.^. LmsResultIdent))
-- , (csvLmsSuccess, FilterColumn . E.mkExactFilter $ views (to queryLmsResult) (E.^. LmsResultSuccess))
] ]
dbtFilterUI = \mPrev -> mconcat where single = uncurry Map.singleton
[ prismAForm (singletonFilter "user" . maybePrism _PathPiece) mPrev $ aopt (hoistField lift textField) (fslI MsgTableLmsUser) dbtFilterUI mPrev = mconcat
, prismAForm (singletonFilter "email" . maybePrism _PathPiece) mPrev $ aopt (hoistField lift textField) (fslI MsgTableEmail) [ fltrUserNameEmailUI mPrev
, prismAForm (singletonFilter csvLmsIdent . maybePrism _PathPiece) mPrev $ aopt (hoistField lift textField) (fslI MsgTableLmsIdent) -- prismAForm (singletonFilter "user" . maybePrism _PathPiece) mPrev $ aopt (hoistField lift textField) (fslI MsgTableLmsUser)
, prismAForm (singletonFilter csvLmsSuccess . maybePrism _PathPiece) mPrev $ aopt (hoistField lift checkBoxField) (fslI MsgTableLmsSuccess) --, prismAForm (singletonFilter "email" . maybePrism _PathPiece) mPrev $ aopt (hoistField lift textField) (fslI MsgTableEmail)
-- , prismAForm (singletonFilter csvLmsIdent . maybePrism _PathPiece) mPrev $ aopt (hoistField lift textField) (fslI MsgTableLmsIdent)
-- , prismAForm (singletonFilter csvLmsSuccess . maybePrism _PathPiece) mPrev $ aopt (hoistField lift checkBoxField) (fslI MsgTableLmsSuccess)
] ]
dbtStyle = def { dbsFilterLayout = defaultDBSFilterLayout } dbtStyle = def { dbsFilterLayout = defaultDBSFilterLayout }
dbtParams = def dbtParams = def