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