diff options
-rw-r--r-- | saleor/product/filters.py | 70 | ||||
-rw-r--r-- | saleor/product/views.py | 21 | ||||
-rw-r--r-- | templates/category/index.html | 44 |
3 files changed, 67 insertions, 68 deletions
diff --git a/saleor/product/filters.py b/saleor/product/filters.py index e67b476a..68f785e1 100644 --- a/saleor/product/filters.py +++ b/saleor/product/filters.py @@ -1,34 +1,54 @@ -from django_filters import FilterSet, ModelMultipleChoiceFilter - +from django_filters import FilterSet, MultipleChoiceFilter, RangeFilter from django.forms import CheckboxSelectMultiple -from .models import Category, Product, ProductAttribute, AttributeChoiceValue - +from django_prices.models import PriceField -class CategoryFilter(FilterSet): - class Meta: - model = Category - fields = ['name', 'parent'] +from .models import Product, AttributeChoiceValue class ProductFilter(FilterSet): - class Meta: - model = Product - fields = ['price', 'categories__name'] - - -class ProductAttributeFilter(FilterSet): def __init__(self, *args, **kwargs): - self.attribute_name = kwargs.pop('attribute_name') - super(ProductAttributeFilter, self).__init__(*args, **kwargs) - self.filters['name'].queryset = \ - AttributeChoiceValue.objects.all().filter( - attribute__name=self.attribute_name) - - name = ModelMultipleChoiceFilter(widget=CheckboxSelectMultiple) + super(ProductFilter, self).__init__(*args, **kwargs) + self.products = self.queryset + + product_attributes = set() + variant_attributes = set() + for product in self.products: + for attribute in product.product_class.variant_attributes.all(): + product_attributes.add(attribute) + for attribute in product.product_class.product_attributes.all(): + variant_attributes.add(attribute) + + for attribute in product_attributes: + self.filters[attribute.slug] = \ + MultipleChoiceFilter( + name='product_class__product_attributes__values__slug', + label=attribute.name, + widget=CheckboxSelectMultiple, + choices=self.get_attribute_choices(attribute) + ) + + for attribute in variant_attributes: + self.filters[attribute.slug] = \ + MultipleChoiceFilter( + name='product_class__variant_attributes__values__slug', + label=attribute.name, + widget=CheckboxSelectMultiple, + choices=self.get_attribute_choices(attribute) + ) + + def get_attribute_choices(self, attribute): + result = [(choice.slug, choice.name) + for choice in AttributeChoiceValue.objects + .filter(attribute__name=attribute.name)] + return result class Meta: - model = ProductAttribute - fields = ['name'] - - + model = Product + fields = ['price'] + exclude = [] + filter_overrides = { + PriceField: { + 'filter_class': RangeFilter + } + } diff --git a/saleor/product/views.py b/saleor/product/views.py index 540fc237..f820908d 100644 --- a/saleor/product/views.py +++ b/saleor/product/views.py @@ -4,15 +4,14 @@ import datetime import json from django.core.urlresolvers import reverse -from django.db.models import Prefetch from django.http import HttpResponsePermanentRedirect, JsonResponse from django.shortcuts import get_object_or_404, redirect from django.template.response import TemplateResponse from ..cart.utils import set_cart_cookie from ..core.utils import serialize_decimal -from .filters import ProductAttributeFilter, CategoryFilter, ProductFilter -from .models import Category, Product, ProductAttribute, AttributeChoiceValue +from .filters import ProductFilter +from .models import Category, Product from .utils import (products_with_details, products_for_cart, handle_cart_form, get_availability, get_product_images, get_variant_picker_data, @@ -122,23 +121,11 @@ def category_index(request, path, category_id): 'product_class__product_attributes__values', 'variants__stock').all()) - filters = dict() - for product in products: - for attribute in product.product_class.variant_attributes.all(): - filters[attribute] = set() - for attribute in product.product_class.product_attributes.all(): - filters[attribute] = set() - - for name, choices in filters.items(): - filters[name] = ProductAttributeFilter( - request=request.GET, - queryset=AttributeChoiceValue.objects.all(), - attribute_name=name) + product_filters = ProductFilter(request.GET, queryset=products) if actual_path != path: return redirect('product:category', permanent=True, path=actual_path, category_id=category_id) return TemplateResponse(request, 'category/index.html', {'category': category, - 'products': products, - 'filters': filters}) + 'filter': product_filters}) diff --git a/templates/category/index.html b/templates/category/index.html index 512e7b37..351a006e 100644 --- a/templates/category/index.html +++ b/templates/category/index.html @@ -59,47 +59,39 @@ <div class="row"> <div class="col-md-4 col-lg-3"> <div class="product-filters"> - {% for name, filter in filters.items %} - <form method="get"> - {{ name }} - {{ filter.form.as_p }} - <button type="submit">Search</button> - </form> - {% endfor %} + </div> - <div> + <div> <h2> {% trans 'Filters' context 'Filter heading title' %} <span class="clear-filters float-right" onClick="">{% trans 'Clear filters' context 'Category page filters' %}</span> </h2> <div class="product-filters"> <div class="product-filters__attributes"> - <div key={{ attribute.pk }}> - <h3 onClick=""> - {{ title }} - <div class="collapse-filters-icon"> - <InlineSVG key={key} src={imageSrc} /> - </div> - </h3> - <ul id={{ attribute.slug }}> - <li key={value.id} class="item"> + <form method="get"> + <!--{% csrf_token %}--> + {% for field in filter.form %} + <div key={{ attribute.pk }}> + <h3 onClick=""> + {{ field.label }} + <!--<div class="collapse-filters-icon">--> + <!--<InlineSVG key={key} src={imageSrc} />--> + <!--</div>--> + </h3> + {{ field }} - </li> - </ul> - </div> + </div> + {% endfor %} + <button type="submit">Search</button> + </form> </div> - <PriceFilter - onFilterChanged={this.updatePriceFilter} - maxPrice={variables.maxPrice} - minPrice={variables.minPrice} - /> </div> </div> </div> <div class="col-md-8 col-lg-9 category-list"> <div> <!--ProductList--> - {% for product in products %} + {% for product in filter.qs %} <div class="row"> <!--ProductItem--> |