Kategorien für Gerichte ergänzt
This commit is contained in:
BIN
db.sqlite3
BIN
db.sqlite3
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
mensa_app/__pycache__/tests.cpython-312.pyc
Normal file
BIN
mensa_app/__pycache__/tests.cpython-312.pyc
Normal file
Binary file not shown.
@@ -9,6 +9,10 @@ from .models import SpeiseplanTag # Ersetze dies durch deine echten Klassennamen
|
|||||||
|
|
||||||
admin.site.register(SpeiseplanTag)
|
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
|
from .models import Gericht # Ersetze dies durch deine echten Klassennamen
|
||||||
|
|
||||||
admin.site.register(Gericht)
|
admin.site.register(Gericht)
|
||||||
|
|||||||
@@ -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.db.models.deletion
|
||||||
import django.utils.timezone
|
import django.utils.timezone
|
||||||
@@ -16,13 +16,14 @@ class Migration(migrations.Migration):
|
|||||||
|
|
||||||
operations = [
|
operations = [
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Gericht',
|
name='Kategorie',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('name', models.CharField(max_length=100)),
|
('name', models.CharField(default='', max_length=50, unique=True)),
|
||||||
('ist_vegetarisch', models.BooleanField(default=False)),
|
|
||||||
('allergene', models.TextField(blank=True)),
|
|
||||||
],
|
],
|
||||||
|
options={
|
||||||
|
'verbose_name_plural': 'Kategorien',
|
||||||
|
},
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='SpeiseplanTag',
|
name='SpeiseplanTag',
|
||||||
@@ -31,6 +32,19 @@ class Migration(migrations.Migration):
|
|||||||
('datum', models.DateField(unique=True)),
|
('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(
|
migrations.CreateModel(
|
||||||
name='Menue',
|
name='Menue',
|
||||||
fields=[
|
fields=[
|
||||||
@@ -44,8 +58,8 @@ class Migration(migrations.Migration):
|
|||||||
name='Person',
|
name='Person',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('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)),
|
('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=10, null=True)),
|
('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)),
|
('user', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -54,7 +68,7 @@ class Migration(migrations.Migration):
|
|||||||
fields=[
|
fields=[
|
||||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('datum_bestellung', models.DateTimeField(default=django.utils.timezone.now)),
|
('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)),
|
('bezahlt', models.BooleanField(default=False)),
|
||||||
('menue', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='mensa_app.menue')),
|
('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')),
|
('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),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -18,16 +18,42 @@ class SpeiseplanTag(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.datum.strftime('%d.%m.%Y')
|
return self.datum.strftime('%d.%m.%Y')
|
||||||
|
|
||||||
class Gericht(models.Model):
|
class Kategorie(models.Model):
|
||||||
"""Ein einzelnes Gericht (z.B. 'Nudeln mit Tomatensauce')."""
|
"""
|
||||||
name = models.CharField(max_length=100)
|
Definiert die Art der Speise (Süßspeise, Hauptgericht, etc.).
|
||||||
ist_vegetarisch = models.BooleanField(default=False)
|
"""
|
||||||
allergene = models.TextField(blank=True)
|
name = models.CharField(max_length=50, unique=True, default="")
|
||||||
preis = models.DecimalField(max_digits=5, decimal_places=2, default=0.00)
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name_plural = "Kategorien"
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.name
|
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):
|
class Menue(models.Model):
|
||||||
"""Eine Kombination von Speisen für einen Tag (z.B. Hauptgang + Dessert)."""
|
"""Eine Kombination von Speisen für einen Tag (z.B. Hauptgang + Dessert)."""
|
||||||
tag = models.ForeignKey(SpeiseplanTag, on_delete=models.CASCADE, related_name='menues')
|
tag = models.ForeignKey(SpeiseplanTag, on_delete=models.CASCADE, related_name='menues')
|
||||||
|
|||||||
Reference in New Issue
Block a user