Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion django/thunderstore/api/cyberstorm/serializers/package.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,15 @@ class CyberstormPackageDependencySerializer(serializers.Serializer):
name = serializers.CharField()
namespace = serializers.CharField(source="package.namespace.name")
version_number = serializers.CharField()
is_removed = serializers.BooleanField()
is_removed = serializers.SerializerMethodField()

def get_is_removed(self, obj: PackageVersion) -> bool:
package_is_removed = not (
obj.package.is_active and obj.package_has_active_versions
)
if package_is_removed:
return True
return not obj.is_active

def get_description(self, obj: PackageVersion) -> str:
return (
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
from typing import Optional

import pytest
from django.db import connection
from django.test.utils import CaptureQueriesContext
from rest_framework.test import APIClient

from thunderstore.repository.factories import PackageFactory, PackageVersionFactory
Expand Down Expand Up @@ -134,3 +132,35 @@ def test_package_version_dependencies_list_response(api_client: APIClient) -> No

assert response.status_code == 200
assert response.json() == expected_data


@pytest.mark.django_db
@pytest.mark.parametrize(
"is_active, is_removed",
[
(False, True),
(True, False),
],
)
def test_package_version_dependencies_list_version_is_active(
api_client: APIClient,
is_active: bool,
is_removed: bool,
) -> None:
"""Test the is_removed field in the PackageVersionDependenciesListAPIView."""

package = PackageFactory(name="TestPackage")
package_version = PackageVersionFactory(package=package)

dependency = PackageVersionFactory(is_active=is_active)
package_version.dependencies.set([dependency.id])

namespace = package.namespace.name
package_name = package.name

url = f"/api/cyberstorm/package/{namespace}/{package_name}/v/latest/dependencies/"
response = api_client.get(url)

assert response.status_code == 200
assert response.json()["results"][0]["is_removed"] == is_removed
assert response.json()["results"][0]["is_active"] == is_active
Original file line number Diff line number Diff line change
Expand Up @@ -233,5 +233,5 @@ def test_package_version_dependencies_query_count(api_client: APIClient) -> None
client=api_client,
method="get",
path=path,
max_queries=25, # TODO: this could be optimized further
max_queries=MAX_QUERIES,
)
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from django.db.models import QuerySet
from django.db.models import Exists, OuterRef, QuerySet
from rest_framework import serializers
from rest_framework.generics import ListAPIView, get_object_or_404

Expand Down Expand Up @@ -54,6 +54,13 @@ def get_queryset(self) -> QuerySet[PackageVersion]:
qs = (
package_version.dependencies.all()
.select_related("package", "package__namespace")
.annotate(
package_has_active_versions=Exists(
PackageVersion.objects.filter(
package_id=OuterRef("package__pk"), is_active=True
)
)
)
.order_by("package__namespace__name", "package__name")
)

Expand Down
Loading