Skip to content

Commit 965c87a

Browse files
authored
Merge branch 'devdev' into feature/golony/status
2 parents 716eef7 + a948eac commit 965c87a

File tree

5 files changed

+71
-1
lines changed

5 files changed

+71
-1
lines changed

pyconkr/settings.py

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,8 @@
4545
# apps
4646
"sponsor",
4747
"status",
48+
# swagger
49+
"drf_spectacular",
4850
]
4951

5052
MIDDLEWARE = [
@@ -146,3 +148,25 @@
146148
"후원사 변동사항에 대한 알림을 보낼 채널",
147149
),
148150
}
151+
152+
# drf-spectacular
153+
REST_FRAMEWORK = {
154+
# YOUR SETTINGS
155+
"DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
156+
}
157+
158+
SPECTACULAR_SETTINGS = {
159+
"TITLE": "pyconkr-api-v2",
160+
"DESCRIPTION": "파이콘 한국 웹서비스용 API (2023 ~ )",
161+
"VERSION": "1.0.0",
162+
"SERVE_INCLUDE_SCHEMA": True,
163+
# available SwaggerUI configuration parameters
164+
# https://swagger.io/docs/open-source-tools/swagger-ui/usage/configuration/
165+
"SWAGGER_UI_SETTINGS": {
166+
"deepLinking": True,
167+
"persistAuthorization": True,
168+
"displayOperationId": True,
169+
},
170+
# available SwaggerUI versions: https://github.com/swagger-api/swagger-ui/releases
171+
"SWAGGER_UI_DIST": "//unpkg.com/[email protected]",
172+
}

pyconkr/urls.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,14 @@
1313
1. Import the include() function: from django.urls import include, path
1414
2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
1515
"""
16+
from django.conf import settings
1617
from django.contrib import admin
1718
from django.urls import include, path
19+
from drf_spectacular.views import (
20+
SpectacularAPIView,
21+
SpectacularRedocView,
22+
SpectacularSwaggerView,
23+
)
1824

1925
import sponsor.routers
2026
import status.urls
@@ -26,3 +32,19 @@
2632
path("sponsors/", include(sponsor.routers.get_router().urls)),
2733
path("status/", include(status.urls)),
2834
]
35+
36+
if settings.DEBUG is True:
37+
urlpatterns += [
38+
path("api/schema/", SpectacularAPIView.as_view(), name="schema"),
39+
# Optional UI:
40+
path(
41+
"api/schema/swagger-ui/",
42+
SpectacularSwaggerView.as_view(url_name="schema"),
43+
name="swagger-ui",
44+
),
45+
path(
46+
"api/schema/redoc/",
47+
SpectacularRedocView.as_view(url_name="schema"),
48+
name="redoc",
49+
),
50+
]

requirements.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,4 @@ django-summernote==0.8.20.0
1414
Pillow==9.4.0
1515
django-constance==2.9.1
1616
django-picklefield==3.1
17+
drf-spectacular==0.25.1

sponsor/validators.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from collections import OrderedDict
2+
3+
from sponsor.models import Sponsor
4+
5+
6+
class SponsorValidater:
7+
def assert_create(self, sponsor: OrderedDict):
8+
target = [self.check_remain_slot(sponsor)]
9+
10+
def check_remain_slot(self, sponsor: OrderedDict):
11+
target_level = sponsor.get("level")
12+
13+
if target_level.limit <= len(
14+
Sponsor.objects.filter(level=target_level, accepted=True)
15+
):
16+
raise RuntimeError("ERROR: 남은 슬롯 없음")

sponsor/viewsets.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
from typing import Type
22

3+
from django.db.transaction import atomic
34
from django.shortcuts import get_object_or_404
45
from rest_framework.response import Response
56
from rest_framework.viewsets import ModelViewSet
@@ -12,12 +13,14 @@
1213
SponsorRemainingAccountSerializer,
1314
SponsorSerializer,
1415
)
16+
from sponsor.validators import SponsorValidater
1517

1618

1719
class SponsorViewSet(ModelViewSet):
1820
serializer_class = SponsorSerializer
1921
permission_classes = [IsOwnerOrReadOnly] # 본인 소유만 수정가능
2022
http_method_names = ["get", "post"] # 지금은 조회/등록만 가능 TODO: 추후 수정기능 추가
23+
validator = SponsorValidater()
2124

2225
def get_queryset(self):
2326
return Sponsor.objects.all()
@@ -27,10 +30,14 @@ def list(self, request, *args, **kwargs):
2730
serializer = SponsorListSerializer(queryset, many=True)
2831
return Response(serializer.data)
2932

33+
@atomic
3034
def create(self, request, *args, **kwargs):
3135
serializer = self.get_serializer(data=request.data)
3236
serializer.is_valid(raise_exception=True)
33-
serializer.save()
37+
self.validator.assert_create(serializer.validated_data)
38+
39+
new_sponsor = serializer.save()
40+
3441
return Response(serializer.data)
3542

3643
def retrieve(self, request, *args, **kwargs):

0 commit comments

Comments
 (0)