Skip to content

Commit 5a9efff

Browse files
committed
Add TeamCreateAPI view
1 parent 1d0e07f commit 5a9efff

File tree

4 files changed

+106
-1
lines changed

4 files changed

+106
-1
lines changed

django/thunderstore/api/cyberstorm/tests/test_team.py

+60
Original file line numberDiff line numberDiff line change
@@ -318,3 +318,63 @@ def test_team_member_add_api_view__when_adding_a_member__fails_because_user_is_n
318318
.count()
319319
== 0
320320
)
321+
322+
323+
@pytest.mark.django_db
324+
def test_team_create__when_creating_a_team__succeeds(
325+
api_client: APIClient,
326+
user: UserType,
327+
):
328+
api_client.force_authenticate(user)
329+
330+
response = api_client.post(
331+
"/api/cyberstorm/teams/create/",
332+
json.dumps({"name": "CoolestTeamNameEver"}),
333+
content_type="application/json",
334+
)
335+
336+
assert response.status_code == 200
337+
response_json = response.json()
338+
assert response_json["name"] == "CoolestTeamNameEver"
339+
assert (
340+
Team.objects.get(name="CoolestTeamNameEver")
341+
.members.filter(user__username=user.username)
342+
.count()
343+
== 1
344+
)
345+
346+
347+
@pytest.mark.django_db
348+
def test_team_create__when_creating_a_team__fails_because_user_is_not_authenticated(
349+
api_client: APIClient,
350+
user: UserType,
351+
):
352+
response = api_client.post(
353+
"/api/cyberstorm/teams/create/",
354+
json.dumps({"name": "CoolestTeamNameEver"}),
355+
content_type="application/json",
356+
)
357+
358+
assert response.status_code == 401
359+
response_json = response.json()
360+
assert response_json["detail"] == "Authentication credentials were not provided."
361+
assert Team.objects.filter(name="CoolestTeamNameEver").count() == 0
362+
363+
364+
@pytest.mark.django_db
365+
def test_team_create__when_creating_a_team__fails_because_team_with_provided_name_exists(
366+
api_client: APIClient,
367+
user: UserType,
368+
team: Team,
369+
):
370+
api_client.force_authenticate(user)
371+
372+
response = api_client.post(
373+
"/api/cyberstorm/teams/create/",
374+
json.dumps({"name": team.name}),
375+
content_type="application/json",
376+
)
377+
378+
assert response.status_code == 400
379+
response_json = response.json()
380+
assert "A team with the provided name already exists" in response_json["name"]

django/thunderstore/api/cyberstorm/views/__init__.py

+2
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
from .package_version_list import PackageVersionListAPIView
1414
from .team import (
1515
TeamAPIView,
16+
TeamCreateAPIView,
1617
TeamMemberAddAPIView,
1718
TeamMemberListAPIView,
1819
TeamServiceAccountListAPIView,
@@ -36,4 +37,5 @@
3637
"PackageRatingRateAPIView",
3738
"PackageDeprecateAPIView",
3839
"PackageListingEditCategoriesAPIView",
40+
"TeamCreateAPIView",
3941
]

django/thunderstore/api/cyberstorm/views/team.py

+38-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from django.db.models import Q, QuerySet
2+
from django.http import HttpRequest
23
from rest_framework import serializers
34
from rest_framework.exceptions import PermissionDenied, ValidationError
45
from rest_framework.generics import ListAPIView, RetrieveAPIView, get_object_or_404
@@ -18,7 +19,7 @@
1819
CyberstormAutoSchemaMixin,
1920
conditional_swagger_auto_schema,
2021
)
21-
from thunderstore.repository.forms import AddTeamMemberForm
22+
from thunderstore.repository.forms import AddTeamMemberForm, CreateTeamForm
2223
from thunderstore.repository.models.team import Team, TeamMember
2324

2425

@@ -45,6 +46,42 @@ def check_permissions(self, request: Request) -> None:
4546
raise PermissionDenied()
4647

4748

49+
class CyberstormTeamCreateRequestSerialiazer(serializers.Serializer):
50+
name = serializers.CharField(
51+
max_length=Team._meta.get_field("name").max_length,
52+
validators=Team._meta.get_field("name").validators,
53+
)
54+
55+
56+
class CyberstormTeamCreateResponseSerialiazer(serializers.Serializer):
57+
name = serializers.CharField()
58+
59+
60+
class TeamCreateAPIView(APIView):
61+
permission_classes = [IsAuthenticated]
62+
63+
@conditional_swagger_auto_schema(
64+
request_body=CyberstormTeamCreateRequestSerialiazer,
65+
responses={200: CyberstormTeamCreateResponseSerialiazer},
66+
operation_id="cyberstorm.teams.create",
67+
tags=["cyberstorm"],
68+
)
69+
def post(self, request: HttpRequest):
70+
serializer = CyberstormTeamCreateRequestSerialiazer(data=request.data)
71+
serializer.is_valid(raise_exception=True)
72+
73+
form = CreateTeamForm(
74+
user=request.user,
75+
data=serializer.validated_data,
76+
)
77+
78+
if form.is_valid():
79+
team = form.save()
80+
return Response(CyberstormTeamCreateResponseSerialiazer(team).data)
81+
else:
82+
raise ValidationError(form.errors)
83+
84+
4885
class TeamMemberListAPIView(CyberstormAutoSchemaMixin, TeamRestrictedAPIView):
4986
permission_classes = [AllowAny]
5087
serializer_class = CyberstormTeamMemberSerializer

django/thunderstore/api/urls.py

+6
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
PackageVersionListAPIView,
1616
PackageVersionReadmeAPIView,
1717
TeamAPIView,
18+
TeamCreateAPIView,
1819
TeamMemberAddAPIView,
1920
TeamMemberListAPIView,
2021
TeamServiceAccountListAPIView,
@@ -97,6 +98,11 @@
9798
PackageDeprecateAPIView.as_view(),
9899
name="cyberstorm.package.deprecate",
99100
),
101+
path(
102+
"teams/create/",
103+
TeamCreateAPIView.as_view(),
104+
name="cyberstorm.teams.create",
105+
),
100106
path(
101107
"team/<str:team_id>/",
102108
TeamAPIView.as_view(),

0 commit comments

Comments
 (0)