Files
shoppy/web/views/components.py
T

79 lines
2.1 KiB
Python

from decimal import Decimal
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_or_create_cart
class ListProducts(TemplateView, FilteredQuerysetMixin, PaginatedQuerysetMixin):
template_name = "web/list_products.html"
queryset = Product.objects.filter(hidden=False).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()