@@ -278,6 +278,9 @@ def get(self, request):
278
278
for course_serialized in serializer .data :
279
279
course : Course = queryset .filter (pk = course_serialized ["id" ])[0 ]
280
280
course_serialized ["enrolled" ] = course .is_user_enrolled (user = request .user )
281
+ course_serialized ["num_students" ] = len (course .get_enrolled_students ())
282
+ course_serialized ["num_teachers" ] = len (course .get_teachers ())
283
+
281
284
return Response (serializer .data , status = status .HTTP_200_OK )
282
285
283
286
class EnrollCourseView (generics .GenericAPIView ):
@@ -288,15 +291,23 @@ class EnrollCourseView(generics.GenericAPIView):
288
291
queryset = Course .objects .all ()
289
292
serializer_class = CourseSerializer
290
293
291
- def post (self , request , * args , ** kwargs ):
292
- if request .user .role == AccountRoles .ADMIN :
294
+ def post (self , request , username = None , * args , ** kwargs ):
295
+ if username is not None :
296
+ if user .role != AccountRoles .ADMIN :
297
+ return Response ({"error" : f"unauthorized" }, status = status .HTTP_401_UNAUTHORIZED )
298
+ queryset = User .objects .all ().filter (username = username )
299
+ if not queryset :
300
+ return Response ({"error" : f"{ username } is not a valid user" }, status = status .HTTP_400_BAD_REQUEST )
301
+ user = queryset [0 ]
302
+ else :
303
+ user = request .user
304
+ username = user .username
305
+
306
+ if user .role == AccountRoles .ADMIN :
293
307
return Response ({"error" : f"cannot enroll an admin account into a course" }, status = status .HTTP_400_BAD_REQUEST )
294
308
295
309
obj : Course = self .get_object ()
296
- user = request .user
297
- username = user .username
298
-
299
- if obj .is_user_enrolled (request .user ):
310
+ if obj .is_user_enrolled (user ):
300
311
return Response ({"error" : f"{ username } is already enrolled in { obj .course_name } " }, status = status .HTTP_400_BAD_REQUEST )
301
312
302
313
obj .add_user_to_course (user )
@@ -314,12 +325,20 @@ class DisenrollCourseView(generics.GenericAPIView):
314
325
queryset = Course .objects .all ()
315
326
serializer_class = CourseSerializer
316
327
317
- def post (self , request , * args , ** kwargs ):
318
- obj : Course = self .get_object ()
319
- user = request .user
320
- username = user .username
328
+ def post (self , request , username = None , * args , ** kwargs ):
329
+ if username is not None :
330
+ if request .user .role != AccountRoles .ADMIN :
331
+ return Response ({"error" : f"unauthorized" }, status = status .HTTP_401_UNAUTHORIZED )
332
+ queryset = User .objects .all ().filter (username = username )
333
+ if not queryset :
334
+ return Response ({"error" : f"{ username } is not a valid user" }, status = status .HTTP_400_BAD_REQUEST )
335
+ user = queryset [0 ]
336
+ else :
337
+ user = request .user
338
+ username = user .username
321
339
322
- if not obj .is_user_enrolled (request .user ):
340
+ obj : Course = self .get_object ()
341
+ if not obj .is_user_enrolled (user ):
323
342
return Response ({"error" : f"{ username } is not enrolled in { obj .course_name } " }, status = status .HTTP_400_BAD_REQUEST )
324
343
325
344
obj .remove_user_from_course (user )
@@ -376,6 +395,8 @@ class AddLectureView(generics.GenericAPIView):
376
395
queryset = Course .objects .all ()
377
396
serializer_class = CourseSerializer
378
397
398
+ holiday_weeks = [1 , 8 , 18 , 29 , 30 , 31 , 32 , 33 , 34 , 42 , 52 ]
399
+
379
400
def post (self , request , * args , ** kwargs ):
380
401
course : Course = self .get_object ()
381
402
result = AddLectureSerializer (data = request .data , context = { "course" : course })
@@ -384,10 +405,32 @@ def post(self, request, *args, **kwargs):
384
405
data = result .data
385
406
start_time = datetime .datetime .fromisoformat (data ["start_time" ])
386
407
end_time = datetime .datetime .fromisoformat (data ["end_time" ])
387
- course .add_lecture_to_course (start_time , end_time , data ["lecture_type" ])
388
408
409
+ if not data ["lecture_series" ]:
410
+ course .add_lecture_to_course (start_time , end_time , data ["lecture_type" ])
411
+ else :
412
+ curr_week = start_time .strftime ("%W" )
413
+ exclude_weeks = list (self .holiday_weeks )
414
+ if curr_week in exclude_weeks : exclude_weeks .remove (curr_week )
415
+
416
+ start_string = start_time .strftime ("%Y %a %H %M %S " )
417
+ end_string = end_time .strftime ("%Y %a %H %M %S " )
418
+ for i in range (1 , 53 ):
419
+ if i in exclude_weeks : continue
420
+ new_start = datetime .datetime .strptime (start_string + str (i ), "%Y %a %H %M %S %W" )
421
+ new_end = datetime .datetime .strptime (end_string + str (i ), "%Y %a %H %M %S %W" )
422
+ course .add_lecture_to_course (new_start , new_end , data ["lecture_type" ])
423
+
389
424
return Response ({"ok" : f"successfully created lecture" }, status = status .HTTP_200_OK )
425
+
426
+ class DestroyLectureView (generics .DestroyAPIView ):
427
+ authentication_classes = [JWTAuthentication ]
428
+ permission_classes = [IsTeacher ]
429
+ lookup_field = 'pk'
390
430
431
+ queryset = CourseLecture .objects .all ()
432
+ serializer_class = LectureSerializer
433
+
391
434
class GetLectureView (generics .RetrieveAPIView ):
392
435
authentication_classes = [JWTAuthentication ]
393
436
permission_classes = [IsStudent ]
@@ -431,7 +474,6 @@ class UnsetStudentAttView(generics.GenericAPIView):
431
474
serializer_class = CourseLecture
432
475
433
476
def post (self , request , * args , ** kwargs ):
434
- print (request .user )
435
477
return setAttendence (self , request , False )
436
478
437
479
class SetTeacherAttView (generics .GenericAPIView ):
@@ -460,14 +502,22 @@ class GetScheduleView(generics.GenericAPIView):
460
502
authentication_classes = [JWTAuthentication ]
461
503
permission_classes = [IsStudent ]
462
504
463
- def get (self , request , year , week ):
505
+ def get (self , request , year , week , course_id = None ):
464
506
if not year .isdigit () or int (year ) < 1970 :
465
507
return Response ({"error" : f"invalid year parameter" }, status = status .HTTP_400_BAD_REQUEST )
466
508
if not week .isdigit () or int (week ) < 0 or int (week ) > 52 :
467
509
return Response ({"error" : f"invalid week parameter" }, status = status .HTTP_400_BAD_REQUEST )
468
510
469
511
user = User .objects .all ().filter (username = request .user .username )[0 ]
470
- courses : List [Course ] = user .get_enrolled_courses ()
512
+
513
+ if course_id is None :
514
+ courses : List [Course ] = user .get_enrolled_courses ()
515
+ else :
516
+ queryset = Course .objects .all ().filter (pk = course_id )
517
+ if not queryset :
518
+ return Response ({"error" : f"course ID is not valid" }, status = status .HTTP_400_BAD_REQUEST )
519
+ courses : List [Course ] = [queryset [0 ]]
520
+
471
521
all_lectures = []
472
522
for course in courses :
473
523
lectures_obj = course .get_lectures_week (int (year ), int (week ))
0 commit comments