feat(labels): set export label on exam csv export

This commit is contained in:
Sarah Vaupel 2022-01-26 23:42:45 +01:00
parent 1caba13ac3
commit 4557fdda92
5 changed files with 26 additions and 7 deletions

View File

@ -73,3 +73,6 @@ ExamSetLabel: Label setzen
ExamLabelsSet n@Int: #{n} Prüfungs-#{pluralDE n "Label" "Labels"} gesetzt ExamLabelsSet n@Int: #{n} Prüfungs-#{pluralDE n "Label" "Labels"} gesetzt
ExamRemoveLabel: Label entfernen ExamRemoveLabel: Label entfernen
ExamLabelsRemoved n@Int: #{n} Prüfungs-#{pluralDE n "Label" "Labels"} entfernt ExamLabelsRemoved n@Int: #{n} Prüfungs-#{pluralDE n "Label" "Labels"} entfernt
ExamOfficeLabelSetLabelOnExport: Prüfungs-Label beim Export setzen
ExamOfficeLabelSetLabelOnExportTip t@Text: Soll beim CSV-Export automatisch das Export-Label für die jeweilige Prüfung gesetzt werden? Von Ihnen gesetzte Prüfungs-Label sind ausschließlich für Sie sichtbar und können von jedem Prüfungsbeauftragten unabhängig voneinander verwaltet bzw. verwendet werden. Ihr aktuell für den CSV-Export eingestelltes Prüfungs-Label ist „#{t}“. Sie können das zu setzende Prüfungs-Label unter „Export-Optionen“ oder in Ihren persönlichen Benutzereinstellungen ändern.
ExamOfficeLabelSetLabelOnExportForcedTip: Soll beim CSV-Export automatisch das Export-Label für die jeweilige Prüfung gesetzt werden? Von Ihnen gesetzte Prüfungs-Label sind ausschließlich für Sie sichtbar und können von jedem Prüfungsbeauftragten unabhängig voneinander verwaltet bzw. verwendet werden. Sie haben aktuell kein Export-Label festgelegt und können diese Option daher nicht auswählen. Sie können das beim CSV-Export zu setzende Prüfungs-Label unter „Export-Optionen“ oder in Ihren persönlichen Benutzereinstellungen wählen.

View File

@ -71,3 +71,6 @@ ExamSetLabel: Set label
ExamLabelsSet n: Successfully set #{n} exam #{pluralEN n "label" "labels"} ExamLabelsSet n: Successfully set #{n} exam #{pluralEN n "label" "labels"}
ExamRemoveLabel: Remove label ExamRemoveLabel: Remove label
ExamLabelsRemoved n: Successfully removed #{n} exam #{pluralEN n "label" "labels"} ExamLabelsRemoved n: Successfully removed #{n} exam #{pluralEN n "label" "labels"}
ExamOfficeLabelSetLabelOnExport: Set exam label while exporting
ExamOfficeLabelSetLabelOnExportTip t: Should the export label be set for the respective exam? Your set exam labels are exclusively visible to you and may be managed and used by each exam office member independently. Your saved exam label for CSV export is currently “#{t}”. You can change the exam label set while exporting under “Export options” or in your user settings.
ExamOfficeLabelSetLabelOnExportForcedTip: Should the export label be set for the respective exam? Your set exam labels are exclusively visible to you and may be managed and used by each exam office member independently. You do not currently have any exam label selected as export label and therefor cannot active this setting. To set an exam label as export label, go to “Export options” or your user settings.

View File

@ -1,4 +1,4 @@
{-# OPTIONS_GHC -fno-warn-redundant-constraints #-} {-# OPTIONS_GHC -fno-warn-redundant-constraints -fno-warn-name-shadowing #-}
module Handler.ExamOffice.Exam module Handler.ExamOffice.Exam
( getEGradesR, postEGradesR ( getEGradesR, postEGradesR
@ -216,16 +216,18 @@ embedRenderMessage ''UniWorX ''ExamUserAction id
data ExamUserActionData = ExamUserMarkSynchronisedData data ExamUserActionData = ExamUserMarkSynchronisedData
newtype ExamUserCsvExportData = ExamUserCsvExportData data ExamUserCsvExportData = ExamUserCsvExportData
{ csvEUserMarkSynchronised :: Bool { csvEUserMarkSynchronised :: Bool
} deriving (Eq, Ord, Read, Show, Generic, Typeable) , csvEUserSetLabel :: Bool
}
deriving (Eq, Ord, Read, Show, Generic, Typeable)
-- | View a list of all users' grades that the current user has access to -- | View a list of all users' grades that the current user has access to
getEGradesR, postEGradesR :: TermId -> SchoolId -> CourseShorthand -> ExamName -> Handler Html getEGradesR, postEGradesR :: TermId -> SchoolId -> CourseShorthand -> ExamName -> Handler Html
getEGradesR = postEGradesR getEGradesR = postEGradesR
postEGradesR tid ssh csh examn = do postEGradesR tid ssh csh examn = do
uid <- requireAuthId Entity uid User{..} <- requireAuth
now <- liftIO getCurrentTime now <- liftIO getCurrentTime
((usersResult, examUsersTable), Entity eId Exam{examFinished}) <- runDB $ do ((usersResult, examUsersTable), Entity eId Exam{examFinished}) <- runDB $ do
exam@(Entity eid Exam{..}) <- fetchExam tid ssh csh examn exam@(Entity eid Exam{..}) <- fetchExam tid ssh csh examn
@ -234,6 +236,12 @@ postEGradesR tid ssh csh examn = do
isLecturer <- hasReadAccessTo $ CExamR tid ssh csh examn EUsersR isLecturer <- hasReadAccessTo $ CExamR tid ssh csh examn EUsersR
userFunctions <- selectList [ UserFunctionUser ==. uid, UserFunctionFunction ==. SchoolExamOffice ] [] userFunctions <- selectList [ UserFunctionUser ==. uid, UserFunctionFunction ==. SchoolExamOffice ] []
userCsvExportLabel' <- E.select . E.from $ \examOfficeLabel -> do
E.where_ $ maybe E.false (\expLbl -> examOfficeLabel E.^. ExamOfficeLabelName E.==. E.val expLbl) (csvExportLabel userCsvOptions)
E.&&. examOfficeLabel E.^. ExamOfficeLabelUser E.==. E.val uid
return examOfficeLabel
let userCsvExportLabel = listToMaybe userCsvExportLabel'
let let
participantLink :: (MonadHandler m, HandlerSite m ~ UniWorX) => UserId -> m (SomeRoute UniWorX) participantLink :: (MonadHandler m, HandlerSite m ~ UniWorX) => UserId -> m (SomeRoute UniWorX)
participantLink partId = liftHandler $ do participantLink partId = liftHandler $ do
@ -332,7 +340,7 @@ postEGradesR tid ssh csh examn = do
colSynced = Colonnade.singleton (fromSortable . Sortable (Just "is-synced") $ i18nCell MsgExamUserSynchronised) $ \x -> cell . flip runReaderT x $ do colSynced = Colonnade.singleton (fromSortable . Sortable (Just "is-synced") $ i18nCell MsgExamUserSynchronised) $ \x -> cell . flip runReaderT x $ do
syncs <- asks $ sortOn (Down . view _3) . toListOf resultSynchronised syncs <- asks $ sortOn (Down . view _3) . toListOf resultSynchronised
lastChange <- view $ resultExamResult . _entityVal . _examResultLastChanged lastChange <- view $ resultExamResult . _entityVal . _examResultLastChanged
user <- view $ resultUser . _entityVal User{..} <- view $ resultUser . _entityVal
isSynced <- view resultIsSynced isSynced <- view resultIsSynced
let let
hasSyncs = has folded syncs hasSyncs = has folded syncs
@ -431,8 +439,13 @@ postEGradesR tid ssh csh examn = do
dbtCsvEncode = Just DBTCsvEncode dbtCsvEncode = Just DBTCsvEncode
{ dbtCsvExportForm = ExamUserCsvExportData { dbtCsvExportForm = ExamUserCsvExportData
<$> apopt checkBoxField (fslI MsgExamOfficeExamUserMarkSynchronisedCsv & setTooltip MsgExamOfficeExamUserMarkSynchronisedCsvTip) (Just False) <$> apopt checkBoxField (fslI MsgExamOfficeExamUserMarkSynchronisedCsv & setTooltip MsgExamOfficeExamUserMarkSynchronisedCsvTip) (Just False)
<*> maybe
(aforced checkBoxField (fslI MsgExamOfficeLabelSetLabelOnExport & setTooltip MsgExamOfficeLabelSetLabelOnExportForcedTip) True)
(\expLbl -> apopt checkBoxField (fslI MsgExamOfficeLabelSetLabelOnExport & setTooltip (MsgExamOfficeLabelSetLabelOnExportTip expLbl)) (Just True))
((examOfficeLabelName . entityVal) <$> userCsvExportLabel)
, dbtCsvDoEncode = \ExamUserCsvExportData{..} -> C.mapM $ \(E.Value k, row) -> do , dbtCsvDoEncode = \ExamUserCsvExportData{..} -> C.mapM $ \(E.Value k, row) -> do
when csvEUserMarkSynchronised $ markSynced k when csvEUserMarkSynchronised $ markSynced k
when csvEUserSetLabel $ maybe (return ()) (\lbl -> void $ upsert (ExamOfficeExamLabel eid lbl) [ExamOfficeExamLabelLabel =. lbl]) (entityKey <$> userCsvExportLabel)
return $ ExamUserTableCsv return $ ExamUserTableCsv
(row ^. resultUser . _entityVal . _userSurname) (row ^. resultUser . _entityVal . _userSurname)
(row ^. resultUser . _entityVal . _userFirstName) (row ^. resultUser . _entityVal . _userFirstName)

View File

@ -245,7 +245,7 @@ makeExternalExamUsersTable mode (Entity eeId ExternalExam{..}) = do
colSynced = Colonnade.singleton (fromSortable . Sortable (Just "is-synced") $ i18nCell MsgExternalExamUserSynchronised) $ \x -> cell . flip runReaderT x $ do colSynced = Colonnade.singleton (fromSortable . Sortable (Just "is-synced") $ i18nCell MsgExternalExamUserSynchronised) $ \x -> cell . flip runReaderT x $ do
syncs <- asks $ sortOn (Down . view _3) . toListOf resultSynchronised syncs <- asks $ sortOn (Down . view _3) . toListOf resultSynchronised
lastChange <- view $ resultResult . _entityVal . _externalExamResultLastChanged lastChange <- view $ resultResult . _entityVal . _externalExamResultLastChanged
user <- view $ resultUser . _entityVal User{..} <- view $ resultUser . _entityVal
isSynced <- view resultIsSynced isSynced <- view resultIsSynced
let let
hasSyncs = has folded syncs hasSyncs = has folded syncs

View File

@ -1,6 +1,6 @@
$newline never $newline never
<h1> <h1>
^{nameWidget (userDisplayName user) (userSurname user)} ^{nameWidget userDisplayName userSurname}
<table .table .table--striped .table--hover> <table .table .table--striped .table--hover>
<thead> <thead>