Source code for pizzas.views

"""Views provided by the pizzas package"""
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.http import Http404
from django.shortcuts import get_object_or_404, render, redirect
from django.utils.translation import gettext_lazy as _
from django.views.decorators.http import require_http_methods

from payments.models import Payment
from payments.services import create_payment
from .models import Order, PizzaEvent, Product


[docs]@login_required def index(request): """ Overview of user order for a pizza event """ products = Product.available_products.order_by("name") if not request.user.has_perm("pizzas.order_restricted_products"): products = products.exclude(restricted=True) event = PizzaEvent.current() try: order = Order.objects.get(pizza_event=event, member=request.member) except Order.DoesNotExist: order = None context = {"event": event, "products": products, "order": order} return render(request, "pizzas/index.html", context)
[docs]@require_http_methods(["POST"]) def cancel_order(request): """ View that cancels a user's order """ if "order" in request.POST: try: order = get_object_or_404(Order, pk=int(request.POST["order"])) if not order.can_be_changed: messages.error(request, _("You can no longer cancel.")) elif order.member == request.member: order.delete() messages.success(request, _("Your order has been cancelled.")) except Http404: messages.error(request, _("Your order could not be found.")) return redirect("pizzas:index")
[docs]@require_http_methods(["POST"]) def pay_order(request): """ View that marks the order as paid using Thalia Pay """ if "order" in request.POST: try: order = get_object_or_404(Order, pk=int(request.POST["order"])) if order.member == request.member: create_payment(order, Payment.TPAY, order.member) messages.success( request, _("Your order has been paid with Thalia Pay.") ) except Http404: messages.error(request, _("Your order could not be found.")) return redirect("pizzas:index")
[docs]@login_required def order(request): """ View that shows the detail of the current order """ event = PizzaEvent.current() if not event: return redirect("pizzas:index") try: order = Order.objects.get(pizza_event=event, member=request.member) current_order_locked = not order.can_be_changed except Order.DoesNotExist: order = None current_order_locked = False if "product" in request.POST and not current_order_locked: productset = Product.available_products.all() if not request.user.has_perm("pizzas.order_restricted_products"): productset = productset.exclude(restricted=True) try: product = productset.get(pk=int(request.POST["product"])) except Product.DoesNotExist: raise Http404("Pizza does not exist") if not order: order = Order(pizza_event=event, member=request.member) order.product = product order.save() return redirect("pizzas:index")