1
0
Fork 0
forked from Fuji/Fuji

Refactor GradesPage to support semester selection and display grades accordingly

This commit is contained in:
Maarceeli 2025-04-05 10:24:55 +02:00
parent a4e938e90f
commit cdd2904f27

View file

@ -1,6 +1,7 @@
import flet as ft import flet as ft
from sqlitehandlernr import fetch_all_grades from sqlitehandlernr import fetch_all_grades
from i18n import _ from i18n import _
from utils import getcurrentsemester
def parse_grade_value(value): def parse_grade_value(value):
try: try:
@ -17,26 +18,19 @@ def format_date(dt):
return dt.strftime("%Y/%m/%d") return dt.strftime("%Y/%m/%d")
def GradesPage(page): def GradesPage(page):
grades = fetch_all_grades() semester = ft.Ref[ft.Dropdown]()
panels = [] content_column = ft.Ref[ft.Column]()
subjects = {}
for grade in grades:
subject = grade.subject
if subject not in subjects:
subjects[subject] = []
subjects[subject].append(grade)
modal = ft.BottomSheet( modal = ft.BottomSheet(
content=ft.Column([], spacing=5), content=ft.Column([], spacing=5),
enable_drag=True, enable_drag=True,
open=False, open=False,
) )
def open_grade_modal(grade): def open_grade_modal(grade):
parsed_value = parse_grade_value(grade.value) parsed_value = parse_grade_value(grade.value)
grade_display = f"{grade.value}" if parsed_value is not None else _("Grade not recognized") grade_display = f"{grade.value}" if parsed_value is not None else _("Grade not recognized")
modal.content = ft.Column([ modal.content = ft.Column([
ft.Row([ ft.Row([
ft.Container( ft.Container(
@ -76,12 +70,12 @@ def GradesPage(page):
ft.Card( ft.Card(
content=ft.Row([ content=ft.Row([
ft.Container( ft.Container(
content=ft.Icon(name=ft.Icons.LOOKS_6_ROUNDED, size=20), content=ft.Icon(name=ft.Icons.LOOKS_6_ROUNDED, size=20),
width=40, width=40,
height=40, height=40,
border_radius=8, border_radius=8,
alignment=ft.alignment.center, alignment=ft.alignment.center,
padding=ft.padding.only(left=10), padding=ft.padding.only(left=10),
), ),
ft.Column([ ft.Column([
ft.Text("Grade", size=14, color=ft.Colors.WHITE70), ft.Text("Grade", size=14, color=ft.Colors.WHITE70),
@ -95,12 +89,12 @@ def GradesPage(page):
ft.Card( ft.Card(
content=ft.Row([ content=ft.Row([
ft.Container( ft.Container(
content=ft.Icon(name=ft.Icons.SCALE, size=20), content=ft.Icon(name=ft.Icons.SCALE, size=20),
width=40, width=40,
height=40, height=40,
border_radius=8, border_radius=8,
alignment=ft.alignment.center, alignment=ft.alignment.center,
padding=ft.padding.only(left=10), padding=ft.padding.only(left=10),
), ),
ft.Column([ ft.Column([
ft.Text("Weight", size=14, color=ft.Colors.WHITE70), ft.Text("Weight", size=14, color=ft.Colors.WHITE70),
@ -114,12 +108,12 @@ def GradesPage(page):
ft.Card( ft.Card(
content=ft.Row([ content=ft.Row([
ft.Container( ft.Container(
content=ft.Icon(name=ft.Icons.CALENDAR_TODAY, size=20), content=ft.Icon(name=ft.Icons.CALENDAR_TODAY, size=20),
width=40, width=40,
height=40, height=40,
border_radius=8, border_radius=8,
alignment=ft.alignment.center, alignment=ft.alignment.center,
padding=ft.padding.only(left=10), padding=ft.padding.only(left=10),
), ),
ft.Column([ ft.Column([
ft.Text("Date", size=14, color=ft.Colors.WHITE70), ft.Text("Date", size=14, color=ft.Colors.WHITE70),
@ -133,56 +127,104 @@ def GradesPage(page):
], spacing=5) ], spacing=5)
modal.open = True modal.open = True
page.update() page.update()
for subject, grades_list in subjects.items(): def build_content_for_semester(selected_semester):
header = ft.Container( all_grades = fetch_all_grades(selected_semester)
content=ft.Column([ panels = []
ft.Text(subject, size=15), subjects = {}
ft.Row([
ft.Text(f"{len(grades_list)} " + _("grades"), size=14), for grade in all_grades:
ft.Text((_("Average")) + ": {:.2f}".format( subject = grade.subject
sum(parse_grade_value(g.value) for g in grades_list if parse_grade_value(g.value) is not None) / max(len([g for g in grades_list if parse_grade_value(g.value) is not None]), 1) subjects.setdefault(subject, []).append(grade)
), size=14),
]) # (rest of your logic stays the same)
], alignment=ft.MainAxisAlignment.CENTER, horizontal_alignment=ft.CrossAxisAlignment.START, expand=True),
padding=ft.padding.all(10),
expand=True, for subject, grades_list in subjects.items():
) header = ft.Container(
content=ft.Column([
grade_rows = [] ft.Text(subject, size=15),
for grade in grades_list: ft.Row([
grade_rows.append( ft.Text(f"{len(grades_list)} " + _("grades"), size=14),
ft.Container( ft.Text((_("Average")) + ": {:.2f}".format(
content=ft.Row([ sum(parse_grade_value(g.value) for g in grades_list if parse_grade_value(g.value) is not None) /
ft.Container( max(len([g for g in grades_list if parse_grade_value(g.value) is not None]), 1)
content=ft.Text(grade.value, text_align=ft.TextAlign.CENTER), ), size=14),
bgcolor=ft.Colors.SURFACE_CONTAINER_HIGHEST, ])
padding=ft.padding.symmetric(horizontal=12, vertical=8), ], alignment=ft.MainAxisAlignment.CENTER, horizontal_alignment=ft.CrossAxisAlignment.START, expand=True),
border_radius=5, padding=ft.padding.all(10),
margin=ft.margin.all(5), expand=True,
on_click=lambda e, grade=grade: open_grade_modal(grade),
),
ft.Column([
ft.Text(grade.name),
ft.Row([
ft.Text(format_date(grade.created_at)),
ft.Text((_("Weight")) + ": {:.1f}".format(getattr(grade, 'weight', 1.0)))
])
], spacing=1)
], expand=True),
on_click=lambda e, grade=grade: open_grade_modal(grade),
)
) )
panel = ft.ExpansionPanel( grade_rows = []
header=header, for grade in grades_list:
content=ft.Column(grade_rows), grade_rows.append(
expand=False, ft.Container(
) content=ft.Row([
panels.append(panel) ft.Container(
content=ft.Text(grade.value, text_align=ft.TextAlign.CENTER),
bgcolor=ft.Colors.SURFACE_CONTAINER_HIGHEST,
padding=ft.padding.symmetric(horizontal=12, vertical=8),
border_radius=5,
margin=ft.margin.all(5),
on_click=(lambda e, g=grade: open_grade_modal(g)),
),
ft.Column([
ft.Text(grade.name),
ft.Row([
ft.Text(format_date(grade.created_at)),
ft.Text((_("Weight")) + ": {:.1f}".format(getattr(grade, 'weight', 1.0)))
])
], spacing=1)
], expand=True),
on_click=(lambda e, g=grade: open_grade_modal(g)),
)
)
panel = ft.ExpansionPanel(
header=header,
content=ft.Column(grade_rows),
expand=False,
)
panels.append(panel)
return panels
def on_semester_change(e):
selected_sem = int(semester.current.value)
panels = build_content_for_semester(selected_sem)
content_column.current.controls = [
ft.ExpansionPanelList(panels),
modal
]
page.update()
return ft.Column([ return ft.Column([
ft.Text((_("Grades")), size=30, weight="bold"), ft.Row([
ft.ExpansionPanelList(panels), ft.Text((_("Grades")), size=30, weight="bold"),
modal ft.Dropdown(
], scroll=True) ref=semester,
width=150,
value=str(getcurrentsemester()),
options=[
ft.dropdown.Option("1", text=(_("Semester 1"))),
ft.dropdown.Option("2", text=(_("Semester 2"))),
],
on_change=on_semester_change,
alignment=ft.MainAxisAlignment.SPACE_BETWEEN,
expand=True,
),
], alignment=ft.MainAxisAlignment.SPACE_BETWEEN, spacing=10),
ft.Container(
content=ft.Column(
ref=content_column,
controls=[
ft.ExpansionPanelList(build_content_for_semester(getcurrentsemester())),
modal
],
scroll=True
),
expand=True
)
])