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()],
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())
co = forms.MultipleChoiceField(label=_(u'Страна'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in Country.objects.select_related('exposition_country')\
.filter(exposition_country__country__isnull=False, translations__language_code=translation.get_language())\
.order_by('translations__name').distinct()]
choices=[(item.id, item.name) for item in Country.objects.expo_countries()]
)
ci = forms.MultipleChoiceField(label=_(u'Город'), required=False, widget=forms.CheckboxSelectMultiple(),
choices=[(item.id, item.name) for item in City.objects.select_related('exposition_city')\
.filter(exposition_city__city__isnull=False, translations__language_code=translation.get_language())\
.order_by('translations__name').distinct()]
choices=[(item.id, item.name) for item in City.used.expo_cities()]
)
fr = forms.DateField(required=False,

@ -56,7 +56,7 @@ class CalendarView(TemplateView):
"""
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
year = self.request.GET.get('year')
@ -70,7 +70,7 @@ class CalendarView(TemplateView):
# events in current months
number_of_days = python_calendar.monthrange(now.year, now.month)[1]
# 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
calendar = self.request.user.calendar
@ -79,7 +79,7 @@ class CalendarView(TemplateView):
else:
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
#context['days'] = days
calendar = self.request.user.calendar
@ -103,7 +103,6 @@ class CalendarView(TemplateView):
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)]
days += b
events = context['events']
context['days'] = days
#days = context['days']

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

@ -19,9 +19,11 @@ from theme.models import Theme, Tag
from service.order_forms import AdvertiseForm
from functions.search_forms import ExpositionSearchForm
from meta.views import MetadataMixin
from functions.cache_mixin import JitterCacheMixin, CacheMixin
MONTHES = settings.MONTHES
class ConferenceBy(ListView):
template_name = 'conference/conference_by.html'
title1 = ''
@ -38,42 +40,48 @@ class ConferenceBy(ListView):
class ConferenceByCountry(ConferenceBy):
cache_range = [60, 120]
model = Country
title1 = _(u'По странам')
title2 = _(u'Коференции мира по странам')
catalog = 'country/'
def get_queryset(self):
lang = translation.get_language()
return self.model.objects.select_related('conference_country')\
.filter(conference_country__country__isnull=False, translations__language_code=lang)\
.order_by('translations__name').distinct()
return self.model.objects.conference_countries_with_count()
#lang = translation.get_language()
#return self.model.objects.select_related('conference_country')\
# .filter(conference_country__country__isnull=False, translations__language_code=lang)\
# .order_by('translations__name').distinct()
class ConferenceByTheme(ConferenceBy):
cache_range = [60, 120]
model = Theme
title1 = _(u'По тематикам')
title2 = _(u'Коференции мира по тематикам')
catalog = 'theme/'
def get_queryset(self):
lang = translation.get_language()
return self.model.objects.select_related('conference_themes')\
.filter(conference_themes__theme__isnull=False, translations__language_code=lang)\
.order_by('translations__name').distinct()
return self.model.active.conference_themes_with_count()
#lang = translation.get_language()
#return self.model.objects.select_related('conference_themes')\
# .filter(conference_themes__theme__isnull=False, translations__language_code=lang)\
# .order_by('translations__name').distinct()
class ConferenceByCity(ConferenceBy):
cache_range = [60, 120]
model = City
title1 = _(u'По городам')
title2 = _(u'Коференции мира по городам')
catalog = 'city/'
def get_queryset(self):
lang = translation.get_language()
return self.model.objects.select_related('conference_city')\
.filter(conference_city__city__isnull=False, translations__language_code=lang)\
.order_by('translations__name').distinct()
return self.model.used.conference_cities_with_count()
#lang = translation.get_language()
#return self.model.objects.select_related('conference_city')\
# .filter(conference_city__city__isnull=False, translations__language_code=lang)\
# .order_by('translations__name').distinct()
class ConferenceCatalog(MetadataMixin, ListView):
@ -96,18 +104,23 @@ class ConferenceCatalog(MetadataMixin, ListView):
year = self.kwargs.get('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
if self.country:
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)}
self.year = {'text': year, 'link': '%s%s/%s/'%(self.catalog_url, self.filter_object.url, year)}
month = self.kwargs.get('month')
@ -148,7 +161,7 @@ class ConferenceCountryCatalog(ConferenceCatalog):
country = get_object_or_404(Country, url=slug)
self.kwargs['country'] = country
self.filter_object = country
qs = self.model.enable.filter(country=country)
qs = self.model.enable.upcoming().filter(country=country)
return qs
class ConferenceCityCatalog(ConferenceCatalog):
@ -158,7 +171,7 @@ class ConferenceCityCatalog(ConferenceCatalog):
slug = self.kwargs.get('slug')
city = get_object_or_404(City, url=slug)
self.kwargs['city'] = city
qs = self.model.enable.filter(city=city)
qs = self.model.enable.upcoming().filter(city=city)
self.filter_object = city
return qs
@ -177,7 +190,7 @@ class ConferenceThemeCatalog(ConferenceCatalog):
theme = get_object_or_404(Theme, url=slug)
self.kwargs['theme'] = theme
qs = self.model.enable.filter(theme=theme)
qs = self.model.enable.upcoming().filter(theme=theme)
if country_slug:
country = get_object_or_404(Country, url=country_slug)
self.country = country
@ -207,7 +220,7 @@ class ConferenceTagCatalog(ConferenceCatalog):
slug = self.kwargs.get('slug')
tag = get_object_or_404(Tag, url=slug)
self.kwargs['tag'] = tag
qs = self.model.enable.filter(tag=tag)
qs = self.model.enable.upcoming().filter(tag=tag)
self.filter_object = tag
return qs
@ -330,7 +343,8 @@ class ConferenceDetail(MetadataMixin, DetailView):
context['advertising_form'] = AdvertiseForm()
return context
class ConferenceList(MetadataMixin, ListView):
class ConferenceList(MetadataMixin, JitterCacheMixin, ListView):
cache_range = settings.CACHE_RANGE
model = Conference
paginate_by = settings.CLIENT_PAGINATION
template_name = 'client/conference/conference_list.html'
@ -341,15 +355,14 @@ class ConferenceList(MetadataMixin, ListView):
def get_queryset(self):
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')
if year:
qs = qs.filter(data_begin__year=year)
qs = self.model.enable.filter(data_end__year=year)
# info for breadscrumbs
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 -*-
from datetime import date
from django.db import models
from django.utils.translation import ugettext as _
from django.contrib.contenttypes import generic
from django.db.models.signals import post_save, pre_save
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
from django.db.models.signals import post_save
from hvad.models import TranslatableModel, TranslatedFields
from bitfield import BitField
from manager import CountryManager, AreaManager
# models
from directories.models import Language, Currency
from city.models import City
@ -17,46 +17,14 @@ from conference.models import Conference
from seminar.models import Seminar
from webinar.models import Webinar
# func
from functions.custom_fields import EnumField
from functions.db import db_table_exists
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
# 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 []
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):
translations = TranslatedFields(
@ -64,6 +32,9 @@ class Area(TranslatableModel):
)
objects = AreaManager()
class Meta:
ordering = ['translations__name']
def __unicode__(self):
return self.lazy_translation_getter('name', unicode(self.pk))
@ -85,9 +56,6 @@ class Area(TranslatableModel):
return parent
class Country(TranslatableModel):
"""
Create Country model
@ -95,17 +63,12 @@ class Country(TranslatableModel):
Uses hvad.TranslatableModel which is child of django.db.models class
"""
objects = CountryManager()
used = CountryManager()
catalog = '/country/'
services = BitField(flags=flags)
url = models.SlugField(unique=True)
#
old_url = models.CharField(unique=True, max_length=55)
inflect = models.CharField(max_length=255, blank=True)
# relations
area = models.ForeignKey(Area)
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)
timezone = models.FloatField(blank=True, null=True)
phone_code = models.PositiveIntegerField(blank=True, null=True)
time_delivery = models.PositiveSmallIntegerField(blank=True, null=True)
latitude = 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)
modified = models.DateTimeField(auto_now=True)
country_code = models.CharField(max_length=2)
# connection with FileModel by ContentType
files = generic.GenericRelation('file.FileModel',content_type_field='content_type', object_id_field='object_id')
#translated fields
@ -140,9 +101,7 @@ class Country(TranslatableModel):
title = models.CharField(max_length=255),
descriptions = models.CharField(max_length=255),
keywords = models.CharField(max_length=255),
)
country_code = models.CharField(max_length=2)
class Meta:
ordering = ['translations__name']
@ -186,9 +145,11 @@ class Country(TranslatableModel):
return Webinar.objects.filter(country=self.id).count()
def active_cities(self):
return City.used.active_qs().filter(country=self)
lang = translation.get_language()
return City.objects.select_related('exposition_city')\
.filter(exposition_city__city__isnull=False, translations__language_code=lang, country=self).distinct().order_by('translations__name')
#return City.objects.select_related('exposition_city')\
# .filter(exposition_city__city__isnull=False, translations__language_code=lang, country=self).distinct().order_by('translations__name')
def get_sub_categories(self):
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):
def get_query_set(self):
now = datetime.datetime.now().date()
return super(ClientManager, self).get_query_set().filter(is_published=True, data_begin__gte=now).order_by('data_begin')
return self.language().select_related('country', 'city', 'place').filter(is_published=True).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]
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)

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

@ -1,10 +1,17 @@
import datetime
from django.utils.translation import get_language
from django.db.models import Q
from django.core.cache import cache
from django.utils import translation
from hvad.models import 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):
if lang:
return super(ExpoManager, self).language(lang).all().order_by('name')
@ -18,7 +25,9 @@ class ExpoManager(TranslationManager):
except:
return None
class CityManager(TranslationManager):
cache_time = 600
def all(self):
lang = get_language()
qs = super(CityManager, self).select_related('exposition_city', 'conference_city')
@ -27,13 +36,100 @@ class CityManager(TranslationManager):
return qs
def expo_cities(self):
def active_qs(self):
from exposition.models import Exposition
cities_id = [item['city_id'] for item in Exposition.objects.values('city_id').distinct()]
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):
"""

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

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

@ -305,20 +305,20 @@ INSTALLED_APPS = (
'webinar',
'meta',
#django modules
'sorl.thumbnail',
'photologue',
'sortedm2m',
'hvad',
'tinymce',
'ckeditor',
'django_messages',
'sorl.thumbnail', # for logos
'photologue', # photogallery
'sortedm2m', # photologue dependence
'hvad', #
'tinymce', # ???
'ckeditor', # wysiwig editor in admin
'django_messages', # messages
'bitfield',
'djutils',
'pytils',
'pymorphy',
'password_reset',
'django_crontab',
'social.apps.django_app.default',
'djutils', # ??
'pytils', # ??
'pymorphy', # ??
'password_reset', # reset password
'django_crontab', # crons
'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'Октябрь')},
'nov': {'value': 11, 'name': _(u'Ноябрь')}, 'dec': {'value': 12, 'name': _(u'Декабрь')}}
# cache pages in random seconds. random in this range
CACHE_RANGE = [60, 120]
try:
from local import *
except ImportError, e:

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

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

@ -33,7 +33,7 @@
<div class="leter"><font size="5">{{ cur_word|slice:":1"|upper }}</font></div>
{% endif %}
<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>
{% set prev_word = obj.name %}
{% endfor %}

@ -34,7 +34,7 @@
<div class="leter"><font size="5">{{ cur_word|slice:":1"|upper }}</font></div>
{% endif %}
<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>
{% set prev_word = obj.name %}
{% endfor %}

@ -17,7 +17,18 @@
{% block content_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 %}
{% endblock %}

@ -2,41 +2,41 @@
{% load i18n %}
<div class="s-news-list">
<header>
<a href="#">{% trans 'Новости событий' %}</a>
</header>
<header>
<a href="#">{% trans 'Новости событий' %}</a>
</header>
<ul>
<!--
<li>
<a href="#">
<span class="nl-pict"></span>
<span class="nl-body">
<span class="nl-text">ОАО «НПК «РЕКОД» на Международной конференции «Земля из космоса — наиболее эффективные решения»</span>
<span class="nl-date">20 августа</span>
</span>
</a>
</li>
<li>
<a href="#">
<span class="nl-pict"><img src="img/_del-temp/expo-bn-2-s.jpg" alt="" /></span>
<span class="nl-body">
<span class="nl-text">«Лоскутная радуга» на выставке «АРТ-Красноярск-2013»</span>
<span class="nl-date">20 августа</span>
</span>
</a>
</li>
<li>
<a href="#">
<span class="nl-pict"><img src="img/_del-temp/expo-bn-2-s.jpg" alt="" /></span>
<span class="nl-body">
<span class="nl-text">На выставке «Арт-Красноярск» организуют настоящий праздник искусства</span>
<span class="nl-date">20 августа</span>
</span>
<ul>
<!--
<li>
<a href="#">
<span class="nl-pict"></span>
<span class="nl-body">
<span class="nl-text">ОАО «НПК «РЕКОД» на Международной конференции «Земля из космоса — наиболее эффективные решения»</span>
<span class="nl-date">20 августа</span>
</span>
</a>
</li>
<li>
<a href="#">
<span class="nl-pict"><img src="img/_del-temp/expo-bn-2-s.jpg" alt="" /></span>
<span class="nl-body">
<span class="nl-text">«Лоскутная радуга» на выставке «АРТ-Красноярск-2013»</span>
<span class="nl-date">20 августа</span>
</span>
</a>
</li>
<li>
<a href="#">
<span class="nl-pict"><img src="img/_del-temp/expo-bn-2-s.jpg" alt="" /></span>
<span class="nl-body">
<span class="nl-text">На выставке «Арт-Красноярск» организуют настоящий праздник искусства</span>
<span class="nl-date">20 августа</span>
</span>
</a>
</li>
-->
</ul>
<footer><a class="more" href="#">{% trans 'Все новости' %}</a></footer>
</div>
</a>
</li>
-->
</ul>
<footer><a class="more" href="/news/">{% trans 'Все новости' %}</a></footer>
</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 -*-
import datetime
import copy
from django.db import models
from django.utils import translation
from django.utils.translation import ugettext as _
from hvad.models import TranslatableModel, TranslatedFields, TranslationManager
from bitfield import BitField
import copy
from exposition.models import Exposition
from conference.models import Conference
from seminar.models import Seminar
from webinar.models import Webinar
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):
@ -107,6 +84,13 @@ class Theme(TranslatableModel):
translation.activate('ru')
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):
"""
Return an identical copy of the instance with a new ID.
@ -127,6 +111,7 @@ class Theme(TranslatableModel):
setattr(duplicate, field, getattr(tr, field))
duplicate.save()
'''
def generate_search_class(self):
result = ''

Loading…
Cancel
Save