From 120c87e44ad082a805be61ecbeff50fd6dda66e7 Mon Sep 17 00:00:00 2001 From: Filip Gralinski Date: Sat, 14 Dec 2019 10:56:07 +0100 Subject: [PATCH] Prepare application structure for re-evaluation --- Application.hs | 1 + Handler/Evaluate.hs | 50 ++++++++++++++++++++++++++++++ Handler/MakePublic.hs | 9 ++---- Handler/Shared.hs | 6 ++++ Handler/Tables.hs | 5 ++- config/routes | 1 + gonito.cabal | 1 + templates/submission-status.hamlet | 14 ++++++--- 8 files changed, 74 insertions(+), 13 deletions(-) create mode 100644 Handler/Evaluate.hs diff --git a/Application.hs b/Application.hs index 8235969..f91e734 100644 --- a/Application.hs +++ b/Application.hs @@ -57,6 +57,7 @@ import Handler.Achievements import Handler.Score import Handler.ExtraPoints import Handler.Dashboard +import Handler.Evaluate -- This line actually creates our YesodDispatch instance. It is the second half -- of the call to mkYesodData which occurs in Foundation.hs. Please see the diff --git a/Handler/Evaluate.hs b/Handler/Evaluate.hs new file mode 100644 index 0000000..b482b72 --- /dev/null +++ b/Handler/Evaluate.hs @@ -0,0 +1,50 @@ +module Handler.Evaluate where + +import Import + +import Handler.Common +import Handler.Runner +import Handler.Shared + +canBeReevaluated :: (YesodAuthPersist (HandlerSite m), MonadHandler m, PersistUniqueRead backend, AuthEntity (HandlerSite m) ~ User, AuthId (HandlerSite m) ~ Key User, BaseBackend backend ~ SqlBackend) => Key Submission -> ReaderT backend m Bool +canBeReevaluated submissionId = do + maybeUser <- maybeAuth + case maybeUser of + Just (Entity userId _) -> do + isOwner <- checkWhetherGivenUserRepo userId submissionId + let isSuperuser = checkIfAdmin maybeUser + + submission <- get404 submissionId + let submissionVersionHash = submissionVersion submission + + challenge <- get404 $ submissionChallenge submission + let challengeVersionHash = challengeVersion challenge + + if (submissionVersionHash == challengeVersionHash) + then return False + else + do + (Entity _ submissionVer) <- getBy404 $ UniqueVersionByCommit submissionVersionHash + (Entity _ chalengeVer) <- getBy404 $ UniqueVersionByCommit challengeVersionHash + + return ((isOwner || isSuperuser) + && + ((versionMajor submissionVer) == (versionMajor chalengeVer) + || (versionMinor submissionVer) == (versionMinor chalengeVer) + || (versionPatch submissionVer) < (versionPatch chalengeVer))) + + + Nothing -> return False + +getReevaluateSubmissionR :: SubmissionId -> Handler TypedContent +getReevaluateSubmissionR submissionId = + runViewProgress $ doReevaluateSubmission submissionId + +doReevaluateSubmission :: SubmissionId -> Channel -> Handler () +doReevaluateSubmission submissionId chan = do + status <- runDB $ canBeReevaluated submissionId + if status + then + msg chan "Will re-evaluate!" + else + msg chan "Won't re-evaluate!" diff --git a/Handler/MakePublic.hs b/Handler/MakePublic.hs index d544667..4c83ed9 100644 --- a/Handler/MakePublic.hs +++ b/Handler/MakePublic.hs @@ -17,7 +17,7 @@ getMakePublicR submissionId = do doMakePublic :: UserId -> SubmissionId -> Channel -> Handler () doMakePublic userId submissionId chan = do - isOwner <- checkWhetherGivenUserRepo userId submissionId + isOwner <- runDB $ checkWhetherGivenUserRepo userId submissionId if not isOwner then err chan "Only the submitter can make a submission public!" @@ -52,9 +52,4 @@ pushRepo repoDir commit targetRepoUrl targetBranchName chan = do checkWhetherUserRepo :: SubmissionId -> Handler Bool checkWhetherUserRepo submissionId = do userId <- requireAuthId - checkWhetherGivenUserRepo userId submissionId - -checkWhetherGivenUserRepo :: UserId -> SubmissionId -> Handler Bool -checkWhetherGivenUserRepo userId submissionId = do - submission <- runDB $ get404 submissionId - return $ userId == submissionSubmitter submission + runDB $ checkWhetherGivenUserRepo userId submissionId diff --git a/Handler/Shared.hs b/Handler/Shared.hs index 9aec4d8..75887a1 100644 --- a/Handler/Shared.hs +++ b/Handler/Shared.hs @@ -8,6 +8,7 @@ import Import import qualified Data.IntMap as IntMap import Handler.Runner +import Handler.Common import System.Exit import qualified Data.Text as T @@ -504,3 +505,8 @@ formatVersion :: (Int, Int, Int) -> Text formatVersion (major, minor, patch) = (T.pack $ show major) <> "." <> (T.pack $ show minor) <> "." <> (T.pack $ show patch) + + +checkWhetherGivenUserRepo userId submissionId = do + submission <- get404 submissionId + return $ userId == submissionSubmitter submission diff --git a/Handler/Tables.hs b/Handler/Tables.hs index b1c5aca..c4c7a91 100644 --- a/Handler/Tables.hs +++ b/Handler/Tables.hs @@ -4,6 +4,7 @@ module Handler.Tables where import Import import Handler.Shared +import Handler.Evaluate import Handler.SubmissionView import Handler.TagUtils @@ -162,7 +163,9 @@ resultCell :: Test -> (a -> Maybe Evaluation) -> Table App a resultCell test fun = hoverTextCell (formatTestForHtml test) (formatTruncatedScore (testPrecision test) . fun) (formatFullScore . fun) statusCellWidget :: Text -> RepoScheme -> Repo -> (SubmissionId, Submission, VariantId, Variant, UserId, Maybe UserId) -> WidgetFor App () -statusCellWidget challengeName repoScheme challengeRepo (submissionId, submission, variantId, _, userId, mauthId) = $(widgetFile "submission-status") +statusCellWidget challengeName repoScheme challengeRepo (submissionId, submission, variantId, _, userId, mauthId) = do + isReevaluable <- handlerToWidget $ runDB $ canBeReevaluated submissionId + $(widgetFile "submission-status") where commitHash = fromSHA1ToText $ submissionCommit submission isPublic = submissionIsPublic submission isOwner = (mauthId == Just userId) diff --git a/config/routes b/config/routes index f2ed0bc..02ca3cc 100644 --- a/config/routes +++ b/config/routes @@ -39,6 +39,7 @@ /make-public/#SubmissionId MakePublicR GET /hide-submission/#SubmissionId HideSubmissionR GET /restore-submission/#SubmissionId RestoreSubmissionR GET +/reevaluate-submission/#SubmissionId ReevaluateSubmissionR GET /challenge-archive/#ChallengeId ArchiveR POST /challenge-unarchive/#ChallengeId UnarchiveR POST diff --git a/gonito.cabal b/gonito.cabal index d2c1e2d..8f5a5f2 100644 --- a/gonito.cabal +++ b/gonito.cabal @@ -54,6 +54,7 @@ library Handler.ExtraPoints Handler.Runner Handler.Dashboard + Handler.Evaluate Data.SubmissionConditions Gonito.ExtractMetadata diff --git a/templates/submission-status.hamlet b/templates/submission-status.hamlet index 8a00c1d..60d19b0 100644 --- a/templates/submission-status.hamlet +++ b/templates/submission-status.hamlet @@ -1,18 +1,22 @@ $if isOwner - - - - + $nothing $if isOwner - +