feat(eeusers): fix form & finish implementation

This commit is contained in:
Gregor Kleen 2020-05-06 15:03:00 +02:00
parent 8008248483
commit 7d3e9a3de3
3 changed files with 63 additions and 63 deletions

View File

@ -4,8 +4,6 @@ module Handler.ExamOffice.ExternalExam
import Import import Import
import Database.Persist.Sql (deleteWhereCount, updateWhereCount)
import Handler.Utils import Handler.Utils
import Handler.Utils.ExternalExam.Users import Handler.Utils.ExternalExam.Users
@ -17,52 +15,13 @@ postEEGradesR tid ssh coursen examn = do
eExam <- getBy404 $ UniqueExternalExam tid ssh coursen examn eExam <- getBy404 $ UniqueExternalExam tid ssh coursen examn
(usersResult, examUsersTable) <- makeExternalExamUsersTable EEUMGrades eExam (usersResult, examUsersTable) <- makeExternalExamUsersTable EEUMGrades eExam
let
editResults results changeList = fmap getSum . flip foldMapM results $ \result -> do
now <- liftIO getCurrentTime
mExtExamRes <- get result
nrEdit <- updateWhereCount
[ ExternalExamResultId ==. result ]
(changeList <> [ ExternalExamResultLastChanged =. now ])
if
| Just ExternalExamResult{..} <- mExtExamRes -> do
forM_ [1..nrEdit] $ const $ audit $ TransactionExternalExamResultEdit externalExamResultExam externalExamResultUser
return $ Sum nrEdit
| otherwise -> return mempty
usersResult' <- formResultMaybe usersResult $ \case usersResult' <- formResultMaybe usersResult $ \case
(ExternalExamUserMarkSynchronisedData, selectedResults) -> do (ExternalExamUserMarkSynchronisedData, selectedResults) -> do
forM_ selectedResults externalExamResultMarkSynchronised forM_ selectedResults externalExamResultMarkSynchronised
return . Just $ do return . Just $ do
addMessageI Success $ MsgExamUserMarkedSynchronised $ length selectedResults addMessageI Success $ MsgExamUserMarkedSynchronised $ length selectedResults
redirect $ EExamR tid ssh coursen examn EEGradesR redirect $ EExamR tid ssh coursen examn EEGradesR
_other -> return Nothing
(ExternalExamUserEditOccurrenceData occ, selectedResults) -> do
nrEdited <- editResults selectedResults
[ ExternalExamResultTime =. occ ]
return . Just $ do
addMessageI Success $ MsgExternalExamOccurrenceEdited nrEdited
redirect $ EExamR tid ssh coursen examn EEGradesR
(ExternalExamUserEditResultData examResult, selectedResults) -> do
nrEdited <- editResults selectedResults
[ ExternalExamResultResult =. examResult ]
return . Just $ do
addMessageI Success $ MsgExternalExamResultEdited nrEdited
redirect $ EExamR tid ssh coursen examn EEGradesR
(ExternalExamUserDeleteData, selectedResults) -> do
nrDeleted <- fmap getSum . flip foldMapM selectedResults $ \selectedResult -> do
mExtExamRes <- get selectedResult
nrDel <- deleteWhereCount [ ExternalExamResultId ==. selectedResult ]
if
| Just ExternalExamResult{..} <- mExtExamRes -> do
forM_ [1..nrDel] $ const $ audit $ TransactionExternalExamResultDelete externalExamResultExam externalExamResultUser
return $ Sum nrDel
| otherwise -> return mempty
return . Just $ do
addMessageI Success $ MsgExternalExamUserDeleted nrDeleted
redirect $ EExamR tid ssh coursen examn EEGradesR
return (usersResult', examUsersTable) return (usersResult', examUsersTable)

View File

