Sheet   -- exercise sheet for a given course
    course          CourseId
    name            (CI Text)
    description     Html Maybe
    type            SheetType        -- Does it count towards overall course grade?
    grouping        SheetGroup       -- May participants submit in groups of certain sizes?
    markingText     Html Maybe       -- Instructions for correctors, included in marking templates
    visibleFrom     UTCTime Maybe    -- Invisible to enrolled participants before
    activeFrom      UTCTime          -- Download of questions and submission is permitted afterwards
    activeTo        UTCTime          -- Submission is only permitted before
    hintFrom        UTCTime Maybe    -- Additional files are made available
    solutionFrom    UTCTime Maybe    -- Solution is made available
    submissionMode  SubmissionMode   -- Submission upload by students and/or through tutors?
    autoDistribute  Bool default=false  -- Should correctors be assigned submissions automagically?
    CourseSheet course name
    deriving Generic
SheetEdit                     -- who edited when a row in table "Course", kept indefinitely
    user            UserId
    time            UTCTime
    sheet           SheetId

-- For anonoymous external submissions (i.e. paper submission tracked in uni2work)
-- Map pseudonyms to users injectively in the context of a single sheet; for the next sheet all-new pseudonyms need to be created
-- Chosen uniformly at random when the submitting user presses a button on the view of a sheet
SheetPseudonym
    sheet           SheetId
    pseudonym       Pseudonym -- 24-bit number that should be attached to external submission (i.e. written on the submitted paper); encoded as two english words akin to PGP-Wordlist
    user            UserId
    UniqueSheetPseudonym sheet pseudonym
    UniqueSheetPseudonymUser sheet user
SheetCorrector                -- grant corrector role to user for a sheet
    user            UserId
    sheet           SheetId
    load            Load      -- portion of work that will be assigned to this corrector
    state           CorrectorState default='CorrectorNormal' -- whether a corrector is assigned his load this time (e.g. in case of sickness)
    UniqueSheetCorrector user sheet
    deriving Show Eq Ord
SheetCorrectorInvitation json
    email           UserEmail
    sheet           SheetId
    load            Load
    state           CorrectorState
    UniqueSheetCorrectorInvitation email sheet
    deriving Show Read Eq Ord Generic Typeable
SheetFile                     -- a file that is part of an exercise sheet
    sheet           SheetId
    file            FileId
    type            SheetFileType   -- excercise, marking, hint or solution
    UniqueSheetFile file sheet type
