149 lines
4.8 KiB
Python
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
|