diff --git a/src/Utils/Schedule.hs b/src/Utils/Schedule.hs index 5c5ed4896..f9f58d746 100644 --- a/src/Utils/Schedule.hs +++ b/src/Utils/Schedule.hs @@ -42,16 +42,18 @@ fetchExamOccurrences :: MonadHandler m => Maybe UserId -> AuthTagActive -> UTCTi fetchExamOccurrences muid ata now = E.select $ E.from $ \(course `E.InnerJoin` exam `E.InnerJoin` examOccurrence) -> do E.on $ course E.^. CourseId E.==. exam E.^. ExamCourse E.on $ exam E.^. ExamId E.==. examOccurrence E.^. ExamOccurrenceExam - E.where_ $ isCourseLecturer muid ata (course E.^. CourseId) - E.||. ( mayViewCourse muid ata now course Nothing -- do NOT remove, this is actually necessary here! - -- (There can be exam participants that are - -- not enrolled, me thinks) - E.&&. E.maybe E.false (\visibleFrom -> visibleFrom E.<=. E.val now) (exam E.^. ExamVisibleFrom) -- is the exam visible? - E.&&. E.maybe E.false (\publishOcc -> publishOcc E.<=. E.val now) (exam E.^. ExamPublishOccurrenceAssignments) -- are the exam occurrence assignments visible? - E.&&. (E.exists $ E.from $ \examRegistration -> E.where_ $ - examRegistration E.^. ExamRegistrationExam E.==. exam E.^. ExamId - E.&&. E.just (examRegistration E.^. ExamRegistrationUser) E.==. E.val muid - E.&&. E.maybe E.true (\registrationOccurrence -> registrationOccurrence E.==. examOccurrence E.^. ExamOccurrenceId) (examRegistration E.^. ExamRegistrationOccurrence) -- if registered for a specific occurrence, get only this one, otherwise get every occurrence available + E.where_ $ examOccurrenceShouldBeDisplayed muid course exam examOccurrence + E.&&. ( isCourseLecturer muid ata (course E.^. CourseId) + E.||. ( mayViewCourse muid ata now course Nothing -- do NOT remove, this is actually necessary here! + -- (There can be exam participants that are + -- not enrolled, me thinks) + E.&&. E.maybe E.false (\visibleFrom -> visibleFrom E.<=. E.val now) (exam E.^. ExamVisibleFrom) -- is the exam visible? + E.&&. E.maybe E.false (\publishOcc -> publishOcc E.<=. E.val now) (exam E.^. ExamPublishOccurrenceAssignments) -- are the exam occurrence assignments visible? + E.&&. (E.exists $ E.from $ \examRegistration -> E.where_ $ + examRegistration E.^. ExamRegistrationExam E.==. exam E.^. ExamId + E.&&. E.just (examRegistration E.^. ExamRegistrationUser) E.==. E.val muid + E.&&. E.maybe E.true (\registrationOccurrence -> registrationOccurrence E.==. examOccurrence E.^. ExamOccurrenceId) (examRegistration E.^. ExamRegistrationOccurrence) -- if registered for a specific occurrence, get only this one, otherwise get every occurrence available + ) ) ) return (course, exam, examOccurrence) @@ -74,3 +76,11 @@ tutorialShouldBeDisplayed (Just uid) _course _tutorial = E.exists . E.from $ \us user E.^. UserScheduleOccurrenceDisplayDefault ) tutorialShouldBeDisplayed _ _ _ = E.false + +examOccurrenceShouldBeDisplayed :: Maybe UserId -> E.SqlExpr (Entity Course) -> E.SqlExpr (Entity Exam) -> E.SqlExpr (Entity ExamOccurrence) -> E.SqlExpr (E.Value Bool) +examOccurrenceShouldBeDisplayed (Just uid) _course _exam _examOcc = E.exists . E.from $ \user -> + E.where_ $ user E.^. UserId E.==. E.val uid + E.&&. ( -- TODO: also check whether there is a display opt-in/out for this course or exam or exam occurrence + user E.^. UserScheduleOccurrenceDisplayDefault + ) +examOccurrenceShouldBeDisplayed _ _ _ _ = E.false