From 18da57b66ac3baa52b3b54c9a59ac2826e53abda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Eva=20G=C3=B6hl?= Date: Thu, 25 Jun 2026 07:07:48 +0000 Subject: [PATCH] mensa_app/models.py aktualisiert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- mensa_app/models.py | 102 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) diff --git a/mensa_app/models.py b/mensa_app/models.py index 88062d2..8886f46 100644 --- a/mensa_app/models.py +++ b/mensa_app/models.py @@ -354,3 +354,105 @@ class GerichtBild(models.Model): # --- 2️⃣ Rufe die normale Django-Delete‑Logik auf ------------------------------------ super().delete(*args, **kwargs) # löscht den DB‑Eintrag + # 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) \ No newline at end of file