summaryrefslogtreecommitdiff
path: root/ishtar_common
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
commit5e55409037f385cdbd01710ea11af9cb9584fd9a (patch)
tree8b0099c79567f3aa32a222a1ecbf6fd17e686b9a /ishtar_common
parentff2b3aac243452b420fce43f0dbce439ac415d81 (diff)
downloadIshtar-5e55409037f385cdbd01710ea11af9cb9584fd9a.tar.bz2
Ishtar-5e55409037f385cdbd01710ea11af9cb9584fd9a.zip
Importers: fix user target key management (refs #3725)
Diffstat (limited to 'ishtar_common')
-rw-r--r--ishtar_common/data_importer.py10
-rw-r--r--ishtar_common/migrations/0011_auto_20170918_1913.py50
-rw-r--r--ishtar_common/models.py42
-rw-r--r--ishtar_common/models_imports.py9
4 files changed, 90 insertions, 21 deletions
diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py
index 00aa34f4c..b88fbff2f 100644
--- a/ishtar_common/data_importer.py
+++ b/ishtar_common/data_importer.py
@@ -431,7 +431,7 @@ class StrChoiceFormater(Formater, ChoiceChecker):
if self.model and v:
v = self.model.objects.get(pk=v)
self.equiv_dict[value] = v
- self.add_key(v, value)
+ self.add_key(v, value, import_instance)
self.new_keys[value] = v
elif self.create and res == len(self.choices):
self.equiv_dict[value] = self.new(base_value)
@@ -479,7 +479,7 @@ class StrChoiceFormater(Formater, ChoiceChecker):
def new(self, value):
return
- def add_key(self, obj, value):
+ def add_key(self, obj, value, importer=None):
return
def format(self, value):
@@ -509,14 +509,14 @@ class TypeFormater(StrChoiceFormater):
if self.import_instance:
for item in model.objects.all():
self.choices.append((item.pk, unicode(item)))
- for key in item.get_keys(importer_id=import_instance.pk):
+ for key in item.get_keys(importer=import_instance):
self.equiv_dict[key] = item
def prepare(self, value):
return slugify(unicode(value).strip())
- def add_key(self, obj, value):
- obj.add_key(slugify(value), force=True)
+ def add_key(self, obj, value, importer=None):
+ obj.add_key(slugify(value), force=True, importer=importer)
def new(self, value):
values = copy.copy(self.defaults)
diff --git a/ishtar_common/migrations/0011_auto_20170918_1913.py b/ishtar_common/migrations/0011_auto_20170918_1913.py
new file mode 100644
index 000000000..30ae07fd8
--- /dev/null
+++ b/ishtar_common/migrations/0011_auto_20170918_1913.py
@@ -0,0 +1,50 @@
+# -*- coding: utf-8 -*-
+# Generated by Django 1.11 on 2017-09-18 19:13
+from __future__ import unicode_literals
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('ishtar_common', '0010_auto_20170829_1716'),
+ ]
+
+ operations = [
+ migrations.AlterModelOptions(
+ name='targetkey',
+ options={'ordering': ('target', 'key'), 'verbose_name': 'Importer - Target key', 'verbose_name_plural': 'Importer - Targets keys'},
+ ),
+ migrations.AddField(
+ model_name='itemkey',
+ name='group',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.TargetKeyGroup'),
+ ),
+ migrations.AddField(
+ model_name='itemkey',
+ name='user',
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.IshtarUser'),
+ ),
+ migrations.AlterField(
+ model_name='import',
+ name='associated_group',
+ field=models.ForeignKey(blank=True, help_text='If a group is selected, target key saved in this group will be used.', null=True, on_delete=django.db.models.deletion.CASCADE, to='ishtar_common.TargetKeyGroup'),
+ ),
+ migrations.AlterField(
+ model_name='import',
+ name='conservative_import',
+ field=models.BooleanField(default=False, help_text='If set to true, do not overload existing values.', verbose_name='Conservative import'),
+ ),
+ migrations.AlterField(
+ model_name='import',
+ name='name',
+ field=models.CharField(max_length=500, null=True, verbose_name='Name'),
+ ),
+ migrations.AlterField(
+ model_name='import',
+ name='skip_lines',
+ field=models.IntegerField(default=1, help_text='Number of header lines in your file (can be 0).', verbose_name='Skip lines'),
+ ),
+ ]
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
diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py
index ccb0f2c57..d82d0580f 100644
--- a/ishtar_common/models_imports.py
+++ b/ishtar_common/models_imports.py
@@ -584,7 +584,14 @@ class TargetKey(models.Model):
except self.target.associated_model.DoesNotExist:
pass
if v:
- v.add_key(self.key, importer=self.associated_import)
+ keys = {}
+ if self.associated_group:
+ keys['group'] = self.associated_group
+ if self.associated_user:
+ keys['user'] = self.associated_user
+ else:
+ keys['importer'] = self.associated_import
+ v.add_key(self.key, **keys)
return obj
TARGET_MODELS = [