Correct catalog filtering. Caching some pages. Calendar bug

remotes/origin/1203
Назар Котюк 11 years ago
parent 09e78a6d38
commit a5c19b3549
  1. 10
      accounts/forms.py
  2. 7
      accounts/views.py
  3. 4
      article/models.py
  4. 79
      conference/views.py
  5. 105
      country/manager.py
  6. 63
      country/models.py
  7. 5
      exposition/manager.py
  8. 2
      exposition/models.py
  9. 89
      exposition/views.py
  10. 100
      functions/models_methods.py
  11. 31
      functions/search_forms.py
  12. 2
      meta/views.py
  13. 29
      proj/settings.py
  14. 12
      proj/views.py
  15. 12
      settings/management/commands/update_views_cache.py
  16. 2
      templates/client/conference/conference_by.html
  17. 2
      templates/client/exposition/exposition_by.html
  18. 13
      templates/client/exposition/search.html
  19. 72
      templates/client/includes/news.html
  20. 106
      theme/manager.py
  21. 37
      theme/models.py

@ -311,18 +311,14 @@ class FeedFilterForm(forms.Form):
th = forms.MultipleChoiceField(label=_(u'Тематика'), choices=[(item.id, item.name) for item in Theme.active.all()], th = forms.MultipleChoiceField(label=_(u'Тематика'), choices=[(item.id, item.name) for item in Theme.active.all()],
required=False, widget=forms.CheckboxSelectMultiple()) required=False, widget=forms.CheckboxSelectMultiple())
tg = forms.CharField(label=_(u'Теги'), required=False, widget=forms.CheckboxSelectMultiple()) tg = forms.CharField(label=_(u'Теги'), required=False, widget=forms.CheckboxSelectMultiple())
area = forms.MultipleChoiceField(label=_(u'Регион'), choices=[(item.id, item.name) for item in Area.objects.all_sorted()], area = forms.MultipleChoiceField(label=_(u'Регион'), choices=[(item.id, item.name) for item in Area.objects.language().all()],
required=False, widget=forms.CheckboxSelectMultiple()) required=False, widget=forms.CheckboxSelectMultiple())
co = forms.MultipleChoiceField(label=_(u'Страна'), required=False, widget=forms.CheckboxSelectMultiple(), co = forms.MultipleChoiceField(label=_(u'Страна'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in Country.objects.select_related('exposition_country')\ choices=[(item.id, item.name) for item in Country.objects.expo_countries()]
.filter(exposition_country__country__isnull=False, translations__language_code=translation.get_language())\
.order_by('translations__name').distinct()]
) )
ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(), ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in City.objects.select_related('exposition_city')\ choices=[(item.id, item.name) for item in City.used.expo_cities()]
.filter(exposition_city__city__isnull=False, translations__language_code=translation.get_language())\
.order_by('translations__name').distinct()]
) )
fr = forms.DateField(required=False, fr = forms.DateField(required=False,

@ -56,7 +56,7 @@ class CalendarView(TemplateView):
""" """
context = super(CalendarView, self).get_context_data(**kwargs) context = super(CalendarView, self).get_context_data(**kwargs)
now = timezone.now().replace(microsecond=0, second=0, minute=0, hour=0) now = datetime.datetime.now().replace(microsecond=0, second=0, minute=0, hour=0)
context['current_day'] = now context['current_day'] = now
year = self.request.GET.get('year') year = self.request.GET.get('year')
@ -70,7 +70,7 @@ class CalendarView(TemplateView):
# events in current months # events in current months
number_of_days = python_calendar.monthrange(now.year, now.month)[1] number_of_days = python_calendar.monthrange(now.year, now.month)[1]
# number of days in current month # number of days in current month
days = [timezone.make_aware(datetime.datetime(now.year, now.month, i+1), timezone.get_default_timezone()) for i in range(number_of_days)] days = [datetime.datetime(now.year, now.month, i+1) for i in range(number_of_days)]
#context['days'] = days #context['days'] = days
calendar = self.request.user.calendar calendar = self.request.user.calendar
@ -79,7 +79,7 @@ class CalendarView(TemplateView):
else: else:
number_of_days = python_calendar.monthrange(year, month)[1] number_of_days = python_calendar.monthrange(year, month)[1]
days = [timezone.make_aware(datetime.datetime(year, month, i+1), timezone.get_default_timezone()) for i in range(number_of_days)] days = [datetime.datetime(year, month, i+1) for i in range(number_of_days)]
# number of days in current month # number of days in current month
#context['days'] = days #context['days'] = days
calendar = self.request.user.calendar calendar = self.request.user.calendar
@ -103,7 +103,6 @@ class CalendarView(TemplateView):
next_sunday = last_day + rdelta.relativedelta(days=1, weekday=rdelta.SU(+1)) next_sunday = last_day + rdelta.relativedelta(days=1, weekday=rdelta.SU(+1))
b = [last_day + datetime.timedelta(days=x+1) for x in range((next_sunday - last_day).days)] b = [last_day + datetime.timedelta(days=x+1) for x in range((next_sunday - last_day).days)]
days += b days += b
events = context['events'] events = context['events']
context['days'] = days context['days'] = days
#days = context['days'] #days = context['days']

@ -26,14 +26,14 @@ class ArticleManager(TranslationManager):
return queryset of news return queryset of news
""" """
model = self.model model = self.model
return model.objects.filter(type=model.news) return self.language().filter(type=model.news)
def blogs(self): def blogs(self):
""" """
return queryset of blogs return queryset of blogs
""" """
model = self.model model = self.model
return model.objects.filter(type=model.blog) return self.language().filter(type=model.blog)
class Article(TranslatableModel): class Article(TranslatableModel):
""" """

@ -19,9 +19,11 @@ from theme.models import Theme, Tag
from service.order_forms import AdvertiseForm from service.order_forms import AdvertiseForm
from functions.search_forms import ExpositionSearchForm from functions.search_forms import ExpositionSearchForm
from meta.views import MetadataMixin from meta.views import MetadataMixin
from functions.cache_mixin import JitterCacheMixin, CacheMixin
MONTHES = settings.MONTHES MONTHES = settings.MONTHES
class ConferenceBy(ListView): class ConferenceBy(ListView):
template_name = 'conference/conference_by.html' template_name = 'conference/conference_by.html'
title1 = '' title1 = ''
@ -38,42 +40,48 @@ class ConferenceBy(ListView):
class ConferenceByCountry(ConferenceBy): class ConferenceByCountry(ConferenceBy):
cache_range = [60, 120]
model = Country model = Country
title1 = _(u'По странам') title1 = _(u'По странам')
title2 = _(u'Коференции мира по странам') title2 = _(u'Коференции мира по странам')
catalog = 'country/' catalog = 'country/'
def get_queryset(self): def get_queryset(self):
lang = translation.get_language() return self.model.objects.conference_countries_with_count()
return self.model.objects.select_related('conference_country')\ #lang = translation.get_language()
.filter(conference_country__country__isnull=False, translations__language_code=lang)\ #return self.model.objects.select_related('conference_country')\
.order_by('translations__name').distinct() # .filter(conference_country__country__isnull=False, translations__language_code=lang)\
# .order_by('translations__name').distinct()
class ConferenceByTheme(ConferenceBy): class ConferenceByTheme(ConferenceBy):
cache_range = [60, 120]
model = Theme model = Theme
title1 = _(u'По тематикам') title1 = _(u'По тематикам')
title2 = _(u'Коференции мира по тематикам') title2 = _(u'Коференции мира по тематикам')
catalog = 'theme/' catalog = 'theme/'
def get_queryset(self): def get_queryset(self):
lang = translation.get_language() return self.model.active.conference_themes_with_count()
return self.model.objects.select_related('conference_themes')\ #lang = translation.get_language()
.filter(conference_themes__theme__isnull=False, translations__language_code=lang)\ #return self.model.objects.select_related('conference_themes')\
.order_by('translations__name').distinct() # .filter(conference_themes__theme__isnull=False, translations__language_code=lang)\
# .order_by('translations__name').distinct()
class ConferenceByCity(ConferenceBy): class ConferenceByCity(ConferenceBy):
cache_range = [60, 120]
model = City model = City
title1 = _(u'По городам') title1 = _(u'По городам')
title2 = _(u'Коференции мира по городам') title2 = _(u'Коференции мира по городам')
catalog = 'city/' catalog = 'city/'
def get_queryset(self): def get_queryset(self):
lang = translation.get_language() return self.model.used.conference_cities_with_count()
return self.model.objects.select_related('conference_city')\ #lang = translation.get_language()
.filter(conference_city__city__isnull=False, translations__language_code=lang)\ #return self.model.objects.select_related('conference_city')\
.order_by('translations__name').distinct() # .filter(conference_city__city__isnull=False, translations__language_code=lang)\
# .order_by('translations__name').distinct()
class ConferenceCatalog(MetadataMixin, ListView): class ConferenceCatalog(MetadataMixin, ListView):
@ -96,18 +104,23 @@ class ConferenceCatalog(MetadataMixin, ListView):
year = self.kwargs.get('year') year = self.kwargs.get('year')
if year: if year:
qs = qs.filter(data_begin__year=year) qs = self.model.enable.filter(data_end__year=year)
filter_object = self.filter_object
if isinstance(filter_object, Country):
qs = qs.filter(country=filter_object)
elif isinstance(filter_object, City):
qs = qs.filter(city=filter_object)
elif isinstance(filter_object, Theme):
qs = qs.filter(theme=filter_object)
if self.kwargs.get('country'):
qs = qs.filter(country=self.kwargs.get('country'))
if self.kwargs.get('city'):
qs = qs.filter(city=self.kwargs.get('city'))
elif isinstance(filter_object, Tag):
qs = qs.filter(tag=filter_object)
# info for breadscrumbs # info for breadscrumbs
if self.country: self.year = {'text': year, 'link': '%s%s/%s/'%(self.catalog_url, self.filter_object.url, year)}
self.year = {'text': year, 'link': '%s%s/country/%s/%s/'%
(self.catalog_url, self.filter_object.url, self.country.url, year)
}
elif self.city:
self.year = {'text': year, 'link': '%s%s/city/%s/%s/'%
(self.catalog_url, self.filter_object.url, self.city.url, year)
}
else:
self.year = {'text': year, 'link': '%s%s/%s/'%(self.catalog_url, self.filter_object.url, year)}
month = self.kwargs.get('month') month = self.kwargs.get('month')
@ -148,7 +161,7 @@ class ConferenceCountryCatalog(ConferenceCatalog):
country = get_object_or_404(Country, url=slug) country = get_object_or_404(Country, url=slug)
self.kwargs['country'] = country self.kwargs['country'] = country
self.filter_object = country self.filter_object = country
qs = self.model.enable.filter(country=country) qs = self.model.enable.upcoming().filter(country=country)
return qs return qs
class ConferenceCityCatalog(ConferenceCatalog): class ConferenceCityCatalog(ConferenceCatalog):
@ -158,7 +171,7 @@ class ConferenceCityCatalog(ConferenceCatalog):
slug = self.kwargs.get('slug') slug = self.kwargs.get('slug')
city = get_object_or_404(City, url=slug) city = get_object_or_404(City, url=slug)
self.kwargs['city'] = city self.kwargs['city'] = city
qs = self.model.enable.filter(city=city) qs = self.model.enable.upcoming().filter(city=city)
self.filter_object = city self.filter_object = city
return qs return qs
@ -177,7 +190,7 @@ class ConferenceThemeCatalog(ConferenceCatalog):
theme = get_object_or_404(Theme, url=slug) theme = get_object_or_404(Theme, url=slug)
self.kwargs['theme'] = theme self.kwargs['theme'] = theme
qs = self.model.enable.filter(theme=theme) qs = self.model.enable.upcoming().filter(theme=theme)
if country_slug: if country_slug:
country = get_object_or_404(Country, url=country_slug) country = get_object_or_404(Country, url=country_slug)
self.country = country self.country = country
@ -207,7 +220,7 @@ class ConferenceTagCatalog(ConferenceCatalog):
slug = self.kwargs.get('slug') slug = self.kwargs.get('slug')
tag = get_object_or_404(Tag, url=slug) tag = get_object_or_404(Tag, url=slug)
self.kwargs['tag'] = tag self.kwargs['tag'] = tag
qs = self.model.enable.filter(tag=tag) qs = self.model.enable.upcoming().filter(tag=tag)
self.filter_object = tag self.filter_object = tag
return qs return qs
@ -330,7 +343,8 @@ class ConferenceDetail(MetadataMixin, DetailView):
context['advertising_form'] = AdvertiseForm() context['advertising_form'] = AdvertiseForm()
return context return context
class ConferenceList(MetadataMixin, ListView): class ConferenceList(MetadataMixin, JitterCacheMixin, ListView):
cache_range = settings.CACHE_RANGE
model = Conference model = Conference
paginate_by = settings.CLIENT_PAGINATION paginate_by = settings.CLIENT_PAGINATION
template_name = 'client/conference/conference_list.html' template_name = 'client/conference/conference_list.html'
@ -341,15 +355,14 @@ class ConferenceList(MetadataMixin, ListView):
def get_queryset(self): def get_queryset(self):
if self.request.user.is_staff: if self.request.user.is_staff:
now = datetime.datetime.now().date()
qs = self.model.objects.filter(data_begin__gte=now).order_by('data_begin')
else:
qs = self.model.enable.all()
qs = self.model.objects.upcoming()
else:
qs = self.model.enable.upcoming()
year = self.kwargs.get('year') year = self.kwargs.get('year')
if year: if year:
qs = qs.filter(data_begin__year=year) qs = self.model.enable.filter(data_end__year=year)
# info for breadscrumbs # info for breadscrumbs
self.year = {'text': year, 'link': '%s%s/'%(self.catalog_url, year)} self.year = {'text': year, 'link': '%s%s/'%(self.catalog_url, year)}

@ -0,0 +1,105 @@
import datetime
from django.utils import translation
from django.core.cache import cache
from django.utils.translation import get_language as lang
from hvad.models import TranslationManager
class CountryManager(TranslationManager):
cache_time = 600
def all(self):
"""
hack
"""
return super(TranslationManager, self).all().filter(translations__language_code=lang()).order_by('translations__name')
def safe_get(self, **kwargs):
model = self.model
try:
return model.objects.get(**kwargs)
except:
return None
def expo_countries(self):
lang = translation.get_language()
key = 'used_expo_countries_%s'%lang
cached_countries = cache.get(key)
if cached_countries:
return cached_countries
else:
from exposition.models import Exposition
countries_id = [item['country_id'] for item in Exposition.objects.values('country_id').distinct()]
countries = list(self.language().filter(id__in=countries_id))
cache.set(key, countries, self.cache_time)
return countries
def expo_countries_with_count(self):
lang = translation.get_language()
key = 'used_expo_countries_count_%s'%lang
cached_countries = cache.get(key)
if cached_countries:
return cached_countries
else:
from exposition.models import Exposition
sql = {'expo_count':
"""SELECT COUNT(*)
FROM exposition_exposition
WHERE exposition_exposition.country_id = country_country.id
AND exposition_exposition.data_end >= CURDATE()
AND exposition_exposition.is_published = 1"""}
now = datetime.datetime.now().date()
# id of unique countries
countries_id = [item['country_id'] for item in Exposition.objects.filter(is_published=True, data_end__gte=now).values('country_id').distinct()]
countries = set(list(self.language().filter(id__in=countries_id).extra(select=sql)))
countries = sorted(countries, key=lambda x: x.name)
cache.set(key, countries, self.cache_time)
return countries
def conference_countries_with_count(self):
lang = translation.get_language()
key = 'used_conference_countries_count_%s'%lang
cached_countries = cache.get(key)
if cached_countries:
return cached_countries
else:
from conference.models import Conference
sql = {'conference_count':
"""SELECT COUNT(*)
FROM conference_conference
WHERE conference_conference.country_id = country_country.id
AND conference_conference.data_end >= CURDATE()
AND conference_conference.is_published = 1"""}
now = datetime.datetime.now().date()
# id of unique countries
countries_id = [item['country_id'] for item in Conference.objects.filter(is_published=True, data_end__gte=now).values('country_id').distinct()]
countries = set(list(self.language().filter(id__in=countries_id).extra(select=sql)))
countries = sorted(countries, key=lambda x: x.name)
cache.set(key, countries, self.cache_time)
return countries
def conference_countries(self):
lang = translation.get_language()
key = 'used_conference_countries_%s'%lang
cached_countries = cache.get(key)
if cached_countries:
return cached_countries
else:
from conference.models import Conference
countries_id = [item['country_id'] for item in Conference.objects.values('country_id').distinct()]
countries = list(self.language().filter(id__in=countries_id))
cache.set(key, countries, self.cache_time)
return countries
class AreaManager(TranslationManager):
def all_sorted(self):
"""
return list, not queryset
"""
model = self.model
result = list(model.objects.filter())
result.sort(key=lambda x: len(x.expos()), reverse=True)
return result

@ -1,11 +1,11 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from datetime import date from datetime import date
from django.db import models from django.db import models
from django.utils.translation import ugettext as _
from django.contrib.contenttypes import generic from django.contrib.contenttypes import generic
from django.db.models.signals import post_save, pre_save from django.db.models.signals import post_save
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from hvad.models import TranslatableModel, TranslatedFields
from bitfield import BitField from bitfield import BitField
from manager import CountryManager, AreaManager
# models # models
from directories.models import Language, Currency from directories.models import Language, Currency
from city.models import City from city.models import City
@ -17,46 +17,14 @@ from conference.models import Conference
from seminar.models import Seminar from seminar.models import Seminar
from webinar.models import Webinar from webinar.models import Webinar
# func # func
from functions.custom_fields import EnumField
from functions.db import db_table_exists from functions.db import db_table_exists
from functions.signal_handlers import post_save_handler, pre_save_handler from functions.signal_handlers import post_save_handler, pre_save_handler
from django.utils.translation import get_language as lang
from django.utils import translation from django.utils import translation
# check if table exist and create flags if true # check if table exist and create flags if true
flags = [str(item.url) for item in Service.objects.all()] if db_table_exists('service_service') else [] flags = [str(item.url) for item in Service.objects.all()] if db_table_exists('service_service') else []
class CountryManager(TranslationManager):
def all(self):
"""
hack
"""
return super(TranslationManager, self).all().filter(translations__language_code=lang()).order_by('translations__name')
def safe_get(self, **kwargs):
model = self.model
try:
return model.objects.get(**kwargs)
except:
return None
def expo_countries(self):
countries_id = [item['country_id'] for item in Exposition.objects.values('country_id').distinct()]
return self.language().filter(id__in=countries_id)
class AreaManager(TranslationManager):
def all_sorted(self):
"""
return list, not queryset
"""
model = self.model
result = list(model.objects.filter())
result.sort(key=lambda x: len(x.expos()), reverse=True)
return result
class Area(TranslatableModel): class Area(TranslatableModel):
translations = TranslatedFields( translations = TranslatedFields(
@ -64,6 +32,9 @@ class Area(TranslatableModel):
) )
objects = AreaManager() objects = AreaManager()
class Meta:
ordering = ['translations__name']
def __unicode__(self): def __unicode__(self):
return self.lazy_translation_getter('name', unicode(self.pk)) return self.lazy_translation_getter('name', unicode(self.pk))
@ -85,9 +56,6 @@ class Area(TranslatableModel):
return parent return parent
class Country(TranslatableModel): class Country(TranslatableModel):
""" """
Create Country model Create Country model
@ -95,17 +63,12 @@ class Country(TranslatableModel):
Uses hvad.TranslatableModel which is child of django.db.models class Uses hvad.TranslatableModel which is child of django.db.models class
""" """
objects = CountryManager() objects = CountryManager()
used = CountryManager()
catalog = '/country/' catalog = '/country/'
services = BitField(flags=flags) services = BitField(flags=flags)
url = models.SlugField(unique=True) url = models.SlugField(unique=True)
#
old_url = models.CharField(unique=True, max_length=55) old_url = models.CharField(unique=True, max_length=55)
inflect = models.CharField(max_length=255, blank=True) inflect = models.CharField(max_length=255, blank=True)
# relations # relations
area = models.ForeignKey(Area) area = models.ForeignKey(Area)
big_cities = models.ManyToManyField(City, blank=True, null=True, related_name='cities') big_cities = models.ManyToManyField(City, blank=True, null=True, related_name='cities')
@ -117,14 +80,12 @@ class Country(TranslatableModel):
teritory = models.PositiveIntegerField(blank=True, null=True) teritory = models.PositiveIntegerField(blank=True, null=True)
timezone = models.FloatField(blank=True, null=True) timezone = models.FloatField(blank=True, null=True)
phone_code = models.PositiveIntegerField(blank=True, null=True) phone_code = models.PositiveIntegerField(blank=True, null=True)
time_delivery = models.PositiveSmallIntegerField(blank=True, null=True) time_delivery = models.PositiveSmallIntegerField(blank=True, null=True)
latitude = models.FloatField(blank=True, null=True) latitude = models.FloatField(blank=True, null=True)
longitude = models.FloatField(blank=True, null=True) longitude = models.FloatField(blank=True, null=True)
# fields saves information about creating and changing model
created = models.DateTimeField(auto_now_add=True) created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True) modified = models.DateTimeField(auto_now=True)
country_code = models.CharField(max_length=2)
# connection with FileModel by ContentType # connection with FileModel by ContentType
files = generic.GenericRelation('file.FileModel',content_type_field='content_type', object_id_field='object_id') files = generic.GenericRelation('file.FileModel',content_type_field='content_type', object_id_field='object_id')
#translated fields #translated fields
@ -140,9 +101,7 @@ class Country(TranslatableModel):
title = models.CharField(max_length=255), title = models.CharField(max_length=255),
descriptions = models.CharField(max_length=255), descriptions = models.CharField(max_length=255),
keywords = models.CharField(max_length=255), keywords = models.CharField(max_length=255),
) )
country_code = models.CharField(max_length=2)
class Meta: class Meta:
ordering = ['translations__name'] ordering = ['translations__name']
@ -186,9 +145,11 @@ class Country(TranslatableModel):
return Webinar.objects.filter(country=self.id).count() return Webinar.objects.filter(country=self.id).count()
def active_cities(self): def active_cities(self):
return City.used.active_qs().filter(country=self)
lang = translation.get_language() lang = translation.get_language()
return City.objects.select_related('exposition_city')\ #return City.objects.select_related('exposition_city')\
.filter(exposition_city__city__isnull=False, translations__language_code=lang, country=self).distinct().order_by('translations__name') # .filter(exposition_city__city__isnull=False, translations__language_code=lang, country=self).distinct().order_by('translations__name')
def get_sub_categories(self): def get_sub_categories(self):
objects = [{'text':item.name, 'id':item.id, 'name':'ci', 'sub': False} for item in self.active_cities()] objects = [{'text':item.name, 'id':item.id, 'name':'ci', 'sub': False} for item in self.active_cities()]

