User
    plugin Text
    ident Text
    matrikelnummer Text Maybe
    email Text
    displayName Text
    UniqueAuthentication plugin ident
UserAdmin
    user   UserId
    school SchoolId
UserLecturer
    user   UserId
    school SchoolId
    UniqueSchoolLecturer user school
StudyFeatures
    user          UserId
    degree        StudyDegreeId
    field         StudyTermsId
    type          StudyFieldType
    semester      Int
    UniqueUserSubject user degree field
StudyDegree
    key           Int
    shorthand     Text Maybe
    name          Text Maybe
    Primary key
StudyTerms
    key           Int
    shorthand     Text Maybe
    name          Text Maybe
    Primary key
Term json
    name          TermIdentifier -- unTermKey :: TermId -> TermIdentifier
    start         Day            -- TermKey   :: TermIdentifier -< TermId
    end           Day
    holidays      [Day]
    lectureStart  Day 
    lectureEnd    Day 
    active        Bool    
    Primary name       -- newtype Key Term = TermKey { unTermKey :: TermIdentifier }
    deriving Show      -- type TermId = Key Term
School json
    name          Text 
    shorthand     Text
    UniqueSchool name
    deriving Eq    
DegreeCourse json
    course       CourseId
    degree       StudyDegreeId
    terms        StudyTermsId
    UniqueDegreeCourse course degree terms
Course 
    name         Text
    description  Html Maybe
    linkExternal Text Maybe    
    shorthand    Text
    termId       TermId
    schoolId     SchoolId    
    capacity     Int Maybe    
    hasRegistration Bool -- canRegisterNow = hasRegistration && maybe False (<= currentTime) registerFrom && maybe True (>= currentTime) registerTo
    registerFrom UTCTime Maybe
    registerTo   UTCTime Maybe
    CourseTermShort termId shorthand
CourseEdit
    user         UserId
    time         UTCTime
    course       CourseId
CourseFavourite
    user         UserId
    time         UTCTime
    course       CourseId
Lecturer 
    userId       UserId
    courseId     CourseId
    UniqueLecturer userId courseId 
Corrector 
    userId       UserId
    courseId     CourseId
    load         Load 
    -- SELECT submissionID FROM Tutorial, TutorialUser, Submission, Sheet
    -- WHERE ( tutorialTutor = correctorUserId
    --      && tutorialCourse = correctorCourseId
    --      && tutorialUserTutorial = tutorialId 
    --      && submissionUser = tutorialUserUser
    --      && sheetId = submissionSheetId
    --      && sheetCourse = correctorCourseId
    --      )
    UniqueCorrector userId courseId
CourseParticipant
    courseId        CourseId
    userId          UserId
    registration    UTCTime
    UniqueParticipant userId courseId
Sheet
    courseId        CourseId
    name            Text
    description     Html Maybe
    type            SheetType
    grouping        SheetGroup
    markingText     Html Maybe
    visibleFrom     UTCTime Maybe
    activeFrom      UTCTime
    activeTo        UTCTime
    hintFrom        UTCTime Maybe
    solutionFrom    UTCTime Maybe
    CourseSheet courseId name
SheetEdit
    user            UserId
    time            UTCTime
    sheet           SheetId
SheetFile
    sheetId         SheetId
    fileId          FileId
    type            SheetFileType
    UniqueSheetFile fileId sheetId type
File        
    title           FilePath
    content         ByteString Maybe -- Nothing iff this is a directory
    modified        UTCTime
    deriving Show Eq
Submission
    sheetId         SheetId    
    ratingPoints    Points  Maybe
    ratingComment   Text    Maybe 
    ratingBy        UserId  Maybe
    ratingTime      UTCTime Maybe   
    deriving Show
SubmissionEdit
    user            UserId
    time            UTCTime
    submission      SubmissionId
SubmissionFile
    submissionId    SubmissionId
    fileId          FileId 
    isUpdate        Bool
    isDeletion      Bool
    UniqueSubmissionFile fileId submissionId isUpdate
    deriving Show
SubmissionUser
    userId          UserId
    submissionId    SubmissionId
    UniqueSubmissionUser userId submissionId
SubmissionGroup
    courseId        CourseId
    name            Text
SubmissionGroupEdit
    user            UserId
    time            UTCTime
    submissionGroup SubmissionGroupId
SubmissionGroupUser
    submissionGroupId   SubmissionGroupId
    userId              UserId   
    UniqueSubmissionGroupUser submissionGroupId userId
Tutorial json
    name        Text
    tutor       UserId    
    course      CourseId
TutorialUser
    userId      UserId
    tutorialId  TutorialId
    UniqueTutorialUser userId tutorialId
Booking
    termId      TermId
    begin       UTCTime
    end         UTCTime
    weekly      Bool
    exceptions  [Day]    -- only if weekly, begin in exception
    bookedFor   RoomForId
    room        RoomId
BookingEdit
    user        UserId
    time        UTCTime
    boooking    BookingId
Room
    name        Text
    capacity    Int Maybe
    building    Text Maybe
-- BookingRoom
--    subject     RoomForId
--    roomId      RoomId
--    bookingId   BookingId
--    UniqueRoomCourse subject roomId bookingId
+RoomFor
    courseId    CourseId
    tutorialId  TutorialId
    examId      ExamId
-- data RoomFor = RoomForCourseIdSum CourseId | RoomForTutorialIdSum TutorialId ...
-- EXAMS ARE TODO:
Exam
    courseId            CourseId
    name                Text
    description         Text
    begin               UTCTime
    end                 UTCTime
    registrationBegin   UTCTime
    registrationEnd     UTCTime
    deregistrationEnd   UTCTime
    ratingVisible       Bool
    statisticsVisible   Bool
--ExamEdit
--    user                UserId
--    time                UTCTime
--    exam                ExamId
--ExamUser
--    userId              UserId
--    examId              ExamId
--    -- CONTINUE HERE: Include rating in this table or separately?
--    UniqueExamUser userId examId
-- By default this file is used in Model.hs (which is imported by Foundation.hs)
