aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--saleor/product/filters.py70
-rw-r--r--saleor/product/views.py21
-rw-r--r--templates/category/index.html44
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-->