@ -5,9 +5,10 @@ from hvad.models import TranslationManager
class ClientManager(TranslationManager): class ClientManager(TranslationManager):
def get_query_set(self): def get_query_set(self):
now = datetime.datetime.now().date() return self.language().select_related('country', 'city', 'place').filter(is_published=True).order_by('data_begin')
return super(ClientManager, self).get_query_set().filter(is_published=True, data_begin__gte=now).order_by('data_begin')
def upcoming(self):
return self.filter(data_begin__gte=datetime.datetime.now().date())
""" """

@ -169,7 +169,7 @@ class Exposition(TranslatableModel, EventMixin, ExpoMixin):
country_ids = [item for item, bool in self.country.services if bool==True] country_ids = [item for item, bool in self.country.services if bool==True]
ids = [item for item, bool in self.services if bool==True] ids = [item for item, bool in self.services if bool==True]
qs = Service.objects.filter(Q(Q(url__in=country_ids) & Q(type=Service.type.expo)) | Q(url__in=ids)) qs = Service.objects.language().filter(Q(Q(url__in=country_ids) & Q(type=Service.type.expo)) | Q(url__in=ids))
return list(qs) return list(qs)

@ -23,6 +23,7 @@ from service.order_forms import AdvertiseForm
from functions.search_forms import ExpositionSearchForm from functions.search_forms import ExpositionSearchForm
from functions.custom_views import ExpoSearchView from functions.custom_views import ExpoSearchView
from meta.views import MetadataMixin from meta.views import MetadataMixin
from functions.cache_mixin import JitterCacheMixin, CacheMixin
@ -31,7 +32,6 @@ class ExpositionBy(ListView):
template_name = 'exposition/exposition_by.html' template_name = 'exposition/exposition_by.html'
title1 = '' title1 = ''
title2 = '' title2 = ''
""" """
abstact class abstact class
""" """
@ -43,48 +43,49 @@ class ExpositionBy(ListView):
class ExpositionByCountry(ExpositionBy): class ExpositionByCountry(ExpositionBy):
cache_range = settings.CACHE_RANGE
model = Country model = Country
title1 = _(u'По странам') title1 = _(u'По странам')
title2 = _(u'Выставки мира по странам') title2 = _(u'Выставки мира по странам')
catalog = 'country/' catalog = 'country/'
def get_queryset(self): def get_queryset(self):
lang = translation.get_language() return self.model.objects.expo_countries_with_count()
return self.model.objects.select_related('exposition_country')\ #lang = translation.get_language()
.filter(exposition_country__country__isnull=False, translations__language_code=lang)\ #return self.model.objects.select_related('exposition_country')\
.order_by('translations__name').distinct() # .filter(exposition_country__country__isnull=False, translations__language_code=lang)\
# .order_by('translations__name').distinct()
class ExpositionByTheme(ExpositionBy): class ExpositionByTheme(ExpositionBy):
cache_range = settings.CACHE_RANGE
model = Theme model = Theme
title1 = _(u'По тематикам') title1 = _(u'По тематикам')
title2 = _(u'Выставки мира по тематикам') title2 = _(u'Выставки мира по тематикам')
catalog = 'theme/' catalog = 'theme/'
def get_queryset(self): def get_queryset(self):
lang = translation.get_language() return self.model.active.expo_themes_with_count()
return self.model.objects.select_related('exposition_themes')\ #lang = translation.get_language()
.filter(exposition_themes__theme__isnull=False, translations__language_code=lang)\ #return self.model.objects.select_related('exposition_themes')\
.order_by('translations__name').distinct() # .filter(exposition_themes__theme__isnull=False, translations__language_code=lang)\
# .order_by('translations__name').distinct()
from functions.cache_mixin import CacheMixin
class ExpositionByCity(CacheMixin, ExpositionBy): class ExpositionByCity(ExpositionBy):
cache_timeout = 60 cache_range = settings.CACHE_RANGE
model = City model = City
title1 = _(u'По городам') title1 = _(u'По городам')
title2 = _(u'Выставки мира по городам') title2 = _(u'Выставки мира по городам')
catalog = 'city/' catalog = 'city/'
def get_queryset(self): def get_queryset(self):
return self.model.used.expo_cities_with_count()
#cities_id = [item['city_id'] for item in Exposition.objects.values('city_id').distinct()] #return self.model.used.expo_cities()
#return self.model.objects.language().filter(id__in=cities_id).order_by('translations__name').distinct() #lang = translation.get_language()
lang = translation.get_language() #return self.model.objects.select_related('exposition_city')\
return self.model.objects.select_related('exposition_city')\ # .filter(exposition_city__city__isnull=False, translations__language_code=lang)\
.filter(exposition_city__city__isnull=False, translations__language_code=lang)\ # .order_by('translations__name').distinct()
.order_by('translations__name').distinct()
class ExpositionSearchView(ExpoSearchView): class ExpositionSearchView(ExpoSearchView):
@ -229,7 +230,8 @@ class ExpositionServiceView(MetadataMixin, FormMixin, DetailView):
return self.initial.copy() return self.initial.copy()
class ExpoList(MetadataMixin, ListView): class ExpoList(MetadataMixin, JitterCacheMixin, ListView):
cache_range = settings.CACHE_RANGE
model = Exposition model = Exposition
paginate_by = settings.CLIENT_PAGINATION paginate_by = settings.CLIENT_PAGINATION
template_name = 'client/exposition/exposition_list.html' template_name = 'client/exposition/exposition_list.html'
@ -240,15 +242,12 @@ class ExpoList(MetadataMixin, ListView):
def get_queryset(self): def get_queryset(self):
if self.request.user.is_staff: if self.request.user.is_staff:
now = datetime.datetime.now().date() qs = self.model.objects.upcoming()
qs = self.model.objects.filter(data_begin__gte=now).order_by('data_begin')
else: else:
qs = self.model.enable.all() qs = self.model.enable.upcoming()
year = self.kwargs.get('year') year = self.kwargs.get('year')
if year: if year:
qs = qs.filter(data_begin__year=year) qs = self.model.enable.filter(data_end__year=year)
# info for breadscrumbs # info for breadscrumbs
self.year = {'text': year, 'link': '%s%s/'%(self.catalog_url, year)} self.year = {'text': year, 'link': '%s%s/'%(self.catalog_url, year)}
@ -289,19 +288,23 @@ class ExpoCatalog(MetadataMixin, ListView):
year = self.kwargs.get('year') year = self.kwargs.get('year')
if year: if year:
qs = qs.filter(data_begin__year=year) qs = self.model.enable.filter(data_end__year=year)
# info for breadscrumbs filter_object = self.filter_object
if self.country: if isinstance(filter_object, Country):
self.year = {'text': year, 'link': '%s%s/country/%s/%s/'% qs = qs.filter(country=filter_object)
(self.catalog_url, self.filter_object.url, self.country.url, year) elif isinstance(filter_object, City):
} qs = qs.filter(city=filter_object)
elif self.city: elif isinstance(filter_object, Theme):
self.year = {'text': year, 'link': '%s%s/city/%s/%s/'% qs = qs.filter(theme=filter_object)
(self.catalog_url, self.filter_object.url, self.city.url, year) if self.kwargs.get('country'):
} qs = qs.filter(country=self.kwargs.get('country'))
else: if self.kwargs.get('city'):
self.year = {'text': year, 'link': '%s%s/%s/'%(self.catalog_url, self.filter_object.url, year)} qs = qs.filter(city=self.kwargs.get('city'))
elif isinstance(filter_object, Tag):
qs = qs.filter(tag=filter_object)
# info for breadscrumbs
self.year = {'text': year, 'link': '%s%s/%s/'%(self.catalog_url, self.filter_object.url, year)}
month = self.kwargs.get('month') month = self.kwargs.get('month')
monthes = {'jan': {'value': 1, 'name': _(u'Январь')}, 'feb': {'value': 2, 'name': _(u'Февраль')}, monthes = {'jan': {'value': 1, 'name': _(u'Январь')}, 'feb': {'value': 2, 'name': _(u'Февраль')},
@ -341,7 +344,7 @@ class ExpoCountryCatalog(ExpoCatalog):
country = get_object_or_404(Country, url=slug) country = get_object_or_404(Country, url=slug)
self.kwargs['country'] = country self.kwargs['country'] = country
self.filter_object = country self.filter_object = country
qs = self.model.enable.filter(country=country) qs = self.model.enable.upcoming().filter(country=country)
return qs return qs
class ExpoCityCatalog(ExpoCatalog): class ExpoCityCatalog(ExpoCatalog):
@ -351,7 +354,7 @@ class ExpoCityCatalog(ExpoCatalog):
slug = self.kwargs.get('slug') slug = self.kwargs.get('slug')
city = get_object_or_404(City, url=slug) city = get_object_or_404(City, url=slug)
self.kwargs['city'] = city self.kwargs['city'] = city
qs = self.model.enable.filter(city=city) qs = self.model.enable.upcoming().filter(city=city)
self.filter_object = city self.filter_object = city
return qs return qs
@ -370,7 +373,7 @@ class ExpoThemeCatalog(ExpoCatalog):
theme = get_object_or_404(Theme, url=slug) theme = get_object_or_404(Theme, url=slug)
self.kwargs['theme'] = theme self.kwargs['theme'] = theme
qs = self.model.enable.filter(theme=theme) qs = self.model.enable.upcoming().filter(theme=theme)
if country_slug: if country_slug:
country = get_object_or_404(Country, url=country_slug) country = get_object_or_404(Country, url=country_slug)
self.country = country self.country = country
@ -402,7 +405,7 @@ class ExpoTagCatalog(ExpoCatalog):
slug = self.kwargs.get('slug') slug = self.kwargs.get('slug')
tag = get_object_or_404(Tag, url=slug) tag = get_object_or_404(Tag, url=slug)
self.kwargs['tag'] = tag self.kwargs['tag'] = tag
qs = self.model.enable.filter(tag=tag) qs = self.model.enable.upcoming().filter(tag=tag)
self.filter_object = tag self.filter_object = tag
return qs return qs

@ -1,10 +1,17 @@
import datetime
from django.utils.translation import get_language from django.utils.translation import get_language
from django.db.models import Q from django.db.models import Q
from django.core.cache import cache
from django.utils import translation
from hvad.models import TranslationManager from hvad.models import TranslationManager
class ExpoManager(TranslationManager): class ExpoManager(TranslationManager):
def upcoming(self):
return self.language().select_related('country', 'city', 'place').filter(data_begin__gte=datetime.datetime.now().date()).order_by('data_begin')
def all(self, lang=None): def all(self, lang=None):
if lang: if lang:
return super(ExpoManager, self).language(lang).all().order_by('name') return super(ExpoManager, self).language(lang).all().order_by('name')
@ -18,7 +25,9 @@ class ExpoManager(TranslationManager):
except: except:
return None return None
class CityManager(TranslationManager): class CityManager(TranslationManager):
cache_time = 600
def all(self): def all(self):
lang = get_language() lang = get_language()
qs = super(CityManager, self).select_related('exposition_city', 'conference_city') qs = super(CityManager, self).select_related('exposition_city', 'conference_city')
@ -27,13 +36,100 @@ class CityManager(TranslationManager):
return qs return qs
def expo_cities(self): def active_qs(self):
from exposition.models import Exposition from exposition.models import Exposition
cities_id = [item['city_id'] for item in Exposition.objects.values('city_id').distinct()] cities_id = [item['city_id'] for item in Exposition.objects.values('city_id').distinct()]
return self.language().filter(id__in=cities_id) return self.language().filter(id__in=cities_id)
def expo_cities(self):
lang = translation.get_language()
key = 'used_expo_cities_%s'%lang
cached_cities = cache.get(key)
if cached_cities:
return cached_cities
else:
from exposition.models import Exposition
cities_id = [item['city_id'] for item in Exposition.objects.values('city_id').distinct()]
cities = list(self.language().filter(id__in=cities_id))
cache.set(key, cities, self.cache_time)
return cities
def expo_cities_with_count(self):
lang = translation.get_language()
key = 'used_expo_cities_count_%s'%lang
cached_cities = cache.get(key)
if cached_cities:
return cached_cities
else:
from exposition.models import Exposition
sql = {'expo_count':
"""SELECT COUNT(*)
FROM exposition_exposition
WHERE exposition_exposition.city_id = city_city.id
AND exposition_exposition.data_end >= CURDATE()
AND exposition_exposition.is_published = 1"""}
now = datetime.datetime.now().date()
# id of unique cities
cities_id = [item['city_id'] for item in Exposition.objects.filter(is_published=True, data_end__gte=now).values('city_id').distinct()]
cities = set(list(self.language().filter(id__in=cities_id).extra(select=sql)))
cities = sorted(cities, key=lambda x: x.name)
cache.set(key, cities, self.cache_time)
return cities
def conference_cities_with_count(self):
lang = translation.get_language()
key = 'used_conference_cities_count_%s'%lang
cached_cities = cache.get(key)
if cached_cities:
return cached_cities
else:
from conference.models import Conference
sql = {'conference_count':
"""SELECT COUNT(*)
FROM conference_conference
WHERE conference_conference.city_id = city_city.id
AND conference_conference.data_end >= CURDATE()
AND conference_conference.is_published = 1"""}
now = datetime.datetime.now().date()
# id of unique countries
cities_id = [item['city_id'] for item in Conference.objects.filter(is_published=True, data_end__gte=now).values('city_id').distinct()]
cities = set(list(self.language().filter(id__in=cities_id).extra(select=sql)))
cities = sorted(cities, key=lambda x: x.name)
cache.set(key, cities, self.cache_time)
return cities
def conference_cities(self):
lang = translation.get_language()
key = 'used_conference_cities_%s'%lang
cached_cities = cache.get(key)
if cached_cities:
return cached_cities
else:
from conference.models import Conference
cities_id = [item['city_id'] for item in Conference.objects.values('city_id').distinct()]
cities = list(self.language().filter(id__in=cities_id))
cache.set(key, cities, self.cache_time)
return cities
def cities(self):
"""
not finished
"""
lang = translation.get_language()
key = 'used_cities_%s'%lang
cached_cities = cache.get(key)
if cached_cities:
return cached_cities
else:
from exposition.models import Exposition
cities_id = [item['city_id'] for item in Exposition.objects.values('city_id').distinct()]
cities = list(self.language().filter(id__in=cities_id))
cache.set(key, cities, self.cache_time)
return cities
def hvad_to_dict(object): def hvad_to_dict(object):
""" """

@ -222,10 +222,6 @@ class AbstactSearchForm(forms.Form):
return sqs#.order_by('data_begin') return sqs#.order_by('data_begin')
class ExpositionSearchForm(AbstactSearchForm): class ExpositionSearchForm(AbstactSearchForm):
search_url = '/expo/search/' search_url = '/expo/search/'
autocomplete_url = '/search-form/autosearch/exposition/' autocomplete_url = '/search-form/autosearch/exposition/'
@ -246,9 +242,7 @@ class ExpositionSearchForm(AbstactSearchForm):
) )
ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(), ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in City.objects.select_related('exposition_city')\ choices=[(item.id, item.name) for item in City.used.expo_cities()]
.filter(exposition_city__city__isnull=False, translations__language_code=translation.get_language())\
.order_by('translations__name').distinct()]
) )
fr = forms.DateField(required=False, fr = forms.DateField(required=False,
@ -326,16 +320,14 @@ class PlaceSearchForm(AbstactSearchForm):
title = _(u'ПОИСК МЕСТ') title = _(u'ПОИСК МЕСТ')
models = [PlaceExposition, PlaceConference] models = [PlaceExposition, PlaceConference]
# place fields # place fields
area = forms.MultipleChoiceField(label=_(u'Регион'), choices=[(item.id, item.name) for item in Area.objects.all_sorted()], area = forms.MultipleChoiceField(label=_(u'Регион'), choices=[(item.id, item.name) for item in list(Area.objects.language().all())],
required=False, widget=forms.CheckboxSelectMultiple()) required=False, widget=forms.CheckboxSelectMultiple())
co = forms.MultipleChoiceField(label=_(u'Страна'), required=False, widget=forms.CheckboxSelectMultiple(), co = forms.MultipleChoiceField(label=_(u'Страна'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in Country.objects.expo_countries()] choices=[(item.id, item.name) for item in list(Country.objects.expo_countries())]
) )
ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(), ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in City.objects.select_related('exposition_city')\ choices=[(item.id, item.name) for item in list(City.used.expo_cities())]
.filter(exposition_city__city__isnull=False, translations__language_code=translation.get_language())\
.order_by('translations__name').distinct()]
) )
# #
place_type = forms.MultipleChoiceField(label=_(u'Тип'), required=False, choices=[]) place_type = forms.MultipleChoiceField(label=_(u'Тип'), required=False, choices=[])
@ -355,23 +347,19 @@ class CompanySearchForm(AbstactSearchForm):
required=False, widget=forms.CheckboxSelectMultiple()) required=False, widget=forms.CheckboxSelectMultiple())
tg = forms.CharField(label=_(u'Теги'), required=False, widget=forms.CheckboxSelectMultiple()) tg = forms.CharField(label=_(u'Теги'), required=False, widget=forms.CheckboxSelectMultiple())
area = forms.MultipleChoiceField(label=_(u'Регион'), choices=[(item.id, item.name) for item in Area.objects.all_sorted()], area = forms.MultipleChoiceField(label=_(u'Регион'), choices=[(item.id, item.name) for item in Area.objects.language().all()],
required=False, widget=forms.CheckboxSelectMultiple()) required=False, widget=forms.CheckboxSelectMultiple())
co = forms.MultipleChoiceField(label=_(u'Страна'), required=False, widget=forms.CheckboxSelectMultiple(), co = forms.MultipleChoiceField(label=_(u'Страна'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in Country.objects.select_related('exposition_country')\ choices=[(item.id, item.name) for item in Country.objects.expo_countries()]
.filter(exposition_country__country__isnull=False, translations__language_code=translation.get_language())\
.order_by('translations__name').distinct()]
) )
ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(), ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in City.objects.select_related('exposition_city')\ choices=[(item.id, item.name) for item in City.used.expo_cities()]
.filter(exposition_city__city__isnull=False, translations__language_code=translation.get_language())\
.order_by('translations__name').distinct()]
) )
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(CompanySearchForm, self).__init__(*args, **kwargs) super(CompanySearchForm, self).__init__(*args, **kwargs)
self.theme_classes = {item.id:item.generate_search_class() for item in Theme.objects.all()} self.theme_classes = {item.id:item.generate_search_class() for item in list(Theme.objects.language().all())}
def search(self): def search(self):
q = self.cleaned_data.get('q') q = self.cleaned_data.get('q')
@ -430,4 +418,5 @@ class EventSearchForm(forms.Form):
if w: if w:
sqs = sqs.filter(where__contains=w) sqs = sqs.filter(where__contains=w)
return sqs return sqs

