diff --git a/ChangeLog.md b/ChangeLog.md index 1e78cad00..8fe2401e2 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,9 @@ + * Version 29.04.2019 + + Tutorien + + Anzeige von Korrektoren auf den Kursseiten + * Version 20.04.2019 Versand von Benachrichtigungen an Kursteilnehmer diff --git a/src/Handler/Course.hs b/src/Handler/Course.hs index 1163a9e8f..5d52bf869 100644 --- a/src/Handler/Course.hs +++ b/src/Handler/Course.hs @@ -999,7 +999,7 @@ makeCourseUserTable cid restrict colChoices psValidator = do E.on $ tutorial E.^. TutorialId E.==. tutorialParticipant E.^. TutorialParticipantTutorial E.where_ $ tutorial E.^. TutorialCourse E.==. E.val cid E.&&. E.hasInfix (tutorial E.^. TutorialName) criterion - E.&&. tutorialParticipant E.^. TutorialParticipantUser E.==. (queryUser row) E.^. UserId + E.&&. tutorialParticipant E.^. TutorialParticipantUser E.==. queryUser row E.^. UserId ) -- , ("course-registration", error "TODO") -- TODO -- , ("course-user-note", error "TODO") -- TODO @@ -1051,7 +1051,7 @@ postCUsersR tid ssh csh = do psValidator = def & defaultSortingByName ent@(Entity cid _) <- getBy404 $ TermSchoolCourseShort tid ssh csh numParticipants <- count [CourseParticipantCourse ==. cid] - table <- makeCourseUserTable cid (const $ E.true) colChoices psValidator + table <- makeCourseUserTable cid (const E.true) colChoices psValidator return (ent, numParticipants, table) formResult participantRes $ \case (CourseUserSendMail, selectedUsers) -> do @@ -1089,8 +1089,8 @@ postTUsersR tid ssh csh tutn = do psValidator = def & defaultSortingByName & restrictSorting (\name _ -> none (== name) ["note"]) -- We need to be careful to restrict allowed sorting/filter to not expose sensitive information - isInTut q = E.exists . E.from $ \tutorialParticipant -> do - E.where_ $ tutorialParticipant E.^. TutorialParticipantUser E.==. (queryUser q) E.^. UserId + isInTut q = E.exists . E.from $ \tutorialParticipant -> + E.where_ $ tutorialParticipant E.^. TutorialParticipantUser E.==. queryUser q E.^. UserId E.&&. tutorialParticipant E.^. TutorialParticipantTutorial E.==. E.val tutid cid <- getKeyBy404 $ TermSchoolCourseShort tid ssh csh table <- makeCourseUserTable cid isInTut colChoices psValidator diff --git a/src/Handler/Tutorial.hs b/src/Handler/Tutorial.hs index 55f2d0811..1919e6a38 100644 --- a/src/Handler/Tutorial.hs +++ b/src/Handler/Tutorial.hs @@ -18,8 +18,12 @@ import qualified Data.Set as Set import qualified Data.CaseInsensitive as CI +import qualified Data.Text as Text + import Utils.Lens +{-# ANN module ("Hlint: ignore Redundant void" :: String) #-} + getCTutorialListR :: TermId -> SchoolId -> CourseShorthand -> Handler Html getCTutorialListR tid ssh csh = do @@ -241,7 +245,7 @@ tutorialForm cid template html = do <*> aopt (natFieldI MsgTutorialCapacityNonPositive) (fslpI MsgTutorialCapacity (mr MsgTutorialCapacity) & setTooltip MsgTutorialCapacityTip) (tfCapacity <$> template) <*> areq textField (fslpI MsgTutorialRoom $ mr MsgTutorialRoomPlaceholder) (tfRoom <$> template) <*> occurencesAForm (tfTime <$> template) - <*> aopt ciField (fslI MsgTutorialRegGroup & setTooltip MsgTutorialRegGroupTip) ((tfRegGroup <$> template) <|> Just (Just "tutorial")) + <*> fmap (assertM (not . Text.null . CI.original) . fmap (CI.map Text.strip)) (aopt ciField (fslI MsgTutorialRegGroup & setTooltip MsgTutorialRegGroupTip) ((tfRegGroup <$> template) <|> Just (Just "tutorial"))) <*> aopt utcTimeField (fslpI MsgRegisterFrom (mr MsgDate) & setTooltip MsgCourseRegisterFromTip ) (tfRegisterFrom <$> template) diff --git a/templates/info-lecturer/de.hamlet b/templates/info-lecturer/de.hamlet index a7bcf0057..74bf737ca 100644 --- a/templates/info-lecturer/de.hamlet +++ b/templates/info-lecturer/de.hamlet @@ -182,6 +182,54 @@ $newline text in Uni2work Abgaben angelegt, welche wie üblich korrigiert werden können. +
+

Tutorien + +
+
Termine +
+ Tutorien können beliebig viele reguläre Termine haben, die sich wöchentlich wiederholen. +
+ Zusätzlich können beliebig viele Ausnahmen angelegt werden. +
+ Hierbei überschreibt eine Ausnahme, dass ein Termin nicht stattfindet, die reguläre Terminplanung (man gibt hierbei einen beliebigen Zeitpunkt innerhalb des regulären Termins an). +
+ Eine Ausnahme, dass ein Termin außerplanmäßig stattfindet, überschreibt wiederrum Ausnahmen, die Termine ausfallen lassen. +
+ Dieses Verhalten kann genutzt werden um einzelne Termine zeitlich zu verschieben, indem der reguläre Termin ausfällt und stattdessen ein außerplanmäßiger mit versetzter Zeit stattfindet. + +
Tutoren +
+

+ Tutoren werden ad hoc pro Tutoriumsgruppe festgelegt. +
+ Eine Tutoriumsgruppe kann beliebig viele Tutoren haben und ein Tutor kann beliebig viele Tutoriengruppen betreuen. + +

+ Tutoren haben Zugriff auf die Namen und Studiendaten ihrer Tutoriums-Teilnehmer und können auch Mitteilungen an sie verschicken (analog zu Kursmitteilungen). + +

Anmeldung +
+

+ Studenten können sich auf der Kursseite selbst zu Tutorien anmelden. +
+ Die Anmeldung erfolgt momentan noch auf first come, first served-Basis +
+ Eine vorherige Anmeldung zum Kurs ist Voraussetzung +

+ Die Anmeldung kann pro Tutoriumsgruppe zeitlich beschränkt werden. +

+ Tutoriumsgruppen können mit einer Registrierungs-Gruppe versehen werden. +
+ Es handelt sich hierbei um einen beliebig wählbaren Text der ansonsten keine Bedeutung hat. +
+ Studenten wird die Anmeldung nur in einem Tutorium pro Registrierungs-Gruppe erlaubt. + + Leere Registrierungs-Gruppen zählen hierbei als verschieden. +

+ Um die Anmeldung in beliebig viele Tutoriumsgruppen zuzulassen können alle Registrierungs-Gruppen leer gelassen werden. + +

Klausuren Das Verwalten von Klausuren und Notenmeldungen