module Handler.Term where import Import import Handler.Utils import Handler.Utils.Table.Cells import qualified Data.Map as Map import Utils.Lens import qualified Database.Esqueleto as E import qualified Data.Set as Set -- | Default start day of term for season, -- @True@: start of term, @False@: end of term defaultDay :: Bool -> Season -> Day defaultDay True Winter = fromGregorian 2020 10 1 defaultDay False Winter = fromGregorian 2020 3 31 defaultDay True Summer = fromGregorian 2020 4 1 defaultDay False Summer = fromGregorian 2020 9 30 validateTerm :: Term -> [Text] validateTerm Term{..} = [ msg | (False, msg) <- [ --startOk ( termStart `withinTerm` termName , "Jahreszahl im Namenskürzel stimmt nicht mit Semesterbeginn überein." ) , -- endOk ( termStart < termEnd , "Semester darf nicht enden, bevor es begann." ) , -- startOk ( termLectureStart < termLectureEnd , "Vorlesungszeit muss vor ihrem Ende anfgangen." ) , -- lecStartOk ( termStart <= termLectureStart , "Semester muss vor der Vorlesungszeit beginnen." ) , -- lecEndOk ( termEnd >= termLectureEnd , "Vorlesungszeit muss vor dem Semester enden." ) ] ] getTermShowR :: Handler TypedContent getTermShowR = do -- terms <- runDB $ selectList [] [Desc TermStart] ------- ÄQUIVALENT: -- term <- runDB $ E.select . E.from $ \(term) -> do -- E.orderBy [E.desc $ term E.^. TermStart ] -- return term -- let termData :: E.SqlExpr (Entity Term) -> E.SqlQuery (E.SqlExpr (Entity Term), E.SqlExpr (E.Value Int64)) termData term = do -- E.orderBy [E.desc $ term E.^. TermStart ] let courseCount = E.sub_select . E.from $ \course -> do E.where_ $ term E.^. TermId E.==. course E.^. CourseTerm return E.countRows return (term, courseCount) selectRep $ do provideRep $ toJSON . map fst <$> runDB (E.select $ E.from termData) provideRep $ do let colonnadeTerms = widgetColonnade $ mconcat [ sortable (Just "term-id") "Kürzel" $ \(Entity tid _, _) -> anchorCell (TermCourseListR tid) [whamlet|#{toPathPiece tid}|] , sortable (Just "lecture-start") (i18nCell MsgLectureStart) $ \(Entity _ Term{..},_) -> cell $ formatTime SelFormatDate termLectureStart >>= toWidget , sortable (Just "lecture-end") "Ende Vorlesungen" $ \(Entity _ Term{..},_) -> cell $ formatTime SelFormatDate termLectureEnd >>= toWidget , sortable Nothing "Aktiv" $ \(Entity _ Term{..},_) -> tickmarkCell termActive , sortable Nothing "Kurse" $ \(_, E.Value numCourses) -> cell [whamlet|_{MsgNumCourses numCourses}|] , sortable (Just "start") "Semesteranfang" $ \(Entity _ Term{..},_) -> cell $ formatTime SelFormatDate termStart >>= toWidget , sortable (Just "end") "Semesterende" $ \(Entity _ Term{..},_) -> cell $ formatTime SelFormatDate termEnd >>= toWidget , sortable Nothing "Feiertage im Semester" $ \(Entity _ Term{..},_) -> cell $ do termHolidays' <- mapM (formatTime SelFormatDate) termHolidays [whamlet| $newline never