11from django .core .exceptions import ObjectDoesNotExist
22from django .db .models import Q
33from django .utils import timezone
4- from scheduler .models import Attendance , SectionOccurrence
54from rest_framework import status , viewsets
65from rest_framework .decorators import action
76from rest_framework .exceptions import PermissionDenied
87from rest_framework .response import Response
9- import datetime
108
11- from .utils import log_str , logger , get_object_or_error
129from ..models import Student
1310from ..serializers import AttendanceSerializer , StudentSerializer
11+ from .utils import get_object_or_error , log_str , logger
1412
1513
1614class StudentViewSet (viewsets .GenericViewSet ):
@@ -28,6 +26,10 @@ def get_queryset(self):
2826
2927 @action (detail = True , methods = ["patch" ])
3028 def drop (self , request , pk = None ):
29+ """
30+ Drops a student form a course.
31+ PATCH: Drop a given student. Check for student ban if coordinator made request
32+ """
3133 student = get_object_or_error (self .get_queryset (), pk = pk )
3234 is_coordinator = student .course .coordinator_set .filter (
3335 user = request .user
@@ -43,23 +45,36 @@ def drop(self, request, pk=None):
4345 student .course .whitelist .remove (student .user )
4446 student .save ()
4547 logger .info (
46- f"<Drop> User { log_str (request .user )} dropped Section { log_str (student .section )} for Student user { log_str (student .user )} "
48+ "<Drop> User %s dropped section %s for Student %s." ,
49+ log_str (request .user ),
50+ log_str (student .section ),
51+ log_str (student .user ),
4752 )
4853 # filter attendances and delete future attendances
4954 now = timezone .now ().astimezone (timezone .get_default_timezone ())
5055 num_deleted , _ = student .attendance_set .filter (
5156 Q (
5257 sectionOccurrence__date__gte = now .date (),
5358 sectionOccurrence__section = student .section ,
59+ presence = "" ,
5460 )
5561 ).delete ()
5662 logger .info (
57- f"<Drop> Deleted { num_deleted } attendances for user { log_str (student .user )} in Section { log_str (student .section )} after { now .date ()} "
63+ "<Drop> Deleted %s attendances for user %s in Section %s after %s" ,
64+ num_deleted ,
65+ log_str (student .user ),
66+ log_str (student .section ),
67+ now .date (),
5868 )
5969 return Response (status = status .HTTP_204_NO_CONTENT )
6070
6171 @action (detail = True , methods = ["get" , "put" ])
6272 def attendances (self , request , pk = None ):
73+ """
74+ Method for updating attendances.
75+ GET: Gets the attendances for a student
76+ PUT: Updates the attendances for a student
77+ """
6378 student = get_object_or_error (self .get_queryset (), pk = pk )
6479 if request .method == "GET" :
6580 return Response (
@@ -81,18 +96,26 @@ def attendances(self, request, pk=None):
8196 )
8297 except ObjectDoesNotExist :
8398 logger .error (
84- f"<Attendance:Failure> Could not record attendance for User { log_str (request .user )} , used non-existent attendance id { request .data ['id' ]} "
99+ (
100+ "<Attendance:Failure> Could not record attendance for User %s, used"
101+ " non-existent attendance ID %s"
102+ ),
103+ log_str (request .user ),
104+ request .data ["id" ],
85105 )
86106 return Response (status = status .HTTP_400_BAD_REQUEST )
87107
88108 if serializer .is_valid ():
89109 attendance = serializer .save ()
90110 logger .info (
91- f"<Attendance:Success> Attendance { log_str (attendance )} recorded for User { log_str (request .user )} "
111+ "<Attendance:Success> Attendance %s recorded for User %s" ,
112+ log_str (attendance ),
113+ log_str (request .user ),
92114 )
93115 return Response (status = status .HTTP_204_NO_CONTENT )
94116 logger .error (
95- f"<Attendance:Failure> Could not record attendance for User { log_str (request .user )} , errors: { serializer .errors } "
117+ "<Attendance:Failure> Could not record attendance for User %s, errors: %s" ,
118+ log_str (request .user ),
119+ serializer .errors ,
96120 )
97121 return Response (serializer .errors , status = status .HTTP_422_UNPROCESSABLE_ENTITY )
98-
0 commit comments