# -*- coding: utf-8 -*- from django.db import models from hvad.models import TranslatableModel, TranslatedFields, TranslationManager from bitfield import BitField import copy from exposition.models import Exposition from conference.models import Conference from seminar.models import Seminar from webinar.models import Webinar from functions.models_methods import ExpoManager class Theme(TranslatableModel): """ Create Theme model Uses hvad.TranslatableModel which is child of django.db.models class """ #set manager of this model objects = ExpoManager() FLAGS = ( ('exposition', 'Выставка'), ('conference', 'Конференция'), ('seminar', 'Семинар'), ('webinar', 'Вебинар'), ) 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), #-----meta data title = models.CharField(max_length=255, blank=True), descriptions = models.CharField(max_length=255, blank=True), keywords = models.CharField(max_length=255, blank=True), ) main_page = models.PositiveIntegerField(default=0, db_index=True) def __unicode__(self): return self.lazy_translation_getter('name', unicode(self.pk)) def expositions_number(self): return len(Exposition.objects.filter(theme__id=self.id)) def conferences_number(self): return len(Conference.objects.filter(theme__id=self.id)) def seminars_number(self): return len(Seminar.objects.filter(theme__id=self.id)) def webinars_number(self): return len(Webinar.objects.filter(theme__id=self.id)) def events_number(self): return self.expositions_number() + self.conferences_number() + self.seminars_number() + self.webinars_number() 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() class Tag(TranslatableModel): """ Create Tag model Uses hvad.TranslatableModel which is child of django.db.models class """ #set manager of this model objects = ExpoManager() 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), ) #fields saves information about creating and changing model #created = models.DateTimeField(auto_now_add=True) #modified = models.DateTimeField(auto_now=True) def __unicode__(self): return self.lazy_translation_getter('name', unicode(self.pk)) 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 from django.db.models.signals import post_save, pre_save from functions.signal_handlers import post_save_handler from functions.form_check import translit_with_separator import random, string 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=Theme) pre_save.connect(pre_save_handler, sender=Tag) post_save.connect(post_save_handler, sender=Theme) post_save.connect(post_save_handler, sender=Tag)