Skip to content

Commit d88f6ac

Browse files
committed
Add EditTeamMemberAPIView
1 parent cd1a72a commit d88f6ac

File tree

4 files changed

+141
-0
lines changed

4 files changed

+141
-0
lines changed

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

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,93 @@ def test_team_membership_permission__when_fetching_team__is_case_insensitive(
134134
assert response.status_code == 200
135135

136136

137+
@pytest.mark.django_db
138+
def test_team_members_edit__when_changing_role__succeeds(
139+
api_client: APIClient,
140+
user: UserType,
141+
team: Team,
142+
):
143+
TeamMemberFactory(team=team, user=user, role="owner")
144+
api_client.force_authenticate(user)
145+
just_a_member = TeamMemberFactory(team=team, role="owner")
146+
147+
response = api_client.post(
148+
f"/api/cyberstorm/team/{team.name}/members/edit/",
149+
json.dumps({"username": just_a_member.user.username, "role": "member"}),
150+
content_type="application/json",
151+
)
152+
153+
response_json = response.json()
154+
assert response.status_code == 200
155+
assert response_json["team_name"] == team.name
156+
assert response_json["username"] == just_a_member.user.username
157+
assert response_json["role"] == "member"
158+
assert TeamMember.objects.get(pk=just_a_member.pk).role == "member"
159+
160+
161+
@pytest.mark.django_db
162+
def test_team_members_edit__when_changing_role__fails_because_user_is_not_in_the_team(
163+
api_client: APIClient,
164+
user: UserType,
165+
team: Team,
166+
):
167+
TeamMemberFactory(team=team, user=user, role="owner")
168+
api_client.force_authenticate(user)
169+
another_team = TeamFactory()
170+
member_in_another_team = TeamMemberFactory(team=another_team, role="owner")
171+
172+
response = api_client.post(
173+
f"/api/cyberstorm/team/{team.name}/members/edit/",
174+
json.dumps(
175+
{"username": member_in_another_team.user.username, "role": "member"}
176+
),
177+
content_type="application/json",
178+
)
179+
180+
assert response.status_code == 404
181+
response_json = response.json()
182+
assert response_json["detail"] == "Not found."
183+
184+
185+
@pytest.mark.django_db
186+
def test_team_members_edit__when_changing_role__fails_because_team_does_not_exist(
187+
api_client: APIClient,
188+
user: UserType,
189+
):
190+
api_client.force_authenticate(user)
191+
192+
response = api_client.post(
193+
f"/api/cyberstorm/team/GhostTeam/members/edit/",
194+
json.dumps({"username": user.username, "role": "member"}),
195+
content_type="application/json",
196+
)
197+
198+
assert response.status_code == 404
199+
response_json = response.json()
200+
assert response_json["detail"] == "Not found."
201+
202+
203+
@pytest.mark.django_db
204+
def test_team_members_edit__when_changing_role__fails_because_user_is_not_authenticated(
205+
api_client: APIClient,
206+
user: UserType,
207+
team: Team,
208+
):
209+
TeamMemberFactory(team=team, user=user, role="owner")
210+
just_a_member = TeamMemberFactory(team=team, role="owner")
211+
212+
response = api_client.post(
213+
f"/api/cyberstorm/team/{team.name}/members/edit/",
214+
json.dumps({"username": just_a_member.user.username, "role": "member"}),
215+
content_type="application/json",
216+
)
217+
218+
assert response.status_code == 401
219+
response_json = response.json()
220+
assert response_json["detail"] == "Authentication credentials were not provided."
221+
assert TeamMember.objects.get(pk=just_a_member.pk).role == "owner"
222+
223+
137224
@pytest.mark.django_db
138225
def test_team_member_list_api_view__for_member__returns_only_real_users(
139226
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+
EditTeamMemberAPIView,
1516
RemoveTeamMemberAPIView,
1617
TeamAPIView,
1718
TeamCreateAPIView,
@@ -40,4 +41,5 @@
4041
"PackageListingEditCategoriesAPIView",
4142
"TeamCreateAPIView",
4243
"RemoveTeamMemberAPIView",
44+
"EditTeamMemberAPIView",
4345
]

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

Lines changed: 46 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+
EditTeamMemberForm,
2526
RemoveTeamMemberForm,
2627
)
2728
from thunderstore.repository.models.team import Team, TeamMember
@@ -190,6 +191,51 @@ def post(self, request: HttpRequest, team_name: str):
190191
raise ValidationError(form.errors)
191192

192193

194+
class CyberstormEditTeamMemberRequestSerialiazer(serializers.Serializer):
195+
username = serializers.CharField()
196+
role = serializers.ChoiceField(
197+
choices=EditTeamMemberForm.base_fields["role"].choices
198+
)
199+
200+
201+
class CyberstormEditTeamMemberResponseSerialiazer(serializers.Serializer):
202+
username = serializers.CharField(source="user")
203+
role = serializers.ChoiceField(
204+
choices=EditTeamMemberForm.base_fields["role"].choices
205+
)
206+
team_name = serializers.CharField(source="team")
207+
208+
209+
class EditTeamMemberAPIView(APIView):
210+
@conditional_swagger_auto_schema(
211+
request_body=CyberstormEditTeamMemberRequestSerialiazer,
212+
responses={200: CyberstormEditTeamMemberResponseSerialiazer},
213+
operation_id="cyberstorm.team.members.edit",
214+
tags=["cyberstorm"],
215+
)
216+
def post(self, request: HttpRequest, team_name: str):
217+
serializer = CyberstormEditTeamMemberRequestSerialiazer(data=request.data)
218+
serializer.is_valid(raise_exception=True)
219+
team_member = get_object_or_404(
220+
TeamMember,
221+
user__username__iexact=request.data["username"],
222+
team__name__iexact=team_name,
223+
)
224+
form = EditTeamMemberForm(
225+
user=request.user,
226+
instance=team_member,
227+
data=serializer.validated_data,
228+
)
229+
230+
if form.is_valid():
231+
team_member = form.save()
232+
return Response(
233+
CyberstormEditTeamMemberResponseSerialiazer(team_member).data
234+
)
235+
else:
236+
raise ValidationError(form.errors)
237+
238+
193239
class TeamServiceAccountListAPIView(CyberstormAutoSchemaMixin, TeamRestrictedAPIView):
194240
serializer_class = CyberstormServiceAccountSerializer
195241
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+
EditTeamMemberAPIView,
78
PackageDeprecateAPIView,
89
PackageListingAPIView,
910
PackageListingByCommunityListAPIView,
@@ -134,4 +135,9 @@
134135
RemoveTeamMemberAPIView.as_view(),
135136
name="cyberstorm.team.members.remove",
136137
),
138+
path(
139+
"team/<str:team_name>/members/edit/",
140+
EditTeamMemberAPIView.as_view(),
141+
name="cyberstorm.team.members.edit",
142+
),
137143
]

0 commit comments

Comments
 (0)