From 45d273b6f83a61c05d5486d5ac789fd9ac2f8953 Mon Sep 17 00:00:00 2001 From: Steffen Jost Date: Wed, 27 Mar 2019 17:52:34 +0100 Subject: [PATCH] Distinguish lecturers and assistants in course; polish FAQ and version history --- ChangeLog.md | 6 +++ messages/uniworx/de.msg | 4 +- src/Handler/Course.hs | 13 ++++-- src/Handler/Utils.hs | 14 +++--- src/Utils.hs | 11 ++++- templates/course.hamlet | 14 +++++- templates/info-lecturer/de.hamlet | 73 +++++++++++++++++-------------- templates/versionHistory.hamlet | 2 +- 8 files changed, 89 insertions(+), 48 deletions(-) diff --git a/ChangeLog.md b/ChangeLog.md index c1ce2db41..f35e0e155 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,3 +1,9 @@ + * Version 27.03.2019 + + Kurse Veranstalter können nun mehrere Dozenten und Assistenten selbst eintragen + + Erfassung Studiengangsdaten + * Version 20.03.2019 Kursanmeldung benötigen assoziertes Hauptfach (für Studierende mit mehreren Hauptfächern) diff --git a/messages/uniworx/de.msg b/messages/uniworx/de.msg index 1f343a7cb..83279daea 100644 --- a/messages/uniworx/de.msg +++ b/messages/uniworx/de.msg @@ -103,7 +103,7 @@ CourseUserNoteDeleted: Teilnehmernotiz gelöscht CourseLecturers: Kursverwalter CourseLecturer: Dozent CourseAssistant: Assistent -CourseLecturerAlreadyAdded email@UserEmail: Es gibt bereits einen Kursverwalter mit E-Mail #{email} +CourseLecturerAlreadyAdded email@UserEmail: Es gibt bereits einen Kursverwalter mit E-Mail #{email} NoSuchTerm tid@TermId: Semester #{display tid} gibt es nicht. NoSuchSchool ssh@SchoolId: Institut #{display ssh} gibt es nicht. @@ -363,6 +363,8 @@ AccessRightsFor: Berechtigungen für AdminFor: Administrator LecturerFor: Dozent LecturersFor: Dozenten +AssistantFor: Assistent +AssistantsFor: Assistenten ForSchools n@Int: für #{pluralDE n "Institut" "Institute"} UserListTitle: Komprehensive Benutzerliste AccessRightsSaved: Berechtigungsänderungen wurden gespeichert. diff --git a/src/Handler/Course.hs b/src/Handler/Course.hs index e7fa74ea1..ad59f17bb 100644 --- a/src/Handler/Course.hs +++ b/src/Handler/Course.hs @@ -270,7 +270,7 @@ getTermCourseListR tid = do getCShowR :: TermId -> SchoolId -> CourseShorthand -> Handler Html getCShowR tid ssh csh = do mbAid <- maybeAuthId - (course,schoolName,participants,registration,defSFid,lecturers) <- runDB . maybeT notFound $ do + (course,schoolName,participants,registration,defSFid,lecturers,assistants) <- runDB . maybeT notFound $ do [(E.Entity cid course, E.Value schoolName, E.Value participants, fmap entityVal -> registration)] <- lift . E.select . E.from $ \((school `E.InnerJoin` course) `E.LeftOuterJoin` participant) -> do @@ -286,12 +286,17 @@ getCShowR tid ssh csh = do return ( E.countRows :: E.SqlExpr (E.Value Int)) return (course,school E.^. SchoolName, numParticipants, participant) defSFid <- ifMaybeM mbAid Nothing $ \uid -> lift $ selectFirst [StudyFeaturesUser ==. uid, StudyFeaturesType ==. FieldPrimary, StudyFeaturesValid ==. True] [Desc StudyFeaturesUpdated, Desc StudyFeaturesDegree, Desc StudyFeaturesField] -- sorting by degree & field is an heuristic only, but this is okay for a default suggestion - lecturers <- lift . E.select $ E.from $ \(lecturer `E.InnerJoin` user) -> do + staff <- lift . E.select $ E.from $ \(lecturer `E.InnerJoin` user) -> do E.on $ lecturer E.^. LecturerUser E.==. user E.^. UserId E.where_ $ lecturer E.^. LecturerCourse E.==. E.val cid E.orderBy [ E.asc $ user E.^. UserSurname, E.asc $ user E.^. UserDisplayName ] - return (user E.^. UserDisplayName, user E.^. UserSurname, user E.^. UserEmail) - return (course,schoolName,participants,registration,entityKey <$> defSFid,lecturers) + return ( lecturer E.^. LecturerType + , user E.^. UserEmail, user E.^. UserDisplayName, user E.^. UserSurname) + let partStaff :: (LecturerType, UserEmail, Text, Text) -> Either (UserEmail, Text, Text) (UserEmail, Text, Text) + partStaff (CourseLecturer ,name,surn,mail) = Right (name,surn,mail) + partStaff (_courseAssistant,name,surn,mail) = Left (name,surn,mail) + (assistants,lecturers) = partitionWith partStaff $ map $(unValueN 4) staff + return (course,schoolName,participants,registration,entityKey <$> defSFid,lecturers,assistants) mRegFrom <- traverse (formatTime SelFormatDateTime) $ courseRegisterFrom course mRegTo <- traverse (formatTime SelFormatDateTime) $ courseRegisterTo course diff --git a/src/Handler/Utils.hs b/src/Handler/Utils.hs index e232261fb..6023c0eaa 100644 --- a/src/Handler/Utils.hs +++ b/src/Handler/Utils.hs @@ -7,7 +7,7 @@ import Import import qualified Data.Text as T -- import qualified Data.Set (Set) import qualified Data.Set as Set -import Data.CaseInsensitive (CI, original) +import Data.CaseInsensitive (original) -- import qualified Data.CaseInsensitive as CI import Language.Haskell.TH (Q, Exp) @@ -50,12 +50,16 @@ nameWidget :: Text -- ^ userDisplayName nameWidget displayName surname = toWidget $ nameHtml displayName surname -- | toWidget-Version of @nameEmailHtml@, for convenience -nameEmailWidget :: CI Text -- ^ userEmail +nameEmailWidget :: UserEmail -- ^ userEmail -> Text -- ^ userDisplayName -> Text -- ^ userSurname -> Widget nameEmailWidget email displayName surname = toWidget $ nameEmailHtml email displayName surname +-- | uncurried Version for @nameEmailWidget@ needed in hamlet, where TH cannot be used +nameEmailWidget' :: (UserEmail, Text, Text)-> Widget +nameEmailWidget' = $(uncurryN 3) nameEmailWidget + -- | Show user's displayName, highlighting the surname if possible. -- Otherwise appends the surname in parenthesis nameHtml :: Text -> Text -> Html @@ -77,18 +81,18 @@ nameHtml displayName surname -- | Like nameHtml just show a users displayname with hightlighted surname, -- but also wrap the name with a mailto-link -nameEmailHtml :: CI Text -> Text -> Text -> Html +nameEmailHtml :: UserEmail -> Text -> Text -> Html nameEmailHtml email displayName surname = wrapMailto email $ nameHtml displayName surname -- | Wrap mailto around given Html using single hamlet-file for consistency -wrapMailto :: CI Text -> Html -> Html +wrapMailto :: UserEmail -> Html -> Html wrapMailto (original -> email) linkText | null email = linkText | otherwise = $(shamletFile "templates/widgets/link-email.hamlet") -- | Just show an email address in a standard way, for convenience inside hamlet files. -mailtoHtml :: CI Text -> Html +mailtoHtml :: UserEmail -> Html mailtoHtml email = wrapMailto email $ toHtml email -- | Generic i18n text for "edited at sometime by someone" diff --git a/src/Utils.hs b/src/Utils.hs index 1139ba7f2..018babd9d 100644 --- a/src/Utils.hs +++ b/src/Utils.hs @@ -320,6 +320,14 @@ mergeAttrs = mergeAttrs' `on` sort mergeAttrs' xs1 [] = xs1 +-- | Copied form Util from package ghc +partitionWith :: (a -> Either b c) -> [a] -> ([b], [c]) +-- ^ Uses a function to determine which of two output lists an input element should join +partitionWith _ [] = ([],[]) +partitionWith f (x:xs) = case f x of + Left b -> (b:bs, cs) + Right c -> (bs, c:cs) + where (bs,cs) = partitionWith f xs ---------- -- Sets -- @@ -530,10 +538,11 @@ ifM c m m' = do b <- c if b then m else m' --- | @ifNotM mc = ifM (not <$> mc)@ +-- | @ifNotM mc = ifM (not <$> mc)@ from Agda.Utils.Monad ifNotM :: Monad m => m Bool -> m a -> m a -> m a ifNotM c = flip $ ifM c +-- | Monadic boolean function, copied from Andreas Abel's utility function and2M, or2M :: Monad m => m Bool -> m Bool -> m Bool and2M ma mb = ifM ma mb (return False) or2M ma = ifM ma (return True) diff --git a/templates/course.hamlet b/templates/course.hamlet index 5ce025a4d..917a8271d 100644 --- a/templates/course.hamlet +++ b/templates/course.hamlet @@ -19,8 +19,18 @@
    - $forall (E.Value displayname, E.Value surname, E.Value email) <- lecturers -
  • ^{nameEmailWidget email displayname surname} + $forall lect <- lecturers +
  • ^{nameEmailWidget' lect} + $with numassi <- length assistants + $if numassi > 1 +
    _{MsgAssistantsFor} + $else +
    _{MsgAssistantFor} +
    +
    +
      + $forall assi <- assistants +
    • ^{nameEmailWidget' assi} $maybe link <- courseLinkExternal course
      Website diff --git a/templates/info-lecturer/de.hamlet b/templates/info-lecturer/de.hamlet index 838a59f2d..7611f1055 100644 --- a/templates/info-lecturer/de.hamlet +++ b/templates/info-lecturer/de.hamlet @@ -8,40 +8,6 @@ hier die wichtigsten Neuerungen. $# $# MOVE ITEM TO SECTION "VERANSTALTUNGEN", once it is implemented: $# -
      Kurs Assistenten -
      - Momentan ist leider nur ein Dozent/Veranstalter pro Kurs erlaubt. - -

      -

      Folgendes ist in Vorbereitung: - Kurs-Veranstalter dürfen beliebige Personen - ebenfalls zu Veranstaltern des Kurses machen. - - Innerhalb des Kurses haben alle Kurs-Veranstalter die - gleichen Befugnisse und können insbesondere auch die - Liste der Veranstalter dieses Kurses bearbeiten. - -

      -

      Unterschied zu UniWorX: - - In Uni2work gibt es die Rollen "Dozent" - und "Veranstalter": - Dozenten dürfen im Wesentlichen neue Kurse erstellen. - Veranstalter haben vollen Zugriff auf einen speziellen Kurs. - - Die Dozenten Berechtigung wird nach Instituten unterschieden. - -

      - In UniWorX gab es die Rolle "Assistent", - d.h. alle "Veranstalter" mussten auch "Dozent" sein; - eine Unterscheidung nach Instituten gab es nicht. - -

      Kurs Teilnehmer -
      - Anzeige und Benachrichtigung angemeldeter - Kurs-Teilnehmer ist leider noch nicht fertig implementiert. - Voraussichtlich vor Start des Sommersemesters 2019 verfügbar. -

      Veranstaltungen @@ -74,6 +40,45 @@ hier die wichtigsten Neuerungen.
      Kurs Passwort
      Die Anmeldung zum Kurs kann durch ein Passwort geschützt werden. +
      Kurs Assistenten +
      +

      + Kurs-Veranstalter dürfen beliebige Personen + ebenfalls zu Veranstaltern des Kurses machen. + + Innerhalb des Kurses haben alle Kurs-Veranstalter die + gleichen Befugnisse und können insbesondere auch die + Liste der Veranstalter dieses Kurses bearbeiten. + +

      +

      Unterschied zu UniWorX: + + In Uni2work gibt es die Rollen "Dozent" + und "Assistent": + Dozenten dürfen im Wesentlichen neue Kurse erstellen. + Die Dozenten Berechtigung wird nach Instituten unterschieden. + + Assistenten haben nur Zugriff auf einen speziellen Kurs, + aber innerhalb dieses Kurses die gleichen Rechte wie Dozenten. + +

      + In UniWorX gab es die Rolle "Assistent", + d.h. alle "Veranstalter" mussten auch "Dozent" sein; + eine Unterscheidung nach Instituten gab es nicht. + +

      Kurs Teilnehmer +
      +

      + Für die Teilnehmer eines Kurses werden nun Studiengangsinformationen angzeigt. + Studierende mit mehreren simultanen Studiengängen müssen bei der + Kursanmeldung ein Hauptfach auswählen, was die Notenmeldung beschleunigen kann. + +

      + Falls Anstatt eines Studienganges oder eines Studienabschlusses nur eine + Nummer angzeigt wird, so hat Uni2work die Zuordnung dieser Schlüsselnummern + leider noch nicht erlernt. Dies muss leider sukzessive erfolgen, da wir + von der Studentenkanzelei keine aktuelle und vollständige Schlüsselzuordnung + bekommen können.

      Übungsbetrieb diff --git a/templates/versionHistory.hamlet b/templates/versionHistory.hamlet index c96183258..994c553ce 100644 --- a/templates/versionHistory.hamlet +++ b/templates/versionHistory.hamlet @@ -7,7 +7,7 @@

      Bekannte Bugs

      - Stand: Februar 2019 + Stand: März 2019
      • Login ist u.U. anders als im alten System, z.B. momentan geht nur @campus.lmu.de aber nicht die Abkürzung @lmu.de