Mino
This commit is contained in:
parent
a3d22baa5b
commit
b0732ae6c6
@ -550,8 +550,11 @@ postCorrectionR tid ssh csh shn cid = do
|
|||||||
uid <- requireAuthId
|
uid <- requireAuthId
|
||||||
|
|
||||||
void . runDBJobs . runConduit $ transPipe (lift . lift) fileUploads .| extractRatingsMsg .| sinkSubmission uid (Right sub) True
|
void . runDBJobs . runConduit $ transPipe (lift . lift) fileUploads .| extractRatingsMsg .| sinkSubmission uid (Right sub) True
|
||||||
|
{-case res of
|
||||||
|
(Left _) -> addMessageI Success MsgRatingFilesUpdated
|
||||||
|
(Right RatingNotExpected) -> addMessageI Error MsgRatingNotExpected
|
||||||
|
(Right other) -> throw other-}
|
||||||
|
|
||||||
addMessageI Success MsgRatingFilesUpdated
|
|
||||||
redirect $ CSubmissionR tid ssh csh shn cid CorrectionR
|
redirect $ CSubmissionR tid ssh csh shn cid CorrectionR
|
||||||
|
|
||||||
mr <- getMessageRender
|
mr <- getMessageRender
|
||||||
|
|||||||
@ -3,7 +3,7 @@ module Handler.Utils.Submission
|
|||||||
, assignSubmissions
|
, assignSubmissions
|
||||||
, submissionBlacklist, filterSubmission, extractRatings, extractRatingsMsg
|
, submissionBlacklist, filterSubmission, extractRatings, extractRatingsMsg
|
||||||
, submissionFileSource, submissionFileQuery
|
, submissionFileSource, submissionFileQuery
|
||||||
, submissionMultiArchive
|
, submissionMultiArchive
|
||||||
, SubmissionSinkException(..)
|
, SubmissionSinkException(..)
|
||||||
, sinkSubmission, sinkMultiSubmission
|
, sinkSubmission, sinkMultiSubmission
|
||||||
, submissionMatchesSheet
|
, submissionMatchesSheet
|
||||||
@ -142,9 +142,9 @@ assignSubmissions sid restriction = do
|
|||||||
wholeProps = Map.fromList [ ( sheetCorrectorUser, round $ byProportion * fromInteger lcd ) | Entity _ SheetCorrector{ sheetCorrectorLoad = Load{..}, .. } <- corrsProp ]
|
wholeProps = Map.fromList [ ( sheetCorrectorUser, round $ byProportion * fromInteger lcd ) | Entity _ SheetCorrector{ sheetCorrectorLoad = Load{..}, .. } <- corrsProp ]
|
||||||
detQueueLength = fromIntegral (Map.size $ Map.filter (\tuts -> all countsToLoad' tuts) subTutor') - sum deficit
|
detQueueLength = fromIntegral (Map.size $ Map.filter (\tuts -> all countsToLoad' tuts) subTutor') - sum deficit
|
||||||
detQueue = concat . List.genericReplicate (detQueueLength `div` sum wholeProps) . concatMap (uncurry $ flip List.genericReplicate) $ Map.toList wholeProps
|
detQueue = concat . List.genericReplicate (detQueueLength `div` sum wholeProps) . concatMap (uncurry $ flip List.genericReplicate) $ Map.toList wholeProps
|
||||||
|
|
||||||
$logDebugS "assignSubmissions" $ "Deterministic Queue: " <> tshow detQueue
|
$logDebugS "assignSubmissions" $ "Deterministic Queue: " <> tshow detQueue
|
||||||
|
|
||||||
queue <- liftIO . Rand.evalRandIO . execWriterT $ do
|
queue <- liftIO . Rand.evalRandIO . execWriterT $ do
|
||||||
tell $ map Just detQueue
|
tell $ map Just detQueue
|
||||||
forever $
|
forever $
|
||||||
@ -162,11 +162,11 @@ assignSubmissions sid restriction = do
|
|||||||
|
|
||||||
maximumDeficit :: (MonadState (_a, _b, Map UserId Integer) m, MonadIO m) => m (Maybe UserId)
|
maximumDeficit :: (MonadState (_a, _b, Map UserId Integer) m, MonadIO m) => m (Maybe UserId)
|
||||||
maximumDeficit = do
|
maximumDeficit = do
|
||||||
transposed <- uses _3 invertMap
|
transposed <- uses _3 invertMap
|
||||||
traverse (liftIO . Rand.evalRandIO . Rand.uniform . snd) (Map.lookupMax transposed)
|
traverse (liftIO . Rand.evalRandIO . Rand.uniform . snd) (Map.lookupMax transposed)
|
||||||
|
|
||||||
subTutor'' <- liftIO . Rand.evalRandIO . Rand.shuffleM $ Map.toList subTutor'
|
subTutor'' <- liftIO . Rand.evalRandIO . Rand.shuffleM $ Map.toList subTutor'
|
||||||
|
|
||||||
subTutor <- fmap (view _1) . flip execStateT (Map.empty, queue, deficit) . forM_ subTutor'' $ \(smid, tuts) -> do
|
subTutor <- fmap (view _1) . flip execStateT (Map.empty, queue, deficit) . forM_ subTutor'' $ \(smid, tuts) -> do
|
||||||
let
|
let
|
||||||
restrictTuts
|
restrictTuts
|
||||||
@ -177,7 +177,7 @@ assignSubmissions sid restriction = do
|
|||||||
Just q' -> do
|
Just q' -> do
|
||||||
$logDebugS "assignSubmissions" $ tshow smid <> " -> " <> tshow q' <> " (byDeficit)"
|
$logDebugS "assignSubmissions" $ tshow smid <> " -> " <> tshow q' <> " (byDeficit)"
|
||||||
assignSubmission False smid q'
|
assignSubmission False smid q'
|
||||||
Nothing
|
Nothing
|
||||||
| Set.null tuts -> do
|
| Set.null tuts -> do
|
||||||
q <- preuse $ _2 . _head . _Just
|
q <- preuse $ _2 . _head . _Just
|
||||||
case q of
|
case q of
|
||||||
@ -194,7 +194,7 @@ assignSubmissions sid restriction = do
|
|||||||
forM_ (Map.toList subTutor) $
|
forM_ (Map.toList subTutor) $
|
||||||
\(smid, tutid) -> update smid [ SubmissionRatingBy =. Just tutid
|
\(smid, tutid) -> update smid [ SubmissionRatingBy =. Just tutid
|
||||||
, SubmissionRatingAssigned =. Just now ]
|
, SubmissionRatingAssigned =. Just now ]
|
||||||
|
|
||||||
let assignedSubmissions = Map.keysSet subTutor
|
let assignedSubmissions = Map.keysSet subTutor
|
||||||
unassigendSubmissions = Map.keysSet subTutor' \\ assignedSubmissions
|
unassigendSubmissions = Map.keysSet subTutor' \\ assignedSubmissions
|
||||||
return (assignedSubmissions, unassigendSubmissions)
|
return (assignedSubmissions, unassigendSubmissions)
|
||||||
@ -222,7 +222,7 @@ submissionMultiArchive (Set.toList -> ids) = do
|
|||||||
ratedSubmissions <- runDBRunner dbrunner $ do
|
ratedSubmissions <- runDBRunner dbrunner $ do
|
||||||
submissions <- selectList [ SubmissionId <-. ids ] []
|
submissions <- selectList [ SubmissionId <-. ids ] []
|
||||||
forM submissions $ \s@(Entity submissionId _) -> maybe (invalidArgs ["Invalid submission numbers"]) (return . (, s)) =<< getRating submissionId
|
forM submissions $ \s@(Entity submissionId _) -> maybe (invalidArgs ["Invalid submission numbers"]) (return . (, s)) =<< getRating submissionId
|
||||||
|
|
||||||
(<* cleanup) . respondSource "application/zip" . transPipe (runDBRunner dbrunner) $ do
|
(<* cleanup) . respondSource "application/zip" . transPipe (runDBRunner dbrunner) $ do
|
||||||
let
|
let
|
||||||
fileEntitySource' :: (Rating, Entity Submission) -> Source (YesodDB UniWorX) File
|
fileEntitySource' :: (Rating, Entity Submission) -> Source (YesodDB UniWorX) File
|
||||||
@ -231,7 +231,7 @@ submissionMultiArchive (Set.toList -> ids) = do
|
|||||||
|
|
||||||
let
|
let
|
||||||
directoryName = Text.unpack $ toPathPiece (cID :: CryptoFileNameSubmission)
|
directoryName = Text.unpack $ toPathPiece (cID :: CryptoFileNameSubmission)
|
||||||
|
|
||||||
fileEntitySource = do
|
fileEntitySource = do
|
||||||
submissionFileSource submissionID =$= Conduit.map entityVal
|
submissionFileSource submissionID =$= Conduit.map entityVal
|
||||||
yieldM (ratingFile cID rating)
|
yieldM (ratingFile cID rating)
|
||||||
@ -249,7 +249,7 @@ submissionMultiArchive (Set.toList -> ids) = do
|
|||||||
}
|
}
|
||||||
|
|
||||||
fileEntitySource =$= mapC withinDirectory
|
fileEntitySource =$= mapC withinDirectory
|
||||||
|
|
||||||
mapM_ fileEntitySource' ratedSubmissions =$= produceZip def =$= Conduit.map toFlushBuilder
|
mapM_ fileEntitySource' ratedSubmissions =$= produceZip def =$= Conduit.map toFlushBuilder
|
||||||
|
|
||||||
|
|
||||||
@ -374,7 +374,7 @@ sinkSubmission userId mExists isUpdate = do
|
|||||||
| not (null underlyingFiles) = all (~~ file) [ f | (Entity _ f, Entity _ _sf) <- underlyingFiles ]
|
| not (null underlyingFiles) = all (~~ file) [ f | (Entity _ f, Entity _ _sf) <- underlyingFiles ]
|
||||||
| otherwise = False
|
| otherwise = False
|
||||||
undoneDeletion = any submissionFileIsDeletion [ sf | (_, Entity _ sf) <- collidingFiles ]
|
undoneDeletion = any submissionFileIsDeletion [ sf | (_, Entity _ sf) <- collidingFiles ]
|
||||||
|
|
||||||
when anyChanges $ do
|
when anyChanges $ do
|
||||||
touchSubmission
|
touchSubmission
|
||||||
when (not $ null collidingFiles) $
|
when (not $ null collidingFiles) $
|
||||||
@ -394,14 +394,14 @@ sinkSubmission userId mExists isUpdate = do
|
|||||||
when undoneDeletion $ do
|
when undoneDeletion $ do
|
||||||
touchSubmission
|
touchSubmission
|
||||||
lift $ deleteWhere [ SubmissionFileId <-. [ sfId | (_, Entity sfId sf) <- collidingFiles, submissionFileIsDeletion sf ] ]
|
lift $ deleteWhere [ SubmissionFileId <-. [ sfId | (_, Entity sfId sf) <- collidingFiles, submissionFileIsDeletion sf ] ]
|
||||||
|
|
||||||
Right (submissionId', r'@Rating'{..}) -> do
|
Right (submissionId', r'@Rating'{..}) -> do
|
||||||
$logDebugS "sinkSubmission" $ tshow submissionId'
|
$logDebugS "sinkSubmission" $ tshow submissionId'
|
||||||
|
|
||||||
unless (submissionId' == submissionId) $ do
|
unless (submissionId' == submissionId) $ do
|
||||||
cID <- encrypt submissionId'
|
cID <- encrypt submissionId'
|
||||||
throwM $ ForeignRating cID
|
throwM $ ForeignRating cID
|
||||||
|
|
||||||
alreadySeen <- gets $ getAny . sinkSeenRating
|
alreadySeen <- gets $ getAny . sinkSeenRating
|
||||||
when alreadySeen $ throwM DuplicateRating
|
when alreadySeen $ throwM DuplicateRating
|
||||||
tellSt $ mempty{ sinkSeenRating = Any True }
|
tellSt $ mempty{ sinkSeenRating = Any True }
|
||||||
@ -410,19 +410,20 @@ sinkSubmission userId mExists isUpdate = do
|
|||||||
|
|
||||||
Submission{..} <- lift $ getJust submissionId
|
Submission{..} <- lift $ getJust submissionId
|
||||||
|
|
||||||
let anyChanges = or $
|
let anyChanges = or $
|
||||||
[ submissionRatingPoints /= ratingPoints
|
[ submissionRatingPoints /= ratingPoints
|
||||||
, submissionRatingComment /= ratingComment
|
, submissionRatingComment /= ratingComment
|
||||||
]
|
]
|
||||||
-- 'ratingTime' is ignored for consistency with 'File's:
|
-- 'ratingTime' is ignored for consistency with 'File's:
|
||||||
--
|
--
|
||||||
-- 'fileModified' is simply stored and never inspected while
|
-- 'fileModified' is simply stored and never inspected while
|
||||||
-- 'submissionChanged' is always set to @now@.
|
-- 'submissionChanged' is always set to @now@.
|
||||||
when anyChanges $ do
|
when anyChanges $ do
|
||||||
|
|
||||||
Sheet{..} <- lift $ getJust submissionSheet
|
Sheet{..} <- lift $ getJust submissionSheet
|
||||||
mapM_ throwM $ validateRating sheetType r'
|
--TODO: should display errorMessages
|
||||||
|
mapM_ throwM $ validateRating sheetType r'
|
||||||
|
|
||||||
touchSubmission
|
touchSubmission
|
||||||
lift $ update submissionId
|
lift $ update submissionId
|
||||||
[ SubmissionRatingPoints =. ratingPoints
|
[ SubmissionRatingPoints =. ratingPoints
|
||||||
@ -514,7 +515,7 @@ data SubmissionMultiSinkException
|
|||||||
{ _submissionSinkId :: CryptoFileNameSubmission
|
{ _submissionSinkId :: CryptoFileNameSubmission
|
||||||
, _submissionSinkFedFile :: Maybe FilePath
|
, _submissionSinkFedFile :: Maybe FilePath
|
||||||
, _submissionSinkException :: SubmissionSinkException
|
, _submissionSinkException :: SubmissionSinkException
|
||||||
}
|
}
|
||||||
deriving (Typeable, Show)
|
deriving (Typeable, Show)
|
||||||
|
|
||||||
instance Exception SubmissionMultiSinkException
|
instance Exception SubmissionMultiSinkException
|
||||||
@ -522,7 +523,7 @@ instance Exception SubmissionMultiSinkException
|
|||||||
sinkMultiSubmission :: UserId
|
sinkMultiSubmission :: UserId
|
||||||
-> Bool {-^ Are these corrections -}
|
-> Bool {-^ Are these corrections -}
|
||||||
-> Sink SubmissionContent (YesodJobDB UniWorX) (Set SubmissionId)
|
-> Sink SubmissionContent (YesodJobDB UniWorX) (Set SubmissionId)
|
||||||
|
|
||||||
-- ^ Expects all supplied 'SubmissionContent' to contain an encrypted 'SubmissionId' and replaces the currently saved files for the respective submissions (either corrected files or original ones, depending on arguments) with the supplied 'SubmissionContent'.
|
-- ^ Expects all supplied 'SubmissionContent' to contain an encrypted 'SubmissionId' and replaces the currently saved files for the respective submissions (either corrected files or original ones, depending on arguments) with the supplied 'SubmissionContent'.
|
||||||
--
|
--
|
||||||
-- Files that don't occur in the 'SubmissionContent' but are in the database are deleted (or marked as deleted in the case of this being a correction).
|
-- Files that don't occur in the 'SubmissionContent' but are in the database are deleted (or marked as deleted in the case of this being a correction).
|
||||||
@ -545,7 +546,7 @@ sinkMultiSubmission userId isUpdate = do
|
|||||||
Nothing -> do
|
Nothing -> do
|
||||||
lift $ do
|
lift $ do
|
||||||
cID <- encrypt sId
|
cID <- encrypt sId
|
||||||
$(logDebugS) "sinkMultiSubmission" $ "Doing auth checks for " <> toPathPiece cID
|
$(logDebugS) "sinkMultiSubmission" $ "Doing auth checks for " <> toPathPiece cID
|
||||||
Submission{..} <- get404 sId
|
Submission{..} <- get404 sId
|
||||||
Sheet{..} <- get404 submissionSheet
|
Sheet{..} <- get404 submissionSheet
|
||||||
Course{..} <- get404 sheetCourse
|
Course{..} <- get404 sheetCourse
|
||||||
@ -595,7 +596,7 @@ sinkMultiSubmission userId isUpdate = do
|
|||||||
handleHCError _ e = throwM e
|
handleHCError _ e = throwM e
|
||||||
handleCryptoID :: CryptoIDError -> _ (Maybe a)
|
handleCryptoID :: CryptoIDError -> _ (Maybe a)
|
||||||
handleCryptoID _ = return Nothing
|
handleCryptoID _ = return Nothing
|
||||||
|
|
||||||
|
|
||||||
submissionMatchesSheet :: TermId -> SchoolId -> CourseShorthand -> SheetName -> CryptoFileNameSubmission -> DB SubmissionId
|
submissionMatchesSheet :: TermId -> SchoolId -> CourseShorthand -> SheetName -> CryptoFileNameSubmission -> DB SubmissionId
|
||||||
submissionMatchesSheet tid ssh csh shn cid = do
|
submissionMatchesSheet tid ssh csh shn cid = do
|
||||||
|
|||||||
@ -46,7 +46,7 @@ writeJobCtlBlock cmd = do
|
|||||||
return var
|
return var
|
||||||
lift $ writeJobCtl cmd
|
lift $ writeJobCtl cmd
|
||||||
let
|
let
|
||||||
removeResVar = HashMap.update (NonEmpty.nonEmpty . NonEmpty.filter (/= resVar)) cmd
|
removeResVar = HashMap.update (NonEmpty.nonEmpty . NonEmpty.filter (/= resVar)) cmd
|
||||||
mExc <- liftIO . atomically $ takeTMVar resVar <* modifyTVar' getResVar removeResVar
|
mExc <- liftIO . atomically $ takeTMVar resVar <* modifyTVar' getResVar removeResVar
|
||||||
maybe (return ()) throwM mExc
|
maybe (return ()) throwM mExc
|
||||||
|
|
||||||
@ -77,7 +77,8 @@ type YesodJobDB site = ReaderT (YesodPersistBackend site) (WriterT (Set QueuedJo
|
|||||||
queueDBJob :: Job -> ReaderT (YesodPersistBackend UniWorX) (WriterT (Set QueuedJobId) (HandlerT UniWorX IO)) ()
|
queueDBJob :: Job -> ReaderT (YesodPersistBackend UniWorX) (WriterT (Set QueuedJobId) (HandlerT UniWorX IO)) ()
|
||||||
queueDBJob job = mapReaderT lift (queueJobUnsafe job) >>= tell . Set.singleton
|
queueDBJob job = mapReaderT lift (queueJobUnsafe job) >>= tell . Set.singleton
|
||||||
|
|
||||||
runDBJobs :: (MonadHandler m, HandlerSite m ~ UniWorX) => ReaderT (YesodPersistBackend UniWorX) (WriterT (Set QueuedJobId) (HandlerT UniWorX IO)) a -> m a
|
runDBJobs :: (MonadHandler m, HandlerSite m ~ UniWorX)
|
||||||
|
=> ReaderT (YesodPersistBackend UniWorX) (WriterT (Set QueuedJobId) (HandlerT UniWorX IO)) a -> m a
|
||||||
runDBJobs act = do
|
runDBJobs act = do
|
||||||
(ret, jIds) <- liftHandlerT . runDB $ mapReaderT runWriterT act
|
(ret, jIds) <- liftHandlerT . runDB $ mapReaderT runWriterT act
|
||||||
forM_ jIds $ writeJobCtl . JobCtlPerform
|
forM_ jIds $ writeJobCtl . JobCtlPerform
|
||||||
|
|||||||
Reference in New Issue
Block a user