diff --git a/conference/models.py b/conference/models.py index c5d60f22..6e238b59 100644 --- a/conference/models.py +++ b/conference/models.py @@ -157,15 +157,15 @@ class Conference(TranslatableModel, EventMixin, ExpoMixin): # excluded = ['tickets'] return super(Conference, self).get_services_detail(None, Service.type.conference) - def get_nearest_events(self): - if self.theme.all(): - theme = self.theme.all()[0] - now = datetime.datetime.now() - now = now - datetime.timedelta(days=1) - conferences = Conference.objects.filter(theme__in=[theme], data_begin__gt=now).exclude(id=self.id).order_by('data_begin') - return conferences[:3] - else: - return [] + # def get_nearest_events(self): + # if self.theme.all(): + # theme = self.theme.all()[0] + # now = datetime.datetime.now() + # now = now - datetime.timedelta(days=1) + # conferences = Conference.objects.filter(theme__in=[theme], data_begin__gt=now).exclude(id=self.id).order_by('data_begin') + # return conferences[:3] + # else: + # return [] def get_news_url(self): return reverse_lazy('news_conference', kwargs={'slug': self.url}) diff --git a/exposition/models.py b/exposition/models.py index cb5aa4a8..be8f09fc 100644 --- a/exposition/models.py +++ b/exposition/models.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- import copy import datetime +from dateutil.relativedelta import relativedelta from bitfield import BitField from django.conf import settings @@ -255,16 +256,6 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin): 0.33: _(u'Раз в 3 года'), 0.25: _(u'Раз в 4 года'), 0.2: _(u'Раз в 5 лет')} return periodic.get(self.periodic) - def get_nearest_events(self): - if self.theme.all(): - theme = self.theme.all()[0] - now = datetime.datetime.now() - now = now - datetime.timedelta(days=1) - expositions = Exposition.objects.filter(theme__in=[theme], data_begin__gt=now).exclude(id=self.id).order_by('data_begin') - return expositions[:3] - else: - return [] - def get_catalog_url(self): return self.catalog diff --git a/functions/model_mixin.py b/functions/model_mixin.py index 112132af..616a2d8f 100644 --- a/functions/model_mixin.py +++ b/functions/model_mixin.py @@ -2,11 +2,15 @@ import copy import calendar as python_calendar from pytils.dt import ru_strftime +import datetime +from dateutil.relativedelta import relativedelta from django.conf import settings from django.db.models import Q from django.utils.translation import ugettext as _ from django.utils.translation import get_language +from django.utils.safestring import mark_safe +from django.core.urlresolvers import reverse from django.http import QueryDict from hvad.utils import get_translation, set_cached_translation, get_cached_translation @@ -101,6 +105,50 @@ class EventMixin(object): } return ctx + def get_nearest_events(self): + if getattr(self, '_nearest_events', None) is None: + model = self.__class__ + result = [] + tags = self.tag.all().values_list('pk', flat=True) + themes = self.theme.all().values_list('pk', flat=True) + now = datetime.datetime.now() + month = now + relativedelta(months=1) + month2 = now + relativedelta(months=2) + exclude_pks = set([self.pk]) + m0 = m1 = m2 = False + for params in [{'tag__in': tags}, {'theme__in': themes}]: + qs = model.objects.language().filter(**params).order_by('data_begin') + events_m2 = qs.filter(data_begin__gte=month2).exclude(pk__in=exclude_pks) + if not m2 and events_m2.exists(): + result.extend(events_m2[:1]) + exclude_pks.update([x.pk for x in result]) + m2 = True + events_m = qs.filter(data_begin__gte=month).exclude(pk__in=exclude_pks) + if not m1 and events_m.exists(): + offset = 2 - len(result) + result.extend(events_m[:offset]) + exclude_pks.update([x.pk for x in result]) + m1 = True + events = qs.filter(data_begin__gte=now).exclude(pk__in=exclude_pks) + if not m0 and events.exists(): + offset = 3 - len(result) + result.extend(events[:offset]) + exclude_pks.update([x.pk for x in result]) + m0 = True + result.sort(key=lambda x: x.data_begin) + self._nearest_events = result + return self._nearest_events + + def get_nearest_events_url(self): + url_params = QueryDict('', mutable=True) + url_params.update({ + 'date_from': datetime.datetime.now().strftime('%d.%m.%Y'), + 'event_type': 1 if self.event_type == 'expo' else 2, + }) + url_params.setlist('tag', self.tag.all().values_list('pk', flat=True)) + url_params.setlist('theme', self.theme.all().values_list('pk', flat=True)) + return mark_safe(reverse('events:main') + '?' + url_params.urlencode()) + @property def get_dates(self): return get_dates(self.data_begin, self.data_end) diff --git a/templates/client/includes/conference/conference_object.html b/templates/client/includes/conference/conference_object.html index 972bbef1..6476a7ce 100644 --- a/templates/client/includes/conference/conference_object.html +++ b/templates/client/includes/conference/conference_object.html @@ -297,9 +297,9 @@ {% include 'client/includes/booking_block.html' with city=event.city place=event.place event=event %}
+