# -*- coding: utf-8 -*- from django.db.models import F from django.db import models from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from functions.custom_fields import EnumField from bitfield import BitField CURENCIES = ('', 'USD', 'RUB', 'EUR') class Service(TranslatableModel): url = models.SlugField(unique=True) currency = EnumField(values=CURENCIES, blank=True, default='USD') price = models.PositiveIntegerField(blank=True, null=True) params = models.CharField(max_length=255, blank=True) template = models.CharField(max_length=255, blank=True) type = BitField(flags=['expo', 'conference']) #translated fields translations = TranslatedFields( name = models.CharField(max_length=50), main_title = models.TextField(), description = models.TextField(), advantage = models.TextField(blank=True), #meta fields title = models.CharField(max_length=255, blank=True), descriptions = models.CharField(max_length=255, blank=True), keywords = models.CharField(max_length=255, blank=True), ) sort = models.PositiveIntegerField(default=0, db_index=True) main_page = models.PositiveIntegerField(default=0, db_index=True) meta_id = models.IntegerField(null=True) def __unicode__(self): return self.lazy_translation_getter('name', self.pk) def get_form(self): pass def get_permanent_url(self): return '/service/%s/'%self.url def get_price(self): pr = self.price from django.db.models.signals import post_save from functions.signal_handlers import post_save_handler post_save.connect(post_save_handler, sender=Service) class AbstractOrder(models.Model): person = models.ForeignKey('accounts.User') phone = models.BigIntegerField() city = models.CharField(max_length=255, blank=True, default='') country = models.CharField(max_length=255, blank=True, default='') person_inf = models.CharField(max_length=255) price = models.IntegerField(blank=True, null=True) currency = EnumField(values=CURENCIES, blank=True) event = models.CharField(max_length=255, blank=True, null=True) exposition = models.ForeignKey('exposition.Exposition', null=True) conference = models.ForeignKey('conference.Conference', null=True) seminar = models.ForeignKey('seminar.Seminar', null=True) created = models.DateTimeField(auto_now_add=True) viewed = models.DateTimeField(null=True, blank=True) class Meta: abstract = True ordering = ['-created'] class Catalog(AbstractOrder): pass class BuildStand(AbstractOrder): pass class Tickets(AbstractOrder): days = models.SmallIntegerField() people = models.SmallIntegerField() class Remote(AbstractOrder): interested_participants = models.TextField(blank=True) additional = models.CharField(max_length=255, blank=True) class Participation(AbstractOrder): area = models.IntegerField(null=True) area_type = models.CharField(max_length=255) company_inf = models.TextField() class Translation(AbstractOrder): days = models.IntegerField(null=True,blank=True) hours = models.IntegerField(null=True, blank=True) fr = models.DateField(blank=True) to = models.DateField(blank=True) languages = models.TextField(blank=True) themes = models.TextField(blank=True) class Visit(AbstractOrder): fr = models.DateField() to = models.DateField() people = models.IntegerField(blank=True, null=True) hotel_additional = models.TextField(blank=True) city_from = models.CharField(max_length=255, blank=True) hotel_stars = models.CharField(max_length=30, blank=True) hotel_location = models.CharField(max_length=255, blank=True) hotel_budget = models.CharField(max_length=255, blank=True) hotel_budget_add = models.CharField(max_length=255, blank=True) avia_tickets = models.BooleanField() avia_type = models.CharField(max_length=255) visa = models.BooleanField() transfer = models.BooleanField() event_tickets = models.BooleanField() # translator = models.BooleanField() languages = models.CharField(max_length=255, blank=True) themes = models.CharField(max_length=255, blank=True) tr_employment_days = models.PositiveIntegerField(blank=True, null=True) tr_employment_hours = models.PositiveIntegerField(blank=True, null=True) excursion = models.BooleanField() notes = models.TextField(blank=True) ADVERTYSE_TYPES = ((u'Рекламировать участника', u'Рекламировать участника'), (u'Баннерная реклама', u'Баннерная реклама'), (u'Приоритетное размещение событий в каталоге',u'Приоритетное размещение событий в каталоге'), (u'Персональная визитка Вашей компании',u'Персональная визитка Вашей компании')) class Advertising(AbstractOrder): type = models.CharField(max_length=255, blank=True, null=True) class CallBack(models.Model): phone = models.CharField(max_length=30) person_inf = models.CharField(max_length=255) created = models.DateTimeField(auto_now_add=True) viewed = models.DateTimeField(null=True, blank=True) class Meta: ordering = ['-created'] class LinkedService(models.Model): service = models.ForeignKey(Service, blank=False) countries = models.ManyToManyField('country.Country', blank=True, verbose_name=u"Страны") exclude_countries = models.BooleanField(default=False, verbose_name=u"Исключить страны") expositions = models.ManyToManyField('exposition.Exposition', blank=True, verbose_name= u"Выставки") conferences = models.ManyToManyField('conference.Conference', blank=True, verbose_name=u'Конференции') def update_countries_flag(self): from country.models import Country if self.exclude_countries: 'filter all countries except selected and set flag to true' Country.objects.language().exclude(id__in=[c.id for c in self.countries.all()]).update(services=F('services').bitor(getattr(Country.services, self.service.url))) 'set another flags to false' Country.objects.language().filter(id__in=[c.id for c in self.countries.all()]).update(services=F('services').bitand(~getattr(Country.services, self.service.url))) else: 'if not exclude, filter all selected countries and set flag to true' self.countries.update(services=F('services').bitor(getattr(Country.services, self.service.url))) Country.objects.exclude(id__in=[c.id for c in self.countries.all()]).update(services=F('services').bitand(~getattr(Country.services, self.service.url))) def update_expositions_flag(self): from exposition.models import Exposition self.expositions.update(services=F('services').bitor(getattr(Exposition.services, self.service.url))) Exposition.objects.exclude(id__in=[c.id for c in self.expositions.all()]).update(services=F('services').bitand(~getattr(Exposition.services, self.service.url))) def update_conferences_flag(self): from conference.models import Conference self.conferences.update(services=F('services').bitor(getattr(Conference.services, self.service.url))) Conference.objects.exclude(id__in=[c.id for c in self.conferences.all()]).update(services=F('services').bitand(~getattr(Conference.services, self.service.url))) def update_all_flags(self): self.update_countries_flag() self.update_expositions_flag() self.update_conferences_flag() def countries_count(self): if not self.exclude_countries: return self.countries.all().count() else: from country.models import Country all = Country.objects.filter().count() excluded = self.countries.all().count() return all - excluded def __unicode__(self): return u'Linked service for %s'%self.service.url