Skip to content

Commit e5a54d5

Browse files
committed
Add EditTeamAPIView
1 parent 463470a commit e5a54d5

File tree

4 files changed

+111
-1
lines changed

4 files changed

+111
-1
lines changed

django/thunderstore/api/cyberstorm/tests/test_team.py

Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,70 @@ def test_team_api_view__for_inactive_team__returns_404(
5656
assert response.status_code == 404
5757

5858

59+
@pytest.mark.django_db
60+
def test_team_edit__when_editing_donation_link__succeeds(
61+
api_client: APIClient,
62+
user: UserType,
63+
team: Team,
64+
):
65+
TeamMemberFactory(team=team, user=user, role="owner")
66+
api_client.force_authenticate(user)
67+
68+
new_donation_link = "https://example.com"
69+
70+
response = api_client.post(
71+
f"/api/cyberstorm/team/{team.name}/edit/",
72+
json.dumps({"donation_link": new_donation_link}),
73+
content_type="application/json",
74+
)
75+
76+
assert response.status_code == 200
77+
response_json = response.json()
78+
assert response_json["donation_link"] == new_donation_link
79+
assert Team.objects.get(pk=team.pk).donation_link == new_donation_link
80+
81+
82+
@pytest.mark.django_db
83+
def test_team_edit__when_editing_donation_link__fails_because_user_is_not_authenticated(
84+
api_client: APIClient,
85+
team: Team,
86+
):
87+
new_donation_link = "https://example.com"
88+
89+
response = api_client.post(
90+
f"/api/cyberstorm/team/{team.name}/edit/",
91+
json.dumps({"donation_link": new_donation_link}),
92+
content_type="application/json",
93+
)
94+
95+
assert response.status_code == 401
96+
response_json = response.json()
97+
assert response_json["detail"] == "Authentication credentials were not provided."
98+
assert Team.objects.get(pk=team.pk).donation_link == None
99+
100+
101+
@pytest.mark.django_db
102+
def test_team_edit__when_editing_donation_link__fails_because_serializer_validators_check_fails(
103+
api_client: APIClient,
104+
user: UserType,
105+
team: Team,
106+
):
107+
TeamMemberFactory(team=team, user=user, role="owner")
108+
api_client.force_authenticate(user)
109+
110+
new_bad_donation_link = "example.com"
111+
112+
response = api_client.post(
113+
f"/api/cyberstorm/team/{team.name}/edit/",
114+
json.dumps({"donation_link": new_bad_donation_link}),
115+
content_type="application/json",
116+
)
117+
118+
assert response.status_code == 400
119+
response_json = response.json()
120+
assert "Enter a valid URL." in response_json["donation_link"]
121+
122+
59123
@pytest.mark.django_db
60124
def test_team_membership_permission__for_unauthenticated_user__returns_401(
61125
api_client: APIClient,

django/thunderstore/api/cyberstorm/views/__init__.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
)
1111
from .package_version_list import PackageVersionListAPIView
1212
from .team import (
13+
EditTeamAPIView,
1314
TeamAPIView,
1415
TeamMemberAddAPIView,
1516
TeamMemberListAPIView,
@@ -31,4 +32,5 @@
3132
"TeamMemberAddAPIView",
3233
"TeamMemberListAPIView",
3334
"TeamServiceAccountListAPIView",
35+
"EditTeamAPIView",
3436
]

django/thunderstore/api/cyberstorm/views/team.py

Lines changed: 39 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from django.contrib.auth import get_user_model
22
from django.db.models import Q, QuerySet
3+
from django.http import HttpRequest
34
from rest_framework import serializers
45
from rest_framework.exceptions import PermissionDenied, ValidationError
56
from rest_framework.generics import ListAPIView, RetrieveAPIView, get_object_or_404
@@ -19,7 +20,7 @@
1920
CyberstormAutoSchemaMixin,
2021
conditional_swagger_auto_schema,
2122
)
22-
from thunderstore.repository.forms import AddTeamMemberForm
23+
from thunderstore.repository.forms import AddTeamMemberForm, DonationLinkTeamForm
2324
from thunderstore.repository.models.team import Team, TeamMember
2425

2526
User = get_user_model()
@@ -49,6 +50,43 @@ def check_permissions(self, request: Request) -> None:
4950
raise PermissionDenied()
5051

5152

53+
class CyberstormEditTeamRequestSerialiazer(serializers.Serializer):
54+
donation_link = serializers.CharField(
55+
max_length=Team._meta.get_field("donation_link").max_length,
56+
validators=Team._meta.get_field("donation_link").validators,
57+
)
58+
59+
60+
class CyberstormEditTeamResponseSerialiazer(serializers.Serializer):
61+
donation_link = serializers.CharField()
62+
63+
64+
class EditTeamAPIView(APIView):
65+
permission_classes = [IsAuthenticated]
66+
67+
@conditional_swagger_auto_schema(
68+
request_body=CyberstormEditTeamRequestSerialiazer,
69+
responses={200: CyberstormEditTeamResponseSerialiazer},
70+
operation_id="cyberstorm.team.edit",
71+
tags=["cyberstorm"],
72+
)
73+
def post(self, request: HttpRequest, team_name: str):
74+
serializer = CyberstormEditTeamRequestSerialiazer(data=request.data)
75+
serializer.is_valid(raise_exception=True)
76+
team = get_object_or_404(Team, name__iexact=team_name)
77+
form = DonationLinkTeamForm(
78+
user=request.user,
79+
instance=team,
80+
data=serializer.validated_data,
81+
)
82+
83+
if form.is_valid():
84+
team = form.save()
85+
return Response(CyberstormEditTeamResponseSerialiazer(team).data)
86+
else:
87+
raise ValidationError(form.errors)
88+
89+
5290
class TeamMemberListAPIView(CyberstormAutoSchemaMixin, TeamRestrictedAPIView):
5391
serializer_class = CyberstormTeamMemberSerializer
5492
filter_backends = [StrictOrderingFilter]

django/thunderstore/api/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
CommunityAPIView,
55
CommunityFiltersAPIView,
66
CommunityListAPIView,
7+
EditTeamAPIView,
78
PackageListingAPIView,
89
PackageListingByCommunityListAPIView,
910
PackageListingByDependencyListAPIView,
@@ -83,6 +84,11 @@
8384
TeamAPIView.as_view(),
8485
name="cyberstorm.team",
8586
),
87+
path(
88+
"team/<str:team_name>/edit/",
89+
EditTeamAPIView.as_view(),
90+
name="cyberstorm.team.edit",
91+
),
8692
path(
8793
"team/<str:team_id>/member/",
8894
TeamMemberListAPIView.as_view(),

0 commit comments

Comments
 (0)