diff --git a/accounts/forms.py b/accounts/forms.py index 4de9c291..00c26f2f 100644 --- a/accounts/forms.py +++ b/accounts/forms.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, diff --git a/accounts/views.py b/accounts/views.py index bf71b293..ba8d445c 100644 --- a/accounts/views.py +++ b/accounts/views.py @@ -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'] diff --git a/article/models.py b/article/models.py index 25fe1135..b28b1ba0 100644 --- a/article/models.py +++ b/article/models.py @@ -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): """ diff --git a/conference/views.py b/conference/views.py index 1d851fd7..9bb44516 100644 --- a/conference/views.py +++ b/conference/views.py @@ -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)} diff --git a/country/manager.py b/country/manager.py new file mode 100644 index 00000000..b267551f --- /dev/null +++ b/country/manager.py @@ -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 diff --git a/country/models.py b/country/models.py index 0f2a1381..d2012dbc 100644 --- a/country/models.py +++ b/country/models.py @@ -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()] diff --git a/exposition/manager.py b/exposition/manager.py index 4e8ee528..1c9deec7 100644 --- a/exposition/manager.py +++ b/exposition/manager.py @@ -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()) """ diff --git a/exposition/models.py b/exposition/models.py index ed205f6a..989cfbf4 100644 --- a/exposition/models.py +++ b/exposition/models.py @@ -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) diff --git a/exposition/views.py b/exposition/views.py index 440ab266..ee8aca83 100644 --- a/exposition/views.py +++ b/exposition/views.py @@ -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 diff --git a/functions/models_methods.py b/functions/models_methods.py index 004bf58f..486fb71e 100644 --- a/functions/models_methods.py +++ b/functions/models_methods.py @@ -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): """ diff --git a/functions/search_forms.py b/functions/search_forms.py index fd9ecbce..590519e9 100644 --- a/functions/search_forms.py +++ b/functions/search_forms.py @@ -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 \ No newline at end of file + return sqs + diff --git a/meta/views.py b/meta/views.py index f943355f..c8146091 100644 --- a/meta/views.py +++ b/meta/views.py @@ -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) diff --git a/proj/settings.py b/proj/settings.py index 59e8a94b..cce3dfd0 100644 --- a/proj/settings.py +++ b/proj/settings.py @@ -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: diff --git a/proj/views.py b/proj/views.py index 78be8e2e..7c5a3052 100644 --- a/proj/views.py +++ b/proj/views.py @@ -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) diff --git a/settings/management/commands/update_views_cache.py b/settings/management/commands/update_views_cache.py index 9f2452ac..6baafc7b 100644 --- a/settings/management/commands/update_views_cache.py +++ b/settings/management/commands/update_views_cache.py @@ -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') diff --git a/templates/client/conference/conference_by.html b/templates/client/conference/conference_by.html index 2fa2aec5..7c14825d 100644 --- a/templates/client/conference/conference_by.html +++ b/templates/client/conference/conference_by.html @@ -33,7 +33,7 @@