# -*- coding: utf-8 -*- 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 django.conf import settings 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') else: return super(ExpoManager, self).language(get_language()).all().order_by('name') """ def safe_get(self, **kwargs): model = self.model try: return model.objects.get(**kwargs) except: return None def expo_main(self, cached=True): lang = translation.get_language() key = 'expo_main_page_key_%s'%lang if cached and key in cache: result = cache.get(key) else: result = list(self.language(lang). select_related('country', 'city', 'place', 'main'). prefetch_related('tag'). filter(main__isnull=False). filter(main__public=True)) cache.set(key, result, 45) return result def conf_main(self, cached=True): lang = translation.get_language() key = 'conf_main_page_key_%s'%lang if cached and key in cache: result = cache.get(key) else: result = list(self.language(lang). select_related('country', 'city', 'place', 'main'). prefetch_related('tag'). filter(main__isnull=False). filter(main__public=True)) cache.set(key, result, 50) return result class CityManager(TranslationManager): cache_time = 600 def all(self): lang = get_language() qs = super(CityManager, self).select_related('exposition_city', 'conference_city') qs = qs.filter(Q(exposition_city__city__isnull=False) | Q(conference_city__city__isnull=False))\ .order_by('translations__name').distinct() return qs 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, cached=True): lang = translation.get_language() key = 'used_expo_cities_%s' % lang if cached and key in cache: cached_cities = cache.get(key) 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, cached=True): lang = translation.get_language() key = 'used_expo_cities_count_%s' % lang if cached and key in cache: cached_cities = cache.get(key) 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 place_cities_with_count(self, cached=True): lang = translation.get_language() key = 'used_place_cities_count_%s' % lang if cached and key in cache: cached_cities = cache.get(key) return cached_cities else: from place_exposition.models import PlaceExposition sql = {'place_count': """SELECT COUNT(*) FROM place_exposition_placeexposition WHERE place_exposition_placeexposition.city_id = city_city.id AND place_exposition_placeexposition.is_published = 1"""} now = datetime.datetime.now().date() # id of unique countries cities_id = set( PlaceExposition.objects\ .filter(is_published=True)\ .values_list('city_id', flat=True) ) 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, cached=True): lang = translation.get_language() key = 'used_conference_cities_count_%s' % lang if cached and key in cache: cached_cities = cache.get(key) 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, cached=True): lang = translation.get_language() key = 'used_conference_cities_%s'%lang if cached and key in cache: cached_cities = cache.get(key) 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, cached=True): """ not finished """ lang = translation.get_language() key = 'used_cities_%s'%lang if cached and key in cache: cached_cities = cache.get(key) 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 russia(self, cached=True): lang = translation.get_language() key = 'russia_cities_%s' % lang if cached and key in cache: cities = cache.get(key) else: cities = [] popular_cities = [] _cities = self.language(lang).filter( country__url='russia', exposition_city__isnull=False, conference_city__isnull=False ).distinct().order_by('name').values_list('pk', 'name') for city in _cities: if city[0] == settings.MOSCOW_PK: popular_cities.insert(0, city) elif city[0] == settings.SPB_PK: popular_cities.append(city) else: cities.append(city) # .exclude(pk=settings.MOSCOW_PK) cities = popular_cities + cities cache.set(key, cities, self.cache_time) return cities def hvad_to_dict(object): """ """ value = object.__dict__ lang = get_language() bad_fields = ['master_id', 'id', 'language_code'] value.update({key:value for key, value in object.translations.filter(language_code=lang).values()[0].iteritems() if key not in bad_fields}) return value