Skip to content

Commit 24a99f6

Browse files
committed
[refactor/WS-12] apiview -> viewset
1 parent ac369da commit 24a99f6

File tree

4 files changed

+148
-6
lines changed

4 files changed

+148
-6
lines changed

WAKe_server/settings/base.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
"rest_framework",
4848
"rest_framework_simplejwt",
4949
"rest_framework_simplejwt.token_blacklist",
50+
'drf_spectacular',
5051
"drf_yasg",
5152
"storages",
5253
]
@@ -162,6 +163,7 @@
162163
'DEFAULT_PERMISSION_CLASSES': (
163164
'rest_framework.permissions.AllowAny', # 누구나 접근
164165
),
166+
"DEFAULT_SCHEMA_CLASS": "drf_spectacular.openapi.AutoSchema",
165167
}
166168

167169
#rest auth

records/serializer.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,12 @@ class RecordListSerializer(serializers.Serializer):
2525
records = RecordSerializer(many=True)
2626

2727

28-
class RecordCreateSerializer(serializers.Serializer):
28+
class CreateRecordSerializer(serializers.Serializer):
29+
content_id = serializers.IntegerField()
30+
text = serializers.CharField(max_length=100, allow_blank=True, allow_null=True)
31+
32+
33+
class RecordCreateSerializer(serializers.Serializer): # todo: deprecated
2934
content_id = serializers.IntegerField()
3035
username = serializers.CharField(max_length=20)
3136
text = serializers.CharField(max_length=100, allow_blank=True, allow_null=True)

records/urls.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
from django.urls import path
22
from rest_framework.routers import SimpleRouter
33

4-
from records.views import RecordListAPIView, RecordCreateAPIView, ContentViewSet
4+
from records.views import RecordListAPIView, RecordCreateAPIView, ContentViewSet, RecordViewSet, RandomContentAPIView
55

66
app_name = 'records'
77

88
router = SimpleRouter()
9+
router.register("", RecordViewSet, basename="record")
910
router.register("content", ContentViewSet, basename="content")
1011

1112
urlpatterns = router.urls
1213

1314
urlpatterns += [
1415
path("records/list/", RecordListAPIView.as_view(), name="record_list"),
1516
path("records/create/", RecordCreateAPIView.as_view(), name="record_create"),
17+
path("contents/random/", RandomContentAPIView.as_view(), name="content_random"),
1618
]

records/views.py

Lines changed: 137 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from django.db.models.functions import TruncDate
55
from drf_spectacular.utils import extend_schema, OpenApiParameter
66
from drf_yasg.utils import swagger_auto_schema
7-
from rest_framework import viewsets, status
7+
from rest_framework import viewsets, status, mixins
88
from rest_framework.decorators import action
99
from rest_framework.generics import ListAPIView, GenericAPIView, CreateAPIView
1010
from rest_framework.permissions import IsAuthenticated
@@ -13,12 +13,13 @@
1313

1414
from records.models import Record, Content
1515
from records.serializer import RecordSerializer, ContentSerializer, RecordCreateSerializer, RecordListQuerySerializer, \
16-
RandomContentQuerySerializer, RecordListSerializer
16+
RandomContentQuerySerializer, RecordListSerializer, CreateRecordSerializer
1717
from accounts.models import CommonProfile
1818
from utils.time import KST
1919

2020

2121
class ContentViewSet(viewsets.GenericViewSet):
22+
model = Record
2223
serializer_class = ContentSerializer
2324
permission_classes = [IsAuthenticated]
2425

@@ -45,11 +46,138 @@ def random(self, request, *args, **kwargs):
4546
return Response(serializer.data)
4647

4748

