From 15fba796096c5fcb1923ec3d5d295a5be395fa16 Mon Sep 17 00:00:00 2001 From: Slava Date: Tue, 8 Aug 2017 12:22:25 +0300 Subject: [PATCH] date + recommend expositions fix --- apps/exposition/models.py | 6 ++++ apps/exposition/views.py | 20 ----------- apps/functions/model_mixin.py | 33 +++++++++++++++++++ .../client/exposition/exposition_detail.html | 14 ++++++-- 4 files changed, 51 insertions(+), 22 deletions(-) diff --git a/apps/exposition/models.py b/apps/exposition/models.py index 06c718f6..c1588526 100644 --- a/apps/exposition/models.py +++ b/apps/exposition/models.py @@ -241,6 +241,12 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin): def get_objectstat_views(self): return sum(self.objectstats_set.all().values_list('value', flat=True)) + def get_data_begin_month(self): + return self.data_begin.month + + def get_data_end_month(self): + return self.data_end.month + class Statistic(TranslatableModel): exposition = models.ForeignKey(Exposition, related_name='statistic') diff --git a/apps/exposition/views.py b/apps/exposition/views.py index 4b99980d..b0be5043 100644 --- a/apps/exposition/views.py +++ b/apps/exposition/views.py @@ -211,28 +211,8 @@ class ExpoDetail(ObjectStatMixin, JitterCacheMixin, MetadataMixin, DetailView): context['themes'] = [str(item.id) for item in obj.theme.all()] context['news'] = Article.objects.news()\ .filter(publish_date__isnull=False, exposition=obj).order_by('-publish_date')[:3] - context['recommend_expos'] = self.get_recommend_expos() return context - def get_recommend_expos(self): - """ - Блок Также рекомендуем - Здесь выводятся: - выставки из топ-размещения в этой тематике; - платные выставки из этой тематики; - если первых двух нет, то выставки, - наиболее похожие по фильтрам - в том же городе, - в той же теме и похожими тегами. - """ - themes = [item.id for item in self.object.theme.all()] - return Exposition.objects.language().filter( - is_published=True - ).filter( - Q(top__isnull=False, theme__in=themes) | - Q(paid_new__isnull=False, theme__in=themes) | - Q(theme__in=themes) - ).order_by('-data_begin')[:2] - class ExpositionProgramme(JitterCacheMixin, MetadataMixin, DetailView): cache_range = [60*30, 60*60] diff --git a/apps/functions/model_mixin.py b/apps/functions/model_mixin.py index 9610dd78..55a354fc 100644 --- a/apps/functions/model_mixin.py +++ b/apps/functions/model_mixin.py @@ -153,6 +153,39 @@ class EventMixin(object): self._nearest_events = result[:3] return self._nearest_events + def get_recommend_expos_incl(self, _qs, tags, themes, exclude=None): + now = datetime.datetime.now() + month = now + relativedelta(months=1) + month2 = now + relativedelta(months=2) + exclude_pks = exclude or set([self.pk]) + events_m2 = [] + events_m = [] + events = [] + for params in [{'tag__in': tags}, {'theme__in': themes}]: + qs = _qs.filter(**params).order_by('data_begin').distinct() + events_m2.extend(list(qs.filter(data_begin__gte=month2).exclude(pk__in=exclude_pks)[3:5])) + exclude_pks.update([x.pk for x in events_m2]) + events_m.extend(list(qs.filter(data_begin__gte=month).exclude(pk__in=exclude_pks)[3:5])) + exclude_pks.update([x.pk for x in events_m]) + events.extend(list(qs.filter(data_begin__gte=now).exclude(pk__in=exclude_pks)[3:5])) + exclude_pks.update([x.pk for x in events]) + return (list(sorted(list(chain(*zip(*[x for x in [events_m2, events_m, events] if x])))[3:5], key=lambda x: x.data_begin)), exclude_pks) + + def get_recommend_expos(self): + if getattr(self, '_nearest_events', None) is None: + model = self.__class__ + result = [] + tags = list(self.tag.all().values_list('pk', flat=True)) + themes = list(self.theme.all().values_list('pk', flat=True)) + qs = model.objects.language().filter(country_id=self.country_id) + result, exclude = self.get_nearest_events_incl(qs, tags, themes) + if len(result) > 5: + qs = model.objects.language() + r, e = self.get_nearest_events_incl(qs, tags, themes, exclude) + result += r + self._nearest_events = result[3:5] + return self._nearest_events + def get_nearest_events_url(self): url_params = QueryDict('', mutable=True) url_params.update({ diff --git a/templates/client/exposition/exposition_detail.html b/templates/client/exposition/exposition_detail.html index 2fdbee7a..961d87b3 100644 --- a/templates/client/exposition/exposition_detail.html +++ b/templates/client/exposition/exposition_detail.html @@ -204,10 +204,20 @@