diff --git a/django/thunderstore/api/cyberstorm/views/__init__.py b/django/thunderstore/api/cyberstorm/views/__init__.py index 6df5135e0..60b27373d 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 ( + TeamCreateAPIView, + TeamDetailAPIView, + TeamMembersAPIView, + TeamServiceAccountsAPIView, +) __all__ = [ "CommunityDetailAPIView", @@ -16,6 +21,7 @@ "NamespacePackageListAPIView", "PackageDependantsListAPIView", "TeamDetailAPIView", + "TeamCreateAPIView", "TeamMembersAPIView", "TeamServiceAccountsAPIView", ] diff --git a/django/thunderstore/api/cyberstorm/views/team.py b/django/thunderstore/api/cyberstorm/views/team.py index 63062a64a..3e725d447 100644 --- a/django/thunderstore/api/cyberstorm/views/team.py +++ b/django/thunderstore/api/cyberstorm/views/team.py @@ -1,8 +1,12 @@ 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,6 +16,7 @@ ) from thunderstore.api.ordering import StrictOrderingFilter from thunderstore.api.utils import CyberstormAutoSchemaMixin +from thunderstore.repository.forms import CreateTeamForm from thunderstore.repository.models.team import Team, TeamMember @@ -39,6 +44,40 @@ def check_permissions(self, request: Request) -> None: raise PermissionDenied() +class CyberstormTeamCreateRequestSerialiazer(serializers.Serializer): + name = serializers.CharField( + max_length=Team._meta.get_field("name").max_length, + validators=Team._meta.get_field("name").validators, + ) + + +class CyberstormTeamCreateResponseSerialiazer(serializers.Serializer): + name = serializers.CharField() + + +class TeamCreateAPIView(APIView): + @swagger_auto_schema( + request_body=CyberstormTeamCreateRequestSerialiazer, + responses={200: CyberstormTeamCreateResponseSerialiazer}, + operation_id="cyberstorm.teams.create", + tags=["cyberstorm"], + ) + def post(self, request, format=None): + form = CreateTeamForm( + user=request.user, + data=request.data, + ) + + serializer = CyberstormTeamCreateRequestSerialiazer(data=request.data) + serializer.is_valid(raise_exception=True) + + if form.is_valid(): + team = form.save() + return Response(CyberstormTeamCreateResponseSerialiazer(team).data) + else: + raise ValidationError(form.errors) + + class TeamMembersAPIView(CyberstormAutoSchemaMixin, TeamRestrictedAPIView): serializer_class = CyberstormTeamMemberSerializer filter_backends = [StrictOrderingFilter] diff --git a/django/thunderstore/api/urls.py b/django/thunderstore/api/urls.py index 5b777b6f6..f4556e376 100644 --- a/django/thunderstore/api/urls.py +++ b/django/thunderstore/api/urls.py @@ -7,6 +7,7 @@ CommunityPackageListAPIView, NamespacePackageListAPIView, PackageDependantsListAPIView, + TeamCreateAPIView, TeamDetailAPIView, TeamMembersAPIView, TeamServiceAccountsAPIView, @@ -43,6 +44,11 @@ PackageDependantsListAPIView.as_view(), name="cyberstorm.package.community.namespace.package-dependants", ), + path( + "teams/create/", + TeamCreateAPIView.as_view(), + name="cyberstorm.teams.create", + ), path( "team//", TeamDetailAPIView.as_view(),