diff options
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r-- | ishtar_common/models.py | 50 |
1 files changed, 43 insertions, 7 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py index 90232159c..75d2ea544 100644 --- a/ishtar_common/models.py +++ b/ishtar_common/models.py @@ -35,7 +35,8 @@ from django.core.validators import validate_slug from django.core.urlresolvers import reverse, NoReverseMatch from django.db.utils import DatabaseError from django.db.models import Q, Max, Count -from django.db.models.signals import post_save +from django.db.models.signals import post_save, pre_save +from django.dispatch import receiver from django.utils.translation import ugettext_lazy as _, ugettext from django.utils.safestring import SafeUnicode, mark_safe from django.template.defaultfilters import slugify @@ -351,8 +352,36 @@ class GeneralType(models.Model): ).split('_')).title() if not self.txt_idx: self.txt_idx = slugify(self.label) + + # clean old keys + pre_label = getattr(self, 'pre_label', None) + pre_txt_idx = getattr(self, 'pre_txt_idx', None) + content_type = ContentType.objects.get_for_model(self.__class__) + if pre_label and self.label != pre_label: + ItemKey.objects.filter(object_id=self.pk, key=slugify(pre_label), + content_type=content_type).delete() + if pre_txt_idx and self.txt_idx != pre_txt_idx: + ItemKey.objects.filter(object_id=self.pk, key=pre_txt_idx, + content_type=content_type).delete() + + self.generate_key(force=True) return super(GeneralType, self).save(*args, **kwargs) + def add_key(self, key, force=False): + content_type = ContentType.objects.get_for_model(self.__class__) + if not force and ItemKey.objects.filter(key=key, + content_type=content_type).count(): + return + if force: + ItemKey.objects.filter(key=key, content_type=content_type).exclude( + object_id=self.pk).delete() + ItemKey.objects.get_or_create(object_id=self.pk, key=key, + content_type=content_type) + + def generate_key(self, force=False): + for key in (slugify(self.label), self.txt_idx): + self.add_key(key) + def get_keys(self): keys = [] content_type = ContentType.objects.get_for_model(self.__class__) @@ -365,18 +394,25 @@ class GeneralType(models.Model): def generate_keys(cls): content_type = ContentType.objects.get_for_model(cls) for item in cls.objects.all(): - for key in (slugify(item.label), item.txt_idx): - if not ItemKey.objects.filter(object_id=item.pk, key=key, - content_type=content_type).count(): - ik = ItemKey(object_id=item.pk, key=key, - content_type=content_type) - ik.save() + item.generate_key() + +@receiver(pre_save) +def pre_save_general_type(sender, **kwargs): + if not issubclass(sender, GeneralType) or not 'instance' in kwargs \ + or not kwargs['instance']: + return + instance = kwargs['instance'] + instance.pre_label = instance.label + instance.pre_txt_idx = instance.txt_idx + class ItemKey(models.Model): key = models.CharField(_(u"Key"), max_length=100) content_type = models.ForeignKey(ContentType) object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey('content_type', 'object_id') + importer = models.ForeignKey('Import', null=True, blank=True, + help_text=_(u"Key specific to an import")) def __unicode__(self): return self.key |