feat: external exam csv export
This commit is contained in:
parent
1d14b6a69c
commit
553c117626
@ -1714,6 +1714,7 @@ ProportionNoRatio c@Text of@Text: #{c}/#{of}
|
|||||||
|
|
||||||
CourseUserCsvName tid@TermId ssh@SchoolId csh@CourseShorthand: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-teilnehmer
|
CourseUserCsvName tid@TermId ssh@SchoolId csh@CourseShorthand: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-teilnehmer
|
||||||
ExamUserCsvName tid@TermId ssh@SchoolId csh@CourseShorthand examn@ExamName: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase examn}-teilnehmer
|
ExamUserCsvName tid@TermId ssh@SchoolId csh@CourseShorthand examn@ExamName: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase examn}-teilnehmer
|
||||||
|
ExternalExamUserCsvName tid@TermId ssh@SchoolId coursen@CourseName examn@ExamName: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase coursen}-#{foldedCase examn}-teilnehmer
|
||||||
CourseApplicationsTableCsvName tid@TermId ssh@SchoolId csh@CourseShorthand: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-bewerbungen
|
CourseApplicationsTableCsvName tid@TermId ssh@SchoolId csh@CourseShorthand: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-bewerbungen
|
||||||
|
|
||||||
CsvColumnsExplanationsLabel: Spalten- & Zellenformat
|
CsvColumnsExplanationsLabel: Spalten- & Zellenformat
|
||||||
|
|||||||
@ -1703,6 +1703,7 @@ ProportionNoRatio c of: #{c}/#{of}
|
|||||||
|
|
||||||
CourseUserCsvName tid ssh csh: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-participants
|
CourseUserCsvName tid ssh csh: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-participants
|
||||||
ExamUserCsvName tid ssh csh examn: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase examn}-participants
|
ExamUserCsvName tid ssh csh examn: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-#{foldedCase examn}-participants
|
||||||
|
ExternalExamUserCsvName tid@TermId ssh@SchoolId coursen@CourseName examn@ExamName: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase coursen}-#{foldedCase examn}-participants
|
||||||
CourseApplicationsTableCsvName tid ssh csh: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-applications
|
CourseApplicationsTableCsvName tid ssh csh: #{foldCase (termToText (unTermKey tid))}-#{foldedCase (unSchoolKey ssh)}-#{foldedCase csh}-applications
|
||||||
|
|
||||||
CsvColumnsExplanationsLabel: Column & cell format
|
CsvColumnsExplanationsLabel: Column & cell format
|
||||||
|
|||||||
@ -4,14 +4,27 @@ module Handler.ExamOffice.ExternalExam
|
|||||||
|
|
||||||
import Import
|
import Import
|
||||||
|
|
||||||
|
import Handler.Utils
|
||||||
|
|
||||||
import Handler.Utils.ExternalExam.Users
|
import Handler.Utils.ExternalExam.Users
|
||||||
|
|
||||||
getEEGradesR, postEEGradesR :: TermId -> SchoolId -> CourseName -> ExamName -> Handler Html
|
getEEGradesR, postEEGradesR :: TermId -> SchoolId -> CourseName -> ExamName -> Handler Html
|
||||||
getEEGradesR = postEEGradesR
|
getEEGradesR = postEEGradesR
|
||||||
postEEGradesR tid ssh coursen examn = do
|
postEEGradesR 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 EEUMGrades eExam
|
(usersResult, examUsersTable) <- makeExternalExamUsersTable EEUMGrades eExam
|
||||||
|
|
||||||
|
usersResult' <- formResultMaybe usersResult $ \case
|
||||||
|
(ExternalExamUserMarkSynchronisedData, selectedResults) -> do
|
||||||
|
forM_ selectedResults externalExamResultMarkSynchronised
|
||||||
|
return . Just $ do
|
||||||
|
addMessageI Success $ MsgExamUserMarkedSynchronised (length selectedResults)
|
||||||
|
redirect $ EExamR tid ssh coursen examn EEGradesR
|
||||||
|
|
||||||
|
return (usersResult', examUsersTable)
|
||||||
|
|
||||||
|
whenIsJust usersResult join
|
||||||
|
|
||||||
siteLayoutMsg (MsgExternalExamGrades coursen examn) $ do
|
siteLayoutMsg (MsgExternalExamGrades coursen examn) $ do
|
||||||
setTitleI MsgBreadcrumbExternalExamGrades
|
setTitleI MsgBreadcrumbExternalExamGrades
|
||||||
|
|||||||
@ -173,6 +173,7 @@ makeExternalExamUsersTable mode (Entity eeId ExternalExam{..}) = do
|
|||||||
examn = externalExamExamName
|
examn = externalExamExamName
|
||||||
|
|
||||||
uid <- requireAuthId
|
uid <- requireAuthId
|
||||||
|
csvName <- getMessageRender <*> pure (MsgExternalExamUserCsvName tid ssh coursen examn)
|
||||||
isLecturer <- hasReadAccessTo $ EExamR tid ssh coursen examn EEUsersR
|
isLecturer <- hasReadAccessTo $ EExamR tid ssh coursen examn EEUsersR
|
||||||
currentRoute <- fromMaybe (error "makeExternalExamUsersTable called from 404-handler") <$> getCurrentRoute
|
currentRoute <- fromMaybe (error "makeExternalExamUsersTable called from 404-handler") <$> getCurrentRoute
|
||||||
|
|
||||||
@ -311,7 +312,28 @@ makeExternalExamUsersTable mode (Entity eeId ExternalExam{..}) = do
|
|||||||
, dbParamsFormIdent = def
|
, dbParamsFormIdent = def
|
||||||
}
|
}
|
||||||
dbtIdent = mode
|
dbtIdent = mode
|
||||||
dbtCsvEncode = Nothing
|
dbtCsvEncode = case mode of
|
||||||
|
EEUMGrades -> Just DBTCsvEncode
|
||||||
|
{ dbtCsvExportForm = ExternalExamUserCsvExportDataGrades
|
||||||
|
<$> apopt checkBoxField (fslI MsgExamUserMarkSynchronisedCsv & setTooltip MsgExamUserMarkSynchronisedCsvTip) (Just False)
|
||||||
|
, dbtCsvDoEncode = \ExternalExamUserCsvExportDataGrades{..} -> C.mapM $ \(E.Value k, row) -> do
|
||||||
|
when csvEEUserMarkSynchronised $ externalExamResultMarkSynchronised k
|
||||||
|
return $ encodeCsv' row
|
||||||
|
, dbtCsvName = unpack csvName
|
||||||
|
, dbtCsvNoExportData = Nothing
|
||||||
|
, dbtCsvHeader = const . return $ headerOrder (error "headerOrder" :: ExternalExamUserTableCsv)
|
||||||
|
}
|
||||||
|
EEUMUsers -> simpleCsvEncode csvName encodeCsv'
|
||||||
|
where
|
||||||
|
encodeCsv' :: ExternalExamUserTableData -> ExternalExamUserTableCsv
|
||||||
|
encodeCsv' row = ExternalExamUserTableCsv
|
||||||
|
{ csvEUserSurname = row ^? resultUser . _entityVal . _userSurname
|
||||||
|
, csvEUserFirstName = row ^? resultUser . _entityVal . _userFirstName
|
||||||
|
, csvEUserName = row ^? resultUser . _entityVal . _userDisplayName
|
||||||
|
, csvEUserMatriculation = row ^? resultUser . _entityVal . _userMatrikelnummer . _Just
|
||||||
|
, csvEUserOccurrenceStart = row ^. resultResult . _entityVal . _externalExamResultTime . to utcToZonedTime
|
||||||
|
, csvEUserExamResult = row ^. resultResult . _entityVal . _externalExamResultResult . to (fmap $ bool (Left . view passingGrade) Right externalExamShowGrades)
|
||||||
|
}
|
||||||
dbtCsvDecode
|
dbtCsvDecode
|
||||||
| mode == EEUMUsers = Just DBTCsvDecode
|
| mode == EEUMUsers = Just DBTCsvDecode
|
||||||
{ dbtCsvRowKey = \csv -> do
|
{ dbtCsvRowKey = \csv -> do
|
||||||
@ -428,3 +450,27 @@ makeExternalExamUsersTable mode (Entity eeId ExternalExam{..}) = do
|
|||||||
return (act, regSet)
|
return (act, regSet)
|
||||||
|
|
||||||
over _1 postprocess <$> dbTable externalExamUsersDBTableValidator DBTable{..}
|
over _1 postprocess <$> dbTable externalExamUsersDBTableValidator DBTable{..}
|
||||||
|
|
||||||
|
externalExamResultMarkSynchronised :: ExternalExamResultId -> DB ()
|
||||||
|
externalExamResultMarkSynchronised resId = do
|
||||||
|
uid <- requireAuthId
|
||||||
|
now <- liftIO getCurrentTime
|
||||||
|
|
||||||
|
userFunctions <- selectList [ UserFunctionUser ==. uid, UserFunctionFunction ==. SchoolExamOffice ] []
|
||||||
|
if
|
||||||
|
| null userFunctions ->
|
||||||
|
insert_ ExamOfficeExternalResultSynced
|
||||||
|
{ examOfficeExternalResultSyncedOffice = uid
|
||||||
|
, examOfficeExternalResultSyncedResult = resId
|
||||||
|
, examOfficeExternalResultSyncedTime = now
|
||||||
|
, examOfficeExternalResultSyncedSchool = Nothing
|
||||||
|
}
|
||||||
|
| otherwise ->
|
||||||
|
insertMany_ [ ExamOfficeExternalResultSynced
|
||||||
|
{ examOfficeExternalResultSyncedOffice = uid
|
||||||
|
, examOfficeExternalResultSyncedResult = resId
|
||||||
|
, examOfficeExternalResultSyncedTime = now
|
||||||
|
, examOfficeExternalResultSyncedSchool = Just userFunctionSchool
|
||||||
|
}
|
||||||
|
| Entity _ UserFunction{..} <- userFunctions
|
||||||
|
]
|
||||||
|
|||||||
Reference in New Issue
Block a user