2025-03-24 14:34:56 +01:00

149 lines
4.8 KiB
Python

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