Files
SGTMensa/mensa_app/views.py
T

98 lines
4.0 KiB
Python

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()})