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.5 KiB
91 lines
3.5 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_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
|
|
|