реализовал убирание фильтра по посетителям и рейтингу в случае если в выбраны только конференции;

реализовал учитывание поисковых параметров "я ищу" и "где"
remotes/origin/stage5
Alexander Burdeiny 10 years ago
parent a8a30d529f
commit 07ede6f706
  1. 73
      events/forms.py
  2. 3
      events/views.py
  3. 4
      functions/custom_views.py
  4. 3
      functions/search_mixin.py
  5. 1
      templates/client/blank.html

@ -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 = ['<ul>']
output = ['<ul>' if not self.is_hidden else '<ul style="display: none;">']
# 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):

@ -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

@ -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()

@ -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()

@ -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 }}",
};
</script>
{% if not NO_BANNERS %}

Loading…
Cancel
Save