You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
147 lines
6.2 KiB
147 lines
6.2 KiB
# -*- 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)
|
|
|