from decimal import Decimal from django.db.models import Sum from django.shortcuts import render from django.views.generic import TemplateView from shop.filters import ProductFilter from shop.models import CartItem, Product, ProductPrice from web.mixins import FilteredQuerysetMixin, PaginatedQuerysetMixin from web.settings import ANONYMOUS_CART_ID_COOKIE_NAME from web.utils import get_cart_total, get_or_create_cart class ListProducts(TemplateView, FilteredQuerysetMixin, PaginatedQuerysetMixin): template_name = "web/list_products.html" queryset = Product.objects.all().prefetch_related( "images", ) filter_class = ProductFilter def get_context_data(self, **kwargs): qs = self.get_queryset() page = self.get_paginated_queryset(qs) return { "page": page, "has_next_page": page.has_next(), "has_previous_page": page.has_previous(), } def cart_dropdown(request, *args, **kwargs): cart, created = get_or_create_cart(request) response = render( request, "components/cart/cart_navbar.html", context={ "cart": cart, }, ) if not request.user.is_authenticated: response.set_cookie(ANONYMOUS_CART_ID_COOKIE_NAME, cart.uuid) return response def cart(request, *args, **kwargs): cart, created = get_or_create_cart(request) items = CartItem.objects.filter(cart=cart) base_total = Decimal("0.00") tax_total = Decimal("0.00") for item in items: price = ProductPrice.objects.filter(product=item.product, current=True).first() base_total += price.price * item.quantity tax_total += round(price.price * Decimal(price.tax.value / 100), 2) total = base_total + tax_total response = render( request, "components/cart/cart.html", context={ "cart": cart, "items": items, "total": total, "base_total": base_total, "tax_total": tax_total, }, ) if not request.user.is_authenticated: response.set_cookie(ANONYMOUS_CART_ID_COOKIE_NAME, cart.uuid) return response list_products = ListProducts.as_view()