From 782b857248435767cc4868a472ce27211596614a Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Tue, 19 Sep 2017 11:37:42 +0200 Subject: Importers: fix user target key management (refs #3725) --- ishtar_common/models.py | 42 +++++++++++++++++++++++++++--------------- 1 file changed, 27 insertions(+), 15 deletions(-) (limited to 'ishtar_common/models.py') 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 -- cgit v1.2.3