diff --git a/backend/apps/github/graphql/nodes/release.py b/backend/apps/github/graphql/nodes/release.py index f4af7888f7..a8fdf7021b 100644 --- a/backend/apps/github/graphql/nodes/release.py +++ b/backend/apps/github/graphql/nodes/release.py @@ -13,6 +13,7 @@ class ReleaseNode(BaseNode): author = graphene.Field(UserNode) project_name = graphene.String() + url = graphene.String() class Meta: model = Release @@ -27,3 +28,7 @@ class Meta: def resolve_project_name(self, info): """Return project name.""" return self.repository.project.name.lstrip(OWASP_ORGANIZATION_NAME) + + def resolve_url(self, info): + """Return release URL.""" + return self.url diff --git a/backend/apps/github/models/release.py b/backend/apps/github/models/release.py index 4c770250bc..30a2abf3a7 100644 --- a/backend/apps/github/models/release.py +++ b/backend/apps/github/models/release.py @@ -50,6 +50,11 @@ def summary(self): """Return release summary.""" return f"{self.tag_name} on {self.published_at.strftime('%b %d, %Y')}" + @property + def url(self): + """Return release URL.""" + return f"{self.repository.url}/releases/tag/{self.tag_name}" + def from_github(self, gh_release, author=None, repository=None): """Update instance based on GitHub release data.""" field_mapping = { diff --git a/backend/tests/github/graphql/nodes/release_test.py b/backend/tests/github/graphql/nodes/release_test.py index 9192871893..bd0807502e 100644 --- a/backend/tests/github/graphql/nodes/release_test.py +++ b/backend/tests/github/graphql/nodes/release_test.py @@ -25,6 +25,7 @@ def test_meta_configuration(self): "project_name", "published_at", "tag_name", + "url", } assert set(ReleaseNode._meta.fields) == expected_fields diff --git a/frontend/src/api/queries/homeQueries.ts b/frontend/src/api/queries/homeQueries.ts index 0c26360fe3..0cba38152e 100644 --- a/frontend/src/api/queries/homeQueries.ts +++ b/frontend/src/api/queries/homeQueries.ts @@ -37,18 +37,19 @@ export const GET_MAIN_PAGE_DATA = gql` avatarUrl login name - url } } recentReleases(limit: 5) { author { avatarUrl + login name } isPreRelease name publishedAt tagName + url } sponsors { imageUrl