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.
128 lines
4.5 KiB
128 lines
4.5 KiB
from ckeditor.widgets import CKEditorWidget
|
|
from crispy_forms.layout import Layout, Field, Button, Div, HTML
|
|
from django import forms
|
|
from crispy_forms.helper import FormHelper
|
|
from django.forms import ALL_FIELDS
|
|
from django.urls import reverse_lazy
|
|
from django.utils.translation import ugettext_lazy as _
|
|
|
|
from core.forms import QueryFormBase
|
|
from core.utils import parse_path
|
|
from products.templatetags.products_filters import apply_query_params
|
|
from .models import Product, Manufacturer
|
|
|
|
|
|
class ProductSearchForm(QueryFormBase, forms.ModelForm):
|
|
field_template = 'bootstrap/forms/product_search.html'
|
|
submit_css_class = None
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
self.submit_css_class = kwargs.pop('submit_css_class')
|
|
|
|
self.helper = FormHelper()
|
|
self.helper.form_method = 'get'
|
|
self.helper.layout = Layout(
|
|
Field('name', template=self.field_template, placeholder="Поиск программы..."),
|
|
Button(_('search'), value="search", css_class=self.submit_css_class, template=self.field_template)
|
|
)
|
|
super().__init__(*args, **kwargs)
|
|
|
|
self.helper.form_action = reverse_lazy(**self.form_action) + apply_query_params(
|
|
self.query_params) if self.query_params else ""
|
|
|
|
class Meta:
|
|
model = Product
|
|
fields = ('name',)
|
|
|
|
|
|
# --------------------------- Product Filter Types -------------------------#
|
|
class ProductManufacturerFilterForm(QueryFormBase):
|
|
manufacturer = forms.ChoiceField()
|
|
|
|
submit_css_button = None
|
|
field_template = 'bootstrap/forms/product_filter.html'
|
|
title = _('Производитель')
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
self.helper = FormHelper()
|
|
self.helper.form_method = 'get'
|
|
self.helper.layout = Layout(
|
|
Div(HTML(self.title), css_class='category__title'),
|
|
Field('manufacturer', template=self.field_template)
|
|
)
|
|
super().__init__(*args, **kwargs)
|
|
|
|
self.helper.form_action = self.get_form_action_url()
|
|
|
|
def get_initial_for_field(self, field, field_name):
|
|
if field_name == 'manufacturer':
|
|
man_qs = Manufacturer.active
|
|
category_instance = ''
|
|
if self.form_action.get('kwargs', None):
|
|
category_instance = parse_path(self.form_action.get('kwargs').get('path', ''))
|
|
|
|
prod_qs = Product.active.filter(
|
|
parent__name=category_instance,
|
|
name__icontains=self.query_params.get('name', '')
|
|
).only('pk')
|
|
|
|
if prod_qs.count():
|
|
man_qs = man_qs.filter(product__pk__in=prod_qs.all())
|
|
|
|
return man_qs.distinct('name').only('name', 'slug')
|
|
return super().get_initial_for_field(field, field_name)
|
|
|
|
|
|
class ProductSortForm(QueryFormBase):
|
|
submit_css_button = None
|
|
field_template = 'bootstrap/forms/product_sorting.html'
|
|
title = _('Сортировать по')
|
|
sort_fields = {
|
|
'price': _('Цене'),
|
|
'popular': _('Популярности'),
|
|
'rate': _('Рейтингу')
|
|
}
|
|
sort = forms.ChoiceField(label=title)
|
|
|
|
def __init__(self, *args, **kwargs):
|
|
self.helper = FormHelper()
|
|
self.helper.form_method = 'get'
|
|
self.helper.layout = Layout(
|
|
HTML(self.title),
|
|
Field('sort', template=self.field_template)
|
|
)
|
|
super().__init__(*args, **kwargs)
|
|
|
|
self.helper.form_action = self.get_form_action_url()
|
|
|
|
def get_sort_field_initial_data(self):
|
|
query_keys = self.query_params.keys()
|
|
initial_data = []
|
|
for key in self.sort_fields:
|
|
order = "DESC" if key in query_keys else "ASC"
|
|
initial_data.append({
|
|
'value': "{url}?{query_params}".format(**{
|
|
'url': reverse_lazy(**self.form_action),
|
|
'query_params': apply_query_params({key: order, **self.query_params}, True)
|
|
}),
|
|
'name': self.sort_fields[key]
|
|
})
|
|
return initial_data
|
|
|
|
def get_initial_for_field(self, field, field_name):
|
|
if field_name == 'sort':
|
|
return self.get_sort_field_initial_data()
|
|
return super().get_initial_for_field(field, field_name)
|
|
|
|
|
|
# ----------------------------------------- Admin forms ------------------------------------#
|
|
|
|
|
|
class ProductAdminForm(forms.ModelForm):
|
|
def __init__(self, *args, **kwargs):
|
|
super().__init__(*args, **kwargs)
|
|
self.fields['description'].widget = CKEditorWidget(config_name='awesome_ckeditor')
|
|
|
|
class Meta:
|
|
model = Product
|
|
fields = ALL_FIELDS
|
|
|