mensa_app/models.py aktualisiert

Ich habe einen Code hinzugefügt, der bewirkt, dass die Schüler bestellen können und ein Admin (der Mensabetreiber) bei Anmeldung auf die Bearbeitung der Gerichte zugreifen kann.
This commit is contained in:
2026-06-25 07:07:48 +00:00
parent 5d060587cb
commit 18da57b66a
+102
View File
@@ -354,3 +354,105 @@ class GerichtBild(models.Model):
# --- 2️⃣ Rufe die normale Django-DeleteLogik auf ------------------------------------
super().delete(*args, **kwargs) # löscht den DBEintrag
# yourappname/admin.py
from django.contrib import admin
from .models import Kategorie, Gericht, Schulwoche, SpeiseplanTag, Menue, Bestellung, Bewertung, GerichtBild
# 1. Kategorien registrieren
@admin.register(Kategorie)
class KategorieAdmin(admin.ModelAdmin):
list_display = ('name',)
search_fields = ('name',)
# 2. Gerichte (Das wichtigste Modell für den Betreiber!)
@admin.register(Gericht)
class GerichtAdmin(admin.ModelAdmin):
list_display = ('name', 'kategorie', 'ist_vegetarisch', 'ist_dauerangebot')
list_filter = ['kategorie', 'is_vegetarisch', 'is_allergene_frei']
search_fields = ['name']
# 3. Bilder (Optional, aber hilfreich)
@admin.register(GerichtBild)
class GerichtBildAdmin(admin.ModelAdmin):
list_display = ('gericht', 'image')
list_filter = ['gericht']
# Hier können Sie eventuell das Bild beim Bearbeiten vorab anzeigen lassen
# 4. Speiseplan-Verwaltung (Schulwochen und Tage)
@admin.register(Schulwoche)
class SchulwocheAdmin(admin.ModelAdmin):
list_display = ('id', 'datum', 'ist_aktiv')
search_fields = ('id',)
# Hier könnten Sie weitere Modelle wie Menue, Bestellung usw. registrieren,
# je nachdem, welchen Zugriff der Betreiber auf diese Bereiche benötigt.
# yourappname/views.py
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.decorators import login_required # Stellt sicher, dass nur eingeloggte Nutzer bestellen können
from .models import SpeiseplanTag, Menue, Bestellung, Person
from datetime import date
import django.db
@login_required
def place_order_view(request):
# 1. Überprüfen, ob Daten über POST (Formular) gesendet wurden
if request.method == 'POST':
# Wir nehmen an, dass das Formular Datum und Benutzer-ID sendet.
datum_str = request.POST.get('datum')
if not datum_str:
return render(request, 'order/error.html', {'message': "Bitte wählen Sie ein Datum."})
try:
bestellungsdatum = date.fromisoformat(datum_str) # Angenommen, das Format ist YYYY-MM-DD
except ValueError:
return render(request, 'order/error.html', {'message': "Ungültiges Datumsformat."})
# 2. Speiseplan für dieses Datum finden
try:
speisetag = SpeiseplanTag.objects.get(datum=bestellungsdatum)
except SpeiseplanTag.DoesNotExist:
return render(request, 'order/error.html', {'message': f"Für den {bestellungsdatum} ist kein Menü verfügbar."})
# 3. Das verfügbare Menü für diesen Tag ermitteln (Hier vereinfacht!)
try:
# Beispiel: Wir holen uns nur das erste gefundene Menü des Tages
menue_item = Menue.objects.filter(tag=speisetag).select_related('gericht').first()
if not menue_item:
return render(request, 'order/error.html', {'message': "Für dieses Datum ist kein Haupt-Menü konfiguriert."})
except Exception as e:
# Bei einem Fehler bei der Datenbankabfrage
return render(request, 'order/error.html', {'message': f"Fehler beim Laden des Menüs: {e}"})
# 4. Bestellung erstellen (Der Kernprozess)
user = Person.objects.get(pk=request.user.person_id) # Zugriff auf die Person-Details des eingeloggten Nutzers
try:
new_bestellung = Bestellung.objects.create(
person=user,
menue=menue_item, # Das Menü für den Tag
datum_bestellung=timezone.now(), # Zeitpunkt der Bestätigung
status='offen' # Standardmäßig offen
)
return redirect('order:confirmation_success') # Weiterleitung zu einer Erfolgsseite
except Exception as e:
# Fehlerbehandlung, z.B., wenn das Menü veraltet ist oder die Person fehlt
return render(request, 'order/error.html', {'message': f"Ein Bestellfehler ist aufgetreten: {e}"})
# 5. Fallback: Wenn Methode GET war (Anzeige des Formulars)
speisetag = SpeiseplanTag.objects.filter(datum__gte=date.today()).order_by('datum').first()
if not speisetag:
return render(request, 'order/form.html', {'error': "Kein zukünftiger Speiseplan gefunden."})
# Hier würden Sie ein Formular mit dem Datum und weiteren Optionen (z.B. Abholzeit) vorbelegen.
context = {
'speisetag': speisetag,
'menue_verfuegbar': True # ... etc.
}
return render(request, 'order/form.html', context)