You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

91 lines
3.6 KiB

from django.conf import settings
from django.utils.translation import ugettext_lazy as _
from django.views.generic import ListView, DetailView
from cart.forms import CartAddInlineForm
from core.utils import parse_path
from .forms import (ProductSortForm)
from .models import (Product, ProductCategory)
class ProductDetailView(DetailView):
http_method_names = ('get',)
model = Product
pk_url_kwarg = None
slug_url_kwarg = 'path'
context_object_name = 'product'
template_name = 'products/product_detail.html'
def dispatch(self, request, *args, **kwargs):
if self.kwargs.get(self.slug_url_kwarg):
slug_url_kwarg_val = self.kwargs.pop(self.slug_url_kwarg)
slug_url_kwarg_val = parse_path(slug_url_kwarg_val)
self.kwargs[self.slug_url_kwarg] = slug_url_kwarg_val
return super().dispatch(request, *args, **kwargs)
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['title'] = self.object.name
return context
class ProductListView(ListView):
http_method_names = ('get',)
model = Product
template_name = 'products/product_list.html'
context_object_name = 'products'
paginate_by = settings.DEFAULT_PAGE_AMOUNT
title = _('Каталог')
def filter_products(self, qs):
if self.kwargs.get('path'):
category_slug = parse_path(self.kwargs.get('path'))
cat_qs = ProductCategory.objects.filter(slug=category_slug)
qs = qs.filter(parent_id__in=cat_qs.get_descendants(include_self=True))
print(qs)
# TODO understand why there are some filtering queries
# if self.request.GET.get('name'):
# qs = qs.filter(name__icontains=self.request.GET.get('name'))
# if self.request.GET.get('manufacturer'):
# qs = qs.filter(manufacturer__slug=self.request.GET.get('manufacturer'))
# if self.request.GET.get('supply_type'):
# qs = qs.filter(offer__supply_type__slug=self.request.GET.get('supply_type'))
# if self.request.GET.get('supply_target'):
# qs = qs.filter(offer__supply_target__slug=self.request.GET.get('supply_target'))
# qs = qs.filter(offer__amount__gte=0)
return qs
def sort_products(self, qs):
if not self.request.GET:
return qs
if self.request.GET.get('sort'):
qs = qs.order_by()
return qs
def get_queryset(self):
qs = super().get_queryset()
qs = self.filter_products(qs)
# qs = self.sort_products(qs)
return qs
def get_cart_add_formset(self, products):
return {product.id: CartAddInlineForm(initial={'offer': product.id, 'amount': 1}) for product in products}
def get_product_sorting_form(self):
if "products" not in self.request.resolver_match.view_name:
product_form_action = {'viewname': 'products:product_list', 'kwarg': {}}
else:
product_form_action = {'viewname': self.request.resolver_match.view_name,
'kwargs': self.request.resolver_match.kwargs}
return ProductSortForm(
product_form_action=product_form_action,
query_params=self.request.GET
)
def get_context_data(self, *, object_list=None, **kwargs):
context = super().get_context_data(object_list=object_list, **kwargs)
context['title'] = self.title
context['product_sort_form'] = self.get_product_sorting_form()
context['product_cart_add_formset'] = self.get_cart_add_formset(self.object_list)
return context