feat(submission-list): bulk download submission originals

Fixes #707
This commit is contained in:
Gregor Kleen 2021-06-03 10:59:02 +02:00
parent adcd5d5aee
commit d7f2d11392
8 changed files with 39 additions and 30 deletions

View File

@ -191,3 +191,5 @@ SubmissionDoneNever: Nie
SubmissionDoneByFile: Je nach Bewertungsdatei SubmissionDoneByFile: Je nach Bewertungsdatei
SubmissionDoneAlways: Immer SubmissionDoneAlways: Immer
SheetGroupNoGroups: Keine Gruppenabgabe SheetGroupNoGroups: Keine Gruppenabgabe
CorrDownloadVersion !ident-ok: Version

View File

@ -190,3 +190,5 @@ SubmissionDoneNever: Never
SubmissionDoneByFile: According to correction file SubmissionDoneByFile: According to correction file
SubmissionDoneAlways: Always SubmissionDoneAlways: Always
SheetGroupNoGroups: No group submission SheetGroupNoGroups: No group submission
CorrDownloadVersion !ident-ok: Version

View File

@ -65,12 +65,7 @@ subArchiveSource tid ssh csh shn cID sfType = maybeT_ $ do
submissionID <- lift $ submissionMatchesSheet tid ssh csh shn cID submissionID <- lift $ submissionMatchesSheet tid ssh csh shn cID
rating <- lift $ getRating submissionID rating <- lift $ getRating submissionID
case sfType of E.selectSource (E.from $ submissionFileQuery submissionID sfType) .| Conduit.map (Left . entityVal)
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)
when (sfType == SubmissionCorrected) $ when (sfType == SubmissionCorrected) $
maybe (return ()) (yieldM . fmap Right . ratingFile cID) rating maybe (return ()) (yieldM . fmap Right . ratingFile cID) rating
@ -96,4 +91,4 @@ getCorrectionsDownloadR = do -- download all assigned and open submissions
when (null subs) $ do when (null subs) $ do
addMessageI Info MsgNoOpenSubmissions addMessageI Info MsgNoOpenSubmissions
redirect CorrectionsR redirect CorrectionsR
submissionMultiArchive SubmissionDownloadAnonymous $ Set.fromList subs submissionMultiArchive SubmissionDownloadAnonymous SubmissionCorrected $ Set.fromList subs

View File

