Skip to content

Commit 8bda898

Browse files
committed
Add EditTeamMemberAPIView
1 parent 31405a1 commit 8bda898

File tree

3 files changed

+72
-3
lines changed

3 files changed

+72
-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: 59 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,53 @@ def get_queryset(self) -> QuerySet[TeamMember]:
5262
)
5363

5464

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