summaryrefslogtreecommitdiff
path: root/ishtar_common/models.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2017-09-19 11:37:42 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2017-09-19 11:37:42 +0200
commit782b857248435767cc4868a472ce27211596614a (patch)
tree8b0099c79567f3aa32a222a1ecbf6fd17e686b9a /ishtar_common/models.py
parent37ad2699ac330364895d58a5fcbf4300998f370c (diff)
downloadIshtar-782b857248435767cc4868a472ce27211596614a.tar.bz2
Ishtar-782b857248435767cc4868a472ce27211596614a.zip
Importers: fix user target key management (refs #3725)
Diffstat (limited to 'ishtar_common/models.py')
-rw-r--r--ishtar_common/models.py42
1 files changed, 27 insertions, 15 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index a4fe5af7f..53d5c85ac 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -717,33 +717,43 @@ class GeneralType(Cached, models.Model):
self.generate_key(force=True)
return obj
- def add_key(self, key, force=False, importer=None):
+ def add_key(self, key, force=False, importer=None, group=None,
+ user=None):
content_type = ContentType.objects.get_for_model(self.__class__)
if not importer and not force and ItemKey.objects.filter(
key=key, content_type=content_type).count():
return
+ filtr = {'key': key, 'content_type': content_type}
+ if group:
+ filtr['group'] = group
+ elif user:
+ filtr['user'] = user
+ else:
+ filtr['importer'] = importer
if force:
- ItemKey.objects.filter(key=key, content_type=content_type,
- importer=importer)\
- .exclude(object_id=self.pk).delete()
- ItemKey.objects.get_or_create(
- object_id=self.pk, key=key, content_type=content_type,
- importer=importer
- )
+ ItemKey.objects.filter(**filtr).exclude(object_id=self.pk).delete()
+ filtr['object_id'] = self.pk
+ ItemKey.objects.get_or_create(**filtr)
def generate_key(self, force=False):
for key in (slugify(self.label), self.txt_idx):
self.add_key(key)
- def get_keys(self, importer_id=None):
+ def get_keys(self, importer):
keys = [self.txt_idx]
content_type = ContentType.objects.get_for_model(self.__class__)
- query = Q(content_type=content_type, object_id=self.pk,
- importer__isnull=True)
- if importer_id:
- query |= Q(content_type=content_type, object_id=self.pk,
- importer__pk=importer_id)
- q = ItemKey.objects.filter(query)
+ base_q = Q(content_type=content_type, object_id=self.pk)
+ subquery = Q(importer__isnull=True, user__isnull=True,
+ group__isnull=True)
+ subquery |= Q(user__isnull=True, group__isnull=True,
+ importer=importer)
+ if importer.user:
+ subquery |= Q(user=importer.user, group__isnull=True,
+ importer=importer)
+ if importer.associated_group:
+ subquery |= Q(user__isnull=True, group=importer.associated_group,
+ importer=importer)
+ q = ItemKey.objects.filter(base_q & subquery)
for ik in q.exclude(key=self.txt_idx).all():
keys.append(ik.key)
return keys
@@ -763,6 +773,8 @@ class ItemKey(models.Model):
importer = models.ForeignKey(
Import, null=True, blank=True,
help_text=_(u"Specific key to an import"))
+ user = models.ForeignKey('IshtarUser', blank=True, null=True)
+ group = models.ForeignKey(TargetKeyGroup, blank=True, null=True)
def __unicode__(self):
return self.key