date + recommend expositions fix

stage8
Slava 9 years ago
parent ac43147966
commit 15fba79609
  1. 6
      apps/exposition/models.py
  2. 20
      apps/exposition/views.py
  3. 33
      apps/functions/model_mixin.py
  4. 14
      templates/client/exposition/exposition_detail.html

@ -241,6 +241,12 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
def get_objectstat_views(self): def get_objectstat_views(self):
return sum(self.objectstats_set.all().values_list('value', flat=True)) 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): class Statistic(TranslatableModel):
exposition = models.ForeignKey(Exposition, related_name='statistic') exposition = models.ForeignKey(Exposition, related_name='statistic')

@ -211,28 +211,8 @@ class ExpoDetail(ObjectStatMixin, JitterCacheMixin, MetadataMixin, DetailView):
context['themes'] = [str(item.id) for item in obj.theme.all()] context['themes'] = [str(item.id) for item in obj.theme.all()]
context['news'] = Article.objects.news()\ context['news'] = Article.objects.news()\
.filter(publish_date__isnull=False, exposition=obj).order_by('-publish_date')[:3] .filter(publish_date__isnull=False, exposition=obj).order_by('-publish_date')[:3]
context['recommend_expos'] = self.get_recommend_expos()
return context 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): class ExpositionProgramme(JitterCacheMixin, MetadataMixin, DetailView):
cache_range = [60*30, 60*60] cache_range = [60*30, 60*60]

@ -153,6 +153,39 @@ class EventMixin(object):
self._nearest_events = result[:3] self._nearest_events = result[:3]
return self._nearest_events 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): def get_nearest_events_url(self):
url_params = QueryDict('', mutable=True) url_params = QueryDict('', mutable=True)
url_params.update({ url_params.update({

@ -204,10 +204,20 @@
<aside class="right_grey_block" id="recommended_expositions"> <aside class="right_grey_block" id="recommended_expositions">
<h4>{% trans 'Также рекомендуем:' %}</h4> <h4>{% trans 'Также рекомендуем:' %}</h4>
<div class="recommended_expositions"> <div class="recommended_expositions">
{% for item in recommend_expos %} {% for item in exposition.get_recommend_expos %}
<div class="recommended"> <div class="recommended">
<a href="{{ item.get_absolute_url }}" target="_blank">{{ item.name }}</a> <a href="{{ item.get_absolute_url }}" target="_blank">{{ item.name }}</a>
<p>{{ item.city }}, {{ item.data_begin|date:'d' }}{% if item.data_end %}-{{ item.data_end|date:'d' }}{% endif %} сентября {{ item.data_begin|date:'Y' }}</p> <p>
{{ item.city }},
{{ item.data_begin|date:'d' }}
{% if item.get_data_begin_month != item.get_data_end_month %}{{ item.data_begin|date:'m' }}{% endif %}
{% if item.data_end %}
-{{ item.data_end|date:'d' }} {{ item.data_end|date:'m' }}
{% else %}
{{ item.data_begin|date:'m' }}
{% endif %}
{{ item.data_begin|date:'Y' }}
</p>
</div> </div>
{% endfor %} {% endfor %}
</div> </div>

Loading…
Cancel
Save