Skip to content

Commit cbcbb35

Browse files
committed
Add EditTeamMemberAPIView
1 parent 31405a1 commit cbcbb35

File tree

3 files changed

+69
-2
lines changed

3 files changed

+69
-2
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: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
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 drf_yasg.utils import swagger_auto_schema
4+
from rest_framework import serializers
5+
from rest_framework.exceptions import PermissionDenied, ValidationError
36
from rest_framework.generics import ListAPIView, RetrieveAPIView, get_object_or_404
47
from rest_framework.permissions import IsAuthenticated
58
from rest_framework.request import Request
9+
from rest_framework.response import Response
10+
from rest_framework.views import APIView
611

712
from thunderstore.account.models.service_account import ServiceAccount
813
from thunderstore.api.cyberstorm.serializers import (
@@ -12,8 +17,11 @@
1217
)
1318
from thunderstore.api.ordering import StrictOrderingFilter
1419
from thunderstore.api.utils import CyberstormAutoSchemaMixin
20+
from thunderstore.repository.forms import EditTeamMemberForm
1521
from thunderstore.repository.models.team import Team, TeamMember
1622

23+
User = get_user_model()
24+
1725

1826
class TeamDetailAPIView(CyberstormAutoSchemaMixin, RetrieveAPIView):
1927
serializer_class = CyberstormTeamSerializer
@@ -52,6 +60,53 @@ def get_queryset(self) -> QuerySet[TeamMember]:
5260
)
5361

5462

63+
class CyberstormEditTeamMemberRequestSerialiazer(serializers.Serializer):
64+
username = serializers.CharField(
65+
max_length=User._meta.get_field("username").max_length
66+
)
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+
@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)