@ -4,14 +4,64 @@ module Handler.ExternalExam.Users
import Import import Import
import Database.Persist.Sql (deleteWhereCount, updateWhereCount)
import Handler.Utils
import Handler.Utils.ExternalExam.Users import Handler.Utils.ExternalExam.Users
getEEUsersR, postEEUsersR :: TermId -> SchoolId -> CourseName -> ExamName -> Handler Html getEEUsersR, postEEUsersR :: TermId -> SchoolId -> CourseName -> ExamName -> Handler Html
getEEUsersR = postEEUsersR getEEUsersR = postEEUsersR
postEEUsersR tid ssh coursen examn = do postEEUsersR tid ssh coursen examn = do
(_, table) <- runDB $ do (usersResult, table) <- runDB $ do
eExam <- getBy404 $ UniqueExternalExam tid ssh coursen examn eExam <- getBy404 $ UniqueExternalExam tid ssh coursen examn
makeExternalExamUsersTable EEUMUsers eExam (usersResult, examUsersTable) <- makeExternalExamUsersTable EEUMUsers eExam
let
editResults results changeList = fmap getSum . flip foldMapM results $ \result -> do
now <- liftIO getCurrentTime
mExtExamRes <- get result
nrEdit <- updateWhereCount
[ ExternalExamResultId ==. result ]
(changeList <> [ ExternalExamResultLastChanged =. now ])
if
| Just ExternalExamResult{..} <- mExtExamRes -> do
forM_ [1..nrEdit] $ const $ audit $ TransactionExternalExamResultEdit externalExamResultExam externalExamResultUser
return $ Sum nrEdit
| otherwise -> return mempty
usersResult' <- formResultMaybe usersResult $ \case
(ExternalExamUserEditOccurrenceData occ, selectedResults) -> do
nrEdited <- editResults selectedResults
[ ExternalExamResultTime =. occ ]
return . Just $ do
addMessageI Success $ MsgExternalExamOccurrenceEdited nrEdited
redirect $ EExamR tid ssh coursen examn EEGradesR
(ExternalExamUserEditResultData examResult, selectedResults) -> do
nrEdited <- editResults selectedResults
[ ExternalExamResultResult =. examResult ]
return . Just $ do
addMessageI Success $ MsgExternalExamResultEdited nrEdited
redirect $ EExamR tid ssh coursen examn EEGradesR
(ExternalExamUserDeleteData, selectedResults) -> do
nrDeleted <- fmap getSum . flip foldMapM selectedResults $ \selectedResult -> do
mExtExamRes <- get selectedResult
nrDel <- deleteWhereCount [ ExternalExamResultId ==. selectedResult ]
if
| Just ExternalExamResult{..} <- mExtExamRes -> do
forM_ [1..nrDel] $ const $ audit $ TransactionExternalExamResultDelete externalExamResultExam externalExamResultUser
return $ Sum nrDel
| otherwise -> return mempty
return . Just $ do
addMessageI Success $ MsgExternalExamUserDeleted nrDeleted
redirect $ EExamR tid ssh coursen examn EEGradesR
_other -> return Nothing
return (usersResult', examUsersTable)
whenIsJust usersResult join
siteLayoutMsg (MsgExternalExamUsers coursen examn) $ do siteLayoutMsg (MsgExternalExamUsers coursen examn) $ do
setTitleI MsgBreadcrumbExternalExamUsers setTitleI MsgBreadcrumbExternalExamUsers

View File

@ -34,6 +34,7 @@ data ExternalExamUserMode = EEUMUsers | EEUMGrades
instance Universe ExternalExamUserMode instance Universe ExternalExamUserMode
instance Finite ExternalExamUserMode instance Finite ExternalExamUserMode
nullaryPathPiece ''ExternalExamUserMode $ camelToPathPiece' 1 nullaryPathPiece ''ExternalExamUserMode $ camelToPathPiece' 1
makePrisms ''ExternalExamUserMode
type ExternalExamUserTableExpr = E.SqlExpr (Entity ExternalExamResult) type ExternalExamUserTableExpr = E.SqlExpr (Entity ExternalExamResult)
@ -259,12 +260,8 @@ makeExternalExamUsersTable mode (Entity eeId ExternalExam{..}) = do
dbtColonnade :: Colonnade Sortable _ _ dbtColonnade :: Colonnade Sortable _ _
dbtColonnade = mconcat dbtColonnade = mconcat
[ case mode of [ dbSelect (applying _2) id $ return . view (resultResult . _entityKey)
EEUMGrades -> mconcat , fromMaybe mempty . guardOn (is _EEUMGrades mode) $ colSynced
[ dbSelect (applying _2) id $ return . view (resultResult . _entityKey)
, colSynced
]
_other -> mempty
, colUserDisplayName (resultUser . _entityVal . $(multifocusL 2) _userDisplayName _userSurname) , colUserDisplayName (resultUser . _entityVal . $(multifocusL 2) _userDisplayName _userSurname)
, colUserMatriculation (resultUser . _entityVal . _userMatrikelnummer) , colUserMatriculation (resultUser . _entityVal . _userMatrikelnummer)
, Colonnade.singleton (fromSortable . Sortable (Just "occurrence-start") $ i18nCell MsgExamTime) $ \x -> cell . flip runReaderT x $ do , Colonnade.singleton (fromSortable . Sortable (Just "occurrence-start") $ i18nCell MsgExamTime) $ \x -> cell . flip runReaderT x $ do
@ -299,9 +296,7 @@ makeExternalExamUsersTable mode (Entity eeId ExternalExam{..}) = do
{ dbParamsFormMethod = POST { dbParamsFormMethod = POST
, dbParamsFormAction = Just $ SomeRoute currentRoute , dbParamsFormAction = Just $ SomeRoute currentRoute
, dbParamsFormAttrs = [] , dbParamsFormAttrs = []
, dbParamsFormSubmit = case mode of , dbParamsFormSubmit = FormSubmit
EEUMGrades -> FormSubmit
_other -> FormNoSubmit
, dbParamsFormAdditional = case mode of , dbParamsFormAdditional = case mode of
EEUMGrades -> \csrf -> do EEUMGrades -> \csrf -> do
let let
@ -316,18 +311,14 @@ makeExternalExamUsersTable mode (Entity eeId ExternalExam{..}) = do
return (formRes, formWgt) return (formRes, formWgt)
EEUMUsers -> \csrf -> do EEUMUsers -> \csrf -> do
let let
-- TODO work in progress
actionMap :: Map ExternalExamUserAction (AForm Handler ExternalExamUserActionData) actionMap :: Map ExternalExamUserAction (AForm Handler ExternalExamUserActionData)
actionMap = mconcat actionMap = mconcat
[ singletonMap ExternalExamUserMarkSynchronised $ [ singletonMap ExternalExamUserEditOccurrence $
pure ExternalExamUserMarkSynchronisedData ExternalExamUserEditOccurrenceData
--, singletonMap ExternalExamUserEditOccurrence $ <$> apopt utcTimeField (fslI MsgExamTime) externalExamDefaultTime
-- ExternalExamUserEditOccurrenceData , singletonMap ExternalExamUserEditResult $
-- <$> mempty ExternalExamUserEditResultData
-- <$> aopt () (fslI MsgExamOccurrence) (Just Nothing) <$> apopt (examResultPassedGradeField Nothing) (fslI MsgExamResult) Nothing
--, singletonMap ExternalExamUserEditResult $
-- ExternalExamUserEditResultData
-- <$> mempty
, singletonMap ExternalExamUserDelete $ , singletonMap ExternalExamUserDelete $
pure ExternalExamUserDeleteData pure ExternalExamUserDeleteData
] ]