-
Notifications
You must be signed in to change notification settings - Fork 11
Expand file tree
/
Copy pathviewsets.py
More file actions
90 lines (81 loc) · 3.17 KB
/
Copy pathviewsets.py
File metadata and controls
90 lines (81 loc) · 3.17 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
from django.conf import settings
from django.utils.decorators import method_decorator
from django.views.decorators.cache import cache_page
from drf_spectacular.utils import OpenApiExample, OpenApiResponse, extend_schema
from rest_framework.permissions import IsAuthenticatedOrReadOnly
from rest_framework.response import Response
from rest_framework.viewsets import ModelViewSet
from pyconkr.external_apis.pretalx.client import pretalx_client
from pyconkr.external_apis.pretalx.serializers import PretalxSessionSerializer
from session.models import Session
from session.serializers import SessionListSerializer, SessionSerializer
class SessionViewSet(ModelViewSet):
queryset = Session.objects.all()
permission_classes = [IsAuthenticatedOrReadOnly]
http_method_names = ["get", "head", "options"]
def get_serializer_class(self):
if self.action == "list":
return SessionListSerializer
return SessionSerializer
def get_queryset(self):
return super().get_queryset().filter(category__year=self.request.version)
@extend_schema(
examples={
200: OpenApiResponse(
response=str,
examples=[
OpenApiExample(
name="2023년 세션 목록", value=SessionListSerializer(many=True)
),
OpenApiExample(
name="2024년 이후 세션 목록 (Pretalx)",
value=PretalxSessionSerializer(many=True),
),
],
),
},
)
# cache list about 30 minutes
@method_decorator(cache_page(60 * 30))
def list(self, request, *args, **kwargs) -> Response:
if (
request.version == 2023
or request.version not in settings.PRETALX.EVENT_NAME
):
return super().list(request, *args, **kwargs)
pretalx_event_name = settings.PRETALX.EVENT_NAME[request.version]
return Response(
data=pretalx_client.list_sessions(
event_name=pretalx_event_name,
only_confirmed=not settings.DEBUG,
)["results"],
)
@extend_schema(
examples={
200: OpenApiResponse(
response=str,
examples=[
OpenApiExample(name="2023년 세션 상세", value=SessionSerializer()),
OpenApiExample(
name="2024년 이후 세션 상세 (Pretalx)",
value=PretalxSessionSerializer(),
),
],
),
},
)
# cache each about 30 minutes
@method_decorator(cache_page(60 * 30))
def retrieve(self, request, *args, **kwargs) -> Response:
if (
request.version == 2023
or request.version not in settings.PRETALX.EVENT_NAME
):
return super().retrieve(request, *args, **kwargs)
pretalx_event_name = settings.PRETALX.EVENT_NAME[request.version]
return Response(
data=pretalx_client.retrieve_session(
event_name=pretalx_event_name,
session_id=kwargs["pk"],
),
)