4
4
from django .db .models .functions import TruncDate
5
5
from drf_spectacular .utils import extend_schema , OpenApiParameter
6
6
from drf_yasg .utils import swagger_auto_schema
7
- from rest_framework import viewsets , status
7
+ from rest_framework import viewsets , status , mixins
8
8
from rest_framework .decorators import action
9
9
from rest_framework .generics import ListAPIView , GenericAPIView , CreateAPIView
10
10
from rest_framework .permissions import IsAuthenticated
13
13
14
14
from records .models import Record , Content
15
15
from records .serializer import RecordSerializer , ContentSerializer , RecordCreateSerializer , RecordListQuerySerializer , \
16
- RandomContentQuerySerializer , RecordListSerializer
16
+ RandomContentQuerySerializer , RecordListSerializer , CreateRecordSerializer
17
17
from accounts .models import CommonProfile
18
18
from utils .time import KST
19
19
20
20
21
21
class ContentViewSet (viewsets .GenericViewSet ):
22
+ model = Record
22
23
serializer_class = ContentSerializer
23
24
permission_classes = [IsAuthenticated ]
24
25
@@ -45,11 +46,138 @@ def random(self, request, *args, **kwargs):
45
46
return Response (serializer .data )
46
47
47
48
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
+
48
172
49
173
class RecordCreateAPIView (CreateAPIView ):
50
174
serializer_class = RecordCreateSerializer
51
175
permission_classes = [IsAuthenticated ]
52
176
177
+ @swagger_auto_schema (
178
+ deprecated = True ,
179
+ operation_description = "to [POST] api/records/"
180
+ )
53
181
def post (self , request : Request , * args , ** kwargs ):
54
182
serializer : RecordCreateSerializer = self .get_serializer (data = request .data )
55
183
serializer .is_valid (raise_exception = True )
@@ -114,13 +242,18 @@ def list(self, request, *args, **kwargs):
114
242
results .append (dict (
115
243
date = target_date_st .strftime ('%Y-%m-%d' ),
116
244
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 ,
118
247
records
119
248
))
120
249
))
121
250
target_date_st += datetime .timedelta (days = 1 )
122
251
return Response (results )
123
252
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
+ )
125
258
def get (self , request , * args , ** kwargs ):
126
259
return self .list (request , * args , ** kwargs )
0 commit comments