diff --git a/db.sqlite3 b/db.sqlite3 index ac45a76..6180d0f 100644 Binary files a/db.sqlite3 and b/db.sqlite3 differ diff --git a/mensa_app/__pycache__/admin.cpython-312.pyc b/mensa_app/__pycache__/admin.cpython-312.pyc index e80cb5c..d91dd7d 100644 Binary files a/mensa_app/__pycache__/admin.cpython-312.pyc and b/mensa_app/__pycache__/admin.cpython-312.pyc differ diff --git a/mensa_app/__pycache__/models.cpython-312.pyc b/mensa_app/__pycache__/models.cpython-312.pyc index 5fa7d6a..a884738 100644 Binary files a/mensa_app/__pycache__/models.cpython-312.pyc and b/mensa_app/__pycache__/models.cpython-312.pyc differ diff --git a/mensa_app/__pycache__/tests.cpython-312.pyc b/mensa_app/__pycache__/tests.cpython-312.pyc new file mode 100644 index 0000000..5efc8ba Binary files /dev/null and b/mensa_app/__pycache__/tests.cpython-312.pyc differ diff --git a/mensa_app/admin.py b/mensa_app/admin.py index 5a291f5..b7df082 100644 --- a/mensa_app/admin.py +++ b/mensa_app/admin.py @@ -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) diff --git a/mensa_app/migrations/0001_initial.py b/mensa_app/migrations/0001_initial.py index 9640677..ecacefd 100644 --- a/mensa_app/migrations/0001_initial.py +++ b/mensa_app/migrations/0001_initial.py @@ -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')), diff --git a/mensa_app/migrations/0002_gericht_preis_alter_bestellung_status_and_more.py b/mensa_app/migrations/0002_gericht_preis_alter_bestellung_status_and_more.py deleted file mode 100644 index 48a01fc..0000000 --- a/mensa_app/migrations/0002_gericht_preis_alter_bestellung_status_and_more.py +++ /dev/null @@ -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), - ), - ] diff --git a/mensa_app/migrations/__pycache__/0001_initial.cpython-312.pyc b/mensa_app/migrations/__pycache__/0001_initial.cpython-312.pyc index 779afae..2bc9c39 100644 Binary files a/mensa_app/migrations/__pycache__/0001_initial.cpython-312.pyc and b/mensa_app/migrations/__pycache__/0001_initial.cpython-312.pyc differ diff --git a/mensa_app/migrations/__pycache__/0002_gericht_preis_alter_bestellung_status_and_more.cpython-312.pyc b/mensa_app/migrations/__pycache__/0002_gericht_preis_alter_bestellung_status_and_more.cpython-312.pyc deleted file mode 100644 index b1d769a..0000000 Binary files a/mensa_app/migrations/__pycache__/0002_gericht_preis_alter_bestellung_status_and_more.cpython-312.pyc and /dev/null differ diff --git a/mensa_app/migrations/__pycache__/__init__.cpython-312.pyc b/mensa_app/migrations/__pycache__/__init__.cpython-312.pyc index e185423..bdc1992 100644 Binary files a/mensa_app/migrations/__pycache__/__init__.cpython-312.pyc and b/mensa_app/migrations/__pycache__/__init__.cpython-312.pyc differ diff --git a/mensa_app/models.py b/mensa_app/models.py index 30b945b..4bf631c 100644 --- a/mensa_app/models.py +++ b/mensa_app/models.py @@ -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')