@ -442,7 +442,7 @@ instance Finite ActionCorrections
nullaryPathPiece ''ActionCorrections $ camelToPathPiece' 1 nullaryPathPiece ''ActionCorrections $ camelToPathPiece' 1
embedRenderMessage ''UniWorX ''ActionCorrections id embedRenderMessage ''UniWorX ''ActionCorrections id
data ActionCorrectionsData = CorrDownloadData SubmissionDownloadAnonymous data ActionCorrectionsData = CorrDownloadData SubmissionDownloadAnonymous SubmissionFileType
| CorrSetCorrectorData (Maybe UserId) | CorrSetCorrectorData (Maybe UserId)
| CorrAutoSetCorrectorData SheetId | CorrAutoSetCorrectorData SheetId
| CorrDeleteData | CorrDeleteData
@ -491,11 +491,11 @@ correctionsR' whereClause displayColumns dbtFilterUI psValidator actions = do
auditAllSubEdit = mapM_ $ \sId -> getJust sId >>= \sub -> audit $ TransactionSubmissionEdit sId $ sub ^. _submissionSheet auditAllSubEdit = mapM_ $ \sId -> getJust sId >>= \sub -> audit $ TransactionSubmissionEdit sId $ sub ^. _submissionSheet
formResult actionRes $ \case formResult actionRes $ \case
(CorrDownloadData nonAnonymous, subs) -> do (CorrDownloadData nonAnonymous sft, subs) -> do
ids <- Set.fromList <$> forM (Set.toList subs) decrypt -- Set is not traversable ids <- Set.fromList <$> forM (Set.toList subs) decrypt -- Set is not traversable
MsgRenderer mr <- getMsgRenderer MsgRenderer mr <- getMsgRenderer
setContentDisposition' $ Just ((addExtension `on` unpack) (mr MsgSubmissionArchiveName) extensionZip) setContentDisposition' $ Just ((addExtension `on` unpack) (mr MsgSubmissionArchiveName) extensionZip)
sendResponse =<< submissionMultiArchive nonAnonymous ids sendResponse =<< submissionMultiArchive nonAnonymous sft ids
(CorrSetCorrectorData (Just uid), subs') -> do (CorrSetCorrectorData (Just uid), subs') -> do
subs <- mapM decrypt $ Set.toList subs' subs <- mapM decrypt $ Set.toList subs'
now <- liftIO getCurrentTime now <- liftIO getCurrentTime
@ -616,7 +616,9 @@ type ActionCorrections' = (ActionCorrections, AForm (HandlerFor UniWorX) ActionC
downloadAction, deleteAction :: ActionCorrections' downloadAction, deleteAction :: ActionCorrections'
downloadAction = ( CorrDownload 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 deleteAction = ( CorrDelete
, pure CorrDeleteData , pure CorrDeleteData

View File

@ -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 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 :: SubmissionId -> SubmissionFileType -> ConduitT () DBFile (YesodDB UniWorX) ()
submissionFileSource subId = E.selectSource (E.from $ submissionFileQuery subId) submissionFileSource subId sft = E.selectSource (E.from $ submissionFileQuery subId sft)
.| C.map entityVal .| C.map entityVal
.| sourceFiles' .| sourceFiles'
submissionFileQuery :: SubmissionId -> E.SqlExpr (Entity SubmissionFile) submissionFileQuery :: SubmissionId -> SubmissionFileType
-> E.SqlExpr (Entity SubmissionFile)
-> E.SqlQuery (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_ $ sf E.^. SubmissionFileSubmission E.==. E.val submissionID
E.where_ . E.not_ . E.exists . E.from $ \sf' -> case sft of
E.where_ $ sf' E.^. SubmissionFileIsDeletion SubmissionOriginal ->
E.&&. sf' E.^. SubmissionFileSubmission E.==. sf E.^. SubmissionFileSubmission E.where_ . E.not_ $ sf E.^. SubmissionFileIsUpdate
E.&&. sf' E.^. SubmissionFileTitle E.==. sf E.^. SubmissionFileTitle E.||. sf E.^. SubmissionFileIsDeletion
E.orderBy [E.desc $ sf E.^. SubmissionFileIsUpdate] -- E.desc returns corrector updated data first 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 return sf
data SubmissionDownloadAnonymous = SubmissionDownloadAnonymous data SubmissionDownloadAnonymous = SubmissionDownloadAnonymous
@ -287,8 +293,8 @@ nullaryPathPiece ''SubmissionDownloadAnonymous $ camelToPathPiece' 2
embedRenderMessage ''UniWorX ''SubmissionDownloadAnonymous id embedRenderMessage ''UniWorX ''SubmissionDownloadAnonymous id
makePrisms ''SubmissionDownloadAnonymous makePrisms ''SubmissionDownloadAnonymous
submissionMultiArchive :: SubmissionDownloadAnonymous -> Set SubmissionId -> Handler TypedContent submissionMultiArchive :: SubmissionDownloadAnonymous -> SubmissionFileType -> Set SubmissionId -> Handler TypedContent
submissionMultiArchive anonymous (Set.toList -> ids) = do submissionMultiArchive anonymous sft (Set.toList -> ids) = do
(dbrunner, cleanup) <- getDBRunner (dbrunner, cleanup) <- getDBRunner
ratedSubmissions <- runDBRunner dbrunner $ do ratedSubmissions <- runDBRunner dbrunner $ do
@ -376,7 +382,7 @@ submissionMultiArchive anonymous (Set.toList -> ids) = do
fileEntitySource = do fileEntitySource = do
yieldM $ ratingFile cID rating yieldM $ ratingFile cID rating
submissionFileSource submissionID submissionFileSource submissionID sft
withinDirectory f@File{..} = f { fileTitle = directoryName </> fileTitle } withinDirectory f@File{..} = f { fileTitle = directoryName </> fileTitle }

View File

@ -31,9 +31,7 @@ import Data.Text.Metrics (damerauLevenshtein)
data SubmissionFileType = SubmissionOriginal | SubmissionCorrected data SubmissionFileType = SubmissionOriginal | SubmissionCorrected
deriving (Show, Read, Eq, Ord, Enum, Bounded, Generic) deriving (Show, Read, Eq, Ord, Enum, Bounded, Generic)
deriving anyclass (Universe, Finite)
instance Universe SubmissionFileType
instance Finite SubmissionFileType
nullaryPathPiece ''SubmissionFileType $ camelToPathPiece' 1 nullaryPathPiece ''SubmissionFileType $ camelToPathPiece' 1

View File

@ -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.

View File

@ -0,0 +1,2 @@
$newline never
When bulk downloading submissions there now is a setting to choose between the original and corrected versions.