diff --git a/src/Handler/Course/List.hs b/src/Handler/Course/List.hs index 794fa74a7..50e6ec153 100644 --- a/src/Handler/Course/List.hs +++ b/src/Handler/Course/List.hs @@ -69,6 +69,35 @@ course2Registered muid (course `E.InnerJoin` _school) = E.exists . E.from $ \cou E.&&. E.just (courseParticipant E.^. CourseParticipantUser) E.==. E.val muid E.&&. courseParticipant E.^. CourseParticipantState E.==. E.val CourseParticipantActive +-- Is this user affiliated with the course in any way (except for being registered)? +course2Affiliated :: Maybe UserId -> CourseTableExpr -> E.SqlExpr (E.Value Bool) +course2Affiliated muid (course `E.InnerJoin` _school) = (E.exists (E.from (\(user `E.InnerJoin` lecturer) -> do + E.on (user E.^. UserId E.==. lecturer E.^. LecturerUser) + E.where_ (E.just (user E.^. UserId) E.==. E.val muid + E.&&. lecturer E.^. LecturerCourse E.==. course E.^. CourseId) + )) + ) E.||. (E.exists (E.from (\(user `E.InnerJoin` (tutor `E.InnerJoin` tutorial)) -> do + E.on (user E.^. UserId E.==. tutor E.^. TutorUser) + E.on (tutor E.^. TutorTutorial E.==. tutorial E.^. TutorialId) + E.where_ (E.just (user E.^. UserId) E.==. E.val muid + E.&&. tutorial E.^. TutorialCourse E.==. course E.^. CourseId) + )) + ) E.||. (E.exists (E.from (\(user `E.InnerJoin` (sheetCorrector `E.InnerJoin` sheet)) -> do + E.on (user E.^. UserId E.==. sheetCorrector E.^. SheetCorrectorUser) + E.on (sheetCorrector E.^. SheetCorrectorSheet E.==. sheet E.^. SheetId) + E.where_ (E.just (user E.^. UserId) E.==. E.val muid + E.&&. sheet E.^. SheetCourse E.==. course E.^. CourseId) + )) + ) + --) E.||. (E.exists (E.from (\(user `E.InnerJoin` (submissionUser `E.InnerJoin` (submission `E.InnerJoin` sheet))) -> do + -- E.on (user E.^. UserId E.==. submissionUser E.^. SubmissionUserUser) + -- E.on (submissionUser E.^. SubmissionUserSubmission E.==. submission E.^. SubmissionId) + -- E.on (submission E.^. SubmissionSheet E.==. sheet E.^. SheetId) + -- E.where_ (E.just (user E.^. UserId) E.==. E.val muid + -- E.&&. sheet E.^. SheetCourse E.==. course E.^. CourseId) + -- )) + --) + makeCourseTable :: ( IsDBTable m x, ToSortable h, Functor h, DBResult m x ~ ((), Widget) ) => _ -> Colonnade h CourseTableData (DBCell m x) -> PSValidator m x -> DB Widget makeCourseTable whereClause colChoices psValidator = do @@ -79,7 +108,8 @@ makeCourseTable whereClause colChoices psValidator = do E.on $ course E.^. CourseSchool E.==. school E.^. SchoolId let participants = course2Participants qin let registered = course2Registered muid qin - E.where_ $ whereClause (course, participants, registered) + let affiliated = course2Affiliated muid qin + E.where_ $ whereClause (course, participants, registered, affiliated) return (course, participants, registered, school) lecturerQuery cid (user `E.InnerJoin` lecturer) = do E.on $ user E.^. UserId E.==. lecturer E.^. LecturerUser @@ -191,6 +221,7 @@ makeCourseTable whereClause colChoices psValidator = do getCourseListR :: Handler Html getCourseListR = do muid <- maybeAuthId + now <- liftIO getCurrentTime let colonnade = widgetColonnade $ mconcat [ colCourse -- colCourseDescr , colDescription @@ -199,7 +230,13 @@ getCourseListR = do , colCShort , maybe mempty (const colRegistered) muid ] - whereClause = const $ E.val True + mnow = E.val $ Just now + whereClause (course, _, registered, affiliated) = registered E.||. affiliated + E.||. (E.isJust (course E.^. CourseVisibleFrom) + E.&&. course E.^. CourseVisibleFrom E.<=. mnow + E.&&. (E.isNothing (course E.^. CourseVisibleTo) + E.||. mnow E.<=. course E.^. CourseVisibleTo) + ) validator = def & defaultSorting [SortDescBy "term",SortAscBy "course"] coursesTable <- runDB $ makeCourseTable whereClause colonnade validator