Skip to content

Commit b39771a

Browse files
authored
Merge pull request #102 from oleveloper/sponsor_api
Sponsor API 추가
2 parents 7c2fd83 + 2a40969 commit b39771a

File tree

5 files changed

+48
-35
lines changed

5 files changed

+48
-35
lines changed

pyconkr/urls.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,16 +22,16 @@
2222
SpectacularSwaggerView,
2323
)
2424

25-
import sponsor.routers
25+
import payment.urls
26+
import sponsor.urls
2627
import status.urls
2728
import ticket.urls
28-
import payment.urls
2929

3030
urlpatterns = [
3131
path("api-auth/", include("rest_framework.urls")),
3232
path("summernote/", include("django_summernote.urls")),
3333
path("admin/", admin.site.urls),
34-
path("sponsors", include(sponsor.routers.get_router().urls)),
34+
path("sponsors/", include(sponsor.urls)),
3535
path("programs/", include("program.urls")),
3636
path("statuses/", include(status.urls)),
3737
path("tickets/", include(ticket.urls)),

sponsor/routers.py

Lines changed: 0 additions & 12 deletions
This file was deleted.

sponsor/serializers.py

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ class Meta:
99
model = Sponsor
1010
fields = [
1111
"name",
12-
# "desc", # 국문/영문 모두 한 필드에 담아 제공하는 것으로 결정 # TODO: 상세 페이지 오픈 후 활성화
12+
"desc", # 국문/영문 모두 한 필드에 담아 제공
1313
"manager_name", # 상세에만 포함되는 필드
1414
"manager_email", # 상세에만 포함되는 필드
1515
"manager_tel", # 상세에만 포함되는 필드
@@ -21,30 +21,35 @@ class Meta:
2121
"level",
2222
"id",
2323
]
24+
read_only_fields = [
25+
"name",
26+
"level",
27+
"id",
28+
]
2429

2530

26-
class SponsorListSerializer(serializers.ModelSerializer):
31+
class SponsorDetailSerializer(serializers.ModelSerializer):
2732
class Meta:
2833
model = Sponsor
2934
fields = [
3035
"name",
31-
"level",
36+
"desc",
3237
"url",
3338
"logo_image",
39+
"level",
3440
"id",
3541
]
3642

3743

38-
class SponsorLevelSerializer(serializers.ModelSerializer):
44+
class SponsorListSerializer(serializers.ModelSerializer):
3945
class Meta:
40-
model = SponsorLevel
46+
model = Sponsor
4147
fields = [
4248
"name",
43-
"price",
44-
"desc",
45-
"limit",
49+
"logo_image",
50+
"level",
4651
"id",
47-
] # TODO: Add fields to show
52+
]
4853

4954

5055
class SponsorRemainingAccountSerializer(serializers.ModelSerializer):

sponsor/urls.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
1-
from django.contrib import admin
2-
from django.urls import include, path
1+
from django.urls import path
2+
3+
from sponsor.viewsets import SponsorViewSet
34

45
urlpatterns = [
5-
# path("", ), # TODO
6+
path("list/", SponsorViewSet.as_view({"get": "list"})),
7+
path(
8+
"list/<int:id>/",
9+
SponsorViewSet.as_view({"get": "retrieve", "put": "update"}),
10+
),
611
]

sponsor/viewsets.py

Lines changed: 23 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,14 @@
22

33
from django.db.transaction import atomic
44
from django.shortcuts import get_object_or_404
5+
from rest_framework import status
56
from rest_framework.response import Response
67
from rest_framework.viewsets import ModelViewSet
78

89
from sponsor.models import Sponsor, SponsorLevel
910
from sponsor.permissions import IsOwnerOrReadOnly, OwnerOnly
1011
from sponsor.serializers import (
11-
SponsorLevelSerializer,
12+
SponsorDetailSerializer,
1213
SponsorListSerializer,
1314
SponsorRemainingAccountSerializer,
1415
SponsorSerializer,
@@ -20,14 +21,14 @@
2021
class SponsorViewSet(ModelViewSet):
2122
serializer_class = SponsorSerializer
2223
permission_classes = [IsOwnerOrReadOnly] # 본인 소유만 수정 가능
23-
http_method_names = ["get", "post"] # 지금은 조회/등록만 가능 TODO: 추후 수정 기능 추가
24+
http_method_names = ["get", "post", "put"]
2425
validator = SponsorValidater()
2526

2627
def get_queryset(self):
2728
return Sponsor.objects.all()
2829

2930
def list(self, request, *args, **kwargs):
30-
queryset = Sponsor.objects.filter(accepted=True).order_by("name")
31+
queryset = Sponsor.objects.filter(paid_at__isnull=False).order_by("level")
3132
serializer = SponsorListSerializer(queryset, many=True)
3233
return Response(serializer.data)
3334

@@ -49,15 +50,15 @@ def create(self, request, *args, **kwargs):
4950
return Response(serializer.data)
5051

5152
def retrieve(self, request, *args, **kwargs):
52-
pk = kwargs["pk"]
53+
pk = kwargs["id"]
5354
sponsor_data = get_object_or_404(Sponsor, pk=pk)
5455

5556
# 본인 소유인 경우는 모든 필드
5657
# 그렇지 않은 경우는 공개 가능한 필드만 응답
5758
serializer = (
5859
SponsorSerializer(sponsor_data)
5960
if self.check_owner_permission(request, sponsor_data)
60-
else SponsorListSerializer(sponsor_data)
61+
else SponsorDetailSerializer(sponsor_data)
6162
)
6263

6364
return Response(serializer.data)
@@ -67,17 +68,31 @@ def check_owner_permission(self, request, sponsor_data: Sponsor):
6768
self=Type[OwnerOnly], request=request, view=self, obj=sponsor_data
6869
)
6970

71+
def update(self, request, *args, **kwargs):
72+
pk = kwargs["id"]
73+
sponsor_data = get_object_or_404(Sponsor, pk=pk)
74+
serializer = SponsorSerializer(sponsor_data, data=request.data, partial=True)
75+
76+
if not self.check_owner_permission(request, sponsor_data):
77+
return Response(None, status.HTTP_401_UNAUTHORIZED)
78+
79+
if serializer.is_valid():
80+
serializer.save()
81+
return Response(serializer.data)
7082

71-
class SponsorLevelViewSet(ModelViewSet):
72-
serializer_class = SponsorLevelSerializer
83+
return Response(serializer.errors, status.HTTP_400_BAD_REQUEST)
84+
85+
86+
class SponsorListViewSet(ModelViewSet):
87+
serializer_class = SponsorListSerializer
7388
http_method_names = ["get"]
7489

7590
def get_queryset(self):
7691
return SponsorLevel.objects.all()
7792

7893
def list(self, request, *args, **kwargs):
7994
queryset = SponsorLevel.objects.all().order_by("-price")
80-
serializer = SponsorLevelSerializer(queryset, many=True)
95+
serializer = SponsorListSerializer(queryset, many=True)
8196

8297
return Response(serializer.data)
8398

0 commit comments

Comments
 (0)