summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py50
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