Statistik für Übungsblätter
This commit is contained in:
parent
bd2b9333e8
commit
85b57654a5
@ -236,7 +236,7 @@ getSheetListR tid csh = do
|
|||||||
, ( "rating"
|
, ( "rating"
|
||||||
, SortColumn $ \(_ `E.LeftOuterJoin` (submission `E.InnerJoin` submissionUser)) -> submission E.?. SubmissionRatingPoints
|
, SortColumn $ \(_ `E.LeftOuterJoin` (submission `E.InnerJoin` submissionUser)) -> submission E.?. SubmissionRatingPoints
|
||||||
)
|
)
|
||||||
-- GitLab Issue $1??:
|
-- GitLab Issue $1??: HOW TO SORT?
|
||||||
-- , ( "percent"
|
-- , ( "percent"
|
||||||
-- , SortColumn $ \(sheet `E.LeftOuterJoin` (submission `E.InnerJoin` ))) ->
|
-- , SortColumn $ \(sheet `E.LeftOuterJoin` (submission `E.InnerJoin` ))) ->
|
||||||
-- case sheetType of -- no Haskell inside Esqueleto, right?
|
-- case sheetType of -- no Haskell inside Esqueleto, right?
|
||||||
@ -248,12 +248,22 @@ getSheetListR tid csh = do
|
|||||||
, dbtStyle = def
|
, dbtStyle = def
|
||||||
, dbtIdent = "sheets" :: Text
|
, dbtIdent = "sheets" :: Text
|
||||||
}
|
}
|
||||||
-- stats <- runDB $ do
|
cTime <- Just <$> liftIO getCurrentTime -- TODO: remove me, see issue #???
|
||||||
-- <- E.select $ E.from $
|
rawStats <- runDB $ do
|
||||||
--
|
E.select $ E.from $ \(sheet `E.LeftOuterJoin` (submission `E.InnerJoin` submissionUser)) -> do
|
||||||
|
E.on $ submission E.?. SubmissionId E.==. submissionUser E.?. SubmissionUserSubmission
|
||||||
|
E.on $ (E.just $ sheet E.^. SheetId) E.==. submission E.?. SubmissionSheet
|
||||||
|
E.&&. submissionUser E.?. SubmissionUserUser E.==. E.val muid
|
||||||
|
E.where_ $ sheet E.^. SheetCourse E.==. E.val cid
|
||||||
|
E.&&. (E.not_ $ E.isNothing $ sheet E.^. SheetVisibleFrom)
|
||||||
|
E.&&. sheet E.^. SheetVisibleFrom E.<=. E.val cTime
|
||||||
|
return $ (sheet E.^. SheetType, submission E.?. SubmissionRatingPoints)
|
||||||
|
|
||||||
|
let sheetTypeSummary = foldl' sumSheetTypes emptySheetTypeSummary
|
||||||
|
$ map (\(st,mp) -> (E.unValue st, join $ E.unValue mp)) rawStats
|
||||||
defaultLayout $ do
|
defaultLayout $ do
|
||||||
$(widgetFile "sheetList")
|
$(widgetFile "sheetList")
|
||||||
|
$(widgetFile "widgets/sheetTypeSummary")
|
||||||
|
|
||||||
-- Show single sheet
|
-- Show single sheet
|
||||||
getSShowR :: TermId -> CourseShorthand -> SheetName -> Handler Html
|
getSShowR :: TermId -> CourseShorthand -> SheetName -> Handler Html
|
||||||
|
|||||||
@ -76,6 +76,32 @@ instance DisplayAble SheetType where
|
|||||||
deriveJSON defaultOptions ''SheetType
|
deriveJSON defaultOptions ''SheetType
|
||||||
derivePersistFieldJSON "SheetType"
|
derivePersistFieldJSON "SheetType"
|
||||||
|
|
||||||
|
data SheetTypeSummary = SheetTypeSummary
|
||||||
|
{ sumBonusPoints :: Points
|
||||||
|
, sumNormalPoints :: Points
|
||||||
|
, numPassSheets :: Int
|
||||||
|
, numNotGraded :: Int
|
||||||
|
, achievedBonus :: Maybe Points
|
||||||
|
, achievedNormal :: Maybe Points
|
||||||
|
, achievedPasses :: Maybe Int
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
emptySheetTypeSummary :: SheetTypeSummary
|
||||||
|
emptySheetTypeSummary = SheetTypeSummary 0 0 0 0 Nothing Nothing Nothing
|
||||||
|
|
||||||
|
-- TODO: refactor with lenses!
|
||||||
|
sumSheetTypes :: SheetTypeSummary -> (SheetType, Maybe Points) -> SheetTypeSummary
|
||||||
|
sumSheetTypes sts@(SheetTypeSummary {..}) (Bonus {..}, achieved)
|
||||||
|
= sts{ sumBonusPoints =sumBonusPoints +maxPoints, achievedBonus = maybeAdd achievedBonus achieved }
|
||||||
|
sumSheetTypes sts@(SheetTypeSummary {..}) (Normal {..}, achieved)
|
||||||
|
= sts{ sumNormalPoints=sumNormalPoints+maxPoints, achievedNormal = maybeAdd achievedNormal achieved }
|
||||||
|
sumSheetTypes sts@(SheetTypeSummary {..}) (Pass {..}, achieved)
|
||||||
|
= sts{ numPassSheets=numPassSheets+1, achievedPasses = maybeAdd achievedPasses (bool 0 1 <$> (passingPoints <=) <$> achieved) }
|
||||||
|
sumSheetTypes sts@(SheetTypeSummary {..}) (NotGraded, _achieved)
|
||||||
|
= sts{ numNotGraded=numNotGraded+1 }
|
||||||
|
|
||||||
|
|
||||||
data SheetGroup
|
data SheetGroup
|
||||||
= Arbitrary { maxParticipants :: Int }
|
= Arbitrary { maxParticipants :: Int }
|
||||||
| RegisteredGroups
|
| RegisteredGroups
|
||||||
|
|||||||
@ -224,6 +224,11 @@ toMaybe :: Bool -> a -> Maybe a
|
|||||||
toMaybe True = Just
|
toMaybe True = Just
|
||||||
toMaybe False = const Nothing
|
toMaybe False = const Nothing
|
||||||
|
|
||||||
|
maybeAdd :: Num a => Maybe a -> Maybe a -> Maybe a -- treats Nothing as neutral/zero, unlike fmap
|
||||||
|
maybeAdd (Just x) (Just y) = Just (x + y)
|
||||||
|
maybeAdd Nothing y = y
|
||||||
|
maybeAdd x Nothing = x
|
||||||
|
|
||||||
maybeEmpty :: Monoid m => Maybe a -> (a -> m) -> m
|
maybeEmpty :: Monoid m => Maybe a -> (a -> m) -> m
|
||||||
maybeEmpty (Just x) f = f x
|
maybeEmpty (Just x) f = f x
|
||||||
maybeEmpty Nothing _ = mempty
|
maybeEmpty Nothing _ = mempty
|
||||||
|
|||||||
Reference in New Issue
Block a user