from django.shortcuts import render # Create your views here. from django.views.generic import ListView from .models import Gericht class GerichtListView(ListView): model = Gericht template_name = 'mensa_app/gericht_liste.html' # Der Pfad zum Template context_object_name = 'alle_gerichte' # Der Name, den wir im Template nutzen from django.views.generic import TemplateView from django.utils import timezone from datetime import datetime from .models import Menue, Gericht, SpeiseplanTag class SpeiseplanView(TemplateView): template_name = 'mensa_app/speiseplan.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 1. Datum aus der URL holen (z.B. ?datum=2023-10-27) # Wenn kein Datum angegeben ist, nehmen wir heute. date_str = self.request.GET.get('datum') if date_str: try: target_date = datetime.strptime(date_str, '%Y-%m-%d').date() except ValueError: target_date = timezone.glob.now().date() else: target_date = timezone.now().date() # 2. Menüs für diesen spezifischen Tag laden # Wir suchen alle Menüs, deren Tag das target_date hat context['target_date'] = target_date context['menues_day'] = Menue.objects.filter(tag__datum=target_date) # 3. Dauerangebote laden (unabhängig vom Tag) context['dauerangebote'] = Gericht.objects.filter(ist_dauerangebot=True) # 4. Pager-Logik: Vorherigen und nächsten Tag finden # Wir suchen in der Tabelle SpeiseplanTag nach dem Tag davor/danach prev_tag = SpeiseplanTag.objects.filter(datum__lt=target_date).order_by('-datum').first() next_tag = SpeiseplanTag.objects.filter(datum__gt=target_date).order_by('datum').first() context['prev_date'] = prev_tag.datum.strftime('%Y-%m-%d') if prev_tag else None context['next_date'] = next_tag.datum.strftime('%Y-%m-%d') if next_tag else None return context from django.views.generic import TemplateView from django.utils import timezone from django.db.models import Count, Sum from datetime import datetime from .models import Bestellung, SpeiseplanTag, Gericht, Menue class BestellSummaryView(TemplateView): template_name = 'mensa_app/bestell_summary.html' def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) # 1. Datum aus der URL holen (wie beim Speiseplan) date_str = self.request.GET. get('datum') if date_str: try: target_date = datetime.strptime(date_str, '%Y-%m-%d').date() except ValueError: target_date = timezone.now().date() else: target_date = timezone.now().date() context['target_date'] = target_date # 2. Aggregation: Bestellungen nach Gericht gruppieren # Wir suchen alle Bestellungen, deren Menü am target_date stattfindet summary_stats = ( Bestellung.objects.filter(menue__tag__datum=target_date) .values('menue__gericht__name', 'menue__gericht__kategorie__name') # Gruppierung nach Name & Kategorie .annotate( anzahl=Count('id'), # Wie viele wurden bestellt? umsatz=Sum('menue__preis') # Was macht das für einen Umsatz? ) .order_by('menue__gericht__name') ) context['summary_stats'] = summary_stats # 3. Pager-Logik (identisch mit dem Speiseplan-View) prev_tag = SpeiseplanTag.objects.filter(datum__lt=target_date).order_by('-datum').first() next_tag = SpeiseplanTag.objects.filter(datum__gt=target_date).order_by('datum').first() context['prev_date'] = prev_tag.datum.strftime('%Y-%m-%d') if prev_tag else None context['next_date'] = next_tag.datum.strftime('%Y-%m-%d') if next_tag else None # 4. Gesamtzahlen für die Übersicht context['total_bestellungen'] = Bestellung.objects.filter(menue__tag__datum=target_date).count() context['total_umsatz'] = Bestellung.objects.filter(menue__tag__datum=target_date).aggregate(Sum('menue__preis'))['menue__preis__sum'] or 0 return context