Skip to content

Commit 6ac65b0

Browse files
committed
Add EditTeamAPIView
1 parent d88f6ac commit 6ac65b0

File tree

4 files changed

+108
-0
lines changed

4 files changed

+108
-0
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_no_user__returns_403(
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
@@ -12,6 +12,7 @@
1212
from .package_rating import PackageRatingRateAPIView
1313
from .package_version_list import PackageVersionListAPIView
1414
from .team import (
15+
EditTeamAPIView,
1516
EditTeamMemberAPIView,
1617
RemoveTeamMemberAPIView,
1718
TeamAPIView,
@@ -42,4 +43,5 @@
4243
"TeamCreateAPIView",
4344
"RemoveTeamMemberAPIView",
4445
"EditTeamMemberAPIView",
46+
"EditTeamAPIView",
4547
]

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

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
from thunderstore.repository.forms import (
2323
AddTeamMemberForm,
2424
CreateTeamForm,
25+
DonationLinkTeamForm,
2526
EditTeamMemberForm,
2627
RemoveTeamMemberForm,
2728
)
@@ -51,6 +52,41 @@ def check_permissions(self, request: Request) -> None:
5152
raise PermissionDenied()
5253

5354

55+
class CyberstormEditTeamRequestSerialiazer(serializers.Serializer):
56+
donation_link = serializers.CharField(
57+
max_length=Team._meta.get_field("donation_link").max_length,
58+
validators=Team._meta.get_field("donation_link").validators,
59+
)
60+
61+
62+
class CyberstormEditTeamResponseSerialiazer(serializers.Serializer):
63+
donation_link = serializers.CharField()
64+
65+
66+
class EditTeamAPIView(APIView):
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+
5490
class CyberstormTeamCreateRequestSerialiazer(serializers.Serializer):
5591
name = serializers.CharField(
5692
max_length=Team._meta.get_field("name").max_length,

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
EditTeamMemberAPIView,
89
PackageDeprecateAPIView,
910
PackageListingAPIView,
@@ -110,6 +111,11 @@
110111
TeamAPIView.as_view(),
111112
name="cyberstorm.team",
112113
),
114+
path(
115+
"team/<str:team_name>/edit/",
116+
EditTeamAPIView.as_view(),
117+
name="cyberstorm.team.edit",
118+
),
113119
path(
114120
"team/<str:team_id>/member/",
115121
TeamMemberListAPIView.as_view(),

0 commit comments

Comments
 (0)