From cbcbb35d9995d5a35c1025b2bed08aa516315ef7 Mon Sep 17 00:00:00 2001 From: Oksamies Date: Mon, 11 Dec 2023 19:02:26 +0200 Subject: [PATCH] Add EditTeamMemberAPIView --- .../api/cyberstorm/views/__init__.py | 8 ++- .../thunderstore/api/cyberstorm/views/team.py | 57 ++++++++++++++++++- django/thunderstore/api/urls.py | 6 ++ 3 files changed, 69 insertions(+), 2 deletions(-) diff --git a/django/thunderstore/api/cyberstorm/views/__init__.py b/django/thunderstore/api/cyberstorm/views/__init__.py index 6df5135e0..7bcd06d56 100644 --- a/django/thunderstore/api/cyberstorm/views/__init__.py +++ b/django/thunderstore/api/cyberstorm/views/__init__.py @@ -6,7 +6,12 @@ NamespacePackageListAPIView, PackageDependantsListAPIView, ) -from .team import TeamDetailAPIView, TeamMembersAPIView, TeamServiceAccountsAPIView +from .team import ( + EditTeamMemberAPIView, + TeamDetailAPIView, + TeamMembersAPIView, + TeamServiceAccountsAPIView, +) __all__ = [ "CommunityDetailAPIView", @@ -17,5 +22,6 @@ "PackageDependantsListAPIView", "TeamDetailAPIView", "TeamMembersAPIView", + "EditTeamMemberAPIView", "TeamServiceAccountsAPIView", ] diff --git a/django/thunderstore/api/cyberstorm/views/team.py b/django/thunderstore/api/cyberstorm/views/team.py index 63062a64a..f0087357c 100644 --- a/django/thunderstore/api/cyberstorm/views/team.py +++ b/django/thunderstore/api/cyberstorm/views/team.py @@ -1,8 +1,13 @@ +from django.contrib.auth import get_user_model from django.db.models import Q, QuerySet -from rest_framework.exceptions import PermissionDenied +from drf_yasg.utils import swagger_auto_schema +from rest_framework import serializers +from rest_framework.exceptions import PermissionDenied, ValidationError from rest_framework.generics import ListAPIView, RetrieveAPIView, get_object_or_404 from rest_framework.permissions import IsAuthenticated from rest_framework.request import Request +from rest_framework.response import Response +from rest_framework.views import APIView from thunderstore.account.models.service_account import ServiceAccount from thunderstore.api.cyberstorm.serializers import ( @@ -12,8 +17,11 @@ ) from thunderstore.api.ordering import StrictOrderingFilter from thunderstore.api.utils import CyberstormAutoSchemaMixin +from thunderstore.repository.forms import EditTeamMemberForm from thunderstore.repository.models.team import Team, TeamMember +User = get_user_model() + class TeamDetailAPIView(CyberstormAutoSchemaMixin, RetrieveAPIView): serializer_class = CyberstormTeamSerializer @@ -52,6 +60,53 @@ def get_queryset(self) -> QuerySet[TeamMember]: ) +class CyberstormEditTeamMemberRequestSerialiazer(serializers.Serializer): + username = serializers.CharField( + max_length=User._meta.get_field("username").max_length + ) + role = serializers.ChoiceField( + choices=EditTeamMemberForm.base_fields["role"].choices + ) + + +class CyberstormEditTeamMemberResponseSerialiazer(serializers.Serializer): + username = serializers.CharField(source="user") + role = serializers.ChoiceField( + choices=EditTeamMemberForm.base_fields["role"].choices + ) + team_name = serializers.CharField(source="team") + + +class EditTeamMemberAPIView(APIView): + @swagger_auto_schema( + request_body=CyberstormEditTeamMemberRequestSerialiazer, + responses={200: CyberstormEditTeamMemberResponseSerialiazer}, + operation_id="cyberstorm.team.members.edit", + tags=["cyberstorm"], + ) + def post(self, request, team_name, format=None): + serializer = CyberstormEditTeamMemberRequestSerialiazer(data=request.data) + serializer.is_valid(raise_exception=True) + team_member = get_object_or_404( + TeamMember, + user__username__iexact=request.data["username"], + team__name__iexact=team_name, + ) + form = EditTeamMemberForm( + user=request.user, + instance=team_member, + data=request.data, + ) + + if form.is_valid(): + team_member = form.save() + return Response( + CyberstormEditTeamMemberResponseSerialiazer(team_member).data + ) + else: + raise ValidationError(form.errors) + + class TeamServiceAccountsAPIView(CyberstormAutoSchemaMixin, TeamRestrictedAPIView): serializer_class = CyberstormServiceAccountSerializer filter_backends = [StrictOrderingFilter] diff --git a/django/thunderstore/api/urls.py b/django/thunderstore/api/urls.py index 5b777b6f6..49e9ddc4c 100644 --- a/django/thunderstore/api/urls.py +++ b/django/thunderstore/api/urls.py @@ -5,6 +5,7 @@ CommunityFiltersAPIView, CommunityListAPIView, CommunityPackageListAPIView, + EditTeamMemberAPIView, NamespacePackageListAPIView, PackageDependantsListAPIView, TeamDetailAPIView, @@ -53,6 +54,11 @@ TeamMembersAPIView.as_view(), name="cyberstorm.team.members", ), + path( + "team//members/edit/", + EditTeamMemberAPIView.as_view(), + name="cyberstorm.team.members.edit", + ), path( "team//service-accounts/", TeamServiceAccountsAPIView.as_view(),