49+
@extend_schema(tags=["Record Domain"])
50+
class RecordViewSet(
51+
viewsets.GenericViewSet,
52+
mixins.ListModelMixin,
53+
mixins.CreateModelMixin):
54+
model = Record
55+
serializer_class = RecordListSerializer
56+
permission_classes = [IsAuthenticated]
57+
58+
def get_target_dates(self) -> (datetime.date, datetime.date):
59+
q_target_date = self.request.query_params.get('target_date')
60+
if q_target_date:
61+
target_date_end = datetime.datetime.strptime(q_target_date, '%Y-%m-%d').date()
62+
else:
63+
target_date_end = datetime.datetime.today().astimezone(tz=KST).date()
64+
target_date_st = target_date_end - datetime.timedelta(days=6)
65+
return target_date_st, target_date_end
66+
67+
def get_queryset(self):
68+
target_date_st, target_date_end = self.get_target_dates()
69+
70+
queryset = Record.objects.filter(
71+
profile__user=self.request.user
72+
).annotate(
73+
record_date=TruncDate('created_at', tzinfo=KST)
74+
).filter(
75+
record_date__gte=target_date_st,
76+
record_date__lte=target_date_end
77+
).select_related(
78+
'content'
79+
).order_by(
80+
'created_at'
81+
)
82+
83+
return queryset
84+
85+
@extend_schema(
86+
request=RecordCreateSerializer,
87+
summary="기록 조회 API",
88+
description="기록을 조회합니다.",
89+
responses={status.HTTP_200_OK: RecordListSerializer(many=True)},
90+
)
91+
@swagger_auto_schema( # todo: extend_schema 적용
92+
operation_summary="기록 조회 API",
93+
query_serializer=RecordListQuerySerializer,
94+
responses={status.HTTP_200_OK: RecordListSerializer(many=True)}
95+
)
96+
def list(self, request, *args, **kwargs):
97+
target_date_st, target_date_end = self.get_target_dates()
98+
queryset = self.filter_queryset(self.get_queryset())
99+
100+
serializer = RecordSerializer(queryset, many=True)
101+
records = serializer.data
102+
103+
results = []
104+
while target_date_st <= target_date_end:
105+
results.append(dict(
106+
date=target_date_st.strftime('%Y-%m-%d'),
107+
records=list(filter(
108+
lambda x: datetime.datetime.fromisoformat(x.get('created_at')).astimezone(
109+
KST).date() == target_date_st,
110+
records
111+
))
112+
))
113+
target_date_st += datetime.timedelta(days=1)
114+
return Response(results)
115+
116+
@extend_schema(
117+
request=RecordCreateSerializer,
118+
summary="기록 생성 API",
119+
description="기록을 생성합니다.",
120+
responses={status.HTTP_201_CREATED: RecordSerializer},
121+
exclude=True
122+
)
123+
@swagger_auto_schema( # todo: extend_schema 적용
124+
operation_summary="기록 생성 API",
125+
request_body=CreateRecordSerializer,
126+
responses={status.HTTP_201_CREATED: RecordSerializer(many=True)}
127+
)
128+
def create(self, request, *args, **kwargs):
129+
serializer: CreateRecordSerializer = self.get_serializer(data=request.data)
130+
serializer.is_valid(raise_exception=True)
131+
132+
content_id = serializer.validated_data.get('content_id')
133+
text = serializer.validated_data.get('text')
134+
135+
profile = request.user.common_profile
136+
137+
record = Record.objects.create(
138+
content_id=content_id,
139+
profile=profile,
140+
text=text
141+
)
142+
143+
record_serializer = RecordSerializer(record)
144+
145+
return Response(record_serializer.data)
146+
147+
148+
# deprecated under
149+
150+
151+
class RandomContentAPIView(GenericAPIView):
152+
serializer_class = ContentSerializer
153+
154+
def get_prev_filter(self) -> Q:
155+
prev = self.request.query_params.get('prev')
156+
if not prev:
157+
return Q()
158+
return ~Q(id=int(prev))
159+
160+
@swagger_auto_schema(deprecated=True, operation_description="to [GET] api/records/content/random/")
161+
def get(self, request: Request):
162+
prev_filter = self.get_prev_filter()
163+
queryset = Content.objects.filter(
164+
prev_filter
165+
).order_by(
166+
'?'
167+
).first()
168+
169+
serializer = self.get_serializer(queryset)
170+
return Response(serializer.data)
171+
48172

49173
class RecordCreateAPIView(CreateAPIView):
50174
serializer_class = RecordCreateSerializer
51175
permission_classes = [IsAuthenticated]
52176

177+
@swagger_auto_schema(
178+
deprecated=True,
179+
operation_description="to [POST] api/records/"
180+
)
53181
def post(self, request: Request, *args, **kwargs):
54182
serializer: RecordCreateSerializer = self.get_serializer(data=request.data)
55183
serializer.is_valid(raise_exception=True)
@@ -114,13 +242,18 @@ def list(self, request, *args, **kwargs):
114242
results.append(dict(
115243
date=target_date_st.strftime('%Y-%m-%d'),
116244
records=list(filter(
117-
lambda x: datetime.datetime.fromisoformat(x.get('created_at')).astimezone(KST).date() == target_date_st,
245+
lambda x: datetime.datetime.fromisoformat(x.get('created_at')).astimezone(
246+
KST).date() == target_date_st,
118247
records
119248
))
120249
))
121250
target_date_st += datetime.timedelta(days=1)
122251
return Response(results)
123252

124-
@swagger_auto_schema(query_serializer=RecordListQuerySerializer)
253+
@swagger_auto_schema(
254+
deprecated=True,
255+
operation_description="to [GET] api/records/",
256+
query_serializer=RecordListQuerySerializer
257+
)
125258
def get(self, request, *args, **kwargs):
126259
return self.list(request, *args, **kwargs)

0 commit comments

Comments
 (0)