from django.shortcuts import render, redirect from django.views import View from .forms import OrderConfirmationForm # Ein Formular für die finalen Details # Importieren Sie notwendige Django-Module (z.B. Django Payments) import stripe # Beispiel: Stripe Payment Library class CheckoutView(View): def get(self, request): # 1. Warenkorb aus der Session laden (vereinfacht dargestellt) cart_items = self.get_cart_from_session(request) context = { 'cart': cart_items, } return render(request, 'orders/checkout.html', context) def post(self, request): # 2. Bestätigungsdaten validieren (z.B. Lieferadresse falls nötig) form = OrderConfirmationForm() if form.is_valid(): user = request.user cart_items = self.get_cart_from_session(request) # --- 3. Transaktionsdaten erstellen und speichern --- total = sum(item['price'] * item['quantity'] for item in cart_items) # Erstelle die Hauptbestellung (STATUS: PENDING) order = Order.objects.create(user=user, total_price=total, status='PENDING') # Speichere jeden Artikel als OrderItem for item in cart_items: OrderItem.objects.create( order=order, menu_item=item['item'], # Angenommen, der Item-Objekt ist verfügbar quantity=item['quantity'], price_at_purchase=item['price'] ) # --- 4. Zahlung verarbeiten (CRITICAL STEP) --- try: payment_token = request.POST.get('stripePaymentToken') # Token aus dem Frontend erhalten # ACHTUNG: Hier wird das tatsächliche Stripe/PayPal API-Call ausgeführt charge = stripe.Charge.create( amount=int(total * 100), # Stripe erwartet Cent currency='eur', source=payment_token, description=f"Mensa Bestellung für {user.username}" ) # Zahlung erfolgreich! Bestätige die Order im Backend order.status = 'CONFIRMED' order.save() return redirect('bestellung_erfolgreich') except stripe.error.CardError as e: # Fehlerbehandlung (z.B. falsche Karte, zu viel Geld) form.add_error('payment', 'Zahlung fehlgeschlagen: ' + str(e)) except Exception as e: print(f"Allgemeiner Fehler bei der Zahlung: {e}") return render(request, 'orders/checkout.html', {'form': form}) # Hilfsfunktion (muss in die View oder ein Servicescript ausgelagert werden) def get_cart_from_session(request): # Logik zum Laden von Menüpunkten und Mengen aus der Session pass from django.shortcuts import render, redirect from django.views import View from .forms import ReviewForm # Muss ein Formular für Rating und Kommentar enthalten class ReviewView(View): def get(self, request): # Zeigt alle bestehenden Bewertungen (z.B. für das Hauptmenü) all_reviews = Review.objects.select_related('menu_item').order_by('-created_at') context = {'reviews': all_reviews} return render(request, 'reviews/list.html', context) def post(self, request): form = ReviewForm(request.POST) if form.is_valid(): review_data = form.cleaned_data # 1. Den Menüpunkt bestimmen (oder lassen Sie ihn optional) menu_item = request.GET.get('menu_item') # 2. Review erstellen Review.objects.create( user=request.user, menu_item=menu_item, # Kann None sein rating=review_data['rating'], comment=review_data['comment'] ) return redirect('nach_bewertung') # Bei Fehler: Formular mit Fehlern erneut anzeigen return render(request, 'reviews/list.html', {'form': form, 'reviews': Review.objects.all()})