forked from filipg/gonito
link for starting work
This commit is contained in:
parent
28c3b231e8
commit
d322896ebe
@ -17,6 +17,7 @@ import Data.Text
|
|||||||
import qualified Yesod.Table as Table
|
import qualified Yesod.Table as Table
|
||||||
|
|
||||||
data AchievementInfo = AchievementInfo {
|
data AchievementInfo = AchievementInfo {
|
||||||
|
achievementInfoId :: AchievementId,
|
||||||
achievementInfoName :: Text,
|
achievementInfoName :: Text,
|
||||||
achievementInfoChallenge :: Entity Challenge,
|
achievementInfoChallenge :: Entity Challenge,
|
||||||
achievementInfoDescription :: Maybe Text,
|
achievementInfoDescription :: Maybe Text,
|
||||||
@ -78,6 +79,7 @@ getAchievementInfo mUser (Entity achievementId achievement) = do
|
|||||||
challenge <- get404 challengeId
|
challenge <- get404 challengeId
|
||||||
|
|
||||||
return $ AchievementInfo {
|
return $ AchievementInfo {
|
||||||
|
achievementInfoId = achievementId,
|
||||||
achievementInfoName = achievementName achievement,
|
achievementInfoName = achievementName achievement,
|
||||||
achievementInfoChallenge = Entity challengeId challenge,
|
achievementInfoChallenge = Entity challengeId challenge,
|
||||||
achievementInfoDescription = achievementDescription achievement,
|
achievementInfoDescription = achievementDescription achievement,
|
||||||
@ -103,7 +105,55 @@ achievementsTable = mempty
|
|||||||
++ Table.int "points" achievementInfoPoints
|
++ Table.int "points" achievementInfoPoints
|
||||||
++ timestampCell "deadline" achievementInfoDeadline
|
++ timestampCell "deadline" achievementInfoDeadline
|
||||||
++ Table.string "max submitters" (formatMaxSubmitters . achievementInfoMaxWinners)
|
++ 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
|
||||||
|
\ <a href=@{StartWorkingOnR (achievementInfoId ainfo)}>start working</a>
|
||||||
|
|]
|
||||||
|
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" (
|
achievementDescriptionCell = Table.widget "description" (
|
||||||
\ainfo -> fragmentWithTags (fromMaybe (""::Text) $ achievementInfoDescription ainfo) (achievementInfoTags ainfo))
|
\ainfo -> fragmentWithTags (fromMaybe (""::Text) $ achievementInfoDescription ainfo) (achievementInfoTags ainfo))
|
||||||
|
@ -98,5 +98,6 @@ AchievementTag
|
|||||||
WorkingOn
|
WorkingOn
|
||||||
achievement AchievementId
|
achievement AchievementId
|
||||||
user UserId
|
user UserId
|
||||||
|
finalSubmission SubmissionId Maybe
|
||||||
UniqueWorkingOnAchievementUser achievement user
|
UniqueWorkingOnAchievementUser achievement user
|
||||||
-- By default this file is used in Model.hs (which is imported by Foundation.hs)
|
-- By default this file is used in Model.hs (which is imported by Foundation.hs)
|
||||||
|
@ -33,6 +33,7 @@
|
|||||||
|
|
||||||
/tags TagsR GET POST
|
/tags TagsR GET POST
|
||||||
/achievements AchievementsR GET POST
|
/achievements AchievementsR GET POST
|
||||||
|
/start-working-on/#AchievementId StartWorkingOnR GET
|
||||||
|
|
||||||
/edit-submission/#SubmissionId EditSubmissionR GET POST
|
/edit-submission/#SubmissionId EditSubmissionR GET POST
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user