Kategorien für Gerichte ergänzt

This commit is contained in:
2026-05-08 00:17:07 +02:00
parent a9afaff671
commit 932d17d12a
11 changed files with 58 additions and 47 deletions
BIN
View File
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
+4
View File
@@ -9,6 +9,10 @@ from .models import SpeiseplanTag # Ersetze dies durch deine echten Klassennamen
admin.site.register(SpeiseplanTag)
from .models import Kategorie # Ersetze dies durch deine echten Klassennamen
admin.site.register(Kategorie)
from .models import Gericht # Ersetze dies durch deine echten Klassennamen
admin.site.register(Gericht)
+22 -8
View File
@@ -1,4 +1,4 @@
# Generated by Django 6.0.5 on 2026-05-07 17:29
# Generated by Django 6.0.5 on 2026-05-07 22:11
import django.db.models.deletion
import django.utils.timezone
@@ -16,13 +16,14 @@ class Migration(migrations.Migration):
operations = [
migrations.CreateModel(
name='Gericht',
name='Kategorie',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('ist_vegetarisch', models.BooleanField(default=False)),
('allergene', models.TextField(blank=True)),
('name', models.CharField(default='', max_length=50, unique=True)),
],
options={
'verbose_name_plural': 'Kategorien',
},
),
migrations.CreateModel(
name='SpeiseplanTag',
@@ -31,6 +32,19 @@ class Migration(migrations.Migration):
('datum', models.DateField(unique=True)),
],
),
migrations.CreateModel(
name='Gericht',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('name', models.CharField(max_length=100)),
('ist_vegetarisch', models.BooleanField(default=False)),
('ist_allergene_frei', models.BooleanField(default=False)),
('allergene', models.TextField(blank=True, default='')),
('preis', models.DecimalField(decimal_places=2, default=0.0, max_digits=5)),
('ist_dauerangebot', models.BooleanField(default=False, help_text='Wenn aktiviert, ist dieses Gericht immer verfügbar und nicht an einen spezifischen Tag gebunden.')),
('kategorie', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='gerichte', to='mensa_app.kategorie')),
],
),
migrations.CreateModel(
name='Menue',
fields=[
@@ -44,8 +58,8 @@ class Migration(migrations.Migration):
name='Person',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('rolle', models.CharField(choices=[('schueler', 'Schüler'), ('lehrer', 'Lehrer')], max_length=20)),
('klasse', models.CharField(blank=True, max_length=10, null=True)),
('rolle', models.CharField(choices=[('schueler', 'Schüler'), ('lehrer', 'Lehrer'), ('mitarbeiter', 'Mensa-Mitarbeiter'), ('chef', 'Mensa-Leitung')], max_length=20)),
('klasse', models.CharField(blank=True, max_length=4, null=True)),
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
],
),
@@ -54,7 +68,7 @@ class Migration(migrations.Migration):
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('datum_bestellung', models.DateTimeField(default=django.utils.timezone.now)),
('status', models.CharField(choices=[('offen', 'Offen'), ('bezahlt', 'Bezahlt'), ('storniert', 'Storniert')], default='offen', max_length=10)),
('status', models.CharField(choices=[('offen', 'Offen'), ('abgeholt', 'Abgeholt'), ('verwaist', 'Nicht abgeholt'), ('bezahlt', 'Bezahlt'), ('storniert', 'Storniert')], default='offen', max_length=10)),
('bezahlt', models.BooleanField(default=False)),
('menue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mensa_app.menue')),
('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mensa_app.person')),
@@ -1,33 +0,0 @@
# Generated by Django 6.0.5 on 2026-05-07 17:44
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('mensa_app', '0001_initial'),
]
operations = [
migrations.AddField(
model_name='gericht',
name='preis',
field=models.DecimalField(decimal_places=2, default=0.0, max_digits=5),
),
migrations.AlterField(
model_name='bestellung',
name='status',
field=models.CharField(choices=[('offen', 'Offen'), ('abgeholt', 'Abgeholt'), ('verwaist', 'Nicht abgeholt'), ('bezahlt', 'Bezahlt'), ('storniert', 'Storniert')], default='offen', max_length=10),
),
migrations.AlterField(
model_name='person',
name='klasse',
field=models.CharField(blank=True, max_length=4, null=True),
),
migrations.AlterField(
model_name='person',
name='rolle',
field=models.CharField(choices=[('schueler', 'Schüler'), ('lehrer', 'Lehrer'), ('mitarbeiter', 'Mensa-Mitarbeiter'), ('chef', 'Mensa-Leitung')], max_length=20),
),
]
+32 -6
View File
@@ -18,16 +18,42 @@ class SpeiseplanTag(models.Model):
def __str__(self):
return self.datum.strftime('%d.%m.%Y')
class Gericht(models.Model):
"""Ein einzelnes Gericht (z.B. 'Nudeln mit Tomatensauce')."""
name = models.CharField(max_length=100)
ist_vegetarisch = models.BooleanField(default=False)
allergene = models.TextField(blank=True)
preis = models.DecimalField(max_digits=5, decimal_places=2, default=0.00)
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_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)
# 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 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')