16
16
17
17
from .permissions import IsTeacher , IsAdmin , IsStudent
18
18
from .models import Course , AccountRoles , CourseLecture
19
- from .serializers import AddLectureSerializer , CustomTokenSerializer , CreateUserSerializer , LectureSerializer , MassEnrollSerializer , SetAttendenceTeacherSerializer , UserSerializer , CourseCreateSerializer , CourseSerializer , MailTestSerializer
19
+
20
+ from .serializers import AddLectureSerializer , CourseUserSerializer , CustomTokenSerializer , CreateUserSerializer , LectureSerializer , MassEnrollSerializer , SetAttendenceTeacherSerializer , UserSerializer , CourseCreateSerializer , CourseSerializer
21
+
22
+
20
23
21
24
from django .core .mail import send_mail
22
25
@@ -216,6 +219,48 @@ def get(self, _, pk):
216
219
serializer = self .serializer_class (queryset [0 ])
217
220
return Response (serializer .data , status = status .HTTP_200_OK )
218
221
222
+ class GetFullCoursePage (generics .RetrieveAPIView ):
223
+ authentication_classes = [JWTAuthentication ]
224
+ permission_classes = [IsStudent ]
225
+
226
+ queryset = Course .objects .all ()
227
+ serializer_class = CourseSerializer
228
+
229
+ def get_attendence_stats (self , course , user ):
230
+ lectures : List [CourseLecture ] = course .get_lectures ()
231
+ attendence_stats = {"attended" : 0 , "missed" : 0 }
232
+ for lecture in lectures :
233
+ if lecture .end_time > datetime .datetime .now (lecture .end_time .tzinfo ): continue
234
+ att = lecture .get_attendence_user (user )
235
+ if att is None or not (att .attended_student and att .attended_teacher ):
236
+ attendence_stats ["missed" ] += 1
237
+ else : attendence_stats ["attended" ] += 1
238
+ return attendence_stats
239
+
240
+ def get (self , request , pk ):
241
+ queryset = self .get_queryset ().filter (pk = pk )
242
+ if not queryset :
243
+ return Response ({"error" : f"course id '{ pk } ' not found" }, status = status .HTTP_404_NOT_FOUND )
244
+
245
+ course : Course = queryset [0 ]
246
+ teachers = course .get_teachers ()
247
+ students = course .get_enrolled_students ()
248
+
249
+ response_data = {}
250
+ response_data ["id" ] = pk
251
+ response_data ["course_name" ] = course .course_name
252
+ response_data ["num_teachers" ] = len (teachers )
253
+ response_data ["num_students" ] = len (students )
254
+ response_data ["attended" ] = - 1
255
+ response_data ["missed" ] = - 1
256
+ response_data ["users" ] = CourseUserSerializer ((teachers + students ), many = True ).data
257
+
258
+ user = User .objects .all ().filter (username = request .user .username )[0 ]
259
+ if user .role == AccountRoles .STUDENT :
260
+ response_data |= self .get_attendence_stats (course , user )
261
+
262
+ return Response (response_data , status = status .HTTP_200_OK )
263
+
219
264
class GetCoursesAll (generics .ListAPIView ):
220
265
authentication_classes = [JWTAuthentication ]
221
266
permission_classes = [IsStudent ]
@@ -413,4 +458,5 @@ def get(self, request, year, week):
413
458
# Sort chronological order
414
459
all_lectures .sort (key = lambda x : datetime .datetime .fromisoformat (x ["start_time" ]))
415
460
416
- return Response (all_lectures )
461
+ return Response (all_lectures , status = status .HTTP_200_OK )
462
+
0 commit comments