2017-02-26 21:40:38 +01:00
|
|
|
module Handler.Achievements where
|
|
|
|
|
|
|
|
import Import
|
|
|
|
import Handler.Common (checkIfAdmin)
|
|
|
|
import Yesod.Form.Bootstrap3 (BootstrapFormLayout (..), renderBootstrap3, bfs)
|
|
|
|
|
|
|
|
import Handler.TagUtils
|
|
|
|
|
|
|
|
import Handler.Tables
|
|
|
|
|
|
|
|
import Data.Time.Clock
|
|
|
|
import Data.Time.LocalTime
|
|
|
|
|
|
|
|
import qualified Yesod.Table as Table
|
|
|
|
|
|
|
|
getAchievementsR :: Handler Html
|
|
|
|
getAchievementsR = do
|
|
|
|
(formWidget, formEnctype) <- generateFormPost achievementForm
|
|
|
|
mUser <- maybeAuth
|
|
|
|
doAchievements mUser formWidget formEnctype
|
|
|
|
|
|
|
|
postAchievementsR :: Handler Html
|
|
|
|
postAchievementsR = do
|
|
|
|
((result, formWidget), formEnctype) <- runFormPost achievementForm
|
|
|
|
mUser <- maybeAuth
|
|
|
|
when (checkIfAdmin mUser) $ do
|
|
|
|
case result of
|
2017-02-26 22:01:27 +01:00
|
|
|
FormSuccess (name, description, points, deadlineDay, deadlineTime, maxSubmitters, mTags) -> do
|
2017-02-26 21:40:38 +01:00
|
|
|
-- @TODO for the time being hardcoded
|
|
|
|
Just challengeEnt <- runDB $ getBy $ UniqueName "petite-difference-challenge2"
|
|
|
|
|
2017-02-26 22:01:27 +01:00
|
|
|
achievementId <- runDB $ insert $ Achievement name (entityKey challengeEnt) points description (UTCTime { utctDay = deadlineDay, utctDayTime = timeOfDayToTime deadlineTime }) maxSubmitters
|
2017-02-26 21:40:38 +01:00
|
|
|
|
|
|
|
tids <- runDB $ tagsAsTextToTagIds mTags
|
|
|
|
|
|
|
|
_ <- mapM (\tid -> runDB $ insert $ AchievementTag achievementId tid) tids
|
|
|
|
|
|
|
|
return ()
|
|
|
|
_ -> do
|
|
|
|
return ()
|
|
|
|
doAchievements mUser formWidget formEnctype
|
|
|
|
|
|
|
|
doAchievements mUser formWidget formEnctype = do
|
|
|
|
achievements <- runDB $ selectList [] [Asc AchievementName]
|
|
|
|
|
|
|
|
tagsAvailableAsJSON <- runDB $ getAvailableTagsAsJSON
|
|
|
|
|
|
|
|
defaultLayout $ do
|
|
|
|
setTitle "Achievements"
|
|
|
|
$(widgetFile "achievements")
|
|
|
|
|
|
|
|
achievementsTable :: Table.Table App (Entity Achievement)
|
|
|
|
achievementsTable = mempty
|
|
|
|
++ Table.text "achievement" (\(Entity _ achievement) -> achievementName achievement)
|
|
|
|
++ Table.text "description" (\(Entity _ achievement) -> (fromMaybe (""::Text) (achievementDescription achievement)))
|
2017-02-26 22:01:27 +01:00
|
|
|
++ Table.int "points" (\(Entity _ achievement) -> achievementPoints achievement)
|
2017-02-26 21:40:38 +01:00
|
|
|
++ timestampCell "deadline" (\(Entity _ achievement) -> achievementDeadline achievement)
|
2017-03-13 11:26:39 +01:00
|
|
|
++ Table.string "max submitters" (\(Entity _ achievement) -> formatMaxSubmitters $ achievementMaxWinners achievement)
|
|
|
|
|
|
|
|
formatMaxSubmitters :: Maybe Int -> String
|
|
|
|
formatMaxSubmitters Nothing = "no limit"
|
|
|
|
formatMaxSubmitters (Just m) = show m
|
2017-02-26 21:40:38 +01:00
|
|
|
|
2017-02-26 22:01:27 +01:00
|
|
|
achievementForm :: Form (Text, Maybe Text, Int, Day, TimeOfDay, Maybe Int, Maybe Text)
|
|
|
|
achievementForm = renderBootstrap3 BootstrapBasicForm $ (,,,,,,)
|
2017-02-26 21:40:38 +01:00
|
|
|
<$> areq textField (bfs MsgAchievementName) Nothing
|
|
|
|
<*> aopt textField (bfs MsgAchievementDescription) Nothing
|
2017-02-26 22:01:27 +01:00
|
|
|
<*> areq intField (bfs MsgAchievementPoints) Nothing
|
2017-02-26 21:40:38 +01:00
|
|
|
<*> areq dayField (bfs MsgAchievementDeadlineDay) Nothing
|
|
|
|
<*> areq timeFieldTypeTime (bfs MsgAchievementDeadlineTime) Nothing
|
|
|
|
<*> aopt intField (bfs MsgAchievementMaxWinners) Nothing
|
|
|
|
<*> aopt textField (tagsfs MsgAchievementTags) Nothing
|