13
13
from drf_spectacular .utils import extend_schema , OpenApiResponse
14
14
15
15
from .permissions import IsTeacher , IsAdmin , IsStudent
16
- from .models import Course , AccountRoles
17
- from .serializers import CustomTokenSerializer , CreateUserSerializer , MassEnrollSerializer , UserSerializer , CourseCreateSerializer , CourseSerializer
16
+ from .models import Course , AccountRoles , CourseLecture
17
+ from .serializers import AddLectureSerializer , CustomTokenSerializer , CreateUserSerializer , LectureSerializer , MassEnrollSerializer , UserSerializer , CourseCreateSerializer , CourseSerializer
18
18
19
19
import pdb
20
20
@@ -110,11 +110,10 @@ class GetUserByUsername(generics.RetrieveAPIView):
110
110
111
111
def get (self , _ , username ):
112
112
queryset = self .get_queryset ().filter (username = username )
113
- serializer = self .serializer_class (queryset , many = True )
114
- if len (serializer .data ) == 0 :
113
+ if not queryset :
115
114
return Response ({"error" : f"user '{ username } ' not found" }, status = status .HTTP_404_NOT_FOUND )
116
- else :
117
- return Response (serializer .data , status = status .HTTP_200_OK )
115
+ serializer = self . serializer_class ( queryset [ 0 ])
116
+ return Response (serializer .data , status = status .HTTP_200_OK )
118
117
119
118
class GetUsersByRole (generics .ListAPIView ):
120
119
authentication_classes = [JWTAuthentication ]
@@ -175,6 +174,35 @@ class DestroyCourseView(generics.DestroyAPIView):
175
174
queryset = Course .objects .all ()
176
175
serializer_class = CourseSerializer
177
176
177
+ class GetCourseByName (generics .RetrieveAPIView ):
178
+ authentication_classes = [JWTAuthentication ]
179
+ permission_classes = [IsStudent ]
180
+
181
+ queryset = Course .objects .all ()
182
+ serializer_class = CourseSerializer
183
+
184
+ def get (self , _ , pk ):
185
+ queryset = self .get_queryset ().filter (pk = pk )
186
+ if not queryset :
187
+ return Response ({"error" : f"course id '{ pk } ' not found" }, status = status .HTTP_404_NOT_FOUND )
188
+ serializer = self .serializer_class (queryset [0 ])
189
+ return Response (serializer .data , status = status .HTTP_200_OK )
190
+
191
+ class GetCoursesAll (generics .ListAPIView ):
192
+ authentication_classes = [JWTAuthentication ]
193
+ permission_classes = [IsStudent ]
194
+
195
+ queryset = Course .objects .all ()
196
+ serializer_class = CourseSerializer
197
+
198
+ def get (self , _ ):
199
+ queryset = self .get_queryset ()
200
+ serializer = self .serializer_class (queryset , many = True )
201
+ if len (serializer .data ) == 0 :
202
+ return Response ({"error" : "no courses found" }, status = status .HTTP_404_NOT_FOUND )
203
+ else :
204
+ return Response (serializer .data , status = status .HTTP_200_OK )
205
+
178
206
class EnrollCourseView (generics .GenericAPIView ):
179
207
authentication_classes = [JWTAuthentication ]
180
208
permission_classes = [IsStudent ]
@@ -223,32 +251,68 @@ def post(self, request, *args, **kwargs):
223
251
224
252
return Response ({"ok" : f"succesfully enrolled { len (usernames )} students" }, status = status .HTTP_200_OK )
225
253
226
- class GetCourseByName (generics .RetrieveAPIView ):
254
+ class GetCourseLecturesView (generics .ListAPIView ):
227
255
authentication_classes = [JWTAuthentication ]
228
256
permission_classes = [IsStudent ]
257
+ lookup_field = 'pk'
229
258
230
259
queryset = Course .objects .all ()
231
260
serializer_class = CourseSerializer
232
261
233
- def get (self , _ , pk ):
234
- queryset = self .get_queryset ().filter (pk = pk )
235
- serializer = self .serializer_class (queryset , many = True )
262
+ def get (self , _ , * args , ** kwargs ):
263
+ course : Course = self .get_object ()
264
+ lectures = course .get_lectures ()
265
+ serializer = LectureSerializer (lectures , many = True )
236
266
if len (serializer .data ) == 0 :
237
- return Response ({"error" : f"course id ' { pk } ' not found" }, status = status .HTTP_404_NOT_FOUND )
267
+ return Response ({"error" : "no lectures found" }, status = status .HTTP_404_NOT_FOUND )
238
268
else :
239
269
return Response (serializer .data , status = status .HTTP_200_OK )
240
270
241
- class GetCoursesAll (generics .ListAPIView ):
271
+ class AddLectureView (generics .GenericAPIView ):
242
272
authentication_classes = [JWTAuthentication ]
243
- permission_classes = [IsStudent ]
273
+ permission_classes = [IsTeacher ]
274
+ lookup_field = 'pk'
244
275
245
276
queryset = Course .objects .all ()
246
277
serializer_class = CourseSerializer
278
+
279
+ def post (self , request , * args , ** kwargs ):
280
+ course : Course = self .get_object ()
281
+ result = AddLectureSerializer (data = request .data , context = { "course" : course })
282
+ result .is_valid (raise_exception = True )
283
+
284
+ data = result .data
285
+ course .add_lecture_to_course (data ["start_time" ], data ["end_time" ], data ["lecture_type" ])
286
+
287
+ return Response ({"ok" : f"successfully created lecture" }, status = status .HTTP_200_OK )
288
+
289
+ class GetLectureView (generics .RetrieveAPIView ):
290
+ authentication_classes = [JWTAuthentication ]
291
+ permission_classes = [IsStudent ]
292
+
293
+ queryset = CourseLecture .objects .all ()
294
+ serializer_class = LectureSerializer
247
295
248
- def get (self , _ ):
249
- queryset = self .get_queryset ()
250
- serializer = self .serializer_class (queryset , many = True )
251
- if len (serializer .data ) == 0 :
252
- return Response ({"error" : "no courses found" }, status = status .HTTP_404_NOT_FOUND )
253
- else :
254
- return Response (serializer .data , status = status .HTTP_200_OK )
296
+ def get (self , _ , pk ):
297
+ queryset = self .get_queryset ().filter (pk = pk )
298
+ if not queryset :
299
+ return Response ({"error" : f"course id '{ pk } ' not found" }, status = status .HTTP_404_NOT_FOUND )
300
+ serializer = self .serializer_class (queryset [0 ])
301
+ return Response (serializer .data , status = status .HTTP_200_OK )
302
+
303
+ class SetStudentAttView (generics .GenericAPIView ):
304
+ authentication_classes = [JWTAuthentication ]
305
+ permission_classes = [IsStudent ]
306
+ lookup_field = 'pk'
307
+
308
+ queryset = CourseLecture .objects .all ()
309
+ serializer_class = CourseLecture
310
+
311
+ def post (self , request , * args , ** kwargs ):
312
+ if request .user .role != AccountRoles .STUDENT :
313
+ return Response ({"error" : f"only a student can set their attendence to a lecture" }, status = status .HTTP_200_OK )
314
+
315
+ course : CourseLecture = self .get_object ()
316
+
317
+
318
+ return Response ({"ok" : f"successfully set attendence" }, status = status .HTTP_200_OK )
0 commit comments