This repository has been archived on 2024-10-24. You can view files and clone it, but cannot push or open issues or pull requests.
fradrive-old/src/Handler/ExternalExam/Users.hs
2022-10-12 09:35:16 +02:00

73 lines
2.8 KiB
Haskell

-- SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>
--
-- SPDX-License-Identifier: AGPL-3.0-or-later
module Handler.ExternalExam.Users
( getEEUsersR, postEEUsersR
) where
import Import
import Database.Persist.Sql (deleteWhereCount, updateWhereCount)
import Handler.Utils
import Handler.Utils.ExternalExam.Users
getEEUsersR, postEEUsersR :: TermId -> SchoolId -> CourseName -> ExamName -> Handler Html
getEEUsersR = postEEUsersR
postEEUsersR tid ssh coursen examn = do
(usersResult, table) <- runDB $ do
eExam <- getBy404 $ UniqueExternalExam tid ssh coursen examn
(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
setTitleI MsgBreadcrumbExternalExamUsers
table