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
    uploadMode      UploadMode       -- Take apart Zip-Archives or not?
    submissionMode  SheetSubmissionMode default='UserSubmissions'  -- Submission upload by students or through tutors only?
    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
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