@ -160,7 +160,7 @@ class MetadataMixin(object):
if meta_id: if meta_id:
try: try:
meta_set = MetaSetting.objects.get(id=meta_id) meta_set = MetaSetting.objects.language().get(id=meta_id)
except MetaSetting.DoesNotExist: except MetaSetting.DoesNotExist:
return context return context
params = dict(self.kwargs) params = dict(self.kwargs)

@ -305,20 +305,20 @@ INSTALLED_APPS = (
'webinar', 'webinar',
'meta', 'meta',
#django modules #django modules
'sorl.thumbnail', 'sorl.thumbnail', # for logos
'photologue', 'photologue', # photogallery
'sortedm2m', 'sortedm2m', # photologue dependence
'hvad', 'hvad', #
'tinymce', 'tinymce', # ???
'ckeditor', 'ckeditor', # wysiwig editor in admin
'django_messages', 'django_messages', # messages
'bitfield', 'bitfield',
'djutils', 'djutils', # ??
'pytils', 'pytils', # ??
'pymorphy', 'pymorphy', # ??
'password_reset', 'password_reset', # reset password
'django_crontab', 'django_crontab', # crons
'social.apps.django_app.default', 'social.apps.django_app.default', # social auth
) )
@ -400,6 +400,9 @@ MONTHES = {'jan': {'value': 1, 'name': _(u'Январь')}, 'feb': {'value': 2,
'sep': {'value': 9, 'name': _(u'Сентябрь')}, 'oct': {'value': 10, 'name': _(u'Октябрь')}, 'sep': {'value': 9, 'name': _(u'Сентябрь')}, 'oct': {'value': 10, 'name': _(u'Октябрь')},
'nov': {'value': 11, 'name': _(u'Ноябрь')}, 'dec': {'value': 12, 'name': _(u'Декабрь')}} 'nov': {'value': 11, 'name': _(u'Ноябрь')}, 'dec': {'value': 12, 'name': _(u'Декабрь')}}
# cache pages in random seconds. random in this range
CACHE_RANGE = [60, 120]
try: try:
from local import * from local import *
except ImportError, e: except ImportError, e:

