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 | 
