Skip to content

Commit d7300fe

Browse files
committed
Add EditTeamMemberAPIView
1 parent 31405a1 commit d7300fe

File tree

3 files changed

+71
-3
lines changed

3 files changed

+71
-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: 58 additions & 2 deletions
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 django.http import HttpRequest
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 (
@@ -11,9 +16,15 @@
1116
CyberstormTeamSerializer,
1217
)
1318
from thunderstore.api.ordering import StrictOrderingFilter
14-
from thunderstore.api.utils import CyberstormAutoSchemaMixin
19+
from thunderstore.api.utils import (
20+
CyberstormAutoSchemaMixin,
21+
conditional_swagger_auto_schema,
22+
)
23+
from thunderstore.repository.forms import EditTeamMemberForm
1524
from thunderstore.repository.models.team import Team, TeamMember
1625

26+
User = get_user_model()
27+
1728

1829
class TeamDetailAPIView(CyberstormAutoSchemaMixin, RetrieveAPIView):
1930
serializer_class = CyberstormTeamSerializer
@@ -52,6 +63,51 @@ def get_queryset(self) -> QuerySet[TeamMember]:
5263
)
5364

5465

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