diff --git a/Handler/Score.hs b/Handler/Score.hs index 91c238b..fe5a8d4 100644 --- a/Handler/Score.hs +++ b/Handler/Score.hs @@ -5,6 +5,8 @@ import Import import Handler.Shared import Handler.Tables +import Control.Monad.Extra + import Handler.AchievementUtils import qualified Database.Esqueleto as E @@ -12,6 +14,8 @@ import Database.Esqueleto ((^.)) import qualified Yesod.Table as Table +import Data.Text as T + getMyScoreR :: Handler Html getMyScoreR = do entUser <- requireAuth @@ -22,12 +26,18 @@ getScoreR userId = do user <- runDB $ get404 userId doScore (Entity userId user) -scoreTable :: Table.Table App (AchievementInfo, Entity Submission) +scoreTable :: Table.Table App (AchievementInfo, (Entity Submission, Bool)) scoreTable = mempty ++ Table.text "name" (achievementInfoName . fst) ++ achievementDescriptionCell fst ++ timestampCell "deadline" (achievementInfoDeadline . fst) - ++ Table.text "submission" (submissionDescription . entityVal . snd) + ++ timestampCell "submitted" (submissionStamp . entityVal . fst . snd) + ++ Table.linked "submission" (submissionDescription . entityVal . fst . snd) (EditSubmissionR . entityKey . fst . snd) + ++ Table.text "status" getStatus + +getStatus :: (AchievementInfo, (Entity Submission, Bool)) -> Text +getStatus (_, (_, False)) = "" +getStatus (aInfo, (_, True)) = T.pack $ show $ achievementInfoPoints aInfo doScore :: Entity User -> Handler Html doScore (Entity userId user) = do @@ -45,7 +55,20 @@ doScore (Entity userId user) = do setTitle "Score" $(widgetFile "score") -processEntry :: Entity User -> (Entity Achievement, Entity Submission) -> Handler (AchievementInfo, Entity Submission) +processEntry :: Entity User -> (Entity Achievement, Entity Submission) -> Handler (AchievementInfo, (Entity Submission, Bool)) processEntry entUser (entAchievement, entSubmission) = do aInfo <- runDB $ getAchievementInfo (Just entUser) entAchievement - return (aInfo, entSubmission) + + accepted <- allM (checkSubmissionTag entSubmission) (achievementInfoTags aInfo) + + return (aInfo, (entSubmission, accepted)) + + +checkSubmissionTag :: Entity Submission -> Entity Tag -> Handler Bool +checkSubmissionTag (Entity submissionId _) (Entity tagId _) = do + mSubmissionTag <- runDB $ getBy $ UniqueSubmissionTag submissionId tagId + return $ case mSubmissionTag of + Just (Entity _ submissionTag) -> case submissionTagAccepted submissionTag of + Just b -> b + Nothing -> False + Nothing -> False diff --git a/gonito.cabal b/gonito.cabal index 5504204..dc2e192 100644 --- a/gonito.cabal +++ b/gonito.cabal @@ -139,6 +139,7 @@ library , pwstore-fast , nonce , esqueleto + , extra executable gonito if flag(library-only) diff --git a/messages/en.msg b/messages/en.msg index cbf8ccc..e80a21a 100644 --- a/messages/en.msg +++ b/messages/en.msg @@ -42,3 +42,4 @@ AchievementTags: tags required for an achievement Achievements: achievements AchievementPoints: points WantToBeAnonimised: I want to stay anonymous for other user of Gonito.net +YourScore: your score diff --git a/stack.yaml b/stack.yaml index 8721cc4..afefb86 100644 --- a/stack.yaml +++ b/stack.yaml @@ -5,5 +5,5 @@ flags: packages: - '.' - '../geval' -extra-deps: [markdown-0.1.13.2,geval-0.3.2.0,cond-0.4.1.1,wai-handler-fastcgi-3.0.0.2,murmur3-1.0.3] +extra-deps: [markdown-0.1.13.2,geval-0.3.2.0,cond-0.4.1.1,wai-handler-fastcgi-3.0.0.2,murmur3-1.0.3,extra-1.4.10] resolver: lts-6.24 diff --git a/templates/default-layout.hamlet b/templates/default-layout.hamlet index 83e8d95..fb7d56d 100644 --- a/templates/default-layout.hamlet +++ b/templates/default-layout.hamlet @@ -19,6 +19,7 @@