Skip to content

Commit e60e8a8

Browse files
authored
Merge pull request #14 from oleveloper/feature/sponsor
Feature: Add sponser viewset
2 parents c931ed4 + c01feb4 commit e60e8a8

File tree

5 files changed

+100
-1
lines changed

5 files changed

+100
-1
lines changed

pyconkr/urls.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,11 @@
1616
from django.contrib import admin
1717
from django.urls import include, path
1818

19+
import sponsor.routers
20+
1921
urlpatterns = [
2022
path("api-auth/", include("rest_framework.urls")),
2123
path("summernote/", include("django_summernote.urls")),
2224
path("admin/", admin.site.urls),
23-
path("sponsors/", include("sponsor.urls")),
25+
path("sponsors/", include(sponsor.routers.get_router().urls)),
2426
]

sponsor/permissions.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
from rest_framework import permissions
2+
3+
from sponsor.models import Sponsor
4+
5+
6+
class IsOwnerOrReadOnly(permissions.BasePermission):
7+
# https://stackoverflow.com/questions/72691826/djnago-rest-framework-how-to-allow-only-update-user-own-content-only
8+
def has_object_permission(self, request, view, obj: Sponsor):
9+
if request.method in permissions.SAFE_METHODS:
10+
return True
11+
12+
return obj.manager_id == request.user or obj.creator == request.user
13+
14+
15+
class OwnerOnly(permissions.BasePermission):
16+
def has_object_permission(self, request, view, obj: Sponsor):
17+
return obj.manager_id == request.user or obj.creator == request.user

sponsor/routers.py

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from rest_framework.routers import DefaultRouter
2+
3+
from sponsor.viewsets import *
4+
5+
6+
def get_router():
7+
router = DefaultRouter()
8+
router.register("", SponsorViewSet, basename="sponsor")
9+
10+
return router

sponsor/serializers.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from rest_framework.serializers import ModelSerializer
2+
3+
from sponsor.models import Sponsor
4+
5+
6+
class SponsorSerializer(ModelSerializer):
7+
class Meta:
8+
model = Sponsor
9+
fields = "__all__"
10+
11+
12+
class SponsorListSerializer(ModelSerializer):
13+
class Meta:
14+
model = Sponsor
15+
fields = [
16+
"name",
17+
"level",
18+
"desc",
19+
"eng_desc",
20+
"url",
21+
"logo_image",
22+
"id",
23+
]

sponsor/viewsets.py

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from django.shortcuts import get_object_or_404
2+
from rest_framework.permissions import IsAuthenticatedOrReadOnly
3+
from rest_framework.response import Response
4+
from rest_framework.viewsets import ModelViewSet
5+
6+
from sponsor.models import Sponsor
7+
from sponsor.permissions import IsOwnerOrReadOnly, OwnerOnly
8+
from sponsor.serializers import SponsorListSerializer, SponsorSerializer
9+
10+
11+
class SponsorViewSet(ModelViewSet):
12+
serializer_class = SponsorSerializer
13+
permission_classes = [IsOwnerOrReadOnly] # 본인 소유만 수정가능
14+
http_method_names = ["get", "post"] # 지금은 조회/등록만 가능 TODO: 추후 수정기능 추가
15+
16+
def get_queryset(self):
17+
return Sponsor.objects.all()
18+
19+
def list(self, request, *args, **kwargs):
20+
queryset = Sponsor.objects.filter(accepted=True).order_by("name")
21+
serializer = SponsorListSerializer(queryset, many=True)
22+
return Response(serializer.data)
23+
24+
def create(self, request, *args, **kwargs):
25+
serializer = self.get_serializer(data=request.data)
26+
serializer.is_valid(raise_exception=True)
27+
serializer.save()
28+
return Response(serializer.data)
29+
30+
def retrieve(self, request, *args, **kwargs):
31+
pk = kwargs["pk"]
32+
sponsor_data = get_object_or_404(Sponsor, pk=pk)
33+
34+
# 본인 소유인 경우는 모든 필드
35+
# 그렇지 않은 경우는 공개 가능한 필드만 응답
36+
serializer = (
37+
SponsorSerializer(sponsor_data)
38+
if self.check_owner_permission(request, sponsor_data)
39+
else SponsorListSerializer(sponsor_data)
40+
)
41+
42+
return Response(serializer.data)
43+
44+
def check_owner_permission(self, request, sponsor_data: Sponsor):
45+
return OwnerOnly.has_object_permission(
46+
self=OwnerOnly, request=request, view=self, obj=sponsor_data
47+
)

0 commit comments

Comments
 (0)