Skip to content

Commit 7b14e71

Browse files
committed
modified attendence query so only untaken attendences are deleted when students are dropped
pre-commit fixes fix merge conflict
1 parent 0af4cb6 commit 7b14e71

File tree

1 file changed

+32
-9
lines changed

1 file changed

+32
-9
lines changed

csm_web/scheduler/views/student.py

Lines changed: 32 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
from django.core.exceptions import ObjectDoesNotExist
22
from django.db.models import Q
33
from django.utils import timezone
4-
from scheduler.models import Attendance, SectionOccurrence
54
from rest_framework import status, viewsets
65
from rest_framework.decorators import action
76
from rest_framework.exceptions import PermissionDenied
87
from rest_framework.response import Response
9-
import datetime
108

11-
from .utils import log_str, logger, get_object_or_error
129
from ..models import Student
1310
from ..serializers import AttendanceSerializer, StudentSerializer
11+
from .utils import get_object_or_error, log_str, logger
1412

1513

1614
class 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

Comments
 (0)