From d322896ebe205d62298191cbfd2230eeff2a3209 Mon Sep 17 00:00:00 2001 From: Filip Gralinski Date: Sat, 18 Mar 2017 21:33:41 +0100 Subject: [PATCH] link for starting work --- Handler/Achievements.hs | 52 ++++++++++++++++++++++++++++++++++++++++- config/models | 1 + config/routes | 1 + 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/Handler/Achievements.hs b/Handler/Achievements.hs index 67ec59a..87b1ad5 100644 --- a/Handler/Achievements.hs +++ b/Handler/Achievements.hs @@ -17,6 +17,7 @@ import Data.Text import qualified Yesod.Table as Table data AchievementInfo = AchievementInfo { + achievementInfoId :: AchievementId, achievementInfoName :: Text, achievementInfoChallenge :: Entity Challenge, achievementInfoDescription :: Maybe Text, @@ -78,6 +79,7 @@ getAchievementInfo mUser (Entity achievementId achievement) = do challenge <- get404 challengeId return $ AchievementInfo { + achievementInfoId = achievementId, achievementInfoName = achievementName achievement, achievementInfoChallenge = Entity challengeId challenge, achievementInfoDescription = achievementDescription achievement, @@ -103,7 +105,55 @@ achievementsTable = mempty ++ Table.int "points" achievementInfoPoints ++ timestampCell "deadline" achievementInfoDeadline ++ Table.string "max submitters" (formatMaxSubmitters . achievementInfoMaxWinners) - ++ Table.text "who's working on it?" (formatSubmitters . achievementInfoWorkingOn) + ++ workingOnCell + +workingOnCell = Table.widget "who's working on it?" workingOnWidget + +workingOnWidget ainfo = [whamlet| +#{srs} + +$if canStartWorkingOn + \ start working +|] + where srs = formatSubmitters $ achievementInfoWorkingOn ainfo + canStartWorkingOn = determineWhetherCanStartWorkingOn (achievementInfoCurrentUser ainfo) (achievementInfoWorkingOn ainfo) (achievementInfoMaxWinners ainfo) + +getStartWorkingOnR :: AchievementId -> Handler Html +getStartWorkingOnR achievementId = do + (Entity userId user) <- requireAuth + + alreadyWorkingOn <- runDB $ selectList [WorkingOnUser ==. userId, WorkingOnFinalSubmission ==. Nothing] [] + if Import.null alreadyWorkingOn + then + do + es <- runDB $ selectList [WorkingOnAchievement ==. achievementId] [] + let userIds = Import.map (workingOnUser . entityVal) es + users <- runDB $ mapM get404 userIds + let userEnts = Import.map (\(k,v) -> (Entity k v)) $ Import.zip userIds users + + achievement <- runDB $ get404 achievementId + + if determineWhetherCanStartWorkingOn (Just (Entity userId user)) userEnts (achievementMaxWinners achievement) + then + do + _ <- runDB $ insert $ WorkingOn achievementId userId Nothing + setMessage $ toHtml ("OK!" :: Text) + else + do + setMessage $ toHtml ("Too many people working on the achievement!" :: Text) + else + do + setMessage $ toHtml ("Already working on another achievement!" :: Text) + redirect $ AchievementsR + + +determineWhetherCanStartWorkingOn Nothing _ _ = False +determineWhetherCanStartWorkingOn (Just (Entity userId user)) peopleWorkingOn maxWinners = + (Import.all (\e -> (userId /= entityKey e)) peopleWorkingOn) && (checkLimit peopleWorkingOn maxWinners) + +checkLimit _ Nothing = True +checkLimit peopleWorkingOn (Just m) = (Import.length peopleWorkingOn) < m + achievementDescriptionCell = Table.widget "description" ( \ainfo -> fragmentWithTags (fromMaybe (""::Text) $ achievementInfoDescription ainfo) (achievementInfoTags ainfo)) diff --git a/config/models b/config/models index 1ce270e..edbc8a7 100644 --- a/config/models +++ b/config/models @@ -98,5 +98,6 @@ AchievementTag WorkingOn achievement AchievementId user UserId + finalSubmission SubmissionId Maybe UniqueWorkingOnAchievementUser achievement user -- By default this file is used in Model.hs (which is imported by Foundation.hs) diff --git a/config/routes b/config/routes index fe26fd7..622df0b 100644 --- a/config/routes +++ b/config/routes @@ -33,6 +33,7 @@ /tags TagsR GET POST /achievements AchievementsR GET POST +/start-working-on/#AchievementId StartWorkingOnR GET /edit-submission/#SubmissionId EditSubmissionR GET POST