From a09338cde4a21bbb7130d88061c9cc420beb9371 Mon Sep 17 00:00:00 2001 From: Maarceeli Date: Wed, 16 Apr 2025 11:03:46 +0200 Subject: [PATCH] Refactor sync and database functions to handle empty results and add timetable database creation --- src/main.py | 9 ++--- src/sqlitehandlernr.py | 74 +++++++++++++++++++++++++++++++++++++++++- 2 files changed, 78 insertions(+), 5 deletions(-) diff --git a/src/main.py b/src/main.py index 8e5ebce..99b1fd2 100644 --- a/src/main.py +++ b/src/main.py @@ -54,17 +54,18 @@ def sync(page: ft.Page): notes = interface.get_notes() grades = interface.get_grades(1) - create_grades_database(grades_list=grades, smstr=1) + if grades: create_grades_database(grades_list=grades, smstr=1) grades = interface.get_grades(2) - add_grades_to_database(grades_list=grades, smstr=2) + if grades: add_grades_to_database(grades_list=grades, smstr=2) - create_notes_database(notes_list=notes) + if notes: create_notes_database(notes_list=notes) start, end = get_current_month_dates() - interface.get_timetable(from_=start, to=end) + timetable = interface.get_timetable(from_=start, to=end) + create_timetable_database(lesson_list=timetable) def change_page(route): routes = { diff --git a/src/sqlitehandlernr.py b/src/sqlitehandlernr.py index 8a3d507..0cf8db7 100644 --- a/src/sqlitehandlernr.py +++ b/src/sqlitehandlernr.py @@ -1,7 +1,8 @@ from sqlmodel import * -from datetime import datetime, timedelta +from datetime import date, datetime, timedelta from sqlalchemy import func from typing import Optional +from sdk.src.models.lesson import LessonDate, Room, Subject, Teacher, Clazz, Change, Distribution, Substitution, TimeSlot class Grades(SQLModel, table=True): id: int = Field(default=None, primary_key=True) # Add an auto-incrementing id @@ -24,6 +25,67 @@ class Notes(SQLModel, table=True): creator: str created_at: datetime + +class Timetable(SQLModel, table=True): + id: int = Field(default=None, primary_key=True) + MergeChangeId: int | None + Event: str | None + Date: date # Ensure this is a date object + RoomId: int + RoomCode: str + TimeSlotId: int + TimeSlotStart: str + TimeSlotEnd: str + TimeSlotDisplay: str + TimeSlotPosition: int + SubjectId: int + SubjectName: str + SubjectKod: str + TeacherPrimaryId: int + TeacherPrimaryName: str + TeacherSecondaryId: int | None = None + TeacherSecondaryName: str | None = None + ChangeId: int | None = None + ChangeType: int | None = None + ClazzId: int + ClazzDisplayName: str + DistributionName: str | None = None + PupilAlias: str | None = None + Visible: bool + SubstitutionDate: date | None = None + + @staticmethod + def from_lesson(lesson: "Lesson") -> "Timetable": + return Timetable( + MergeChangeId=lesson.MergeChangeId, + Event=lesson.Event, + Date=lesson.Date, + RoomId=lesson.Room.Id, + RoomCode=lesson.Room.Code, + TimeSlotId=lesson.TimeSlot.Id, + TimeSlotStart=lesson.TimeSlot.Start, + TimeSlotEnd=lesson.TimeSlot.End, + TimeSlotDisplay=lesson.TimeSlot.Display, + TimeSlotPosition=lesson.TimeSlot.Position, + SubjectId=lesson.Subject.Id, + SubjectName=lesson.Subject.Name, + SubjectKod=lesson.Subject.Kod, + TeacherPrimaryId=lesson.TeacherPrimary.Id, + TeacherPrimaryName=lesson.TeacherPrimary.DisplayName, + TeacherSecondaryId=lesson.TeacherSecondary.Id if lesson.TeacherSecondary else None, + TeacherSecondaryName=lesson.TeacherSecondary.DisplayName if lesson.TeacherSecondary else None, + ChangeId=lesson.Change.Id if lesson.Change else None, + ChangeType=lesson.Change.Type if lesson.Change else None, + ClazzId=lesson.Clazz.Id, + ClazzDisplayName=lesson.Clazz.DisplayName, + DistributionName=lesson.Distribution.Name if lesson.Distribution else None, + PupilAlias=lesson.PupilAlias, + Visible=lesson.Visible, + SubstitutionDate=lesson.Substitution.LessonDate.Date if lesson.Substitution else None, + ) + + + engine = create_engine("sqlite:///database.db") SQLModel.metadata.create_all(engine) @@ -46,6 +108,16 @@ def create_grades_database(grades_list, smstr): session.add(grade_obj) session.commit() + +def create_timetable_database(lesson_list): + with Session(engine) as session: + session.execute(delete(Timetable)) + for lesson in lesson_list: + timetable_obj = Timetable.from_lesson(lesson) + session.add(timetable_obj) + session.commit() + + def add_grades_to_database(grades_list, smstr): with Session(engine) as session: