# -*- coding: utf-8 -*- import datetime from django.utils.translation import ugettext as _ from django.db import models from django.db.models import Q from django.db.models.signals import post_save, pre_save from django.contrib.contenttypes import generic from exposition.manager import ClientManager from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from functions.translate import fill_with_signal from photologue.models import Gallery from functions.signal_handlers import post_save_handler, pre_save_handler import copy from bitfield import BitField from service.models import Service from functions.db import db_table_exists #custom functions from functions.custom_fields import EnumField from functions.models_methods import ExpoManager from functions.model_mixin import EventMixin, ExpoMixin from functions.models_methods import hvad_to_dict # check if table exist and create flags if true flags = [item.url for item in Service.objects.all()] if db_table_exists('service_service') else [] from django.conf import settings CURRENCY = settings.CURRENCY BIT_AUDIENCE = settings.BIT_AUDIENCE class Conference(TranslatableModel, EventMixin, ExpoMixin): """ Create Conference model Uses hvad.TranslatableModel which is child of django.db.models class """ catalog = '/conference/' catalog_name = _(u'Конференции:') # type of event event_type = 'conf' #set manager of this model objects = ExpoManager() enable = ClientManager() url = models.SlugField(unique=True, max_length=255) old_url = models.SlugField(unique=True, max_length=255) data_begin = models.DateField(verbose_name='Дата начала') data_end = models.DateField(verbose_name='Дата окончания') services = BitField(flags=flags) #relations country = models.ForeignKey('country.Country', verbose_name='Страна', on_delete=models.PROTECT, related_name='conference_country') city = models.ForeignKey('city.City', verbose_name='Город', on_delete=models.PROTECT, related_name='conference_city') place = models.ForeignKey('place_conference.PlaceConference', verbose_name='Место проведения', blank=True, null=True, on_delete=models.PROTECT, related_name='conference_place') theme = models.ManyToManyField('theme.Theme', verbose_name='Тематики', related_name='conference_themes') tag = models.ManyToManyField('theme.Tag', verbose_name='Теги', blank=True, null=True, related_name='conference_tags') organiser = models.ManyToManyField('organiser.Organiser', verbose_name='Организатор', blank=True, null=True, related_name='conference_organisers') company = models.ManyToManyField('company.Company', verbose_name='Компании', blank=True, null=True, related_name='conference_companies') users = models.ManyToManyField('accounts.User', verbose_name='Посетители выставки', blank=True, null=True, related_name='conference_users') photogallery = models.ForeignKey('photologue.Gallery', blank=True, null=True) logo = models.ImageField(verbose_name='Logo', upload_to='conference/logo/', blank=True) rating = models.IntegerField(default=0, db_index=True) # добавить индекс в базе quality_label = BitField(flags=['ufi', 'rsva', 'exporating']) periodic = models.FloatField(verbose_name='Переодичность', blank=True, null=True) audience = BitField(flags=[k for k, v in BIT_AUDIENCE]) web_page = models.CharField(verbose_name='Вебсайт', max_length=255, blank=True) link = models.CharField(verbose_name='Линк на регистрацию', max_length=255, blank=True) discount = models.PositiveIntegerField(verbose_name='Скидка', blank=True, null=True) # currency = EnumField(values=CURRENCY, default='USD') tax = models.BooleanField(verbose_name='Налог', default=1) min_price = models.PositiveIntegerField(verbose_name='Минимальная цена', blank=True, null=True) max_price = models.PositiveIntegerField(verbose_name='Максимальная цена', blank=True, null=True) #administrator can cancel conference expohit = models.BooleanField(verbose_name='Expohit', default=0) canceled_by_administrator = models.BooleanField(default=0) canceled = models.BooleanField(default=0) moved = models.BooleanField(default=0) #can publish not immediately is_published = models.BooleanField(default=0) files = generic.GenericRelation('file.FileModel', content_type_field='content_type', object_id_field='object_id') note = generic.GenericRelation('note.Note', content_type_field='content_type', object_id_field='object_id') # statistic foundation_year = models.PositiveIntegerField(verbose_name='Год основания', blank=True, null=True) visitors = models.PositiveIntegerField(verbose_name='Посетитеил', blank=True, null=True) members = models.PositiveIntegerField(verbose_name='Участники', blank=True, null=True) #translated fields translations = TranslatedFields( name = models.CharField(verbose_name='Название', max_length=255), main_title=models.TextField(verbose_name='Краткое описание', blank=True), description=models.TextField(verbose_name='Описание', blank=True), main_themes=models.TextField(verbose_name='Основные темы', blank=True), time=models.TextField(verbose_name='Время работы', blank=True), discount_description=models.TextField(verbose_name='Описание скидки', blank=True), #-----meta data title=models.CharField(max_length=250), descriptions=models.CharField(max_length=250), keywords=models.CharField(max_length=250), ) #fields saves information about creating and changing model created = models.DateTimeField(auto_now_add=True) modified = models.DateTimeField(auto_now=True) main_page = models.PositiveIntegerField(default=0, db_index=True) views = models.PositiveIntegerField(default=0) def __unicode__(self): return self.lazy_translation_getter('name', unicode(self.pk)) def get_services(self): 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.conference)) | Q(url__in=ids)) return list(qs) #return list(Service.objects.language().filter(url__in=ids, type=Service.type.conference).order_by('sort')) def get_nearest_events(self): if self.theme.all(): theme = self.theme.all()[0] now = datetime.datetime.now() now = now - datetime.timedelta(days=1) conferences = Conference.objects.filter(theme__in=[theme], data_begin__gt=now).exclude(id=self.id).order_by('data_begin') return conferences[:3] else: return [] def get_catalog_url(self): return '/conference/' def get_audience(self): checked = [item for item, bool in self.audience if bool==True] audience = [] for k, v in BIT_AUDIENCE: for item in checked: if item == k: audience.append(v) return ', '.join(audience) def get_calendar_url(self): return '/conference-add-calendar/%s/'%self.id def get_visit_url(self): return '/conference-visit/%s/'%self.id def get_note_by_user(self, user_id): note = self.note.filter(user__id=user_id) try: return note.get().text except: return '' def tags(self): return self.tag.language().all() def get_gallery(self): if self.photogallery: return self.photogallery data = {} model = type(self) for code, name in settings.LANGUAGES: obj = model._meta.translations_model.objects.get(language_code = code,master__id=self.id) #access to translated fields data['title_%s'%code] = obj.name data['description_%s'%code] = obj.description gallery = Gallery() fill_with_signal(Gallery, gallery, data) self.photogallery = gallery self.save() return gallery class Statistic(TranslatableModel): conference = models.ForeignKey(Conference, related_name='statistic') year = models.PositiveIntegerField(verbose_name='Год') members = models.PositiveIntegerField(verbose_name='Посетители', blank=True, null=True) visitors = models.PositiveIntegerField(verbose_name='Участники', blank=True, null=True) area = models.PositiveIntegerField(verbose_name='Площадь', blank=True, null=True) countries_number = models.PositiveIntegerField(verbose_name='Количество стран', blank=True, null=True) translations = TranslatedFields( countries = models.TextField(blank=True) ) def to_dict(self): return hvad_to_dict(self) class TimeTable(TranslatableModel): """ TimeTable for business program """ conference = models.ForeignKey(Conference, related_name='business_program') begin = models.DateTimeField(verbose_name='Начало') end = models.DateTimeField(verbose_name='Конец') timetable_organiser = models.ForeignKey('organiser.Organiser', null=True, blank=True, related_name='conf_timetable') # created = models.DateTimeField(auto_now_add=True) modified = models.DateTimeField(auto_now=True) #translated fields translations = TranslatedFields( name = models.CharField(verbose_name='Название программы', max_length=255, blank=True), programe = models.TextField(verbose_name='Программа'), speaker = models.CharField(verbose_name='Спикеры', max_length=255, blank=True), place = models.CharField(verbose_name='Место проведения', max_length=255, blank=True) ) def to_dict(self): return hvad_to_dict(self) pre_save.connect(pre_save_handler, sender=Conference) post_save.connect(post_save_handler, sender=Conference) post_save.connect(post_save_handler, sender=TimeTable) post_save.connect(post_save_handler, sender=Statistic)