from functools import reduce from django.conf import settings from django.urls import reverse_lazy 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_slug_field(self): return 'slug' 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_intance = parse_path(self.kwargs.get('path')) cat_qs = ProductCategory.objects.filter(slug__exact=category_intance).first() qs = qs.filter(parent__in=cat_qs.get_descendants(include_self=True)) 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 not "products" 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