diff --git a/Gonito/ExtractMetadata.hs b/Gonito/ExtractMetadata.hs index 516d37d..cfcad06 100644 --- a/Gonito/ExtractMetadata.hs +++ b/Gonito/ExtractMetadata.hs @@ -6,7 +6,8 @@ module Gonito.ExtractMetadata ( ExtractionOptions(..), parseCommitMessage, getLastCommitMessage, - parseTags) + parseTags, + Link(..)) where import Import @@ -34,7 +35,8 @@ data ExtractionOptions = ExtractionOptions { extractionOptionsGeneralParams :: Maybe (M.Map Text Text), extractionOptionsUnwantedParams :: Maybe [Text], extractionOptionsParamFiles :: Maybe [String], - extractionOptionsMLRunPath :: Maybe FilePath + extractionOptionsMLRunPath :: Maybe FilePath, + extractionOptionsExternalLinks :: Maybe [Link] } instance FromJSON ExtractionOptions where @@ -45,6 +47,7 @@ instance FromJSON ExtractionOptions where <*> v .:? "unwanted-params" <*> v .:? "param-files" <*> v .:? "mlrun-path" + <*> v .:? "links" instance Default ExtractionOptions where def = ExtractionOptions { @@ -53,13 +56,25 @@ instance Default ExtractionOptions where extractionOptionsGeneralParams = Nothing, extractionOptionsUnwantedParams = Nothing, extractionOptionsParamFiles = Nothing, - extractionOptionsMLRunPath = Nothing + extractionOptionsMLRunPath = Nothing, + extractionOptionsExternalLinks = Nothing } +data Link = Link { + linkTitle :: Maybe Text, + linkUrl :: Text } + deriving (Eq, Show) + +instance FromJSON Link where + parseJSON = withObject "Link" $ \v -> Link + <$> v .:? "title" + <*> v .: "url" + data GonitoMetadata = GonitoMetadata { gonitoMetadataDescription :: Text, gonitoMetadataTags :: S.Set Text, - gonitoMetadataGeneralParams :: M.Map Text Text + gonitoMetadataGeneralParams :: M.Map Text Text, + gonitoMetadataExternalLinks :: [Link] } deriving (Eq, Show) @@ -84,7 +99,10 @@ combineExtractionOptions (Just otherOptions) options = ExtractionOptions { extractionOptionsParamFiles = case extractionOptionsParamFiles options of Nothing -> extractionOptionsParamFiles otherOptions Just pfs -> Just pfs, - extractionOptionsMLRunPath = combineWithF extractionOptionsMLRunPath } + extractionOptionsMLRunPath = combineWithF extractionOptionsMLRunPath, + extractionOptionsExternalLinks = case extractionOptionsExternalLinks options of + Nothing -> extractionOptionsExternalLinks otherOptions + Just links -> Just (links ++ (fromMaybe [] $ extractionOptionsExternalLinks otherOptions)) } where combineWithT fun = case fun options of Nothing -> fun otherOptions Just v -> Just v @@ -131,7 +149,8 @@ extractMetadataFromRepoDir repoDir formExtractionOptions = do pure $ GonitoMetadata { gonitoMetadataDescription = description, gonitoMetadataTags = tagsParsed, - gonitoMetadataGeneralParams = params + gonitoMetadataGeneralParams = params, + gonitoMetadataExternalLinks = fromMaybe [] (extractionOptionsExternalLinks extractionOptions) } diff --git a/Handler/ShowChallenge.hs b/Handler/ShowChallenge.hs index f5e70c6..a72678f 100644 --- a/Handler/ShowChallenge.hs +++ b/Handler/ShowChallenge.hs @@ -23,7 +23,8 @@ import Handler.MakePublic import Gonito.ExtractMetadata (ExtractionOptions(..), extractMetadataFromRepoDir, GonitoMetadata(..), - parseTags) + parseTags, + Link(..)) import qualified Text.Read as TR @@ -257,6 +258,12 @@ doCreateSubmission userId challengeId mDescription mTags repoSpec chan = do challengeId (gonitoMetadataDescription gonitoMetadata) chan + + _ <- runDB $ mapM insert $ map (\l -> ExternalLink { + externalLinkSubmission = submissionId, + externalLinkTitle = linkTitle l, + externalLinkUrl = linkUrl l }) $ gonitoMetadataExternalLinks gonitoMetadata + _ <- getOuts chan submissionId (gonitoMetadataGeneralParams gonitoMetadata) currentTagIds <- runDB $ selectList [SubmissionTagSubmission ==. submissionId] [] diff --git a/Handler/SubmissionView.hs b/Handler/SubmissionView.hs index d65cd57..f3bfe2c 100644 --- a/Handler/SubmissionView.hs +++ b/Handler/SubmissionView.hs @@ -18,7 +18,8 @@ data FullSubmissionInfo = FullSubmissionInfo { fsiChallenge :: Challenge, fsiChallengeRepo :: Repo, fsiScheme :: RepoScheme, - fsiTags :: [(Entity Tag, Entity SubmissionTag)] } + fsiTags :: [(Entity Tag, Entity SubmissionTag)], + fsiExternalLinks :: [Entity ExternalLink] } getFullInfo :: Entity Submission -> Handler FullSubmissionInfo getFullInfo (Entity submissionId submission) = do @@ -29,6 +30,8 @@ getFullInfo (Entity submissionId submission) = do tags <- runDB $ getTags submissionId + links <- runDB $ selectList [ExternalLinkSubmission ==. submissionId] [Asc ExternalLinkTitle] + app <- getYesod let scheme = appRepoScheme $ appSettings app @@ -40,7 +43,8 @@ getFullInfo (Entity submissionId submission) = do fsiChallenge = challenge, fsiChallengeRepo = challengeRepo, fsiScheme = scheme, - fsiTags = tags } + fsiTags = tags, + fsiExternalLinks = links } getTags submissionId = do sts <- selectList [SubmissionTagSubmission ==. submissionId] [] diff --git a/config/models b/config/models index e3fb505..b410937 100644 --- a/config/models +++ b/config/models @@ -68,6 +68,10 @@ Parameter name Text value Text UniqueParameterName variant name +ExternalLink + submission SubmissionId + title Text Maybe + url Text Fork source SubmissionId target SubmissionId diff --git a/templates/query-result.hamlet b/templates/query-result.hamlet index 76bde7e..a9d061c 100644 --- a/templates/query-result.hamlet +++ b/templates/query-result.hamlet @@ -17,7 +17,13 @@
#{browsableUrl}
clone by
git clone --single-branch #{publicSubmissionRepo} -b #{publicSubmissionBranch} - + $if not (null (fsiExternalLinks submission)) +
see also +
+ $forall (Entity _ externalLink) <- fsiExternalLinks submission + + #{fromMaybe (externalLinkUrl externalLink) (externalLinkTitle externalLink)} +
^{resultTable (Entity (fsiSubmissionId submission) (fsiSubmission submission))}
diff --git a/test/Gonito/ExtractMetadataSpec.hs b/test/Gonito/ExtractMetadataSpec.hs index 5d8ea2a..1cf454c 100644 --- a/test/Gonito/ExtractMetadataSpec.hs +++ b/test/Gonito/ExtractMetadataSpec.hs @@ -8,7 +8,7 @@ import qualified Data.Set as S import qualified Data.Map.Strict as M import Test.Hspec -import Gonito.ExtractMetadata (extractMetadataFromRepoDir, GonitoMetadata(..), ExtractionOptions(..)) +import Gonito.ExtractMetadata (extractMetadataFromRepoDir, GonitoMetadata(..), ExtractionOptions(..), Link(..)) spec :: Spec spec = do @@ -17,7 +17,8 @@ spec = do extractMetadataFromRepoDir "test/fake-git-repos/simple/" def `shouldReturn` GonitoMetadata { gonitoMetadataDescription = "Simple solution", gonitoMetadataTags = S.fromList ["foo", "simple-solution", "baz"], - gonitoMetadataGeneralParams = M.empty + gonitoMetadataGeneralParams = M.empty, + gonitoMetadataExternalLinks = [] } it "simple with some fields from the form" $ do extractMetadataFromRepoDir "test/fake-git-repos/simple/" def { @@ -26,7 +27,8 @@ spec = do } `shouldReturn` GonitoMetadata { gonitoMetadataDescription = "Other solution", gonitoMetadataTags = S.fromList ["foo", "simple-solution", "baz", "other-tag"], - gonitoMetadataGeneralParams = M.empty + gonitoMetadataGeneralParams = M.empty, + gonitoMetadataExternalLinks = [] } it "with gonito.yaml" $ do extractMetadataFromRepoDir "test/fake-git-repos/with-gonito-yaml/" def `shouldReturn` GonitoMetadata { @@ -35,5 +37,9 @@ spec = do gonitoMetadataGeneralParams = M.fromList [("level", "4"), ("altitude", "8900.3"), ("q", "10.4"), - ("style", "bold")] + ("style", "bold")], + gonitoMetadataExternalLinks = [ + Link (Just "gitlab") "https://about.gitlab.com/", + Link (Just "Polish Wikipedia") "https://pl.wikipedia.org/wiki/Wikipedia:Strona_g%C5%82%C3%B3wna", + Link Nothing "https://tvtropes.org/" ] } diff --git a/test/fake-git-repos/with-gonito-yaml b/test/fake-git-repos/with-gonito-yaml index 262f063..f301441 160000 --- a/test/fake-git-repos/with-gonito-yaml +++ b/test/fake-git-repos/with-gonito-yaml @@ -1 +1 @@ -Subproject commit 262f063bfbdb6417fbc4589ea6dfb60be773e6b1 +Subproject commit f30144141f64f5bdee9d423d628cf8aeb5f5e466