# -*- coding: utf-8 -*- import copy import datetime import random import string from bitfield import BitField from conference.models import Conference from django.db import IntegrityError, models from django.db.models.signals import post_save, pre_save from django.utils import translation from django.utils.translation import ugettext as _ from exposition.models import Exposition from functions.form_check import translit_with_separator from functions.models_methods import ExpoManager from functions.signal_handlers import post_save_handler from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from manager import TagActiveManager, ThemeActiveManager from seminar.models import Seminar from webinar.models import Webinar class Theme(TranslatableModel): """ Create Theme model Uses hvad.TranslatableModel which is child of django.db.models class """ #set manager of this model catalog_name = _(u'Тематики:') search_name = 'th' objects = ExpoManager() active = ThemeActiveManager() FLAGS = ( ('exposition', _(u'Выставка')), ('conference', _(u'Конференция')), ('seminar', _(u'Семинар')), ('webinar', _(u'Вебинар')), ('article', _(u'Статья')), ) url = models.SlugField(unique=True, max_length=255) old_url = models.SlugField(unique=True, max_length=255) types = BitField([k for k, v in FLAGS]) #translated fields translations = TranslatedFields( name = models.CharField(max_length=255), main_title = models.CharField(max_length=255), description = models.TextField(blank=True) ) main_page_conf = models.PositiveIntegerField(default=0, db_index=True) main_page_expo = models.PositiveIntegerField(default=0, db_index=True) inflect = models.CharField(max_length=255, blank=True) def __unicode__(self): return self.lazy_translation_getter('name', unicode(self.pk)) def expositions_number(self): return Exposition.enable.upcoming().filter(theme=self).count() def conferences_number(self): return Conference.enable.upcoming().filter(theme=self).count() def seminars_number(self): return Seminar.objects.filter(theme=self).count() def webinars_number(self): return Webinar.objects.filter(theme=self).count() def events_number(self): return self.expositions_number() + self.conferences_number() + self.seminars_number() + self.webinars_number() def get_sub_categories(self): objects = [{'text':item.name, 'id':item.id, 'name':'tg', 'sub':False} for item in Tag.active.all().filter(theme=self)] return objects def get_all_names(self): return [item['name'] for item in self.translations.all().values('name')] def get_index_text(self): translation.activate('ru') return ' '.join(self.get_all_names()) def expo_count(self): return Exposition.objects.filter(is_published=True, data_end__gte=datetime.datetime.now().date(), theme=self).count() def conference_count(self): return Conference.objects.filter(is_published=True, data_end__gte=datetime.datetime.now().date(), theme=self).count() ''' def clone(self): """ Return an identical copy of the instance with a new ID. """ if not self.pk: raise ValueError('Instance must be saved before it can be cloned.') duplicate = copy.copy(self) ignore_fields = ['id', 'master', 'language_code'] # Setting pk to None. Django thinking this is a new object. duplicate.pk = None duplicate.translate('ru') tr = self._meta.translations_model.objects.get(language_code = 'ru',master__id=self.pk) for field in duplicate._translated_field_names: if field in ignore_fields: continue setattr(duplicate, field, getattr(tr, field)) duplicate.save() ''' def generate_search_class(self): result = '' for item, bool in self.types: if bool == True: if item == 'exposition': result += ' exhb' elif item == 'conference': result += ' conf' elif item == 'seminar': result += ' smnr' elif item == 'webinar': result += ' webn' return result def get_parent(self): parent = {} return parent class Tag(TranslatableModel): """ Create Tag model Uses hvad.TranslatableModel which is child of django.db.models class """ catalog_name = _(u'Теги:') search_name = 'tg' #set manager of this model objects = ExpoManager() active = TagActiveManager() url = models.SlugField(unique=True, max_length=255) old_url = models.SlugField(unique=True, max_length=255) theme = models.ForeignKey(Theme, on_delete=models.PROTECT, related_name='tags') #translated fields translations = TranslatedFields( name = models.CharField(max_length=100), main_title = models.CharField(max_length=100), description = models.TextField(blank=True), #-----meta data title = models.CharField(max_length=250, blank=True), descriptions = models.CharField(max_length=250, blank=True), keywords = models.CharField(max_length=250, blank=True), ) inflect = models.CharField(max_length=255, blank=True) #fields saves information about creating and changing model #created = models.DateTimeField(auto_now_add=True) #modified = models.DateTimeField(auto_now=True) def save(self, *args, **kwargs): try: super(Tag, self).save(*args, **kwargs) except IntegrityError: theme = self.theme self.url = '%s_%s'%(theme.url, self.url) super(Tag, self).save(*args, **kwargs) def __unicode__(self): return self.lazy_translation_getter('name', unicode(self.pk)) def get_sub_categories(self): return [] def get_all_names(self): return [item['name'] for item in self.translations.all().values('name')] def get_index_text(self): translation.activate('ru') return ' '.join(self.get_all_names()) def clone(self): """ Return an identical copy of the instance with a new ID. """ if not self.pk: raise ValueError('Instance must be saved before it can be cloned.') duplicate = copy.copy(self) ignore_fields = ['id', 'master', 'language_code'] # Setting pk to None. Django thinking this is a new object. duplicate.pk = None duplicate.translate('ru') tr = self._meta.translations_model.objects.get(language_code = 'ru',master__id=self.pk) for field in duplicate._translated_field_names: if field in ignore_fields: continue setattr(duplicate, field, getattr(tr, field)) duplicate.save() return duplicate def get_parent(self): parent = {'text' : self.theme.name, 'id': self.theme.id, 'name': 'th'} return parent def pre_save_handler(sender, **kwargs): obj = kwargs['instance'] if obj.language_code =='en': try: name = getattr(obj, 'name') obj.url = translit_with_separator(name) except AttributeError: pass tags = Tag.objects.filter(url=obj.url).exclude(id=obj.id) if tags: obj.url = obj.theme.url+'-'+ obj.url if not obj.url: obj.url = ''.join([random.choice(string.ascii_lowercase) for n in xrange(8)]) pre_save.connect(pre_save_handler, sender=Tag) post_save.connect(post_save_handler, sender=Theme) post_save.connect(post_save_handler, sender=Tag) #-----------------------