@ -34,17 +34,15 @@ class MainPageView(TemplateView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super(MainPageView, self).get_context_data(**kwargs) context = super(MainPageView, self).get_context_data(**kwargs)
events = Exposition.objects.filter(main_page__gt=0) events = Exposition.objects.language().filter(main_page=1)
exposition_themes = Theme.objects.order_by('-main_page').filter(types=Theme.types.exposition)[:6] exposition_themes = Theme.objects.language().order_by('-main_page').filter(types=Theme.types.exposition)[:6]
conference_themes = Theme.objects.order_by('-main_page').filter(types=Theme.types.conference)[:6] conference_themes = Theme.objects.language().order_by('-main_page').filter(types=Theme.types.conference)[:6]
seminar_themes = Theme.objects.order_by('-main_page').filter(types=Theme.types.seminar)[:6]
news_list = Article.objects.news().filter(main_page=1) news_list = Article.objects.news().filter(main_page=1)
blogs = Article.objects.blogs().filter(main_page=1) blogs = Article.objects.blogs().filter(main_page=1)
args = {'events': events, 'exposition_themes': exposition_themes, args = {'events': events, 'exposition_themes': exposition_themes,
'conference_themes': conference_themes, 'seminar_themes': seminar_themes, 'conference_themes': conference_themes, 'news_list': news_list,
'news_list': news_list, 'blogs': blogs, 'search_form': EventSearchForm, 'blogs': blogs, 'search_form': ExpositionSearchForm, 'search_action': '/expo/search/'}
'search_action': '/events/search/'}
context.update(args) context.update(args)

@ -8,15 +8,19 @@ from exposition.views import ExpositionByCity
class Command(BaseCommand): class Command(BaseCommand):
def handle(self, *args, **options): def handle(self, *args, **options):
langs = [code for code, name in settings.LANGUAGES] langs = [code for code, name in settings.LANGUAGES]
print(langs) for lang in langs:
translation.activate(lang)
#request = RequestFactory().get('/expo/city/') request = RequestFactory().get('/expo/city/')
#view = ExpositionByCity.as_view() view = ExpositionByCity.as_view()
#response = view(request, name='bob') response = view(request)
print(lang)
print('success') print('success')

@ -33,7 +33,7 @@
<div class="leter"><font size="5">{{ cur_word|slice:":1"|upper }}</font></div> <div class="leter"><font size="5">{{ cur_word|slice:":1"|upper }}</font></div>
{% endif %} {% endif %}
<li> <li>
<a href="/conference/{{ catalog }}{{ obj.url }}/">{{ obj.name }}&nbsp;({{ obj.conferences_number }})</a> <a href="/conference/{{ catalog }}{{ obj.url }}/">{{ obj.name }}&nbsp;({{ obj.conference_count }})</a>
</li> </li>
{% set prev_word = obj.name %} {% set prev_word = obj.name %}
{% endfor %} {% endfor %}

@ -34,7 +34,7 @@
<div class="leter"><font size="5">{{ cur_word|slice:":1"|upper }}</font></div> <div class="leter"><font size="5">{{ cur_word|slice:":1"|upper }}</font></div>
{% endif %} {% endif %}
<li> <li>
<a href="{{ expo_catalog }}{{ catalog }}{{ obj.url }}/">{{ obj.name }}&nbsp;({{ obj.expositions_number }})</a> <a href="{{ expo_catalog }}{{ catalog }}{{ obj.url }}/">{{ obj.name }}&nbsp;({{ obj.expo_count }})</a>
</li> </li>
{% set prev_word = obj.name %} {% set prev_word = obj.name %}
{% endfor %} {% endfor %}

@ -17,7 +17,18 @@
{% block content_list %} {% block content_list %}
{% with query=object_list %} {% with query=object_list %}
{% include 'includes/exposition/search_result.html' %} {% if query %}
{% include 'includes/exposition/search_result.html' %}
{% else %}
<p class="message-not-found">
<span>
<i class="fa fa-exclamation-triangle"></i>
</span>
<span class="message">
{% trans "Увы, событий, соответствующих выбранным фильтрам, нет в каталоге.<br> Попробуйте укрупнить параметры поиска" %}
</span>
</p>
{% endif %}
{% endwith %} {% endwith %}
{% endblock %} {% endblock %}

@ -2,41 +2,41 @@
{% load i18n %} {% load i18n %}
<div class="s-news-list"> <div class="s-news-list">
<header> <header>
<a href="#">{% trans 'Новости событий' %}</a> <a href="#">{% trans 'Новости событий' %}</a>
</header> </header>
<ul> <ul>
<!-- <!--
<li> <li>
<a href="#"> <a href="#">
<span class="nl-pict"></span> <span class="nl-pict"></span>
<span class="nl-body"> <span class="nl-body">
<span class="nl-text">ОАО «НПК «РЕКОД» на Международной конференции «Земля из космоса — наиболее эффективные решения»</span> <span class="nl-text">ОАО «НПК «РЕКОД» на Международной конференции «Земля из космоса — наиболее эффективные решения»</span>
<span class="nl-date">20 августа</span> <span class="nl-date">20 августа</span>
</span> </span>
</a> </a>
</li> </li>
<li> <li>
<a href="#"> <a href="#">
<span class="nl-pict"><img src="img/_del-temp/expo-bn-2-s.jpg" alt="" /></span> <span class="nl-pict"><img src="img/_del-temp/expo-bn-2-s.jpg" alt="" /></span>
<span class="nl-body"> <span class="nl-body">
<span class="nl-text">«Лоскутная радуга» на выставке «АРТ-Красноярск-2013»</span> <span class="nl-text">«Лоскутная радуга» на выставке «АРТ-Красноярск-2013»</span>
<span class="nl-date">20 августа</span> <span class="nl-date">20 августа</span>
</span> </span>
</a> </a>
</li> </li>
<li> <li>
<a href="#"> <a href="#">
<span class="nl-pict"><img src="img/_del-temp/expo-bn-2-s.jpg" alt="" /></span> <span class="nl-pict"><img src="img/_del-temp/expo-bn-2-s.jpg" alt="" /></span>
<span class="nl-body"> <span class="nl-body">
<span class="nl-text">На выставке «Арт-Красноярск» организуют настоящий праздник искусства</span> <span class="nl-text">На выставке «Арт-Красноярск» организуют настоящий праздник искусства</span>
<span class="nl-date">20 августа</span> <span class="nl-date">20 августа</span>
</span> </span>
</a> </a>
</li> </li>
--> -->
</ul> </ul>
<footer><a class="more" href="#">{% trans 'Все новости' %}</a></footer> <footer><a class="more" href="/news/">{% trans 'Все новости' %}</a></footer>
</div> </div>

@ -0,0 +1,106 @@
import datetime
from django.utils import translation
from django.core.cache import cache
from hvad.models import TranslationManager
class ThemeActiveManager(TranslationManager):
"""
manager works only with active themes
models where theme defines activity:
- exposition
"""
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, )\
.order_by('translations__name').distinct()
return qs
def expo_main_page(self):
Model = self.model
return list(self.language().filter(types=Model.types.exposition)[:6])
def conference_main_page(self):
Model = self.model
return list(self.language().filter(types=Model.types.conference)[:6])
def expo_themes(self):
lang = translation.get_language()
key = 'used_expo_themes_%s'%lang
cached_themes = cache.get(key)
if cached_themes:
return cached_themes
else:
from exposition.models import Exposition
themes_id = [item['theme_id'] for item in Exposition.objects.values('theme').distinct()]
themes = list(self.language().filter(id__in=themes_id))
cache.set(key, themes, 300)
return themes
"""
def expo_themes_with_count(self):
lang = translation.get_language()
key = 'used_expo_themes_count_%s'%lang
cached_themes = cache.get(key)
if cached_themes:
return cached_themes
else:
from exposition.models import Exposition
sql = {'expo_count': 'SELECT COUNT(*) FROM exposition_exposition_theme WHERE exposition_exposition_theme.theme_id = theme_theme.id'}
# id of unique cities
themes_id = [item['theme'] for item in Exposition.objects.values('theme').distinct()]
themes = list(self.language().filter(id__in=themes_id).extra(select=sql))
cache.set(key, themes, 300)
return themes
"""
def expo_themes_with_count(self):
lang = translation.get_language()
key = 'used_expo_themes_count_%s'%lang
cached_themes = cache.get(key)
if cached_themes:
return cached_themes
else:
from exposition.models import Exposition
now = datetime.datetime.now().date()
# id of unique cities
themes_id = [item['theme'] for item in Exposition.objects.filter(is_published=True, data_end__gte=now).values('theme').distinct()]
#themes = set(list(self.language().filter(id__in=themes_id).extra(select=sql)))
themes = set(list(self.language().filter(id__in=themes_id)))
themes = sorted(themes, key=lambda x: x.name)
cache.set(key, themes, self.cache_time)
return themes
def conference_themes_with_count(self):
lang = translation.get_language()
key = 'used_conference_themes_count_%s'%lang
cached_themes = cache.get(key)
if cached_themes:
return cached_themes
else:
from conference.models import Conference
now = datetime.datetime.now().date()
# id of unique cities
themes_id = [item['theme'] for item in Conference.objects.filter(is_published=True, data_end__gte=now).values('theme').distinct()]
#themes = set(list(self.language().filter(id__in=themes_id).extra(select=sql)))
themes = set(list(self.language().filter(id__in=themes_id)))
themes = sorted(themes, key=lambda x: x.name)
cache.set(key, themes, self.cache_time)
return themes
class TagActiveManager(TranslationManager):
"""
manager works only with active themes
models where theme defines activity:
- exposition
"""
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, )\
.order_by('translations__name').distinct()
return qs

