# -*- coding: utf-8 -*- from datetime import date from django.db import models from django.db.models.signals import post_save, pre_save from django.utils import translation from django.utils.translation import ugettext_lazy as _ from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from bitfield import BitField from sorl.thumbnail import ImageField from directories.models import Iata from functions.db import db_table_exists from functions.signal_handlers import post_save_handler, pre_save_handler from functions.models_methods import ExpoManager, CityManager #from service.models import Service #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 = ['catalog', 'translator', 'participation', 'remote', 'tickets', 'visit', 'buildstand'] class City(TranslatableModel): """ City describes cities with translations in the project all cities with id from booking.com -> id city on booking equal this city objects """ objects = ExpoManager() used = CityManager() catalog = '/city/' services = BitField(flags=flags) url = models.SlugField(verbose_name=_(u'Url'), unique=True) logo = models.ImageField(verbose_name=_(u'Logo'), upload_to='city/logo/', blank=True, max_length=255) old_url = models.CharField(verbose_name=_(u'Url старой бд'), max_length=55) # inflect name for russian language. example- в Москве inflect = models.CharField(verbose_name=_(u'Склонение'), max_length=255, blank=True) country = models.ForeignKey('country.Country', verbose_name=_(u'Страна'), null=True, on_delete=models.PROTECT, related_name='cities') code_IATA = models.ForeignKey(Iata, verbose_name=_(u'IATA'), blank=True, null=True) population = models.PositiveIntegerField(verbose_name=_(u'Население'), blank=True, null=True) phone_code = models.PositiveIntegerField(verbose_name=_(u'Тел. код '), blank=True, null=True) #translated fields translations = TranslatedFields( name = models.CharField(verbose_name=_(u'Название'), max_length=50), region = models.CharField(verbose_name=_(u'Регион'), max_length=255), transport = models.TextField(verbose_name=_(u'Транспорт'), blank=True), description = models.TextField(verbose_name=_(u'Описание'), blank=True), famous_places = models.TextField(verbose_name=_(u'Знаменитые места'), blank=True), shoping = models.TextField(verbose_name=_(u'Магазины'), blank=True), #-----meta title = models.CharField(max_length=255), descriptions = models.CharField(max_length=255), keywords = models.CharField(max_length=255), ) created = models.DateTimeField(auto_now_add=True) modified = models.DateTimeField(auto_now=True) #class Meta: #ordering = ['translations__name'] def __unicode__(self): return self.lazy_translation_getter('name', self.pk) def get_hotels(self): """ returns list of 4 hotels in current city """ return list(self.hotels.all()[:4]) def get_events(self): """ returns nearest expos in this city """ from exposition.models import Exposition now = date.today() return Exposition.objects.filter(data_begin__gte=now, city=self).order_by('data_begin')[:3] def get_places(self): from place_exposition.models import PlaceExposition return PlaceExposition.objects.filter(city=self)[:3] def get_permanent_url(self): return self.catalog+self.url def expositions_number(self): from exposition.models import Exposition return Exposition.objects.filter(city=self).count() def conferences_number(self): from conference.models import Conference return Conference.objects.filter(city=self).count() def get_parent(self): """ returns dictionary of parents uses in search in ajax requests """ parent = {'text': self.country.name, 'id': self.country.id, 'name': 'co', 'parent': { 'text': self.country.area.name, 'id': self.country.area.id, 'name': 'area'} } return parent def get_sub_categories(self): """ uses in search city has no children objects, so returns empty list """ return [] def get_index_text(self): """ returns string of names in all languages for indexing it in search engine """ translation.activate('ru') translations = self.translations.all() names = ' '.join([tr.name for tr in translations]) return names class Hotel(TranslatableModel): """ Hotels downloaded from booking.com with booking api """ url = models.URLField(verbose_name=_(u'Url'), max_length=255) city = models.ForeignKey(City, verbose_name=_(u'Город'), related_name='hotels') ranking = models.FloatField(verbose_name=_(u'Рейтинг'), blank=True, null=True) hotel_class = models.CharField(verbose_name=_(u'Клас отеля'), max_length=10, blank=True) latitude = models.FloatField(verbose_name=_(u'Широта'), blank=True, null=True) longitude = models.FloatField(verbose_name=_(u'Долгота'), blank=True, null=True) photo = ImageField(verbose_name=_(u'Фото'), upload_to='hotels') currency = models.CharField(verbose_name=_(u'Валюта'), max_length=10) min_price = models.FloatField(verbose_name=_(u'Мин. цена'), blank=True, null=True) max_price = models.FloatField(verbose_name=_(u'Макс. цена'), blank=True, null=True) checked = models.NullBooleanField(verbose_name=_(u'Проверено'), blank=True, null=True) translations = TranslatedFields( name=models.CharField(verbose_name=_(u'Название'), max_length=255, blank=True), address=models.CharField(verbose_name=_(u'Адрес'), max_length=255, blank=True) ) pre_save.connect(pre_save_handler, sender=City) post_save.connect(post_save_handler, sender=City) post_save.connect(post_save_handler, sender=Hotel)