Files
SGTMensa/mensa_app/models.py

136 lines
4.6 KiB
Python

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
import datetime
class Person(models.Model):
"""Repräsentiert Schüler oder Lehrer."""
user = models.OneToOneField(User, on_delete=models.CASCADE)
rolle = models.CharField(max_length=20, choices=[('schueler', 'Schüler'), ('lehrer', 'Lehrer'), ('mitarbeiter','Mensa-Mitarbeiter'), ('chef','Mensa-Leitung')])
klasse = models.CharField(max_length=4, blank=True, null=True) # Nur für Schüler relevant
class Meta:
verbose_name_plural = "Personen"
def __str__(self):
return f"{self.user.username} ({self.rolle})"
class Schulwoche(models.Model):
"""Repräsentiert eine Schulwoche mit einem eindeutigen Datum."""
id = models.CharField(max_length=20, unique=True, primary_key=True, default="test_1") # eine eindeutige ID wie "Woche_2024_10"
datum = models.DateField(unique=True) # Datum der Schulwoche (z. B. Montag der ersten Woche)
ist_aktiv = models.BooleanField(default=False)
ist_ferienwoche = models.BooleanField(default=False)
class Meta:
verbose_name = "Schulwoche"
verbose_name_plural = "Schulwochen"
class SpeiseplanTag(models.Model):
"""Ein bestimmter Tag im Speiseplan."""
datum = models.DateField(unique=True)
schulwoche = models.ForeignKey(
Schulwoche,
on_delete=models.CASCADE,
#related_name='tag_get_schulwoche' # Für Abfragen wie: Schulwoche.tag_get_schulwoche.all()
default = "test_1"
)
class Meta:
verbose_name = "Tag mit Speiseplan"
verbose_name_plural = "Tage mit Speiseplan"
def __str__(self):
return self.datum.strftime('%d.%m.%Y')
class Kategorie(models.Model):
"""
Definiert die Art der Speise (Süßspeise, Hauptgericht, etc.).
"""
name = models.CharField(max_length=50, unique=True, default="")
class Meta:
verbose_name = "Kategorie"
verbose_name_plural = "Kategorien"
def __str__(self):
return self.name
class Gericht(models.Model):
"""Ein einzelnes Gericht (z.B. 'Nudeln mit Tomatensauce')."""
name = models.CharField(max_length=100)
# PROTECT verhindert, dass eine Kategorie gelöscht wird,
# solange noch Gerichte ihr zugeordnet sind.
kategorie = models.ForeignKey(
Kategorie,
on_delete=models.PROTECT,
related_name='gerichte'
)
ist_vegetarisch = models.BooleanField(default=False)
ist_allergene_frei = models.BooleanField(default=False)
allergene = models.TextField(blank=True, default="")
preis = models.DecimalField(max_digits=5, decimal_places=2, default=0.00)
now = datetime.datetime.now()
time_last_change = models.TimeField(default=now)
time_creation = models.TimeField(default=now)
# Das Attribut für das "Dauerangebot"
ist_dauerangebot = models.BooleanField(
default=False,
help_text="Wenn aktiviert, ist dieses Gericht immer verfügbar und nicht an einen spezifischen Tag gebunden."
)
def __str__(self):
return f"{self.name} ({self.kategorie.name})"
class Meta:
verbose_name = "Gericht"
verbose_name_plural = "Gerichte"
permissions = [("can_create_Gericht", "Kann neues Gericht anlegen")]
ordering = ["kategorie", "name", "preis"]
get_latest_by = "time_last_change"
class Menue(models.Model):
"""Eine Kombination von Speisen für einen Tag (z.B. Hauptgang + Dessert)."""
tag = models.ForeignKey(SpeiseplanTag, on_delete=models.CASCADE, related_name='menues')
gericht = models.ForeignKey(Gericht, on_delete=models.CASCADE)
preis = models.DecimalField(max_digits=5, decimal_places=2)
def __str__(self):
return f"{self.tag.datum}: {self.gericht.name} ({self.preis}€)"
class Meta:
verbose_name = "Menü"
verbose_name_plural = "Menüs"
class Bestellung(models.Model):
"""Eine abgeschlossene Bestellung eines Nutzers."""
STATUS_CHOICES = [
('offen', 'Offen'),
('abgeholt', 'Abgeholt'),
('verwaist', 'Nicht abgeholt'),
('bezahlt', 'Bezahlt'),
('storniert', 'Storniert'),
]
person = models.ForeignKey(Person, on_delete=models.CASCADE)
menue = models.ForeignKey(Menue, on_delete=models.CASCADE)
datum_bestellung = models.DateTimeField(default=timezone.now)
status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='offen')
bezahlt = models.BooleanField(default=False)
def __str__(self):
return f"Bestellung {self.id} von {self.person.user.username}"
class Meta:
verbose_name = "Bestellung"
verbose_name_plural = "Bestellungen"