@ -1,41 +1,18 @@
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
import datetime
import copy
from django.db import models from django.db import models
from django.utils import translation from django.utils import translation
from django.utils.translation import ugettext as _ from django.utils.translation import ugettext as _
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
from bitfield import BitField from bitfield import BitField
import copy
from exposition.models import Exposition from exposition.models import Exposition
from conference.models import Conference from conference.models import Conference
from seminar.models import Seminar from seminar.models import Seminar
from webinar.models import Webinar from webinar.models import Webinar
from functions.models_methods import ExpoManager from functions.models_methods import ExpoManager
from manager import TagActiveManager, ThemeActiveManager
class ThemeActiveManager(TranslationManager):
"""
manager works only with active themes
models where theme defines activity:
- exposition
"""
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, )\
.order_by('translations__name').distinct()
return qs
class TagActiveManager(TranslationManager):
"""
manager works only with active themes
models where theme defines activity:
- exposition
"""
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, )\
.order_by('translations__name').distinct()
return qs
class Theme(TranslatableModel): class Theme(TranslatableModel):
@ -107,6 +84,13 @@ class Theme(TranslatableModel):
translation.activate('ru') translation.activate('ru')
return ' '.join(self.get_all_names()) return ' '.join(self.get_all_names())
def expo_count(self):
return Exposition.objects.filter(is_published=True, data_end__gte=datetime.datetime.now().date(), theme=self).count()
def conference_count(self):
return Conference.objects.filter(is_published=True, data_end__gte=datetime.datetime.now().date(), theme=self).count()
'''
def clone(self): def clone(self):
""" """
Return an identical copy of the instance with a new ID. Return an identical copy of the instance with a new ID.
@ -127,6 +111,7 @@ class Theme(TranslatableModel):
setattr(duplicate, field, getattr(tr, field)) setattr(duplicate, field, getattr(tr, field))
duplicate.save() duplicate.save()
'''
def generate_search_class(self): def generate_search_class(self):
result = '' result = ''

Loading…
Cancel
Save