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.
238 lines
10 KiB
238 lines
10 KiB
# -*- 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) |