работа над фильтром

remotes/origin/stage5
Alexander Burdeiny 10 years ago
parent f2816d4827
commit 2258c76d24
  1. 60
      events/forms.py
  2. 15
      templates/client/includes/events/filter_form.html
  3. 11
      theme/manager.py

@ -1,26 +1,74 @@
# -*- coding: utf-8 -*-
from itertools import chain
from django import forms
from django.utils.translation import ugettext as _
from django.utils.encoding import force_text
from django.utils.html import format_html
from django.utils.safestring import mark_safe
from django.db.models import Count, Sum
from haystack.query import SearchQuerySet
from functions.model_utils import EnumChoices
from exposition.models import Exposition
from conference.models import Conference
from theme.models import Theme, Tag
class CheckboxSelectMultiple(forms.CheckboxSelectMultiple):
def render(self, name, value, attrs=None, choices=()):
if value is None: value = []
has_id = attrs and 'id' in attrs
final_attrs = self.build_attrs(attrs, name=name)
output = ['<ul>']
# 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)):
# If an ID attribute was given, add a numeric index as a suffix,
# so that the checkboxes don't all have the same ID attribute.
if has_id:
final_attrs = dict(final_attrs, id='%s_%s' % (attrs['id'], i))
label_for = format_html(u' for="{0}"', final_attrs['id'])
else:
label_for = ''
cb = forms.CheckboxInput(final_attrs, check_test=lambda value: value in str_values)
option_value = force_text(option_value)
rendered_cb = cb.render(name, option_value)
option_label = force_text(option_label)
count = 763
output.append(format_html(u'<li><label{0}>{1} {2} ({count})</label></li>',
label_for, rendered_cb, option_label,
count=count))
output.append('</ul>')
return mark_safe('\n'.join(output))
class FilterForm(forms.Form):
# class Meta:
# widgets = {
# 'model': forms.CheckboxSelectMultiple(),
# }
# widgets = {
# 'model': forms.CheckboxSelectMultiple(),
# 'theme': forms.CheckboxSelectMultiple(),
# 'tag': forms.CheckboxSelectMultiple(),
# }
TYPES = EnumChoices(
EXPO=(1, _(u'Выставки')),
CONF=(2, _(_(u'Конференции'))),
)
model = forms.TypedMultipleChoiceField(label=_(u'Тип события'), coerce=int, choices=TYPES, required=False, widget=forms.CheckboxSelectMultiple())
model = forms.TypedMultipleChoiceField(label=_(u'Тип события'), coerce=int, choices=TYPES, required=False, widget=CheckboxSelectMultiple())
theme = forms.ModelMultipleChoiceField(label=_(u'Тематики'),
queryset=Theme.active.all()\
.annotate(e_count=Count('exposition_themes'), c_count=Count('conference_themes')),
required=False, widget=CheckboxSelectMultiple())
tag = forms.ModelMultipleChoiceField(label=_(u'Теги'),
queryset=Tag.active.all()\
.annotate(e_count=Count('exposition_themes'), c_count=Count('conference_themes')),
required=False, widget=CheckboxSelectMultiple())
def get_models(self):
val = self.cleaned_data.get('model')
@ -37,4 +85,8 @@ class FilterForm(forms.Form):
def filter(self):
qs = SearchQuerySet().models(*self.get_models()).all()
d = self.cleaned_data
if d.get('theme'):
qs = qs.filter(theme__in=d.get('theme'))
if d.get('tag'):
qs = qs.filter(tag__in=d.get('tag'))
return qs

@ -2,13 +2,14 @@
<form action="{% url 'events:main' %}" method="get">
{% csrf_token %}
{% for field in form %}
{% if field.errors %}error{% endif %}
<label for="{{ field.auto_id }}">{{ field.label }}</label>
{{ field }} (763)
{{ field.errors }}
{{ field.help_text }}
{% endfor %}
{% for field in form %}
{{ field.label_tag }}
{{ field }}
{% endfor %}
{# {{ form.as_p }} #}
<button type="submit">{% trans "Применить" %}</button>
</form>

@ -2,6 +2,7 @@ import datetime
from operator import attrgetter
from django.utils import translation
from django.core.cache import cache
from django.db.models import Q
from hvad.models import TranslationManager
@ -14,8 +15,9 @@ class ThemeActiveManager(TranslationManager):
cache_time = 600
def all(self):
lang = translation.get_language()
qs = super(ThemeActiveManager, self).select_related('exposition_themes').\
filter(exposition_themes__theme__isnull=False, translations__language_code=lang, )\
qs = super(ThemeActiveManager, self)\
.select_related('exposition_themes', 'conference_themes')\
.filter(Q(exposition_themes__theme__isnull=False) | Q(conference_themes__theme__isnull=False), translations__language_code=lang, )\
.order_by('translations__name').distinct()
return qs
@ -86,8 +88,9 @@ class TagActiveManager(TranslationManager):
cache_time = 600
def all(self):
lang = translation.get_language()
qs = super(TagActiveManager, self).select_related('exposition_tags').\
filter(exposition_tags__tag__isnull=False, translations__language_code=lang, )\
qs = super(TagActiveManager, self)\
.select_related('exposition_tags', 'conference_tags')\
.filter(Q(exposition_tags__tag__isnull=False) | Q(conference_tags__tag__isnull=False), translations__language_code=lang, )\
.order_by('translations__name').distinct()
return qs

Loading…
Cancel
Save