Skip to content

Commit d8897b9

Browse files
committed
fix: unify semester-related schemas across hours-summary and semester-history endpoints
1 parent 70d5d0f commit d8897b9

File tree

4 files changed

+31
-26
lines changed

4 files changed

+31
-26
lines changed

adminpage/api_v2/crud/crud_attendance.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ def get_detailed_hours_and_self(student, semester: Semester):
7575
Retrieves statistics of hours in one semester
7676
"""
7777
att = (Attendance.objects
78-
.filter(training__group__semester=semester, student=student.student)
78+
.filter(training__group__semester=semester, student=student)
7979
.annotate(
8080
group=F("training__group__name"),
8181
group_id=F("training__group_id"),
@@ -90,7 +90,7 @@ def get_detailed_hours_and_self(student, semester: Semester):
9090

9191

9292
self = (SelfSportReport.objects
93-
.filter(semester=semester, student=student.student, attendance=None)
93+
.filter(semester=semester, student=student, attendance=None)
9494
.annotate(
9595
group=Value('Self training', output_field=CharField()),
9696
group_id=Value(-1, output_field=IntegerField()),
@@ -102,7 +102,7 @@ def get_detailed_hours_and_self(student, semester: Semester):
102102
.values('group_id', 'group', 'custom_name', 'timestamp', 'hours', 'approved'))
103103

104104
ref = (Reference.objects
105-
.filter(semester=semester, student=student.student, attendance=None)
105+
.filter(semester=semester, student=student, attendance=None)
106106
.annotate(
107107
group=Value('Medical leave', output_field=CharField()),
108108
group_id=Value(-1, output_field=IntegerField()),

adminpage/api_v2/serializers/attendance.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -112,18 +112,13 @@ class SemesterHoursSummarySerializer(serializers.Serializer):
112112

113113

114114
class StudentHoursSummarySerializer(serializers.Serializer):
115-
# Fields for current semester only (when current_semester_only=true)
116115
debt = serializers.FloatField(help_text="Current student debt in hours", required=False)
117116
self_sport_hours = serializers.FloatField(help_text="Number of self sport hours", required=False)
118117
hours_from_groups = serializers.FloatField(help_text="Number of hours from sport groups", required=False)
119118
required_hours = serializers.FloatField(help_text="Number of hours required to achieve", required=False)
120119

121-
# Fields for all semesters (when current_semester_only=false)
122120
semesters = SemesterHoursSummarySerializer(many=True, help_text="List of semesters with hours info", required=False)
123121

124-
# Common field
125-
current_semester_only = serializers.BooleanField(help_text="Current semester only or all semesters")
126-
127122

128123
class GradesCsvRowSerializer(serializers.Serializer):
129124
student_id = serializers.IntegerField()

adminpage/api_v2/views/attendance.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -299,8 +299,8 @@ def get_student_hours_summary(request, student_id, **kwargs):
299299
from api_v2.crud.crud_attendance import get_student_hours_summary
300300

301301
summary = get_student_hours_summary(student_id)
302-
#summary.update({"better_than": get_better_than_info(student_id)})
303-
return Response(summary)
302+
serializer = StudentHoursSummarySerializer(instance=summary)
303+
return Response(serializer.data)
304304
except Student.DoesNotExist:
305305
return Response(
306306
{"detail": "Student not found"}, status=status.HTTP_404_NOT_FOUND

adminpage/api_v2/views/profile.py

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -60,47 +60,57 @@ def get_user_info(request, **kwargs):
6060
methods=["GET"],
6161
tags=["For student"],
6262
summary="Get student training history",
63-
description="Retrieve student's training history for a specific semester, including regular trainings, self-sport activities, results of fitness test, and medical references.",
63+
description="Retrieve student's training history for a specific semester, including trainings, self-sport activities, results of fitness tests, and medical references.",
6464
responses={
65-
status.HTTP_200_OK: StudentSpecificSemesterHistorySerializer,
65+
status.HTTP_200_OK: SemesterHistoryWithFitnessSerializer,
6666
status.HTTP_404_NOT_FOUND: training_history404,
6767
},
6868
)
6969
@api_view(["GET"])
7070
@permission_classes([IsStudent])
7171
def get_student_specific_semester_history(request, semester_id: int, **kwargs):
7272
"""
73-
Get student's trainings per_semester + fitness tests
73+
Get student's training history for a specific semester using unified logic.
7474
"""
75-
semester = get_object_or_404(Semester, pk=semester_id)
7675
student: Student = request.user.student
76+
semester = get_object_or_404(Semester, pk=semester_id)
7777

78+
trainings_queryset = get_detailed_hours_and_self(student, semester)
7879
trainings = []
79-
for g in get_detailed_hours_and_self(student, semester):
80-
trainings.append(
81-
{
82-
**g,
83-
"group": g["group"]
84-
if g.get("group_id", -1) < 0
85-
else Group.objects.get(pk=g["group_id"]).to_frontend_name(),
86-
"timestamp": timezone.localtime(g["timestamp"]),
87-
}
88-
)
80+
for t in get_detailed_hours_and_self(student, semester):
81+
trainings.append({
82+
"training_id": t.get("id", -1),
83+
"date": t["timestamp"].strftime("%Y-%m-%d"),
84+
"time": t["timestamp"].strftime("%H:%M"),
85+
"hours": t.get("hours", 0),
86+
"group_name": t["group"] if t.get("group_id", -1) < 0 else Group.objects.get(pk=t["group_id"]).to_frontend_name(),
87+
"sport_name": t.get("sport_name", "Unknown"),
88+
"training_class": t.get("training_class", ""),
89+
"custom_name": t.get("custom_name", ""),
90+
})
91+
8992

9093
fitness_tests = get_student_fitness_results_for_semester_crud(
9194
student=student,
9295
semester=semester,
9396
latest_only=False,
9497
)
9598

96-
payload = {
99+
semester_payload = {
97100
"semester_id": semester.id,
98101
"semester_name": str(semester),
102+
"semester_start": semester.start,
103+
"semester_end": semester.end,
104+
"required_hours": semester.hours,
105+
"total_hours": sum(t["hours"] for t in trainings),
99106
"trainings": trainings,
100107
"fitness_tests": fitness_tests,
101108
}
102109

103-
return Response(StudentSpecificSemesterHistorySerializer(payload).data)
110+
serializer = SemesterHistoryWithFitnessSerializer(semester_payload)
111+
return Response(serializer.data)
112+
113+
104114

105115

106116
@extend_schema(

0 commit comments

Comments
 (0)