From 5d3a2d52661f0c841561b63ab2288edac2724e3c Mon Sep 17 00:00:00 2001 From: Alexander Burdeiny Date: Mon, 8 Aug 2016 12:06:20 +0300 Subject: [PATCH] =?UTF-8?q?1461:=20=D0=AD=D1=82=D0=B0=D0=BF=20=E2=84=965:?= =?UTF-8?q?=20=D0=A4=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=B0=D1=86=D0=B8=D1=8F?= =?UTF-8?q?=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9=20=D1=81=D0=B4?= =?UTF-8?q?=D0=B5=D0=BB=D0=B0=D0=BB=20=D0=BF=D0=BE=D0=B4=D1=81=D1=87=D0=B5?= =?UTF-8?q?=D1=82=20=D1=81=D0=BE=D0=B1=D1=8B=D1=82=D0=B8=D0=B9=20=D0=B2=20?= =?UTF-8?q?=D1=84=D0=B8=D0=BB=D1=8C=D1=82=D1=80=D0=B5=20=D0=BF=D0=BE=20?= =?UTF-8?q?=D1=82=D0=B8=D0=BF=D1=83;=20=D1=81=D0=B4=D0=B5=D0=BB=D0=B0?= =?UTF-8?q?=D0=BB=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA=D1=83?= =?UTF-8?q?=20=D0=B0=D1=8F=D0=BA=D1=81=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=D0=B0=20=D1=81=20=D0=B2=D0=BE=D0=B7=D0=B2=D1=80=D0=B0?= =?UTF-8?q?=D1=82=D0=BE=D0=BC=20=D1=80=D0=B5=D0=B7=D1=83=D0=BB=D1=8C=D1=82?= =?UTF-8?q?=D0=B0=D1=82=D0=BE=D0=B2=20=D0=B8=20=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D1=8B=20=D0=B2=20JSON=D0=B5=20(HTML)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- conference/views.py | 8 ++++---- events/common.py | 4 ++++ events/forms.py | 34 ++++++++++++++++++------------ events/mixin.py | 17 +++++++++++++++ events/views.py | 41 +++++++++++++++++++++++++++++-------- exposition/views.py | 9 ++++---- templates/client/blank.html | 1 + 7 files changed, 84 insertions(+), 30 deletions(-) create mode 100644 events/mixin.py diff --git a/conference/views.py b/conference/views.py index 8e9ef448..888d3f66 100644 --- a/conference/views.py +++ b/conference/views.py @@ -35,11 +35,11 @@ from stats_collector.mixin import ( ObjectStatMixin ) from theme.models import Tag, Theme +from events.mixin import ConfFilterMixin MONTHES = settings.MONTHES - -class ConferenceBy(ConfSectionMixin, JitterCacheMixin, MetadataMixin, ListView): +class ConferenceBy(ConfFilterMixin, ConfSectionMixin, JitterCacheMixin, MetadataMixin, ListView): cache_range = settings.CACHE_RANGE template_name = 'client/conference/conference_by.html' title1 = '' @@ -111,7 +111,7 @@ class ConferenceByCity(ConferenceBy): # .order_by('translations__name').distinct() -class ConferenceCatalog(ConfSectionKindMixin, JitterCacheMixin, MetadataMixin, ListView): +class ConferenceCatalog(ConfFilterMixin, ConfSectionKindMixin, JitterCacheMixin, MetadataMixin, ListView): cache_range = settings.CACHE_RANGE model = Conference paginate_by = settings.CLIENT_PAGINATION @@ -429,7 +429,7 @@ class ConferenceDetail(ObjectStatMixin, JitterCacheMixin, MetadataMixin, DetailV return context -class ConferenceList(ConfSectionMixin, MetadataMixin, JitterCacheMixin, ListView): +class ConferenceList(ConfFilterMixin, ConfSectionMixin, MetadataMixin, JitterCacheMixin, ListView): cache_range = settings.CACHE_RANGE model = Conference paginate_by = settings.CLIENT_PAGINATION diff --git a/events/common.py b/events/common.py index eb4600a2..00cc1057 100644 --- a/events/common.py +++ b/events/common.py @@ -40,6 +40,10 @@ def get_choices_kwargs(mapping): MEMBERS = EnumChoices(**get_choices_kwargs(members_mapping)) VISITORS = EnumChoices(**get_choices_kwargs(visitors_mapping)) PRICE = EnumChoices(**get_choices_kwargs(price_mapping)) +TYPES = EnumChoices( + EXPO=(1, _(u'Выставки')), + CONF=(2, _(_(u'Конференции'))), +) class ExtraWhere(object): diff --git a/events/forms.py b/events/forms.py index 095a385d..52c78e87 100644 --- a/events/forms.py +++ b/events/forms.py @@ -25,7 +25,7 @@ from conference.models import Conference from theme.models import Theme, Tag from country.models import Country from city.models import City -from events.common import MEMBERS, VISITORS, PRICE +from events.common import MEMBERS, VISITORS, PRICE, TYPES from events.common import members_mapping, visitors_mapping, price_mapping from events.common import ExtraWhere, OR, AND @@ -120,14 +120,11 @@ values_mapping = { class FilterForm(forms.Form): - TYPES = EnumChoices( - EXPO=(1, _(u'Выставки')), - CONF=(2, _(_(u'Конференции'))), - ) + # TYPES = TYPES # MEMBERS = MEMBERS # VISITORS = VISITORS # PRICE = PRICE - model = FilterTypedMultipleChoiceField( + event_type = FilterTypedMultipleChoiceField( label=_(u'Тип события'), coerce=int, choices=TYPES, required=False, widget=FilterCheckboxSelectMultiple()) theme = CountModelMultipleChoiceField( @@ -183,11 +180,11 @@ class FilterForm(forms.Form): @property def models(self): if self._models is None and self._is_valid: - val = self.cleaned_data.get('model') + val = self.cleaned_data.get('event_type') self._models = [] - if self.TYPES.EXPO in val: + if TYPES.EXPO in val: self._models.append(Exposition) - if self.TYPES.CONF in val: + if TYPES.CONF in val: self._models.append(Conference) return self._models or [Exposition, Conference] @@ -223,13 +220,14 @@ class FilterForm(forms.Form): def filter(self, qs=None): qs = qs or self.default_filter() # lookup_kwargs = dict(ChainMap({}, *(lookup_kwargs or self.lookup_kwargs).values())) - return qs.filter(**self.lookup_kwargs) + return qs.filter(**self.lookup_kwargs).order_by('data_begin') - def default_filter(self, load_all=True): - qs = RelatedSearchQuerySet().models(*self.models) + def default_filter(self, load_all=True, _models=None): + models = _models or self.models + qs = RelatedSearchQuerySet().models(*models) if load_all: qs = qs.load_all() - for model in self.models: + for model in models: qs = qs.load_all_queryset(model, model.enable.all()) qs = qs.filter(data_end__gte=datetime.now()) return qs @@ -270,11 +268,21 @@ class FilterForm(forms.Form): for field in ['members', 'visitors', 'price']: self.fields[field].choices = self.make_local_field_count(field) or self.fields[field].choices + self.make_event_type_choices_count() # for field in self.fields: # field = self.fields[field] # if hasattr(field, 'queryset'): # field.queryset = field.queryset[:15] + def make_event_type_choices_count(self): + types = {1: Exposition, 2: Conference} + choices = [] + for _type, label in TYPES: + qs = self.default_filter(load_all=False, _models=[types.get(_type)]) + count = qs.filter(**self.lookup_kwargs).count() + choices.append((_type, label + ' ({count})'.format(count=count))) + self.fields['event_type'].choices = choices + def make_ids_in_sql_format(self, values): return tuple(values) if len(values) > 1 else '({})'.format(*values) diff --git a/events/mixin.py b/events/mixin.py new file mode 100644 index 00000000..95500ba3 --- /dev/null +++ b/events/mixin.py @@ -0,0 +1,17 @@ +# -*- coding: utf-8 -*- +from .common import TYPES + + +class BaseFilterMixin(object): + def get_context_data(self, **kwargs): + context = super(BaseFilterMixin, self).get_context_data(**kwargs) + context['event_type'] = self.event_type + return context + + +class ConfFilterMixin(BaseFilterMixin): + event_type = TYPES.CONF + + +class ExpoFilterMixin(BaseFilterMixin): + event_type = TYPES.EXPO diff --git a/events/views.py b/events/views.py index 29ba469c..6da56b07 100644 --- a/events/views.py +++ b/events/views.py @@ -1,11 +1,14 @@ # -*- coding: utf-8 -*- from django.views.generic.edit import FormMixin from django.conf import settings +from django.template.loader import render_to_string from haystack.query import SearchQuerySet from functions.custom_views import ContextMixin from functions.custom_views import ListView +from functions.http import JsonResponse + from exposition.models import Exposition from conference.models import Conference @@ -17,7 +20,8 @@ class FilterListView(ContextMixin, FormMixin, ListView): form_class = FilterForm paginate_by = settings.CLIENT_PAGINATION _template_name = 'events/filter_listview.html' - _template_name_ajax = 'events/filter_listview_ajax.html' + _ajax_results_template_name = 'events/filter_listview_ajax.html' + _ajax_form_template_name = 'includes/events/filter_form.html' def get_form_kwargs(self): kwargs = super(FilterListView, self).get_form_kwargs() @@ -30,21 +34,40 @@ class FilterListView(ContextMixin, FormMixin, ListView): else: qs = self.form.default_filter() self.form.recalculate_choices() + # import pdb; pdb.set_trace() return qs + def handle_ajax(request, *args, **kwargs): + self.template_name = + handle_ajax + def get(self, request, *args, **kwargs): self.form = self.get_form(self.get_form_class()) self.extra_ctx['form'] = self.form + self.template_name = self._template_name - # get params for paginator - get = request.GET.copy() - if 'page' in get: - del get['page'] - self.extra_ctx['GETparams'] = get.urlencode() - - # ajax or get - self.template_name = self._template_name_ajax if request.is_ajax() else self._template_name + # ajax + if request.is_ajax(): + self.template_name = self._ajax_results_template_name + data = { + 'success': True, + 'results': super(FilterListView, self).get(request, *args, **kwargs), + 'form': render_to_string(self._ajax_form_template_name, {'form': self.form}), + } + return JsonResponse(data) + # usual get return super(FilterListView, self).get(request, *args, **kwargs) def post(self, request, *args, **kwargs): return self.get(request, *args, **kwargs) + + def get_context_data(self, **kwargs): + context = super(FilterListView, self).get_context_data(**kwargs) + + # get params for paginator + get = self.request.GET.copy() + if 'page' in get: + del get['page'] + self.context['GETparams'] = get.urlencode() + + return context diff --git a/exposition/views.py b/exposition/views.py index 4d664a6f..c7252e3d 100644 --- a/exposition/views.py +++ b/exposition/views.py @@ -36,9 +36,10 @@ from stats_collector.mixin import ( ObjectStatMixin ) from theme.models import Tag, Theme +from events.mixin import ExpoFilterMixin -class ExpositionBy(ExpoSectionMixin, JitterCacheMixin, MetadataMixin, ListView): +class ExpositionBy(ExpoFilterMixin, ExpoSectionMixin, JitterCacheMixin, MetadataMixin, ListView): template_name = 'exposition/exposition_by.html' title1 = '' title2 = '' @@ -113,7 +114,7 @@ class ExpositionByCity(ExpositionBy): # .order_by('translations__name').distinct() -class ExpositionSearchView(ExpoSearchView): +class ExpositionSearchView(ExpoFilterMixin, ExpoSearchView): #paginate_by = 10 template_name = 'client/exposition/search.html' search_form = ExpositionSearchForm @@ -324,7 +325,7 @@ class ExpositionServiceView(JitterCacheMixin, MetadataMixin, FormMixin, DetailVi return self.initial.copy() -class ExpoList(ExpoSectionMixin, MetadataMixin, JitterCacheMixin, ListView): +class ExpoList(ExpoFilterMixin, ExpoSectionMixin, MetadataMixin, JitterCacheMixin, ListView): cache_range = [60*30, 60*60] model = Exposition paginate_by = settings.CLIENT_PAGINATION @@ -360,7 +361,7 @@ class ExpoList(ExpoSectionMixin, MetadataMixin, JitterCacheMixin, ListView): return context -class ExpoCatalog(ExpoSectionKindMixin, JitterCacheMixin, MetadataMixin, ListView): +class ExpoCatalog(ExpoFilterMixin, ExpoSectionKindMixin, JitterCacheMixin, MetadataMixin, ListView): model = Exposition paginate_by = settings.CLIENT_PAGINATION template_name = 'client/exposition/catalog.html' diff --git a/templates/client/blank.html b/templates/client/blank.html index 68be1c4f..9cfddc7f 100644 --- a/templates/client/blank.html +++ b/templates/client/blank.html @@ -61,6 +61,7 @@ This template include basic anf main styles and js files, "tag": "{{ tag }}", "month": "{{ month.slug }}", "year": "{{ year.text }}", + "event_type": "{{ event_type }}", }; {% if not NO_BANNERS %}