diff --git a/events/forms.py b/events/forms.py
index 0707fb8e..e26abaeb 100644
--- a/events/forms.py
+++ b/events/forms.py
@@ -48,7 +48,7 @@ class FilterCheckboxSelectMultiple(forms.CheckboxSelectMultiple):
if value is None: value = []
has_id = attrs and 'id' in attrs
final_attrs = self.build_attrs(attrs, name=name)
- output = ['
']
+ output = ['' if not self.is_hidden else '']
# Normalize to strings
str_values = set([force_text(v) for v in value])
for i, (option_value, option_label) in enumerate(chain(self.choices, choices)):
@@ -260,7 +260,8 @@ class FilterForm(forms.Form):
label=_(u'Рейтинги'), coerce=str,
choices=RATING,
required=False, widget=FilterCheckboxSelectMultiple())
-
+ query = forms.CharField(required=False, widget=forms.HiddenInput())
+ where_query = forms.CharField(required=False, widget=forms.HiddenInput())
def __init__(self, *args, **kwargs):
super(FilterForm, self).__init__(*args, **kwargs)
@@ -323,7 +324,7 @@ class FilterForm(forms.Form):
return year
def clean_default_month(self):
- v = self.cleaned_data.get('default_month')
+ v = self.cleaned_data.get('default_month')
if v and v in settings.MONTHES.keys():
self.fields['month'].default_month = v
return v
@@ -362,19 +363,32 @@ class FilterForm(forms.Form):
# print(new_values, self.data)
return new_values
+ def clean_rating(self):
+ types = self.cleaned_data.get('event_type')
+ if TYPES.CONF in types and not TYPES.EXPO in types:
+ self.fields['rating'].widget.input_type = 'hidden'
+ self.fields['rating'].widget.is_hidden = True
+ # self.fields['rating'].widget = forms.HiddenInput()
+ return []
+ return self.cleaned_data.get('rating')
+
+ def clean_visitors(self):
+ types = self.cleaned_data.get('event_type')
+ if TYPES.CONF in types and not TYPES.EXPO in types:
+ self.fields['visitors'].widget.input_type = 'hidden'
+ self.fields['visitors'].widget.is_hidden = True
+ # self.fields['visitors'].widget = forms.HiddenInput()
+ return []
+ return self.cleaned_data.get('visitors')
+
def _post_clean(self):
# нужно для того, чтобы год зашел в поле month
# print(self.get_date_begin_periods())
if not self.cleaned_data.get('default_month') and self.fields['month'].default_month:
self.data['default_month'] = self.fields['month'].default_month
- year = self.cleaned_data.get('year')
- # if year:
- # for val, name in self.fields['month'].additional_choices:
- # self.
- # additional_choices
+ # year = self.cleaned_data.get('year')
def is_valid(self):
- # if getattr(self, '_is_valid', None) is None:
self._is_valid = super(FilterForm, self).is_valid()
# нам нужно сбрасывать сохраненный выбор моделей,
@@ -392,7 +406,18 @@ class FilterForm(forms.Form):
self._models.append(Exposition)
if TYPES.CONF in val:
self._models.append(Conference)
- return self._models or [Exposition, Conference]
+ if not self._models:
+ self._models = [Exposition, Conference]
+ if self.cleaned_data.get('query') or self.cleaned_data.get('where_query'):
+ exclude_models = []
+ for model in self._models:
+ values = self.filter(load_all=False, models=[model]).values_list('pk', flat=True)
+ if values:
+ setattr(self, 'query_{model}_ids'.format(model=model.__name__), map(int, values))
+ else:
+ exclude_models.append(model)
+ self._models = list(filter(lambda x: x not in exclude_models, self._models))
+ return self._models
@property
def lookup_kwargs(self):
@@ -424,8 +449,8 @@ class FilterForm(forms.Form):
self._lookup_kwargs['price_choice__in'] = d.get('price')
return self._lookup_kwargs
- def filter(self, qs=None):
- qs = qs or self.default_filter()
+ def filter(self, qs=None, load_all=True, models=None):
+ qs = qs or self.default_filter(load_all=load_all, _models=models)
# lookup_kwargs = dict(ChainMap({}, *(lookup_kwargs or self.lookup_kwargs).values()))
qs = self.make_cleaned_sqs_filter(qs)
return qs.filter(**self.lookup_kwargs).order_by('data_begin')
@@ -448,6 +473,12 @@ class FilterForm(forms.Form):
rating_params = self.make_rating_sqs_params()
if rating_params is not None:
qs = qs.filter(rating_params)
+ query = self.cleaned_data.get('query')
+ if query:
+ qs = qs.autocomplete(content_auto=query)
+ where_query = self.cleaned_data.get('where_query')
+ if where_query:
+ qs = qs.filter(where__contains=where_query)
return qs
def recalculate_choices(self):
@@ -492,10 +523,10 @@ class FilterForm(forms.Form):
self.make_event_type_choices_count()
# self.fields['month'].choices = self.month_choices()
- # for field in self.fields:
- # field = self.fields[field]
- # if hasattr(field, 'queryset'):
- # field.queryset = field.queryset[:15]
+ for field in self.fields:
+ field = self.fields[field]
+ if hasattr(field, 'queryset'):
+ field.queryset = field.queryset[:150]
def make_event_type_choices_count(self):
types = {1: Exposition, 2: Conference}
@@ -561,6 +592,16 @@ class FilterForm(forms.Form):
'''`{db_table}`.`{attname}` IN {val}'''\
.format(**_format_kwargs))
+ # if self.cleaned_data.get('query') or self.cleaned_data.get('where_query'):
+ values = getattr(self, 'query_{model}_ids'.format(model=model.__name__), [])
+ # values = self.filter(load_all=False, models=[model]).values_list('pk', flat=True)
+ if values:
+ where.append(
+ '''`{db_table}`.`id` IN {val}'''\
+ .format(
+ db_table=model._meta.db_table,
+ val=self.make_ids_in_sql_format(values))
+ )
return joins, where
def make_local_field_count(self, field):
diff --git a/events/views.py b/events/views.py
index 7830de21..5d51439d 100644
--- a/events/views.py
+++ b/events/views.py
@@ -32,11 +32,12 @@ class FilterListView(ContextMixin, FormMixin, ListView):
def get_queryset(self):
if self.form.is_valid():
qs = self.form.filter()
+ # import pdb; pdb.set_trace()
else:
qs = self.form.default_filter()
if self.kwargs.get('with_form', True):
self.form.recalculate_choices()
- print(self.form.data, self.form.cleaned_data, self.form.get_date_begin_periods())
+ # print(self.form.data, self.form.cleaned_data, self.form.get_date_begin_periods())
# import pdb; pdb.set_trace()
return qs
diff --git a/functions/custom_views.py b/functions/custom_views.py
index bbc580a9..019635df 100644
--- a/functions/custom_views.py
+++ b/functions/custom_views.py
@@ -413,7 +413,9 @@ class ExpoSearchView(ListView):
if form.cleaned_data.get('to'):
context['date_to'] = form.cleaned_data.get('to').strftime('%d.%m.%Y')
if form.cleaned_data.get('q'):
- context['query'] = self.cleaned_data.get('q', '').strip()
+ context['query'] = form.cleaned_data.get('q', '').strip()
+ if form.cleaned_data.get('w'):
+ context['where_query'] = form.cleaned_data.get('w', '').strip()
else:
form = self.search_form()
diff --git a/functions/search_mixin.py b/functions/search_mixin.py
index 6e0f2170..1590360e 100644
--- a/functions/search_mixin.py
+++ b/functions/search_mixin.py
@@ -5,7 +5,6 @@ class ExpoSearchMixin(object):
"""
"""
-
def prepare_where(self, obj):
if obj.country:
country = [tr.name for tr in obj.country.translations.all()]
@@ -24,7 +23,6 @@ class ExpoSearchMixin(object):
"""
return obj.get_index_text()
-
def prepare_area_id(self, obj):
if obj.country:
return obj.country.area.id
@@ -46,7 +44,6 @@ class ExpoSearchMixin(object):
def prepare_tag(self, obj):
return [th.id for th in obj.tag.filter()]
-
def prepare_url(self, obj):
return obj.get_permanent_url()
diff --git a/templates/client/blank.html b/templates/client/blank.html
index 20b5bc9e..90f56977 100644
--- a/templates/client/blank.html
+++ b/templates/client/blank.html
@@ -65,6 +65,7 @@ This template include basic anf main styles and js files,
"date_from": "{{ date_from }}",
"date_to": "{{ date_to }}",
"query": "{{ query }}",
+ "where_query": "{{ where_query }}",
};
{% if not NO_BANNERS %}