From d7f2d113929f9dc11291d6db916c8944ae158c3b Mon Sep 17 00:00:00 2001 From: Gregor Kleen Date: Thu, 3 Jun 2021 10:59:02 +0200 Subject: [PATCH] feat(submission-list): bulk download submission originals Fixes #707 --- .../courses/submission/de-de-formal.msg | 4 ++- .../categories/courses/submission/en-eu.msg | 4 ++- src/Handler/Submission/Download.hs | 9 ++--- src/Handler/Submission/List.hs | 10 +++--- src/Handler/Utils/Submission.hs | 34 +++++++++++-------- src/Model/Types/Submission.hs | 4 +-- ...d-original-submissions.de-de-formal.hamlet | 2 ++ ...download-original-submissions.en-eu.hamlet | 2 ++ 8 files changed, 39 insertions(+), 30 deletions(-) create mode 100644 templates/i18n/changelog/bulk-download-original-submissions.de-de-formal.hamlet create mode 100644 templates/i18n/changelog/bulk-download-original-submissions.en-eu.hamlet diff --git a/messages/uniworx/categories/courses/submission/de-de-formal.msg b/messages/uniworx/categories/courses/submission/de-de-formal.msg index d869d66fe..d094355da 100644 --- a/messages/uniworx/categories/courses/submission/de-de-formal.msg +++ b/messages/uniworx/categories/courses/submission/de-de-formal.msg @@ -190,4 +190,6 @@ Deficit: Defizit SubmissionDoneNever: Nie SubmissionDoneByFile: Je nach Bewertungsdatei SubmissionDoneAlways: Immer -SheetGroupNoGroups: Keine Gruppenabgabe \ No newline at end of file +SheetGroupNoGroups: Keine Gruppenabgabe + +CorrDownloadVersion !ident-ok: Version \ No newline at end of file diff --git a/messages/uniworx/categories/courses/submission/en-eu.msg b/messages/uniworx/categories/courses/submission/en-eu.msg index 107999eae..a10d9e8de 100644 --- a/messages/uniworx/categories/courses/submission/en-eu.msg +++ b/messages/uniworx/categories/courses/submission/en-eu.msg @@ -189,4 +189,6 @@ Deficit: Deficit SubmissionDoneNever: Never SubmissionDoneByFile: According to correction file SubmissionDoneAlways: Always -SheetGroupNoGroups: No group submission \ No newline at end of file +SheetGroupNoGroups: No group submission + +CorrDownloadVersion !ident-ok: Version \ No newline at end of file diff --git a/src/Handler/Submission/Download.hs b/src/Handler/Submission/Download.hs index 59adad1c1..897fcf7d1 100644 --- a/src/Handler/Submission/Download.hs +++ b/src/Handler/Submission/Download.hs @@ -65,12 +65,7 @@ subArchiveSource tid ssh csh shn cID sfType = maybeT_ $ do submissionID <- lift $ submissionMatchesSheet tid ssh csh shn cID rating <- lift $ getRating submissionID - case sfType of - SubmissionOriginal -> (.| Conduit.map (Left . entityVal)) . E.selectSource . E.from $ \sf -> do - E.where_ $ sf E.^. SubmissionFileSubmission E.==. E.val submissionID - E.&&. sf E.^. SubmissionFileIsUpdate E.==. E.val False - return sf - _other -> E.selectSource (E.from $ submissionFileQuery submissionID) .| Conduit.map (Left . entityVal) + E.selectSource (E.from $ submissionFileQuery submissionID sfType) .| Conduit.map (Left . entityVal) when (sfType == SubmissionCorrected) $ maybe (return ()) (yieldM . fmap Right . ratingFile cID) rating @@ -96,4 +91,4 @@ getCorrectionsDownloadR = do -- download all assigned and open submissions when (null subs) $ do addMessageI Info MsgNoOpenSubmissions redirect CorrectionsR - submissionMultiArchive SubmissionDownloadAnonymous $ Set.fromList subs + submissionMultiArchive SubmissionDownloadAnonymous SubmissionCorrected $ Set.fromList subs diff --git a/src/Handler/Submission/List.hs b/src/Handler/Submission/List.hs index abae00689..c5296a64a 100644 --- a/src/Handler/Submission/List.hs +++ b/src/Handler/Submission/List.hs @@ -442,7 +442,7 @@ instance Finite ActionCorrections nullaryPathPiece ''ActionCorrections $ camelToPathPiece' 1 embedRenderMessage ''UniWorX ''ActionCorrections id -data ActionCorrectionsData = CorrDownloadData SubmissionDownloadAnonymous +data ActionCorrectionsData = CorrDownloadData SubmissionDownloadAnonymous SubmissionFileType | CorrSetCorrectorData (Maybe UserId) | CorrAutoSetCorrectorData SheetId | CorrDeleteData @@ -491,11 +491,11 @@ correctionsR' whereClause displayColumns dbtFilterUI psValidator actions = do auditAllSubEdit = mapM_ $ \sId -> getJust sId >>= \sub -> audit $ TransactionSubmissionEdit sId $ sub ^. _submissionSheet formResult actionRes $ \case - (CorrDownloadData nonAnonymous, subs) -> do + (CorrDownloadData nonAnonymous sft, subs) -> do ids <- Set.fromList <$> forM (Set.toList subs) decrypt -- Set is not traversable MsgRenderer mr <- getMsgRenderer setContentDisposition' $ Just ((addExtension `on` unpack) (mr MsgSubmissionArchiveName) extensionZip) - sendResponse =<< submissionMultiArchive nonAnonymous ids + sendResponse =<< submissionMultiArchive nonAnonymous sft ids (CorrSetCorrectorData (Just uid), subs') -> do subs <- mapM decrypt $ Set.toList subs' now <- liftIO getCurrentTime @@ -616,7 +616,9 @@ type ActionCorrections' = (ActionCorrections, AForm (HandlerFor UniWorX) ActionC downloadAction, deleteAction :: ActionCorrections' downloadAction = ( CorrDownload - , CorrDownloadData <$> apopt (selectField optionsFinite) (fslI MsgCorrDownloadAnonymous & setTooltip MsgCorrDownloadAnonymousTip) (Just SubmissionDownloadAnonymous) + , CorrDownloadData + <$> apopt (selectField optionsFinite) (fslI MsgCorrDownloadAnonymous & setTooltip MsgCorrDownloadAnonymousTip) (Just SubmissionDownloadAnonymous) + <*> apopt (selectField optionsFinite) (fslI MsgCorrDownloadVersion) (Just SubmissionCorrected) ) deleteAction = ( CorrDelete , pure CorrDeleteData diff --git a/src/Handler/Utils/Submission.hs b/src/Handler/Utils/Submission.hs index 7ce366355..ba94bde8f 100644 --- a/src/Handler/Utils/Submission.hs +++ b/src/Handler/Utils/Submission.hs @@ -260,20 +260,26 @@ planSubmissions sid restriction = do maximumsBy f xs = flip Set.filter xs $ \x -> maybe True (((==) `on` f) x . maximumBy (comparing f)) $ fromNullable xs -submissionFileSource :: SubmissionId -> ConduitT () DBFile (YesodDB UniWorX) () -submissionFileSource subId = E.selectSource (E.from $ submissionFileQuery subId) - .| C.map entityVal - .| sourceFiles' +submissionFileSource :: SubmissionId -> SubmissionFileType -> ConduitT () DBFile (YesodDB UniWorX) () +submissionFileSource subId sft = E.selectSource (E.from $ submissionFileQuery subId sft) + .| C.map entityVal + .| sourceFiles' -submissionFileQuery :: SubmissionId -> E.SqlExpr (Entity SubmissionFile) +submissionFileQuery :: SubmissionId -> SubmissionFileType + -> E.SqlExpr (Entity SubmissionFile) -> E.SqlQuery (E.SqlExpr (Entity SubmissionFile)) -submissionFileQuery submissionID sf = E.distinctOnOrderBy [E.asc $ sf E.^. SubmissionFileTitle] $ do +submissionFileQuery submissionID sft sf = E.distinctOnOrderBy [E.asc $ sf E.^. SubmissionFileTitle] $ do E.where_ $ sf E.^. SubmissionFileSubmission E.==. E.val submissionID - E.where_ . E.not_ . E.exists . E.from $ \sf' -> - E.where_ $ sf' E.^. SubmissionFileIsDeletion - E.&&. sf' E.^. SubmissionFileSubmission E.==. sf E.^. SubmissionFileSubmission - E.&&. sf' E.^. SubmissionFileTitle E.==. sf E.^. SubmissionFileTitle - E.orderBy [E.desc $ sf E.^. SubmissionFileIsUpdate] -- E.desc returns corrector updated data first + case sft of + SubmissionOriginal -> + E.where_ . E.not_ $ sf E.^. SubmissionFileIsUpdate + E.||. sf E.^. SubmissionFileIsDeletion + SubmissionCorrected -> do + E.where_ . E.not_ . E.exists . E.from $ \sf' -> + E.where_ $ sf' E.^. SubmissionFileIsDeletion + E.&&. sf' E.^. SubmissionFileSubmission E.==. sf E.^. SubmissionFileSubmission + E.&&. sf' E.^. SubmissionFileTitle E.==. sf E.^. SubmissionFileTitle + E.orderBy [E.desc $ sf E.^. SubmissionFileIsUpdate] -- E.desc returns corrector updated data first return sf data SubmissionDownloadAnonymous = SubmissionDownloadAnonymous @@ -287,8 +293,8 @@ nullaryPathPiece ''SubmissionDownloadAnonymous $ camelToPathPiece' 2 embedRenderMessage ''UniWorX ''SubmissionDownloadAnonymous id makePrisms ''SubmissionDownloadAnonymous -submissionMultiArchive :: SubmissionDownloadAnonymous -> Set SubmissionId -> Handler TypedContent -submissionMultiArchive anonymous (Set.toList -> ids) = do +submissionMultiArchive :: SubmissionDownloadAnonymous -> SubmissionFileType -> Set SubmissionId -> Handler TypedContent +submissionMultiArchive anonymous sft (Set.toList -> ids) = do (dbrunner, cleanup) <- getDBRunner ratedSubmissions <- runDBRunner dbrunner $ do @@ -376,7 +382,7 @@ submissionMultiArchive anonymous (Set.toList -> ids) = do fileEntitySource = do yieldM $ ratingFile cID rating - submissionFileSource submissionID + submissionFileSource submissionID sft withinDirectory f@File{..} = f { fileTitle = directoryName fileTitle } diff --git a/src/Model/Types/Submission.hs b/src/Model/Types/Submission.hs index 21fed7e4b..49dfd12ce 100644 --- a/src/Model/Types/Submission.hs +++ b/src/Model/Types/Submission.hs @@ -31,9 +31,7 @@ import Data.Text.Metrics (damerauLevenshtein) data SubmissionFileType = SubmissionOriginal | SubmissionCorrected deriving (Show, Read, Eq, Ord, Enum, Bounded, Generic) - -instance Universe SubmissionFileType -instance Finite SubmissionFileType + deriving anyclass (Universe, Finite) nullaryPathPiece ''SubmissionFileType $ camelToPathPiece' 1 diff --git a/templates/i18n/changelog/bulk-download-original-submissions.de-de-formal.hamlet b/templates/i18n/changelog/bulk-download-original-submissions.de-de-formal.hamlet new file mode 100644 index 000000000..5f3bbdf15 --- /dev/null +++ b/templates/i18n/changelog/bulk-download-original-submissions.de-de-formal.hamlet @@ -0,0 +1,2 @@ +$newline never +Es kann nun eingestellt werden, ob, beim Download mehrerer Abgaben, die (wmgl.) korrigierte oder die originale Version heruntergeladen werden soll. diff --git a/templates/i18n/changelog/bulk-download-original-submissions.en-eu.hamlet b/templates/i18n/changelog/bulk-download-original-submissions.en-eu.hamlet new file mode 100644 index 000000000..af6b24182 --- /dev/null +++ b/templates/i18n/changelog/bulk-download-original-submissions.en-eu.hamlet @@ -0,0 +1,2 @@ +$newline never +When bulk downloading submissions there now is a setting to choose between the original and corrected versions.