from __future__ import annotations # Python 3.10 (Production still on 3.9) from dataclasses import asdict, dataclass, field import datetime as dt from django.db import models class Subject(models.Model): identification = models.CharField(max_length=200, primary_key=True) initials = models.CharField(max_length=200, null=True) name = models.CharField(max_length=200, null=True) def __str__(self): return self.name class Exam(models.Model): identification = models.CharField(max_length=200, null=True) date = models.DateField(blank=True, null=True) time = models.TimeField(blank=True, null=True) weekday = models.CharField(max_length=200, null=True) class PartialExam(models.Model): identification = models.CharField(max_length=200, null=True) regStudCount = models.CharField(max_length=200, null=True) subjectIds = models.ManyToManyField(Subject) exam = models.ForeignKey("Exam", blank=True, null=True, on_delete=models.SET_NULL) class Lecturer(models.Model): identification = models.CharField(max_length=200, primary_key=True) firstName = models.CharField(max_length=200, null=True) lastName = models.CharField(max_length=200, null=True) title = models.CharField(max_length=200, null=True) class Attendance(models.Model): identification = models.CharField(max_length=200, primary_key=True) date = models.DateField(blank=True, null=True) time = models.TimeField(blank=True, null=True) dateTimeText = models.CharField(max_length=200, null=True) weekday = models.CharField(max_length=200, null=True) lecturer = models.ForeignKey( "Lecturer", blank=True, null=True, on_delete=models.SET_NULL ) class StudentExam(models.Model): examIdentification = models.CharField(max_length=200, null=True) date = models.DateField(blank=True, null=True) time = models.TimeField(blank=True, null=True) weekday = models.CharField(max_length=200, null=True) location = models.CharField(max_length=200, null=True) examExecution = models.ForeignKey( "ExamExecution", blank=True, null=True, on_delete=models.CASCADE ) class Student(models.Model): matrikel = models.CharField(max_length=200, primary_key=True) exams = models.ManyToManyField(StudentExam) class ExamExecution(models.Model): lecturer = models.ForeignKey( "Lecturer", blank=True, null=True, on_delete=models.CASCADE ) supervisorType = models.CharField(max_length=200, null=True) location = models.CharField(max_length=200, null=True) subjectIds = models.ManyToManyField(Subject) partialExam = models.ForeignKey( "PartialExam", blank=True, null=True, on_delete=models.SET_NULL ) class Meta: ordering = ("partialExam__exam__date", "partialExam__exam__time") # @dataclass() # class API_ExamDataSet_ForStudent(models.Model): # date: dt.date # time: dt.time # weekday: str # room: str | None # location: str | None # subjectIdent: str | None # examIdent: str | None # examStudCount: int | None # supervisor: str # studMartNr: str | None # def to_dict(self): # return asdict(self) class API_ExamDataSet_ForStudent(models.Model): date = models.DateField(blank=True, null=True) time = models.TimeField(blank=True, null=True) weekday = models.CharField(max_length=200, null=True) room = models.CharField(max_length=200, null=True) location = models.CharField(max_length=200, null=True) subjectIdent = models.CharField(max_length=200, null=True) examIdent = models.CharField(max_length=200, null=True) examStudCount = models.CharField(max_length=200, null=True) supervisor = models.CharField(max_length=200, null=True) studMartNr = models.CharField(max_length=200, null=True) def to_dict(self): return asdict(self) @dataclass(order=True) class ExamLines: sort_index: dt.datetime = field(init=False) date: dt.date time: dt.time weekday: str location: str | None subjectIds: list[Subject] | None examIdent: str | None examStudCound: int | None supervisorType: str executionSet: list | None partialExamIdent: str | None def __post_init__(self): self.sort_index = dt.datetime.combine(self.date, self.time) def sort_and_group_datetime(examLines: list): examLine_Datetime_Groups = {} for examLine in examLines: if examLine.sort_index not in examLine_Datetime_Groups: examLine_Datetime_Groups[examLine.sort_index] = [] examLine_Datetime_Groups[examLine.sort_index].append(examLine) sorted_groups = sorted(examLine_Datetime_Groups.items(), key=lambda x: x[0]) sorted_result = [] for _, group in sorted_groups: sorted_result.extend(group) return sorted_result