From de917a8d8646c4df599d945bc4979e226dd5192f Mon Sep 17 00:00:00 2001 From: Sarah Vaupel Date: Wed, 26 Jan 2022 19:24:04 +0100 Subject: [PATCH] feat(csv): add export-exam-label as csv option --- .../settings/csv_options/de-de-formal.msg | 2 ++ .../categories/settings/csv_options/en-eu.msg | 2 ++ src/Handler/Profile.hs | 8 +++++++- src/Handler/Utils/Form.hs | 10 +++++++++- src/Model/Types/Csv.hs | 20 +++++++++++-------- 5 files changed, 32 insertions(+), 10 deletions(-) diff --git a/messages/uniworx/categories/settings/csv_options/de-de-formal.msg b/messages/uniworx/categories/settings/csv_options/de-de-formal.msg index 5041a5918..31d411eb0 100644 --- a/messages/uniworx/categories/settings/csv_options/de-de-formal.msg +++ b/messages/uniworx/categories/settings/csv_options/de-de-formal.msg @@ -3,6 +3,8 @@ CsvOptionsTip: Diese Einstellungen betreffen primär den CSV-Export; beim Import CsvFormatOptions: Dateiformat CsvTimestamp: Zeitstempel CsvTimestampTip: Soll an den Namen jeder exportierten CSV-Datei ein Zeitstempel vorne angehängt werden? +CsvExportLabel: Prüfungs-Label bei Export +CsvExportLabelTip: Soll beim CSV-Export von Prüfungsleistungen automatisch ein gegebenes Label für diese Prüfung gesetzt werden? CsvPresetRFC: Standard-Konform (RFC 4180) CsvPresetExcel: Excel-Kompatibel CsvCustom: Benutzerdefiniert diff --git a/messages/uniworx/categories/settings/csv_options/en-eu.msg b/messages/uniworx/categories/settings/csv_options/en-eu.msg index 2900dc672..2f9d76ab8 100644 --- a/messages/uniworx/categories/settings/csv_options/en-eu.msg +++ b/messages/uniworx/categories/settings/csv_options/en-eu.msg @@ -3,6 +3,8 @@ CsvOptionsTip: These settings primarily affect CSV export. During import most se CsvFormatOptions: File format CsvTimestamp: Timestamp CsvTimestampTip: Should the name of every exported csv file contain a timestamp? +CsvExportLabel: Exam label on export +CsvExportLabelTip: Should a given label be automatically set for an exam of which results are exported to CSV? CsvPresetRFC: Standards-compliant (RFC 4180) CsvPresetExcel: Excel compatible CsvCustom: User defined diff --git a/src/Handler/Profile.hs b/src/Handler/Profile.hs index 99b06a835..6ce9b02dc 100644 --- a/src/Handler/Profile.hs +++ b/src/Handler/Profile.hs @@ -1061,8 +1061,14 @@ getCsvOptionsR = postCsvOptionsR postCsvOptionsR = do Entity uid User{userCsvOptions} <- requireAuth + userIsExamOffice <- hasReadAccessTo $ ExamOfficeR EOExamsR + examOfficeLabels <- if not userIsExamOffice then return mempty else runDB . E.select . E.from $ \examOfficeLabel -> do + E.where_ $ examOfficeLabel E.^. ExamOfficeLabelUser E.==. E.val uid + E.orderBy [ E.asc (examOfficeLabel E.^. ExamOfficeLabelName) ] + return $ examOfficeLabel E.^. ExamOfficeLabelName + ((optionsRes, optionsWgt'), optionsEnctype) <- runFormPost . renderAForm FormStandard $ - csvOptionsForm (Just userCsvOptions) + csvOptionsForm (Just userCsvOptions) (Set.fromList $ E.unValue <$> examOfficeLabels) formResultModal optionsRes CsvOptionsR $ \opts -> do lift . runDB $ update uid [ UserCsvOptions =. opts ] diff --git a/src/Handler/Utils/Form.hs b/src/Handler/Utils/Form.hs index 92940d471..b39d89428 100644 --- a/src/Handler/Utils/Form.hs +++ b/src/Handler/Utils/Form.hs @@ -2125,10 +2125,18 @@ csvOptionsForm :: forall m. , HandlerSite m ~ UniWorX ) => Maybe CsvOptions + -> Set ExamOfficeLabelName -> AForm m CsvOptions -csvOptionsForm mPrev = hoistAForm liftHandler $ CsvOptions +csvOptionsForm mPrev (Set.toList -> exportLabels) = hoistAForm liftHandler $ CsvOptions <$> csvFormatOptionsForm (fslI MsgCsvFormatOptions & setTooltip MsgCsvOptionsTip) (csvFormat <$> mPrev) <*> apopt checkBoxField (fslI MsgCsvTimestamp & setTooltip MsgCsvTimestampTip) (csvTimestamp <$> mPrev) + <*> bool (aopt (selectField $ return exportLabelOptions) (fslI MsgCsvExportLabel & setTooltip MsgCsvExportLabelTip) (csvExportLabel <$> mPrev)) (pure Nothing) (null exportLabels) + where + exportLabelOptions = mkOptionList $ exportLabels <&> \exportLabel -> Option + { optionDisplay = exportLabel + , optionInternalValue = exportLabel + , optionExternalValue = exportLabel + } courseSelectForm :: forall ident handler. diff --git a/src/Model/Types/Csv.hs b/src/Model/Types/Csv.hs index 88f183de9..ca7ec802b 100644 --- a/src/Model/Types/Csv.hs +++ b/src/Model/Types/Csv.hs @@ -51,8 +51,9 @@ nullaryPathPiece ''Quoting $ \q -> if data CsvOptions = CsvOptions - { csvFormat :: CsvFormatOptions - , csvTimestamp :: Bool + { csvFormat :: CsvFormatOptions + , csvTimestamp :: Bool + , csvExportLabel :: Maybe Text } deriving (Eq, Ord, Read, Show, Generic, Typeable) deriving anyclass (Hashable, NFData) @@ -73,8 +74,9 @@ makeLenses_ ''CsvFormatOptions instance Default CsvOptions where def = CsvOptions - { csvFormat = def - , csvTimestamp = False + { csvFormat = def + , csvTimestamp = False + , csvExportLabel = Nothing } instance Default CsvFormatOptions where @@ -128,14 +130,16 @@ _CsvEncodeOptions = prism' fromEncode toEncode instance ToJSON CsvOptions where toJSON CsvOptions{..} = JSON.object - [ "format" JSON..= csvFormat - , "timestamp" JSON..= csvTimestamp + [ "format" JSON..= csvFormat + , "timestamp" JSON..= csvTimestamp + , "export-label" JSON..= csvExportLabel ] instance FromJSON CsvOptions where parseJSON = JSON.withObject "CsvOptions" $ \o -> do - csvFormat <- o JSON..:? "format" JSON..!= csvFormat def - csvTimestamp <- o JSON..:? "timestamp" JSON..!= csvTimestamp def + csvFormat <- o JSON..:? "format" JSON..!= csvFormat def + csvTimestamp <- o JSON..:? "timestamp" JSON..!= csvTimestamp def + csvExportLabel <- o JSON..:? "export-label" JSON..!= csvExportLabel def return CsvOptions{..} data CsvFormat = FormatCsv | FormatXlsx