66 lines
2.3 KiB
Haskell
66 lines
2.3 KiB
Haskell
module Handler.Tutorial.New
|
|
( getCTutorialNewR, postCTutorialNewR
|
|
) where
|
|
|
|
import Import
|
|
import Handler.Utils
|
|
import Handler.Utils.Invitations
|
|
import Jobs.Queue
|
|
|
|
import qualified Data.Set as Set
|
|
|
|
import Handler.Tutorial.Form
|
|
import Handler.Tutorial.TutorInvite
|
|
|
|
|
|
getCTutorialNewR, postCTutorialNewR :: TermId -> SchoolId -> CourseShorthand -> Handler Html
|
|
getCTutorialNewR = postCTutorialNewR
|
|
postCTutorialNewR tid ssh csh = do
|
|
cid <- runDB . getKeyBy404 $ TermSchoolCourseShort tid ssh csh
|
|
|
|
((newTutResult, newTutWidget), newTutEnctype) <- runFormPost $ tutorialForm cid Nothing
|
|
|
|
formResult newTutResult $ \TutorialForm{..} -> do
|
|
insertRes <- runDBJobs $ do
|
|
now <- liftIO getCurrentTime
|
|
insertRes <- insertUnique Tutorial
|
|
{ tutorialName = tfName
|
|
, tutorialCourse = cid
|
|
, tutorialType = tfType
|
|
, tutorialCapacity = tfCapacity
|
|
, tutorialRoom = tfRoom
|
|
, tutorialRoomHidden = tfRoomHidden
|
|
, tutorialTime = tfTime
|
|
, tutorialRegGroup = tfRegGroup
|
|
, tutorialRegisterFrom = tfRegisterFrom
|
|
, tutorialRegisterTo = tfRegisterTo
|
|
, tutorialDeregisterUntil = tfDeregisterUntil
|
|
, tutorialLastChanged = now
|
|
, tutorialTutorControlled = tfTutorControlled
|
|
}
|
|
whenIsJust insertRes $ \tutid -> do
|
|
audit $ TransactionTutorialEdit tutid
|
|
|
|
let (invites, adds) = partitionEithers $ Set.toList tfTutors
|
|
insertMany_ $ map (Tutor tutid) adds
|
|
memcachedByInvalidate AuthCacheTutorList $ Proxy @(Set UserId)
|
|
sinkInvitationsF tutorInvitationConfig $ map (, tutid, (InvDBDataTutor, InvTokenDataTutor)) invites
|
|
return insertRes
|
|
case insertRes of
|
|
Nothing -> addMessageI Error $ MsgTutorialNameTaken tfName
|
|
Just _ -> do
|
|
addMessageI Success $ MsgTutorialCreated tfName
|
|
redirect $ CourseR tid ssh csh CTutorialListR
|
|
|
|
let heading = prependCourseTitle tid ssh csh MsgTutorialNew
|
|
|
|
siteLayoutMsg heading $ do
|
|
setTitleI heading
|
|
let
|
|
newTutForm = wrapForm newTutWidget def
|
|
{ formMethod = POST
|
|
, formAction = Just . SomeRoute $ CourseR tid ssh csh CTutorialNewR
|
|
, formEncoding = newTutEnctype
|
|
}
|
|
$(widgetFile "tutorial-new")
|