252 lines
10 KiB
Haskell
252 lines
10 KiB
Haskell
-- SPDX-FileCopyrightText: 2022 Gregor Kleen <gregor.kleen@ifi.lmu.de>,Sarah Vaupel <sarah.vaupel@ifi.lmu.de>,Sarah Vaupel <vaupel.sarah@campus.lmu.de>,Steffen Jost <jost@tcs.ifi.lmu.de>
|
|
--
|
|
-- SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
{-# LANGUAGE GeneralizedNewtypeDeriving, UndecidableInstances, DeriveAnyClass #-}
|
|
|
|
module Model
|
|
( module Model
|
|
, module Model.Types
|
|
, module Cron.Types
|
|
) where
|
|
|
|
import Import.NoModel
|
|
import Database.Persist.Quasi
|
|
import Database.Persist.TH.Directory
|
|
-- import Data.Time
|
|
-- import Data.ByteString
|
|
import Model.Types hiding (_maxPoints, _passingPoints)
|
|
import Cron.Types
|
|
|
|
import Data.CaseInsensitive (original)
|
|
import Data.CaseInsensitive.Instances ()
|
|
|
|
import Settings.Cluster (ClusterSettingsKey)
|
|
|
|
import Text.Blaze (ToMarkup(..))
|
|
|
|
import Database.Persist.Sql (BackendKey(..))
|
|
|
|
import qualified Database.Esqueleto.Legacy as E
|
|
|
|
|
|
type SqlBackendKey = BackendKey SqlBackend
|
|
|
|
|
|
-- You can define all of your database entities in the entities file.
|
|
-- You can find more information on persistent and how to declare entities
|
|
-- at:
|
|
-- http://www.yesodweb.com/book/persistent/
|
|
share [mkPersist sqlSettings{ mpsDeriveInstances = [''NFData] }, mkMigrate "migrateUniWorX", mkEntityDefList "currentModel"]
|
|
$(persistDirectoryWith lowerCaseSettings "models")
|
|
|
|
|
|
submissionRatingDone :: Submission -> Bool
|
|
submissionRatingDone Submission{..} = isJust submissionRatingTime
|
|
|
|
sqlSubmissionRatingDone :: E.SqlExpr (Entity Submission) -> E.SqlExpr (E.Value Bool)
|
|
sqlSubmissionRatingDone submission = E.not_ . E.isNothing $ submission E.^. SubmissionRatingTime
|
|
|
|
|
|
deriving newtype instance ToJSONKey UserId
|
|
deriving newtype instance FromJSONKey UserId
|
|
deriving newtype instance ToJSONKey ExamOccurrenceId
|
|
deriving newtype instance FromJSONKey ExamOccurrenceId
|
|
|
|
deriving newtype instance ToSample UserId
|
|
deriving newtype instance ToSample ExternalApiId
|
|
|
|
-- required Show instances for use of getByJust
|
|
deriving instance Show (Unique ExamPart)
|
|
deriving instance Show (Unique QualificationUser)
|
|
deriving instance Show (Unique LmsUser)
|
|
|
|
-- ToMarkup and ToMessage instances for displaying selected database primary keys
|
|
|
|
instance ToMarkup (Key School) where
|
|
toMarkup = toMarkup . unSchoolKey
|
|
|
|
instance ToMessage (Key School) where
|
|
toMessage = original . unSchoolKey
|
|
|
|
instance ToMarkup (Key Term) where
|
|
toMarkup = toMarkup . termToText . unTermKey
|
|
|
|
instance ToMessage (Key Term) where
|
|
toMessage = termToText . unTermKey
|
|
|
|
|
|
instance HasFileReference SheetFile where
|
|
data FileReferenceResidual SheetFile = SheetFileResidual
|
|
{ sheetFileResidualSheet :: SheetId
|
|
, sheetFileResidualType :: SheetFileType
|
|
} deriving (Eq, Ord, Read, Show, Generic)
|
|
|
|
_FileReference
|
|
= iso (\SheetFile{..} -> ( FileReference
|
|
{ fileReferenceTitle = sheetFileTitle
|
|
, fileReferenceContent = sheetFileContent
|
|
, fileReferenceModified = sheetFileModified
|
|
}
|
|
, SheetFileResidual
|
|
{ sheetFileResidualSheet = sheetFileSheet
|
|
, sheetFileResidualType = sheetFileType
|
|
}
|
|
)
|
|
)
|
|
(\( FileReference{..}
|
|
, SheetFileResidual{..}
|
|
) -> SheetFile
|
|
{ sheetFileSheet = sheetFileResidualSheet
|
|
, sheetFileType = sheetFileResidualType
|
|
, sheetFileTitle = fileReferenceTitle
|
|
, sheetFileContent = fileReferenceContent
|
|
, sheetFileModified = fileReferenceModified
|
|
}
|
|
)
|
|
|
|
instance IsFileReference SheetFile where
|
|
fileReferenceTitleField = SheetFileTitle
|
|
fileReferenceContentField = SheetFileContent
|
|
fileReferenceModifiedField = SheetFileModified
|
|
|
|
instance HasFileReference PersonalisedSheetFile where
|
|
data FileReferenceResidual PersonalisedSheetFile = PersonalisedSheetFileResidual
|
|
{ personalisedSheetFileResidualSheet :: SheetId
|
|
, personalisedSheetFileResidualUser :: UserId
|
|
, personalisedSheetFileResidualType :: SheetFileType
|
|
} deriving (Eq, Ord, Read, Show, Generic)
|
|
|
|
_FileReference
|
|
= iso (\PersonalisedSheetFile{..} -> ( FileReference
|
|
{ fileReferenceTitle = personalisedSheetFileTitle
|
|
, fileReferenceContent = personalisedSheetFileContent
|
|
, fileReferenceModified = personalisedSheetFileModified
|
|
}
|
|
, PersonalisedSheetFileResidual
|
|
{ personalisedSheetFileResidualSheet = personalisedSheetFileSheet
|
|
, personalisedSheetFileResidualUser = personalisedSheetFileUser
|
|
, personalisedSheetFileResidualType = personalisedSheetFileType
|
|
}
|
|
)
|
|
)
|
|
(\( FileReference{..}
|
|
, PersonalisedSheetFileResidual{..}
|
|
) -> PersonalisedSheetFile
|
|
{ personalisedSheetFileSheet = personalisedSheetFileResidualSheet
|
|
, personalisedSheetFileUser = personalisedSheetFileResidualUser
|
|
, personalisedSheetFileType = personalisedSheetFileResidualType
|
|
, personalisedSheetFileTitle = fileReferenceTitle
|
|
, personalisedSheetFileContent = fileReferenceContent
|
|
, personalisedSheetFileModified = fileReferenceModified
|
|
}
|
|
)
|
|
|
|
instance IsFileReference PersonalisedSheetFile where
|
|
fileReferenceTitleField = PersonalisedSheetFileTitle
|
|
fileReferenceContentField = PersonalisedSheetFileContent
|
|
fileReferenceModifiedField = PersonalisedSheetFileModified
|
|
|
|
instance HasFileReference SubmissionFile where
|
|
data FileReferenceResidual SubmissionFile = SubmissionFileResidual
|
|
{ submissionFileResidualSubmission :: SubmissionId
|
|
, submissionFileResidualIsUpdate
|
|
, submissionFileResidualIsDeletion :: Bool
|
|
} deriving (Eq, Ord, Read, Show, Generic)
|
|
|
|
_FileReference
|
|
= iso (\SubmissionFile{..} -> ( FileReference
|
|
{ fileReferenceTitle = submissionFileTitle
|
|
, fileReferenceContent = submissionFileContent
|
|
, fileReferenceModified = submissionFileModified
|
|
}
|
|
, SubmissionFileResidual
|
|
{ submissionFileResidualSubmission = submissionFileSubmission
|
|
, submissionFileResidualIsUpdate = submissionFileIsUpdate
|
|
, submissionFileResidualIsDeletion = submissionFileIsDeletion
|
|
}
|
|
)
|
|
)
|
|
(\( FileReference{..}
|
|
, SubmissionFileResidual{..}
|
|
) -> SubmissionFile
|
|
{ submissionFileSubmission = submissionFileResidualSubmission
|
|
, submissionFileIsUpdate = submissionFileResidualIsUpdate
|
|
, submissionFileIsDeletion = submissionFileResidualIsDeletion
|
|
, submissionFileTitle = fileReferenceTitle
|
|
, submissionFileContent = fileReferenceContent
|
|
, submissionFileModified = fileReferenceModified
|
|
}
|
|
)
|
|
|
|
instance IsFileReference SubmissionFile where
|
|
fileReferenceTitleField = SubmissionFileTitle
|
|
fileReferenceContentField = SubmissionFileContent
|
|
fileReferenceModifiedField = SubmissionFileModified
|
|
|
|
instance HasFileReference CourseNewsFile where
|
|
newtype FileReferenceResidual CourseNewsFile
|
|
= CourseNewsFileResidual { courseNewsFileResidualNews :: CourseNewsId }
|
|
deriving (Eq, Ord, Read, Show, Generic)
|
|
|
|
_FileReference
|
|
= iso (\CourseNewsFile{..} -> ( FileReference
|
|
{ fileReferenceTitle = courseNewsFileTitle
|
|
, fileReferenceContent = courseNewsFileContent
|
|
, fileReferenceModified = courseNewsFileModified
|
|
}
|
|
, CourseNewsFileResidual courseNewsFileNews
|
|
)
|
|
)
|
|
(\( FileReference{..}
|
|
, CourseNewsFileResidual courseNewsFileNews
|
|
) -> CourseNewsFile
|
|
{ courseNewsFileNews
|
|
, courseNewsFileTitle = fileReferenceTitle
|
|
, courseNewsFileContent = fileReferenceContent
|
|
, courseNewsFileModified = fileReferenceModified
|
|
}
|
|
)
|
|
|
|
instance IsFileReference CourseNewsFile where
|
|
fileReferenceTitleField = CourseNewsFileTitle
|
|
fileReferenceContentField = CourseNewsFileContent
|
|
fileReferenceModifiedField = CourseNewsFileModified
|
|
|
|
instance HasFileReference MaterialFile where
|
|
newtype FileReferenceResidual MaterialFile
|
|
= MaterialFileResidual { materialFileResidualMaterial :: MaterialId }
|
|
deriving (Eq, Ord, Read, Show, Generic)
|
|
|
|
_FileReference
|
|
= iso (\MaterialFile{..} -> ( FileReference
|
|
{ fileReferenceTitle = materialFileTitle
|
|
, fileReferenceContent = materialFileContent
|
|
, fileReferenceModified = materialFileModified
|
|
}
|
|
, MaterialFileResidual
|
|
{ materialFileResidualMaterial = materialFileMaterial
|
|
}
|
|
)
|
|
)
|
|
(\( FileReference{..}
|
|
, MaterialFileResidual{..}
|
|
) -> MaterialFile
|
|
{ materialFileMaterial = materialFileResidualMaterial
|
|
, materialFileTitle = fileReferenceTitle
|
|
, materialFileContent = fileReferenceContent
|
|
, materialFileModified = fileReferenceModified
|
|
}
|
|
)
|
|
|
|
instance IsFileReference MaterialFile where
|
|
fileReferenceTitleField = MaterialFileTitle
|
|
fileReferenceContentField = MaterialFileContent
|
|
fileReferenceModifiedField = MaterialFileModified
|
|
|
|
deriveJSON defaultOptions
|
|
{ tagSingleConstructors = False
|
|
, fieldLabelModifier = camelToPathPiece' 2
|
|
, omitNothingFields = True
|
|
} ''QualificationUserBlock
|