1
+ import datetime
1
2
import os
2
3
from django .http import JsonResponse
3
4
from django .contrib .auth import get_user_model
14
15
15
16
from .permissions import IsTeacher , IsAdmin , IsStudent
16
17
from .models import Course , AccountRoles , CourseLecture
17
- from .serializers import AddLectureSerializer , CustomTokenSerializer , CreateUserSerializer , LectureSerializer , MassEnrollSerializer , UserSerializer , CourseCreateSerializer , CourseSerializer
18
+ from .serializers import AddLectureSerializer , CustomTokenSerializer , CreateUserSerializer , LectureSerializer , MassEnrollSerializer , SetAttendenceTeacherSerializer , UserSerializer , CourseCreateSerializer , CourseSerializer
18
19
19
20
import pdb
20
21
@@ -195,12 +196,15 @@ class GetCoursesAll(generics.ListAPIView):
195
196
queryset = Course .objects .all ()
196
197
serializer_class = CourseSerializer
197
198
198
- def get (self , _ ):
199
+ def get (self , request ):
199
200
queryset = self .get_queryset ()
200
201
serializer = self .serializer_class (queryset , many = True )
201
202
if len (serializer .data ) == 0 :
202
203
return Response ({"error" : "no courses found" }, status = status .HTTP_404_NOT_FOUND )
203
204
else :
205
+ for course_serialized in serializer .data :
206
+ course : Course = queryset .filter (pk = course_serialized ["id" ])[0 ]
207
+ course_serialized ["enrolled" ] = course .is_user_enrolled (user = request .user )
204
208
return Response (serializer .data , status = status .HTTP_200_OK )
205
209
206
210
class EnrollCourseView (generics .GenericAPIView ):
@@ -261,7 +265,7 @@ class GetCourseLecturesView(generics.ListAPIView):
261
265
262
266
def get (self , _ , * args , ** kwargs ):
263
267
course : Course = self .get_object ()
264
- lectures = course .get_lectures ()
268
+ lectures = course .get_lectures ()
265
269
serializer = LectureSerializer (lectures , many = True )
266
270
if len (serializer .data ) == 0 :
267
271
return Response ({"error" : "no lectures found" }, status = status .HTTP_404_NOT_FOUND )
@@ -282,7 +286,9 @@ def post(self, request, *args, **kwargs):
282
286
result .is_valid (raise_exception = True )
283
287
284
288
data = result .data
285
- course .add_lecture_to_course (data ["start_time" ], data ["end_time" ], data ["lecture_type" ])
289
+ start_time = datetime .datetime .fromisoformat (data ["start_time" ])
290
+ end_time = datetime .datetime .fromisoformat (data ["end_time" ])
291
+ course .add_lecture_to_course (start_time , end_time , data ["lecture_type" ])
286
292
287
293
return Response ({"ok" : f"successfully created lecture" }, status = status .HTTP_200_OK )
288
294
@@ -310,9 +316,52 @@ class SetStudentAttView(generics.GenericAPIView):
310
316
311
317
def post (self , request , * args , ** kwargs ):
312
318
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 )
319
+ return Response ({"error" : f"cannot set the attendence of a non-student " }, status = status .HTTP_200_OK )
314
320
315
- course : CourseLecture = self .get_object ()
321
+ lecture : CourseLecture = self .get_object ()
322
+ lecture .set_attendence_user (request .user , teacher = False )
316
323
324
+ return Response ({"ok" : f"successfully set attendence" }, status = status .HTTP_200_OK )
325
+
326
+ class SetTeacherAttView (generics .GenericAPIView ):
327
+ authentication_classes = [JWTAuthentication ]
328
+ permission_classes = [IsTeacher ]
329
+ lookup_field = 'pk'
330
+
331
+ queryset = CourseLecture .objects .all ()
332
+ serializer_class = CourseLecture
333
+
334
+ def post (self , request , * args , ** kwargs ):
335
+ lecture : CourseLecture = self .get_object ()
336
+ result = SetAttendenceTeacherSerializer (data = request .data , context = { "course" : lecture .course })
337
+ result .is_valid (raise_exception = True )
317
338
318
- return Response ({"ok" : f"successfully set attendence" }, status = status .HTTP_200_OK )
339
+ queryset = User .objects .all ()
340
+ usernames = result .data ["usernames" ]
341
+ for username in usernames :
342
+ user = queryset .filter (username = username )[0 ]
343
+ lecture .set_attendence_user (user , teacher = True )
344
+
345
+ return Response ({"ok" : f"succesfully set attendence for { len (usernames )} students" }, status = status .HTTP_200_OK )
346
+
347
+ class GetScheduleView (generics .GenericAPIView ):
348
+ authentication_classes = [JWTAuthentication ]
349
+ permission_classes = [IsStudent ]
350
+
351
+ def get (self , request , * args , ** kwargs ):
352
+ user = User .objects .all ().filter (username = request .user .username )[0 ]
353
+ courses = user .get_enrolled_courses ()
354
+ all_lectures = []
355
+ for course in courses :
356
+ lectures_obj = course .get_lectures ()
357
+ lectures = LectureSerializer (lectures_obj , many = True )
358
+ for i , lecture_obj in enumerate (lectures_obj ):
359
+ att = lecture_obj .get_attendence_user (user )
360
+ lectures .data [i ]["attended_student" ] = att .attended_student if att is not None else False
361
+ lectures .data [i ]["attended_teacher" ] = att .attended_teacher if att is not None else False
362
+ all_lectures += lectures .data
363
+
364
+ # Sort chronological order
365
+ all_lectures .sort (key = lambda x : datetime .datetime .fromisoformat (x ["start_time" ]))
366
+
367
+ return Response (all_lectures )
0 commit comments