73 lines
2.6 KiB
Haskell
73 lines
2.6 KiB
Haskell
module Handler.ExternalExam.New
|
|
( getEExamNewR, postEExamNewR
|
|
) where
|
|
|
|
import Import
|
|
|
|
import Jobs.Queue
|
|
|
|
import Handler.Utils
|
|
import Handler.Utils.Invitations
|
|
|
|
import Handler.ExternalExam.StaffInvite
|
|
import Handler.ExternalExam.Form
|
|
|
|
import qualified Data.Set as Set
|
|
|
|
|
|
getEExamNewR, postEExamNewR :: Handler Html
|
|
getEExamNewR = postEExamNewR
|
|
postEExamNewR = do
|
|
((newExamResult, newExamWidget'), newExamEnctype) <- runFormPost $ externalExamForm Nothing
|
|
|
|
formResult newExamResult $ \ExternalExamForm{..} -> do
|
|
insertRes <- runDBJobs $ do
|
|
insertRes <- insertUnique ExternalExam
|
|
{ externalExamTerm = eefTerm
|
|
, externalExamSchool = eefSchool
|
|
, externalExamCourseName = eefCourseName
|
|
, externalExamExamName = eefExamName
|
|
, externalExamDefaultTime = eefDefaultTime
|
|
, externalExamGradingMode = eefGradingMode
|
|
}
|
|
whenIsJust insertRes $ \eeId -> do
|
|
audit $ TransactionExternalExamEdit eeId
|
|
|
|
let eefOfficeSchools' = do
|
|
externalExamOfficeSchoolSchool <- Set.toList eefOfficeSchools
|
|
guard $ externalExamOfficeSchoolSchool /= eefSchool
|
|
let externalExamOfficeSchoolExam = eeId
|
|
return ExternalExamOfficeSchool{..}
|
|
insertMany_ eefOfficeSchools'
|
|
forM_ eefOfficeSchools' $ \ExternalExamOfficeSchool{..} ->
|
|
audit $ TransactionExternalExamOfficeSchoolEdit eeId externalExamOfficeSchoolSchool
|
|
|
|
let (invites, adds) = partitionEithers $ Set.toList eefStaff
|
|
eefStaff' = do
|
|
externalExamStaffUser <- adds
|
|
let externalExamStaffExam = eeId
|
|
return ExternalExamStaff{..}
|
|
insertMany_ eefStaff'
|
|
forM_ eefStaff' $ \ExternalExamStaff{..} ->
|
|
audit $ TransactionExternalExamStaffEdit eeId externalExamStaffUser
|
|
|
|
sinkInvitationsF externalExamStaffInvitationConfig $ map (, eeId, (InvDBDataExternalExamStaff, InvTokenDataExternalExamStaff)) invites
|
|
forM_ invites $ \invEmail ->
|
|
audit $ TransactionExternalExamStaffInviteEdit eeId invEmail
|
|
return insertRes
|
|
|
|
case insertRes of
|
|
Nothing -> addMessageI Error $ MsgExternalExamExists eefCourseName eefExamName
|
|
Just _ -> do
|
|
addMessageI Success $ MsgExternalExamCreated eefCourseName eefExamName
|
|
redirect $ EExamR eefTerm eefSchool eefCourseName eefExamName EEShowR
|
|
|
|
let heading = MsgMenuExternalExamNew
|
|
|
|
siteLayoutMsg heading $ do
|
|
setTitleI heading
|
|
wrapForm newExamWidget' def
|
|
{ formAction = Just $ SomeRoute EExamNewR
|
|
, formEncoding = newExamEnctype
|
|
}
|