Skip to content

Commit 76a52ec

Browse files
committed
Add DisbandTeamAPIView
1 parent 8adedeb commit 76a52ec

File tree

4 files changed

+120
-0
lines changed

4 files changed

+120
-0
lines changed

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

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,79 @@ 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_disband__when_disbanding_team__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+
response = api_client.post(
69+
f"/api/cyberstorm/team/{team.name}/disband/",
70+
json.dumps({"verification": team.name}),
71+
content_type="application/json",
72+
)
73+
74+
assert response.status_code == 200
75+
response_json = response.json()
76+
assert response_json["name"] == team.name
77+
78+
79+
@pytest.mark.django_db
80+
def test_team_disband__when_disbanding_team__fails_because_verification_is_invalid(
81+
api_client: APIClient,
82+
user: UserType,
83+
team: Team,
84+
):
85+
TeamMemberFactory(team=team, user=user, role="owner")
86+
api_client.force_authenticate(user)
87+
response = api_client.post(
88+
f"/api/cyberstorm/team/{team.name}/disband/",
89+
json.dumps({"verification": "Bad Verification"}),
90+
content_type="application/json",
91+
)
92+
93+
assert response.status_code == 400
94+
response_json = response.json()
95+
assert "Invalid verification" in response_json["verification"]
96+
97+
98+
@pytest.mark.django_db
99+
def test_team_disband__when_disbanding_team__fails_because_team_doesnt_exist(
100+
api_client: APIClient,
101+
user: UserType,
102+
):
103+
api_client.force_authenticate(user)
104+
response = api_client.post(
105+
f"/api/cyberstorm/team/GhostTeam/disband/",
106+
json.dumps({"verification": "GhostTeam"}),
107+
content_type="application/json",
108+
)
109+
110+
assert response.status_code == 404
111+
response_json = response.json()
112+
assert response_json["detail"] == "Not found."
113+
114+
115+
@pytest.mark.django_db
116+
def test_team_disband__when_disbanding_team__fails_because_user_is_not_authenticated(
117+
api_client: APIClient,
118+
team: Team,
119+
):
120+
response = api_client.post(
121+
f"/api/cyberstorm/team/{team.name}/disband/",
122+
json.dumps({"verification": "Bad Verification"}),
123+
content_type="application/json",
124+
)
125+
126+
assert response.status_code == 401
127+
response_json = response.json()
128+
assert response_json["detail"] == "Authentication credentials were not provided."
129+
assert Team.objects.filter(name=team.name).count() == 1
130+
131+
59132
@pytest.mark.django_db
60133
def test_team_edit__when_editing_donation_link__succeeds(
61134
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+
DisbandTeamAPIView,
1516
EditTeamAPIView,
1617
EditTeamMemberAPIView,
1718
RemoveTeamMemberAPIView,
@@ -44,4 +45,5 @@
4445
"RemoveTeamMemberAPIView",
4546
"EditTeamMemberAPIView",
4647
"EditTeamAPIView",
48+
"DisbandTeamAPIView",
4749
]

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

Lines changed: 39 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+
DisbandTeamForm,
2526
DonationLinkTeamForm,
2627
EditTeamMemberForm,
2728
RemoveTeamMemberForm,
@@ -125,6 +126,44 @@ def post(self, request: HttpRequest):
125126
raise ValidationError(form.errors)
126127

127128

129+
class CyberstormDisbandTeamRequestSerialiazer(serializers.Serializer):
130+
verification = serializers.CharField()
131+
132+
133+
class CyberstormDisbandTeamResponseSerialiazer(serializers.Serializer):
134+
name = serializers.CharField()
135+
136+
137+
class DisbandTeamAPIView(APIView):
138+
permission_classes = [IsAuthenticated]
139+
140+
@conditional_swagger_auto_schema(
141+
request_body=CyberstormDisbandTeamRequestSerialiazer,
142+
responses={200: CyberstormDisbandTeamResponseSerialiazer},
143+
operation_id="cyberstorm.team.disband",
144+
tags=["cyberstorm"],
145+
)
146+
def post(self, request: HttpRequest, team_name: str):
147+
serializer = CyberstormDisbandTeamRequestSerialiazer(data=request.data)
148+
serializer.is_valid(raise_exception=True)
149+
150+
team = get_object_or_404(Team, name__iexact=team_name)
151+
152+
form = DisbandTeamForm(
153+
user=request.user,
154+
instance=team,
155+
data=serializer.validated_data,
156+
)
157+
158+
if form.is_valid():
159+
form.save()
160+
return Response(
161+
CyberstormDisbandTeamResponseSerialiazer({"name": team_name}).data
162+
)
163+
else:
164+
raise ValidationError(form.errors)
165+
166+
128167
class TeamMemberListAPIView(CyberstormAutoSchemaMixin, TeamRestrictedAPIView):
129168
permission_classes = [AllowAny]
130169
serializer_class = CyberstormTeamMemberSerializer

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+
DisbandTeamAPIView,
78
EditTeamAPIView,
89
EditTeamMemberAPIView,
910
PackageDeprecateAPIView,
@@ -121,6 +122,11 @@
121122
TeamMemberListAPIView.as_view(),
122123
name="cyberstorm.team.member.list",
123124
),
125+
path(
126+
"team/<str:team_name>/disband/",
127+
DisbandTeamAPIView.as_view(),
128+
name="cyberstorm.team.disband",
129+
),
124130
path(
125131
"team/<str:team_name>/member/add/",
126132
TeamMemberAddAPIView.as_view(),

0 commit comments

Comments
 (0)