Skip to content

Commit aef4d18

Browse files
committed
Create a PackageListing Report API
Create an API for reporting PackageListings (creating a PackageReport)
1 parent dd04599 commit aef4d18

File tree

4 files changed

+64
-2
lines changed

4 files changed

+64
-2
lines changed

django/thunderstore/community/api/experimental/serializers.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44
from thunderstore.repository.api.experimental.serializers import (
55
CommunityFilteredModelChoiceField,
66
)
7+
from thunderstore.repository.models import PackageVersion
8+
from thunderstore.repository.serializer_fields import ModelChoiceField
79

810

911
class PackageListingUpdateRequestSerializer(serializers.Serializer):
@@ -16,6 +18,22 @@ class PackageListingUpdateRequestSerializer(serializers.Serializer):
1618
)
1719

1820

21+
class PackageListingReportRequestSerializer(serializers.Serializer):
22+
package_version_id = ModelChoiceField(
23+
PackageVersion.objects.all(), "pk", required=True
24+
)
25+
reason = serializers.CharField(
26+
required=True,
27+
allow_blank=False,
28+
allow_null=False,
29+
)
30+
description = serializers.CharField(
31+
required=False,
32+
allow_blank=True,
33+
allow_null=True,
34+
)
35+
36+
1937
class PackageCategoryExperimentalSerializer(serializers.Serializer):
2038
name = serializers.CharField()
2139
slug = serializers.SlugField()

django/thunderstore/community/api/experimental/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from thunderstore.community.api.experimental.views.listing import (
1111
PackageListingApproveApiView,
1212
PackageListingRejectApiView,
13+
PackageListingReportApiView,
1314
PackageListingUpdateApiView,
1415
)
1516

@@ -44,4 +45,9 @@
4445
PackageListingRejectApiView.as_view(),
4546
name="package-listing.reject",
4647
),
48+
path(
49+
"package-listing/<int:pk>/report/",
50+
PackageListingReportApiView.as_view(),
51+
name="package-listing.report",
52+
),
4753
]

django/thunderstore/community/api/experimental/views/listing.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,18 @@
22
from rest_framework import serializers, status
33
from rest_framework.exceptions import PermissionDenied
44
from rest_framework.generics import GenericAPIView
5+
from rest_framework.permissions import IsAuthenticated
56
from rest_framework.response import Response
67

78
from thunderstore.community.api.experimental.serializers import (
9+
PackageListingReportRequestSerializer,
810
PackageListingUpdateRequestSerializer,
911
PackageListingUpdateResponseSerializer,
1012
)
1113
from thunderstore.community.models import PackageListing
14+
from thunderstore.repository.models import Package, PackageVersion
1215
from thunderstore.repository.views.package._utils import get_package_listing_or_404
16+
from thunderstore.ts_reports.models import PackageReport
1317

1418

1519
class PackageListingUpdateApiView(GenericAPIView):
@@ -126,3 +130,38 @@ def post(self, request, *args, **kwargs):
126130
return Response(status=status.HTTP_200_OK)
127131
except PermissionError:
128132
raise PermissionDenied()
133+
134+
135+
class PackageListingReportApiView(GenericAPIView):
136+
queryset = PackageListing.objects.active().select_related(
137+
"package",
138+
)
139+
serializer_class = PackageListingReportRequestSerializer
140+
permission_classes = [IsAuthenticated]
141+
142+
@swagger_auto_schema(
143+
operation_id="experimental.package_listing.report",
144+
request_body=PackageListingReportRequestSerializer,
145+
responses={200: "Success"},
146+
tags=["experimental"],
147+
)
148+
def post(self, request, *args, **kwargs):
149+
serializer = self.get_serializer(data=request.data)
150+
serializer.is_valid(raise_exception=True)
151+
152+
listing: PackageListing = self.get_object()
153+
package: Package = listing.package
154+
version: PackageVersion = serializer.validated_data["package_version_id"]
155+
156+
try:
157+
PackageReport.handle_user_report(
158+
reason=serializer.validated_data["reason"],
159+
submitted_by=request.user,
160+
package=package,
161+
package_listing=listing,
162+
package_version=version,
163+
description=serializer.validated_data["description"],
164+
)
165+
return Response(status=status.HTTP_200_OK)
166+
except PermissionError:
167+
raise PermissionDenied()

django/thunderstore/ts_reports/models/package_report.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,6 @@ def __str__(self):
5757
@classmethod
5858
def handle_user_report(
5959
cls,
60-
category: str,
6160
reason: str,
6261
submitted_by: UserType,
6362
package: Package,
@@ -66,7 +65,7 @@ def handle_user_report(
6665
description: Optional[str],
6766
) -> "PackageReport":
6867
return cls.objects.create(
69-
category=category,
68+
category="UserReport",
7069
reason=reason,
7170
submitted_by=submitted_by,
7271
package=package,

0 commit comments

Comments
 (0)