From 2258c76d249300ec5d78169518e53552ef355abc Mon Sep 17 00:00:00 2001 From: Alexander Burdeiny Date: Tue, 26 Jul 2016 10:50:04 +0300 Subject: [PATCH] =?UTF-8?q?=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=B0=20=D0=BD?= =?UTF-8?q?=D0=B0=D0=B4=20=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=BE=D0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- events/forms.py | 60 +++++++++++++++++-- .../client/includes/events/filter_form.html | 15 ++--- theme/manager.py | 11 ++-- 3 files changed, 71 insertions(+), 15 deletions(-) diff --git a/events/forms.py b/events/forms.py index afa9cdba..b4e56403 100644 --- a/events/forms.py +++ b/events/forms.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 = ['') + 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 diff --git a/templates/client/includes/events/filter_form.html b/templates/client/includes/events/filter_form.html index dd28b2cf..e6cbd559 100644 --- a/templates/client/includes/events/filter_form.html +++ b/templates/client/includes/events/filter_form.html @@ -2,13 +2,14 @@
{% csrf_token %} + + {% for field in form %} + {% if field.errors %}error{% endif %} + + {{ field }} (763) + {{ field.errors }} + {{ field.help_text }} + {% endfor %} - - {% for field in form %} - {{ field.label_tag }} - {{ field }} - {% endfor %} - - {# {{ form.as_p }} #}
diff --git a/theme/manager.py b/theme/manager.py index 20fd2266..3d5434aa 100644 --- a/theme/manager.py +++ b/theme/manager.py @@ -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