Aktualisierter Code #8

Closed
e.goehl wants to merge 1 commits from SheCodesGroup/SGTMensa:main into main
+102
View File
@@ -354,3 +354,105 @@ class GerichtBild(models.Model):
# --- 2️⃣ Rufe die normale Django-DeleteLogik auf ------------------------------------ # --- 2️⃣ Rufe die normale Django-DeleteLogik auf ------------------------------------
super().delete(*args, **kwargs) # löscht den DBEintrag 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)