Skip to content

Commit 2f4d368

Browse files
Merge pull request #37 from WebCorvus/feat/app-rebuild-user-info-display
Feat/app rebuild user info display
2 parents d8530ec + 2581956 commit 2f4d368

63 files changed

Lines changed: 8260 additions & 14879 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

api/students/views.py

Lines changed: 20 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
from rest_framework.permissions import IsAuthenticated
44
from rest_framework.response import Response
55

6+
from django.utils import timezone
7+
68
from users.permissions import IsProfessor, IsStaff
79
from utils.pdfgen import pdfgen
810
from utils.reports import (
@@ -77,11 +79,17 @@ def download_grades_pdf(self, request, pk=None):
7779
student = self.get_object()
7880
subjects = get_subject_names()
7981
data = {}
82+
current_year = timezone.now().year
83+
all_grades = Grade.objects.filter(student=student, year=current_year)
84+
8085
for subject in subjects:
81-
data[subject] = Grade.objects.filter(
82-
student=student,
83-
subject__full_name=subject,
84-
)
86+
# Initialize with None for each bimester
87+
bimester_grades = [None, None, None, None]
88+
for grade in all_grades.filter(subject__full_name=subject):
89+
bimester_num = int(grade.bimester[0]) # Extract the numeric part (e.g., "1B" -> 1)
90+
if 1 <= bimester_num <= 4:
91+
bimester_grades[bimester_num - 1] = grade.value
92+
data[subject] = bimester_grades
8593
return pdfgen(
8694
"grades.html",
8795
{"student": student, "data": data},
@@ -91,7 +99,10 @@ def download_grades_pdf(self, request, pk=None):
9199
@action(detail=True, methods=["get"], url_path="download-presence")
92100
def download_presence_pdf(self, request, pk=None):
93101
student = self.get_object()
94-
presence_records = Presence.objects.filter(student=student)
102+
current_year = timezone.now().year
103+
presence_records = Presence.objects.filter(
104+
student=student, date__year=current_year
105+
).order_by('date')
95106
return pdfgen(
96107
"presence.html",
97108
{"student": student, "data": presence_records},
@@ -108,10 +119,9 @@ def academic_report(self, request, pk=None):
108119
@action(detail=True, methods=["get"], url_path="download-academic-report")
109120
def download_academic_report(self, request, pk=None):
110121
"""Download comprehensive academic report PDF"""
111-
from django.utils import timezone as tz
112-
122+
current_year = timezone.now().year
113123
student = self.get_object()
114-
report = generate_student_academic_report(student)
124+
report = generate_student_academic_report(student, year=current_year)
115125

116126
context = {
117127
"student": student,
@@ -356,11 +366,10 @@ def financial_report(self, request):
356366
@action(detail=False, methods=["get"], url_path="download-financial-report")
357367
def download_financial_report(self, request):
358368
"""Download financial report PDF"""
359-
from django.utils import timezone as tz
360-
369+
current_year = timezone.now().year
361370
student_id = request.query_params.get("student_id")
362371
student = Student.objects.get(id=student_id) if student_id else None
363-
report = generate_financial_report(student)
372+
report = generate_financial_report(student, year=current_year)
364373

365374
context = {
366375
"student": student,

api/templates/grades.html

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,9 @@ <h1>Boletim de {{ student.full_name }}</h1>
5151
{% for subject, grades in data.items %}
5252
<tr>
5353
<th>{{ subject }}</th>
54-
{% if grades %} {% for grade in grades %}
55-
<td>{{ grade.value|default_if_none:"-" }}</td>
56-
57-
{% endfor %} {% else %}
58-
<td>-</td>
59-
<td>-</td>
60-
<td>-</td>
61-
<td>-</td>
62-
{% endif %}
54+
{% for grade_value in grades %}
55+
<td>{{ grade_value|default_if_none:"-" }}</td>
56+
{% endfor %}
6357
</tr>
6458
{% endfor %}
6559
</table>

api/users/serializers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class UserProfileSerializer(serializers.ModelSerializer):
4040

4141
class Meta:
4242
model = get_user_model()
43-
fields = ["id", "email", "name", "role", "profile_details"]
43+
fields = ["id", "email", "name", "role", "is_staff", "is_superuser", "profile_details"]
4444

4545
def get_profile_details(self, obj):
4646
profile = obj.profile

api/utils/reports.py

Lines changed: 31 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,19 @@
1919
)
2020

2121

22-
def generate_student_academic_report(student):
22+
def generate_student_academic_report(student, year=None):
2323
"""Generate comprehensive academic report for a single student"""
24+
if year is None:
25+
year = timezone.now().year
2426

2527
# Get all grades by subject and bimester
2628
grades_by_subject = {}
2729
all_subjects = Subject.objects.all()
2830

2931
for subject in all_subjects:
30-
grades = Grade.objects.filter(student=student, subject=subject).order_by(
31-
"bimester"
32-
)
32+
grades = Grade.objects.filter(
33+
student=student, subject=subject, year=year
34+
).order_by("bimester")
3335
bimester_grades = {"1B": None, "2B": None, "3B": None, "4B": None}
3436

3537
for grade in grades:
@@ -45,20 +47,28 @@ def generate_student_academic_report(student):
4547
}
4648

4749
# Get attendance statistics
48-
total_days = Presence.objects.filter(student=student).count()
49-
absences = Presence.objects.filter(student=student, presence=False).count()
50-
presences = Presence.objects.filter(student=student, presence=True).count()
50+
total_days = Presence.objects.filter(student=student, date__year=year).count()
51+
absences = Presence.objects.filter(
52+
student=student, presence=False, date__year=year
53+
).count()
54+
presences = Presence.objects.filter(
55+
student=student, presence=True, date__year=year
56+
).count()
5157
absence_rate = (absences / total_days * 100) if total_days > 0 else 0
5258

5359
# Get disciplinary records
54-
warnings_count = Warning.objects.filter(student=student).count()
55-
suspensions_count = Suspension.objects.filter(student=student).count()
60+
warnings_count = Warning.objects.filter(student=student, date__year=year).count()
61+
suspensions_count = Suspension.objects.filter(
62+
student=student, start_date__year=year
63+
).count()
5664

5765
# Get recent warnings and suspensions
58-
recent_warnings = Warning.objects.filter(student=student).order_by("-date")[:5]
59-
recent_suspensions = Suspension.objects.filter(student=student).order_by(
60-
"-start_date"
66+
recent_warnings = Warning.objects.filter(student=student, date__year=year).order_by(
67+
"-date"
6168
)[:5]
69+
recent_suspensions = Suspension.objects.filter(
70+
student=student, start_date__year=year
71+
).order_by("-start_date")[:5]
6272

6373
return {
6474
"student_id": student.id,
@@ -174,13 +184,19 @@ def generate_group_performance_report(group):
174184
}
175185

176186

177-
def generate_financial_report(student=None):
187+
def generate_financial_report(student=None, year=None):
178188
"""Generate financial report for tuition payments"""
189+
if year is None:
190+
year = timezone.now().year
179191

180192
if student:
181-
tuitions = Tuition.objects.filter(student=student).order_by("-reference_month")
193+
tuitions = Tuition.objects.filter(
194+
student=student, reference_month__year=year
195+
).order_by("-reference_month")
182196
else:
183-
tuitions = Tuition.objects.all().order_by("-reference_month")
197+
tuitions = Tuition.objects.filter(reference_month__year=year).order_by(
198+
"-reference_month"
199+
)
184200

185201
# Summary statistics
186202
total_pending = tuitions.filter(status="PENDING").count()

app/next.config.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
/** @type {import('next').NextConfig} */
22
const nextConfig = {
33
output: "standalone",
4+
images: {
5+
unoptimized: process.env.NODE_ENV === "development",
6+
},
47
};
58

69
module.exports = nextConfig;

0 commit comments

Comments
 (0)