Skip to content

Commit 8c64e99

Browse files
committed
Add DisbandTeamAPIView
1 parent 2f11553 commit 8c64e99

File tree

4 files changed

+120
-2
lines changed

4 files changed

+120
-2
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
@@ -16,6 +16,7 @@
1616
RemoveTeamMemberAPIView,
1717
EditTeamMemberAPIView,
1818
EditTeamAPIView,
19+
DisbandTeamAPIView,
1920
TeamAPIView,
2021
TeamCreateAPIView,
2122
TeamMemberAddAPIView,
@@ -45,4 +46,5 @@
4546
"RemoveTeamMemberAPIView",
4647
"EditTeamMemberAPIView",
4748
"EditTeamAPIView",
49+
"DisbandTeamAPIView",
4850
]

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

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,7 @@
1919
CyberstormAutoSchemaMixin,
2020
conditional_swagger_auto_schema,
2121
)
22-
from thunderstore.repository.forms import AddTeamMemberForm, EditTeamMemberForm, CreateTeamForm, RemoveTeamMemberForm
23-
from thunderstore.repository.forms import AddTeamMemberForm, DonationLinkTeamForm
22+
from thunderstore.repository.forms import AddTeamMemberForm, EditTeamMemberForm, CreateTeamForm, RemoveTeamMemberForm, DonationLinkTeamForm, DisbandTeamForm
2423
from thunderstore.repository.models.team import Team, TeamMember
2524

2625

@@ -120,6 +119,44 @@ def post(self, request: HttpRequest):
120119
raise ValidationError(form.errors)
121120

122121

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

django/thunderstore/api/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
PackageDeprecateAPIView,
88
EditTeamMemberAPIView,
99
EditTeamAPIView,
10+
DisbandTeamAPIView,
1011
PackageListingAPIView,
1112
PackageListingByCommunityListAPIView,
1213
PackageListingByDependencyListAPIView,
@@ -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)