merge master
This commit is contained in:
commit
d51608a1bf
@ -626,12 +626,12 @@ MenuCorrectionsCreate: Abgaben registrieren
|
||||
MenuCorrectionsGrade: Abgaben bewerten
|
||||
MenuAuthPreds: Authorisierungseinstellungen
|
||||
|
||||
AuthPredsInfo: Um eigene Veranstaltungen aus Sicht der Teilnehmer anzusehen, können Veranstalter und Korrektoren hier die Prüfung ihrer erweiterten Berechtigungen temporär deaktivieren. Abgewählte Prädikate werden nicht geprüft um Zugriffe zu gewähren, welche andernfalls nicht erlaubt wären. Diese Einstellungen gelten nur temporär bis Ihre Sitzung abgelaufen ist (d.h. bis ihr Browser-Cookie abgelaufen ist).
|
||||
AuthPredsInfo: Um eigene Veranstaltungen aus Sicht der Teilnehmer anzusehen, können Veranstalter und Korrektoren hier die Prüfung ihrer erweiterten Berechtigungen temporär deaktivieren. Abgewählte Prädikate schlagen immer fehl. Abgewählte Prädikate werden also nicht geprüft um Zugriffe zu gewähren, welche andernfalls nicht erlaubt wären. Diese Einstellungen gelten nur temporär bis Ihre Sitzung abgelaufen ist, d.h. bis ihr Browser-Cookie abgelaufen ist. Durch Abwahl von Prädikaten kann man sich höchstens temporär aussperren.
|
||||
AuthPredsActive: Aktive Authorisierungsprädikate
|
||||
AuthPredsActiveChanged: Authorisierungseinstellungen für aktuelle Sitzung gespeichert
|
||||
AuthTagFree: Seite ist universell zugänglich
|
||||
AuthTagAdmin: Nutzer ist Administrator
|
||||
AuthTagNoEscalation: Nutzer-Rechte werden nicht erweitert
|
||||
AuthTagNoEscalation: Nutzer-Rechte werden nicht auf fremde Institute ausgeweitet
|
||||
AuthTagDeprecated: Seite ist nicht überholt
|
||||
AuthTagDevelopment: Seite ist nicht in Entwicklung
|
||||
AuthTagLecturer: Nutzer ist Dozent
|
||||
@ -646,7 +646,7 @@ AuthTagOwner: Nutzer ist Besitzer
|
||||
AuthTagRated: Korrektur ist bewertet
|
||||
AuthTagUserSubmissions: Abgaben erfolgen durch Kursteilnehmer
|
||||
AuthTagCorrectorSubmissions: Abgaben erfolgen durch Korrektoren
|
||||
AuthTagAuthentication: Authentifizierung erfüllt Anforderungen
|
||||
AuthTagAuthentication: Nutzer ist angemeldet, falls erforderlich
|
||||
AuthTagRead: Zugriff ist nur lesend
|
||||
AuthTagWrite: Zugriff ist i.A. schreibend
|
||||
|
||||
|
||||
@ -1,3 +1,4 @@
|
||||
-- Some comments needes
|
||||
User json
|
||||
ident (CI Text)
|
||||
authentication AuthenticationMode
|
||||
@ -24,7 +25,7 @@ UserLecturer
|
||||
user UserId
|
||||
school SchoolId
|
||||
UniqueSchoolLecturer user school
|
||||
StudyFeatures
|
||||
StudyFeatures -- Abschluss, Studiengang, Haupt/Nebenfachh und Fachsemester
|
||||
user UserId
|
||||
degree StudyDegreeId
|
||||
field StudyTermsId
|
||||
@ -34,12 +35,12 @@ StudyFeatures
|
||||
valid Bool default=true
|
||||
UniqueStudyFeatures user degree field type semester
|
||||
-- UniqueUserSubject user degree field -- There exists a counterexample
|
||||
StudyDegree
|
||||
StudyDegree -- Studienabschluss
|
||||
key Int
|
||||
shorthand Text Maybe
|
||||
name Text Maybe
|
||||
Primary key
|
||||
StudyTerms
|
||||
StudyTerms -- Studiengang
|
||||
key Int
|
||||
shorthand Text Maybe
|
||||
name Text Maybe
|
||||
|
||||
@ -13,7 +13,7 @@ import Handler.Utils.Course
|
||||
import Handler.Utils.Delete
|
||||
|
||||
-- import Data.Time
|
||||
import qualified Data.Text as T
|
||||
-- import qualified Data.Text as T
|
||||
import Data.Function ((&))
|
||||
-- import Yesod.Form.Bootstrap3
|
||||
|
||||
@ -282,9 +282,9 @@ getCShowR tid ssh csh = do
|
||||
lecturers <- 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
|
||||
return $ user E.^. UserDisplayName
|
||||
|
||||
return (course,schoolName,participants,registration,map E.unValue lecturers)
|
||||
return $ (user E.^. UserDisplayName, user E.^. UserSurname, user E.^. UserEmail)
|
||||
return (course,schoolName,participants,registration,lecturers)
|
||||
|
||||
mRegFrom <- traverse (formatTime SelFormatDateTime) $ courseRegisterFrom course
|
||||
mRegTo <- traverse (formatTime SelFormatDateTime) $ courseRegisterTo course
|
||||
mDereg <- traverse (formatTime SelFormatDateTime) $ courseDeregisterUntil course
|
||||
@ -633,7 +633,7 @@ validateCourse CourseForm{..} =
|
||||
|
||||
type UserTableExpr = (E.SqlExpr (Entity User) `E.InnerJoin` E.SqlExpr (Entity CourseParticipant)) `E.LeftOuterJoin` E.SqlExpr (Maybe (Entity CourseUserNote))
|
||||
type UserTableWhere = UserTableExpr -> E.SqlExpr (E.Value Bool)
|
||||
type UserTableData = DBRow (Entity User, E.Value UTCTime, E.Value (Maybe CourseUserNoteId))
|
||||
type UserTableData = DBRow (Entity User, UTCTime, Maybe CourseUserNoteId)
|
||||
|
||||
forceUserTableType :: (UserTableExpr -> a) -> (UserTableExpr -> a)
|
||||
forceUserTableType = id
|
||||
@ -656,10 +656,10 @@ instance HasUser UserTableData where
|
||||
hasUser = _dbrOutput . _1 . _entityVal
|
||||
|
||||
_userTableRegistration :: Lens' UserTableData UTCTime
|
||||
_userTableRegistration = _dbrOutput . _2 . _unValue
|
||||
_userTableRegistration = _dbrOutput . _2
|
||||
|
||||
_userTableNote :: Lens' UserTableData (Maybe CourseUserNoteId)
|
||||
_userTableNote = _dbrOutput . _3 . _unValue
|
||||
_userTableNote = _dbrOutput . _3
|
||||
|
||||
-- default Where-Clause
|
||||
courseIs :: CourseId -> UserTableWhere
|
||||
@ -669,7 +669,7 @@ courseIs cid ((_user `E.InnerJoin` participant) `E.LeftOuterJoin` _note) = parti
|
||||
colUserComment :: IsDBTable m c => TermId -> SchoolId -> CourseShorthand -> Colonnade Sortable UserTableData (DBCell m c)
|
||||
colUserComment tid ssh csh =
|
||||
sortable (Just "course-user-note") (i18nCell MsgCourseUserNote)
|
||||
$ \DBRow{ dbrOutput=(Entity uid _, _, E.Value mbNoteKey) } ->
|
||||
$ \DBRow{ dbrOutput=(Entity uid _, _, mbNoteKey) } ->
|
||||
maybeEmpty mbNoteKey $ const $
|
||||
anchorCellM (courseLink <$> encrypt uid) (toWidget $ hasComment True)
|
||||
where
|
||||
@ -694,7 +694,7 @@ makeCourseUserTable whereClause colChoices psValidator =
|
||||
dbtStyle = def
|
||||
dbtSQLQuery = userTableQuery whereClause
|
||||
dbtRowKey ((user `E.InnerJoin` _participant) `E.LeftOuterJoin` _note) = user E.^. UserId
|
||||
dbtProj = return -- . dbrOutput -- NOT SURE
|
||||
dbtProj = traverse $ \(user, E.Value registrationTime , E.Value userNoteId) -> return (user, registrationTime, userNoteId)
|
||||
dbtColonnade = colChoices
|
||||
dbtSorting = Map.fromList [] -- TODO
|
||||
dbtFilter = Map.fromList [] -- TODO
|
||||
|
||||
@ -192,7 +192,7 @@ getImpressumR :: Handler Html
|
||||
getImpressumR = -- do
|
||||
siteLayoutMsg' MsgMenuImpressum $ do
|
||||
setTitleI MsgImpressumHeading
|
||||
$(widgetFile "impressum")
|
||||
$(i18nWidgetFile "imprint")
|
||||
|
||||
|
||||
-- | Hinweise zu Datenschutz und Aufbewahrungspflichten
|
||||
@ -200,7 +200,7 @@ getDataProtR :: Handler Html
|
||||
getDataProtR = -- do
|
||||
siteLayoutMsg' MsgMenuDataProt $ do
|
||||
setTitleI MsgDataProtHeading
|
||||
$(widgetFile "data-protection-de")
|
||||
$(i18nWidgetFile "data-protection")
|
||||
|
||||
|
||||
-- | Allgemeine Informationen
|
||||
@ -280,8 +280,7 @@ getInfoLecturerR :: Handler Html
|
||||
getInfoLecturerR =
|
||||
siteLayoutMsg' MsgInfoLecturerTitle $ do
|
||||
setTitleI MsgInfoLecturerTitle
|
||||
-- TODO: Translation. This is simply too much for a simple message and too akwward to cut into bits. Create i18nWidgetFile tool.
|
||||
$(widgetFile "infoLecturer")
|
||||
$(i18nWidgetFile "info-lecturer")
|
||||
|
||||
|
||||
getAuthPredsR, postAuthPredsR :: Handler Html
|
||||
|
||||
@ -7,6 +7,13 @@ 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 qualified Data.CaseInsensitive as CI
|
||||
|
||||
import Language.Haskell.TH (Q, Exp)
|
||||
-- import Language.Haskell.TH.Datatype
|
||||
|
||||
import Text.Hamlet (shamletFile)
|
||||
|
||||
import Handler.Utils.DateTime as Handler.Utils
|
||||
import Handler.Utils.Form as Handler.Utils
|
||||
@ -36,9 +43,16 @@ tidFromText = fmap TermKey . maybeRight . termFromText
|
||||
simpleLink :: Widget -> Route UniWorX -> Widget
|
||||
simpleLink lbl url = [whamlet|<a href=@{url}>^{lbl}|]
|
||||
|
||||
-- | toWidget-Version of @nameHtml@, for convenience
|
||||
nameWidget :: Text -> Text -> Widget
|
||||
nameWidget displayName surname = toWidget $ nameHtml displayName surname
|
||||
|
||||
-- | toWidget-Version of @nameEmailHtml@, for convenience
|
||||
nameEmailWidget :: (CI Text) -> Text -> Text -> Widget
|
||||
nameEmailWidget email displayName surname = toWidget $ nameEmailHtml email displayName surname
|
||||
|
||||
-- | Show user's displayName, highlighting the surname if possible.
|
||||
-- Otherwise appends the surname in parenthesis
|
||||
nameHtml :: Text -> Text -> Html
|
||||
nameHtml displayName surname
|
||||
| null surname = toHtml displayName
|
||||
@ -56,6 +70,21 @@ nameHtml displayName surname
|
||||
|]
|
||||
[] -> error "Data.Text.splitOn returned empty list in violation of specification."
|
||||
|
||||
-- | 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 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 (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 email = wrapMailto email $ toHtml email
|
||||
|
||||
warnTermDays :: TermId -> [Maybe UTCTime] -> DB ()
|
||||
warnTermDays tid times = do
|
||||
@ -70,3 +99,12 @@ warnTermDays tid times = do
|
||||
forM_ outoflecture $ warnI MsgDayIsOutOfLecture
|
||||
forM_ outoftermdays $ warnI MsgDayIsOutOfTerm
|
||||
|
||||
-- | Add language dependent template files
|
||||
-- For large files which are translated as a whole.
|
||||
-- Argument musst be a directory under templates,
|
||||
-- which contains a file for each language,
|
||||
-- eg. /templates/imprint/de.hamlet and /templates/imprint/en.hamlet
|
||||
i18nWidgetFile :: FilePath -> Q Exp
|
||||
i18nWidgetFile =
|
||||
-- TODO write code to distinguish languages here
|
||||
widgetFile . (</> "de")
|
||||
@ -65,7 +65,8 @@ userCell :: IsDBTable m a => Text -> Text -> DBCell m a
|
||||
userCell displayName surname = cell $ nameWidget displayName surname
|
||||
|
||||
emailCell :: IsDBTable m a => CI Text -> DBCell m a
|
||||
emailCell userEmail = cell $(widgetFile "widgets/link-email")
|
||||
emailCell email = cell $(widgetFile "widgets/link-email")
|
||||
where linkText= toWgt email
|
||||
|
||||
cellHasUser :: (IsDBTable m c, HasUser a) => a -> DBCell m c
|
||||
cellHasUser = liftA2 userCell (view _userDisplayName) (view _userSurname)
|
||||
|
||||
@ -1,5 +1,6 @@
|
||||
<p>
|
||||
<a href="mailto:#{userEmail}">#{userEmail}
|
||||
$# Does not use link-email.hamlet, but should
|
||||
^{mailtoHtml userEmail}
|
||||
<form method=post action=@{AdminUserR uuid} enctype=#{formEnctype}>
|
||||
^{formWidget}
|
||||
^{submitButtonView}
|
||||
|
||||
@ -18,7 +18,9 @@
|
||||
<dt .deflist__dt>_{MsgLecturerFor}
|
||||
<dd .deflist__dd>
|
||||
<div>
|
||||
#{T.intercalate ", " lecturers}
|
||||
<ul .list--inline .list--comma-separated>
|
||||
$forall (E.Value displayname, E.Value surname, E.Value email) <- lecturers
|
||||
<li>^{nameEmailWidget email displayname surname}
|
||||
|
||||
$maybe link <- courseLinkExternal course
|
||||
<dt .deflist__dt>Website
|
||||
|
||||
@ -73,7 +73,7 @@
|
||||
<h4>Welche Daten werden erhoben
|
||||
Der Webserver protokolliert
|
||||
<ul>
|
||||
<li>Pseudonymisierte IP-Adresse des Webclients des Nutzers dieses Dienstes
|
||||
<li>IP-Adresse des Webclients des Nutzers dieses Dienstes
|
||||
<li>Datum und Uhrzeit des Abrufs eines Elementes der Webseite
|
||||
<li>Adresse des abgerufenen Elementes
|
||||
<li>übertragene Datenmenge
|
||||
@ -10,5 +10,4 @@
|
||||
bitten um Ihr Verständnis.
|
||||
<p>
|
||||
Bitte melden Sie etwaige Probleme an #
|
||||
<a href="mailto:jost@tcs.ifi.lmu.de">
|
||||
jost@tcs.ifi.lmu.de
|
||||
^{mailtoHtml "jost@tcs.ifi.lmu.de"}
|
||||
|
||||
@ -9,9 +9,7 @@ $newline never
|
||||
<li>Akademischer Rat
|
||||
<li>Oettingenstraße 67
|
||||
<li>D-80538 München
|
||||
<li>E-Mail: #
|
||||
<a href="mailto:jost@tcs.ifi.lmu.de">
|
||||
jost@tcs.ifi.lmu.de
|
||||
<li>E-Mail: ^{mailtoHtml "jost@tcs.ifi.lmu.de"}
|
||||
<li>Web: #
|
||||
<a href="https://www.tcs.ifi.lmu.de/mitarbeiter/steffen-jost">
|
||||
https://www.tcs.ifi.lmu.de/mitarbeiter/steffen-jost
|
||||
@ -24,9 +22,7 @@ $newline never
|
||||
<li>Leiter Rechnerbetriebsgruppe
|
||||
<li>Oettingenstraße 67
|
||||
<li>D-80538 München
|
||||
<li>E-Mail: #
|
||||
<a href="mailto:rbg@ifi.lmu.de">
|
||||
rbg@ifi.lmu.de
|
||||
<li>E-Mail: ^{mailtoHtml "rbg@ifi.lmu.de"}
|
||||
<li>Web: #
|
||||
<a href="https://www.rz.ifi.lmu.de/rbg/">
|
||||
https://www.rz.ifi.lmu.de/rbg/
|
||||
@ -41,7 +37,7 @@ $newline never
|
||||
<ul style="list-style-type: none">
|
||||
<li>Oettingenstraße 67
|
||||
<li>D-80538 München
|
||||
<li>E-Mail: rbg@ifi.lmu.de
|
||||
<li>E-Mail: ^{mailtoHtml "rbg@ifi.lmu.de"}
|
||||
<li>Web: https://www.rz.ifi.lmu.de/rbg/
|
||||
<li>Telefon: +49 (0) 89 / 2180 - 9198
|
||||
<p>
|
||||
@ -68,9 +64,7 @@ $newline never
|
||||
<li>Geschwister-Scholl-Platz 1
|
||||
<li>80539 München<
|
||||
<li>Telefon: +49 (0) 89 / 2180 - 0
|
||||
<li>E-Mail: #
|
||||
<a href="mailto:praesidium@lmu.de">
|
||||
praesidium@lmu.de
|
||||
<li>E-Mail: ^{mailtoHtml "praesidium@lmu.de"}
|
||||
<li>Web: #
|
||||
<a href="https://www.lmu.de/">
|
||||
https://www.lmu.de/
|
||||
@ -135,9 +135,29 @@ hier die wichtigsten Neuerungen.
|
||||
|
||||
<dt .deflist__dt> Papierabgaben
|
||||
<dd .deflist__dd>
|
||||
Abgaben in anderer Form (z.B. Papierabgaben)
|
||||
können mit Hilfe von Tokens verwaltet werden.
|
||||
Korrekturen können elektronisch zurückgegeben werden.
|
||||
Externe Abgaben Form (z.B. Papierabgaben)
|
||||
können mit Pseudonymen verwaltet werden:
|
||||
<ul>
|
||||
<li>
|
||||
Übungsblatt mit Abgabe-Modus
|
||||
<i>Abgabe extern mit Pseudonym
|
||||
anlegen
|
||||
<li>
|
||||
Studierende können sich auf
|
||||
der Seite des Übungsblattes ein
|
||||
Pseudonym generieren und ihre Abgabe
|
||||
damit markieren.
|
||||
<p>
|
||||
Für jedes Übungsblatt müssen sich die
|
||||
Studierenden ein neues Pseudonym
|
||||
erstellen, damit eine anonyme Korrektur
|
||||
gewährleistet werden kann.
|
||||
<li>
|
||||
Korrektoren bekommen die externen Abgaben
|
||||
ausgehändigt.
|
||||
Anhand der Pseudonyme werden
|
||||
in Uni2work Abgaben angelegt,
|
||||
welche wie üblich korrigiert werden können.
|
||||
|
||||
<section>
|
||||
<h2>Klausuren
|
||||
@ -1,2 +1,3 @@
|
||||
<a href="mailto:#{userEmail}">
|
||||
#{userEmail}
|
||||
$# Used for all mailto-link, and used as both as shamlet and whamlet at once.
|
||||
<a href="mailto:#{email}">
|
||||
^{linkText}
|
||||
Loading…
Reference in New Issue
Block a user