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 .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: obj = Order.objects.get(pizza_event=event, member=request.member) except Order.DoesNotExist: obj = None context = {"event": event, "products": products, "order": obj} 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]@login_required def place_order(request): """View that shows the detail of the current order.""" event = PizzaEvent.current() if not event: return redirect("pizzas:index") try: obj = Order.objects.get(pizza_event=event, member=request.member) current_order_locked = not obj.can_be_changed except Order.DoesNotExist: obj = 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 as e: raise Http404("Pizza does not exist") from e if not obj: obj = Order(pizza_event=event, member=request.member) obj.product = product obj.save() return redirect("pizzas:index")