checkout/src/purchase/views/basket.py

118 lines
4.3 KiB
Python
Raw Normal View History

2023-03-27 16:45:00 +02:00
import logging
2022-05-05 19:19:54 +02:00
from django.contrib import messages
from django.contrib.auth.decorators import permission_required
2023-03-27 16:45:00 +02:00
from django.core.handlers.wsgi import WSGIRequest
2022-05-05 19:19:54 +02:00
from django.http import HttpRequest, HttpResponse
2023-03-27 16:45:00 +02:00
from django.shortcuts import get_object_or_404, redirect, render
2022-05-05 19:19:54 +02:00
from django.template.response import TemplateResponse
2022-04-24 18:59:04 +02:00
from django.urls import reverse
2023-03-27 16:45:00 +02:00
from django.utils.datastructures import MultiValueDict
2022-04-25 23:04:49 +02:00
from django.utils.translation import gettext_lazy as _
2022-09-25 21:08:44 +02:00
from django.views.decorators.http import condition, require_http_methods
2023-03-27 16:45:00 +02:00
from django_htmx.http import trigger_client_event
from purchase.forms import UNPRICED_PREFIX, BasketForm
from purchase.models import Basket, Product, reports_etag, reports_last_modified
2022-04-24 16:21:39 +02:00
2023-03-27 16:45:00 +02:00
logger = logging.getLogger(__name__)
2022-04-24 18:59:04 +02:00
2022-05-05 19:19:54 +02:00
@require_http_methods(["GET", "POST"])
@permission_required("purchase.add_basket")
2023-03-27 16:45:00 +02:00
def new_basket(request: WSGIRequest) -> HttpResponse:
2022-05-05 19:19:54 +02:00
if request.method == "POST":
form = BasketForm(request.POST)
if form.is_valid():
2023-03-27 16:45:00 +02:00
basket = form.save()
update_with_unpriced_products(basket, request.POST)
2022-05-05 19:19:54 +02:00
if request.user.has_perm("purchase.change_basket"):
2023-03-27 16:45:00 +02:00
url = basket.get_absolute_url()
2022-05-05 19:19:54 +02:00
else:
url = reverse("purchase:new")
messages.success(request, _("Successfully created basket."))
return redirect(url)
else:
form = BasketForm()
2022-04-24 18:59:04 +02:00
2023-03-27 16:45:00 +02:00
return TemplateResponse(
request,
"purchase/basket_form.html",
{"form": form, "products": Product.objects.with_no_fixed_price()},
)
def update_with_unpriced_products(basket: Basket, post_data: MultiValueDict):
no_fixed_price = {
product.id: product for product in Product.objects.with_no_fixed_price()
}
basket.items.filter(product__in=no_fixed_price.values()).delete()
for product_id, product in no_fixed_price.items():
if prices := post_data.getlist(f"{UNPRICED_PREFIX}{product_id}"):
2023-03-27 16:49:26 +02:00
for price in map(int, prices):
if price:
basket.items.create(
product=product,
quantity=1,
unit_price_cents=price,
)
2022-04-25 17:30:49 +02:00
2022-05-05 19:19:54 +02:00
@require_http_methods(["GET", "POST"])
@permission_required("purchase.change_basket")
2023-03-27 16:45:00 +02:00
def update_basket(request: WSGIRequest, pk: int) -> HttpResponse:
2022-05-05 19:19:54 +02:00
basket = get_object_or_404(Basket.objects.priced(), pk=pk)
if request.method == "POST":
form = BasketForm(request.POST, instance=basket)
if form.is_valid():
basket = form.save()
2023-03-27 16:45:00 +02:00
update_with_unpriced_products(basket, request.POST)
2022-05-05 19:19:54 +02:00
messages.success(request, _("Successfully updated basket."))
return redirect(basket.get_absolute_url())
else:
form = BasketForm(instance=basket)
2022-04-24 18:59:04 +02:00
2023-03-27 16:45:00 +02:00
response = render(
2023-03-25 20:01:14 +01:00
request,
"purchase/basket_form.html",
2023-03-27 16:45:00 +02:00
{
"form": form,
"basket": basket,
"products": Product.objects.with_no_fixed_price(),
},
)
trigger_client_event(response, "load-unpriced", after="swap")
return response
@require_http_methods(["GET"])
def additional_unpriced_product(request: WSGIRequest) -> HttpResponse:
product_id = request.GET.get("product_to_add")
value = request.GET.get("value", 0)
product = get_object_or_404(Product.objects.with_no_fixed_price(), pk=product_id)
context = {"product": product, "value": value}
return render(
request,
"purchase/snippets/basket_unpriced_item.html",
context,
2022-05-05 19:19:54 +02:00
)
2022-04-25 16:27:59 +02:00
2022-05-05 19:19:54 +02:00
@permission_required("purchase.view_basket")
2022-09-25 21:46:14 +02:00
@condition(etag_func=reports_etag, last_modified_func=reports_last_modified)
2022-05-05 19:19:54 +02:00
def list_baskets(request: HttpRequest) -> HttpResponse:
context = {"baskets": Basket.objects.priced().order_by("-id")}
return TemplateResponse(request, "purchase/basket_list.html", context)
2022-04-25 16:27:59 +02:00
2022-05-05 19:19:54 +02:00
@require_http_methods(["GET", "POST"])
@permission_required("purchase.delete_basket")
def delete_basket(request: HttpRequest, pk: int) -> HttpResponse:
basket = get_object_or_404(Basket, pk=pk)
if request.method == "GET":
context = {"basket": basket}
return TemplateResponse(request, "purchase/basket_confirm_delete.html", context)
2023-03-25 20:01:14 +01:00
basket.delete()
messages.success(request, _("Basket successfully deleted."))
return redirect("purchase:list")