Skip to content

Commit b6bca11

Browse files
committed
Add EditTeamMemberAPIView
1 parent 31405a1 commit b6bca11

File tree

3 files changed

+70
-3
lines changed

3 files changed

+70
-3
lines changed

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
NamespacePackageListAPIView,
77
PackageDependantsListAPIView,
88
)
9-
from .team import TeamDetailAPIView, TeamMembersAPIView, TeamServiceAccountsAPIView
9+
from .team import (
10+
EditTeamMemberAPIView,
11+
TeamDetailAPIView,
12+
TeamMembersAPIView,
13+
TeamServiceAccountsAPIView,
14+
)
1015

1116
__all__ = [
1217
"CommunityDetailAPIView",
@@ -17,5 +22,6 @@
1722
"PackageDependantsListAPIView",
1823
"TeamDetailAPIView",
1924
"TeamMembersAPIView",
25+
"EditTeamMemberAPIView",
2026
"TeamServiceAccountsAPIView",
2127
]

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

Lines changed: 57 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
1+
from django.contrib.auth import get_user_model
12
from django.db.models import Q, QuerySet
2-
from rest_framework.exceptions import PermissionDenied
3+
from rest_framework import serializers
4+
from rest_framework.exceptions import PermissionDenied, ValidationError
35
from rest_framework.generics import ListAPIView, RetrieveAPIView, get_object_or_404
46
from rest_framework.permissions import IsAuthenticated
57
from rest_framework.request import Request
8+
from rest_framework.response import Response
9+
from rest_framework.views import APIView
610

711
from thunderstore.account.models.service_account import ServiceAccount
812
from thunderstore.api.cyberstorm.serializers import (
@@ -11,9 +15,15 @@
1115
CyberstormTeamSerializer,
1216
)
1317
from thunderstore.api.ordering import StrictOrderingFilter
14-
from thunderstore.api.utils import CyberstormAutoSchemaMixin
18+
from thunderstore.api.utils import (
19+
CyberstormAutoSchemaMixin,
20+
conditional_swagger_auto_schema,
21+
)
22+
from thunderstore.repository.forms import EditTeamMemberForm
1523
from thunderstore.repository.models.team import Team, TeamMember
1624

25+
User = get_user_model()
26+
1727

1828
class TeamDetailAPIView(CyberstormAutoSchemaMixin, RetrieveAPIView):
1929
serializer_class = CyberstormTeamSerializer
@@ -52,6 +62,51 @@ def get_queryset(self) -> QuerySet[TeamMember]:
5262
)
5363

5464

65+
class CyberstormEditTeamMemberRequestSerialiazer(serializers.Serializer):
66+
username = serializers.CharField()
67+
role = serializers.ChoiceField(
68+
choices=EditTeamMemberForm.base_fields["role"].choices
69+
)
70+
71+
72+
class CyberstormEditTeamMemberResponseSerialiazer(serializers.Serializer):
73+
username = serializers.CharField(source="user")
74+
role = serializers.ChoiceField(
75+
choices=EditTeamMemberForm.base_fields["role"].choices
76+
)
77+
team_name = serializers.CharField(source="team")
78+
79+
80+
class EditTeamMemberAPIView(APIView):
81+
@conditional_swagger_auto_schema(
82+
request_body=CyberstormEditTeamMemberRequestSerialiazer,
83+
responses={200: CyberstormEditTeamMemberResponseSerialiazer},
84+
operation_id="cyberstorm.team.members.edit",
85+
tags=["cyberstorm"],
86+
)
87+
def post(self, request, team_name, format=None):
88+
serializer = CyberstormEditTeamMemberRequestSerialiazer(data=request.data)
89+
serializer.is_valid(raise_exception=True)
90+
team_member = get_object_or_404(
91+
TeamMember,
92+
user__username__iexact=request.data["username"],
93+
team__name__iexact=team_name,
94+
)
95+
form = EditTeamMemberForm(
96+
user=request.user,
97+
instance=team_member,
98+
data=request.data,
99+
)
100+
101+
if form.is_valid():
102+
team_member = form.save()
103+
return Response(
104+
CyberstormEditTeamMemberResponseSerialiazer(team_member).data
105+
)
106+
else:
107+
raise ValidationError(form.errors)
108+
109+
55110
class TeamServiceAccountsAPIView(CyberstormAutoSchemaMixin, TeamRestrictedAPIView):
56111
serializer_class = CyberstormServiceAccountSerializer
57112
filter_backends = [StrictOrderingFilter]

django/thunderstore/api/urls.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
CommunityFiltersAPIView,
66
CommunityListAPIView,
77
CommunityPackageListAPIView,
8+
EditTeamMemberAPIView,
89
NamespacePackageListAPIView,
910
PackageDependantsListAPIView,
1011
TeamDetailAPIView,
@@ -53,6 +54,11 @@
5354
TeamMembersAPIView.as_view(),
5455
name="cyberstorm.team.members",
5556
),
57+
path(
58+
"team/<str:team_name>/members/edit/",
59+
EditTeamMemberAPIView.as_view(),
60+
name="cyberstorm.team.members.edit",
61+
),
5662
path(
5763
"team/<str:team_id>/service-accounts/",
5864
TeamServiceAccountsAPIView.as_view(),

0 commit comments

Comments
 (0)