3rd tick for issue #187

This commit is contained in:
SJost 2018-10-11 19:24:44 +02:00
parent b87c3c4ca7
commit 67ba5509b1
2 changed files with 60 additions and 84 deletions

View File

@ -15,7 +15,7 @@
module Handler.Course where module Handler.Course where
import Import import Import hiding (catMaybes)
import Control.Lens import Control.Lens
import Utils.Lens import Utils.Lens
@ -33,6 +33,9 @@ import Data.Maybe
import qualified Data.Set as Set import qualified Data.Set as Set
import qualified Data.Map as Map import qualified Data.Map as Map
import qualified Data.CaseInsensitive as CI
import Colonnade hiding (fromMaybe,bool) import Colonnade hiding (fromMaybe,bool)
-- import Yesod.Colonnade -- import Yesod.Colonnade
@ -317,6 +320,14 @@ postCRegisterR tid ssh csh = do
(_other) -> return () -- TODO check this! (_other) -> return () -- TODO check this!
redirect $ CourseR tid ssh csh CShowR redirect $ CourseR tid ssh csh CShowR
getCourseNewTemplateR :: Maybe TermId -> Maybe SchoolId -> Maybe CourseShorthand -> Handler Html
getCourseNewTemplateR mbTid mbSsh mbCsh =
redirect (CourseNewR, catMaybes [ ("tid",).termToText.unTermKey <$> mbTid
, ("ssh",).CI.original.unSchoolKey <$> mbSsh
, ("csh",).CI.original <$> mbCsh
])
getCourseNewR :: Handler Html -- call via toTextUrl getCourseNewR :: Handler Html -- call via toTextUrl
getCourseNewR = do getCourseNewR = do
uid <- requireAuthId uid <- requireAuthId
@ -325,59 +336,55 @@ getCourseNewR = do
<*> iopt ciField "ssh" <*> iopt ciField "ssh"
<*> iopt ciField "csh" <*> iopt ciField "csh"
let noTemplateAction = courseEditHandler True Nothing let noTemplateAction = courseEditHandler True Nothing
case params of case params of -- DO NOT REMOVE: without this distinction, lecturers would never see an empty newCourseForm any more!
FormMissing -> noTemplateAction FormMissing -> noTemplateAction
FormFailure msgs -> forM_ msgs ((addMessage Error) . toHtml) FormFailure msgs -> forM_ msgs ((addMessage Error) . toHtml) >>
>> noTemplateAction noTemplateAction
FormSuccess (mbTid,mbSsh,mbCsh) -> FormSuccess (fmap TermKey -> mbTid, fmap SchoolKey -> mbSsh, mbCsh) -> do
getCourseNewTemplateR (TermKey <$> mbTid) (SchoolKey <$> mbSsh) mbCsh uid <- requireAuthId
oldCourses <- runDB $ do
getCourseNewTemplateR :: Maybe TermId -> Maybe SchoolId -> Maybe CourseShorthand -> Handler Html E.select $ E.from $ \course -> do
getCourseNewTemplateR mbTid mbSsh mbCsh = do whenIsJust mbTid $ \tid -> E.where_ $ course E.^. CourseTerm E.==. E.val tid
uid <- requireAuthId whenIsJust mbSsh $ \ssh -> E.where_ $ course E.^. CourseSchool E.==. E.val ssh
oldCourses <- runDB $ do whenIsJust mbCsh $ \csh -> E.where_ $ course E.^. CourseShorthand E.==. E.val csh
E.select $ E.from $ \course -> do let lecturersCourse =
whenIsJust mbTid $ \tid -> E.where_ $ course E.^. CourseTerm E.==. E.val tid E.exists $ E.from $ \lecturer -> do
whenIsJust mbSsh $ \ssh -> E.where_ $ course E.^. CourseSchool E.==. E.val ssh E.where_ $ lecturer E.^. LecturerUser E.==. E.val uid
whenIsJust mbCsh $ \csh -> E.where_ $ course E.^. CourseShorthand E.==. E.val csh E.&&. lecturer E.^. LecturerCourse E.==. course E.^. CourseId
let lecturersCourse = let lecturersSchool =
E.exists $ E.from $ \lecturer -> do E.exists $ E.from $ \user -> do
E.where_ $ lecturer E.^. LecturerUser E.==. E.val uid E.where_ $ user E.^. UserLecturerUser E.==. E.val uid
E.&&. lecturer E.^. LecturerCourse E.==. course E.^. CourseId E.&&. user E.^. UserLecturerSchool E.==. course E.^. CourseSchool
let lecturersSchool = let courseCreated c =
E.exists $ E.from $ \user -> do E.sub_select . E.from $ \edit -> do -- oldest edit must be creation
E.where_ $ user E.^. UserLecturerUser E.==. E.val uid E.where_ $ edit E.^. CourseEditCourse E.==. c E.^. CourseId
E.&&. user E.^. UserLecturerSchool E.==. course E.^. CourseSchool return $ E.min_ $ edit E.^. CourseEditTime
let courseCreated c = E.orderBy [ E.desc $ E.case_ [(lecturersCourse, E.val (1 :: Int64))] (E.val 0) -- prefer courses from lecturer
E.sub_select . E.from $ \edit -> do -- oldest edit must be creation , E.desc $ E.case_ [(lecturersSchool, E.val (1 :: Int64))] (E.val 0) -- prefer from schools of lecturer
E.where_ $ edit E.^. CourseEditCourse E.==. c E.^. CourseId , E.desc $ courseCreated course] -- most recent created course
return $ E.min_ $ edit E.^. CourseEditTime E.limit 1
E.orderBy [ E.desc $ E.case_ [(lecturersCourse, E.val (1 :: Int64))] (E.val 0) -- prefer courses from lecturer return course
, E.desc $ E.case_ [(lecturersSchool, E.val (1 :: Int64))] (E.val 0) -- prefer from schools of lecturer template <- case listToMaybe oldCourses of
, E.desc $ courseCreated course] -- most recent created course (Just oldTemplate) ->
E.limit 1 let newTemplate = (courseToForm oldTemplate) in
return course return $ Just $ newTemplate
template <- case listToMaybe oldCourses of { cfCourseId = Nothing
(Just oldTemplate) -> , cfTerm = TermKey $ TermIdentifier 0 Winter -- invalid, will be ignored; undefined won't work due to strictness
let newTemplate = (courseToForm oldTemplate) in , cfRegFrom = Nothing
return $ Just $ newTemplate , cfRegTo = Nothing
{ cfCourseId = Nothing , cfDeRegUntil = Nothing
, cfTerm = TermKey $ TermIdentifier 0 Winter -- invalid, will be ignored; undefined won't work due to strictness }
, cfRegFrom = Nothing Nothing -> do
, cfRegTo = Nothing (tidOk,sshOk,cshOk) <- runDB $ (,,)
, cfDeRegUntil = Nothing <$> ifMaybeM mbTid True existsKey
} <*> ifMaybeM mbSsh True existsKey
Nothing -> do <*> ifMaybeM mbCsh True (\csh -> (not . null) <$> selectKeysList [CourseShorthand ==. csh] [LimitTo 1])
(tidOk,sshOk,cshOk) <- runDB $ (,,) unless tidOk $ addMessageI Warning $ MsgNoSuchTerm $ fromJust mbTid -- safe, since tidOk==True otherwise
<$> ifMaybeM mbTid True existsKey unless sshOk $ addMessageI Warning $ MsgNoSuchSchool $ fromJust mbSsh -- safe, since sshOk==True otherwise
<*> ifMaybeM mbSsh True existsKey unless cshOk $ addMessageI Warning $ MsgNoSuchCourseShorthand $ fromJust mbCsh
<*> ifMaybeM mbCsh True (\csh -> (not . null) <$> selectKeysList [CourseShorthand ==. csh] [LimitTo 1]) when (tidOk && sshOk && cshOk) $ addMessageI Warning MsgNoSuchCourse
unless tidOk $ addMessageI Warning $ MsgNoSuchTerm $ fromJust mbTid -- safe, since tidOk==True otherwise return Nothing
unless sshOk $ addMessageI Warning $ MsgNoSuchSchool $ fromJust mbSsh -- safe, since sshOk==True otherwise courseEditHandler True template
unless cshOk $ addMessageI Warning $ MsgNoSuchCourseShorthand $ fromJust mbCsh
when (tidOk && sshOk && cshOk) $ addMessageI Warning MsgNoSuchCourse
return Nothing
courseEditHandler True template
postCourseNewR :: Handler Html postCourseNewR :: Handler Html
postCourseNewR = courseEditHandler False Nothing -- Note: Nothing is safe here, since we will create a new course. postCourseNewR = courseEditHandler False Nothing -- Note: Nothing is safe here, since we will create a new course.

View File

@ -121,37 +121,6 @@ linkButton lbl cls url = [whamlet| <a href=@{url} .btn .#{bcc2txt cls} role=butt
-- |] -- |]
-- <input .btn .#{bcc2txt cls} type="submit" value=^{lbl}> -- <input .btn .#{bcc2txt cls} type="submit" value=^{lbl}>
{-
combinedButtonField :: Button a => [a] -> Form m -> Form (a,m)
combinedButtonField btns inner csrf = do
buttonIdent <- newFormIdent
let button b = mopt (buttonField b) ("n/a"{ fsName = Just buttonIdent }) Nothing
(results, btnViews) <- unzip <$> mapM button [minBound..maxBound]
(innerRes,innerWdgt) <- inner
let widget = do
[whamlet|
#{csrf}
^{innerWdgt}
<div .btn-group>
$forall bView <- btnViews
^{fvInput bView}
|]
let result = case (accResult result, innerRes) of
(FormSuccess b, FormSuccess i) -> FormSuccess (b,i)
_ -> FormFailure ["Something went wrong"] -- TODO
return (result,widget)
where
accResult :: Foldable f => f (FormResult (Maybe a)) -> FormResult a
accResult = Foldable.foldr accResult' FormMissing
accResult' :: FormResult (Maybe a) -> FormResult a -> FormResult a
accResult' (FormSuccess (Just _)) (FormSuccess _) = FormFailure ["Ambiguous button parse"]
accResult' (FormSuccess (Just x)) _ = FormSuccess x
accResult' _ x@(FormSuccess _) = x --SJ: Is this safe? Shouldn't Failure override Success?
accResult' (FormSuccess Nothing) x = x
accResult' FormMissing _ = FormMissing
accResult' (FormFailure errs) _ = FormFailure errs
-}
-- buttonForm :: Button a => Markup -> MForm (HandlerT UniWorX IO) (FormResult a, (WidgetT UniWorX IO ())) -- buttonForm :: Button a => Markup -> MForm (HandlerT UniWorX IO) (FormResult a, (WidgetT UniWorX IO ()))
buttonForm :: (Button UniWorX a, Show a) => Form a buttonForm :: (Button UniWorX a, Show a) => Form a