summaryrefslogtreecommitdiff
path: root/ishtar_common/data_importer.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@iggdrasil.net>2018-05-15 18:56:04 +0200
committerÉtienne Loks <etienne.loks@iggdrasil.net>2018-06-12 08:44:34 +0200
commitab9a0a74fd37f477a159fcee5effad85cc3bbd52 (patch)
tree8d989caf9dca94cb82469fdc9f2c515cfc3e70d3 /ishtar_common/data_importer.py
parentc765f09197c0ad3e5fb8a77370832c4593e635e1 (diff)
downloadIshtar-ab9a0a74fd37f477a159fcee5effad85cc3bbd52.tar.bz2
Ishtar-ab9a0a74fd37f477a159fcee5effad85cc3bbd52.zip
Data importer: simple management of M2M association when intermediate model is not auto
Diffstat (limited to 'ishtar_common/data_importer.py')
-rw-r--r--ishtar_common/data_importer.py22
1 files changed, 21 insertions, 1 deletions
diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py
index 6e71d69bb..8051ca300 100644
--- a/ishtar_common/data_importer.py
+++ b/ishtar_common/data_importer.py
@@ -1790,7 +1790,27 @@ class Importer(object):
obj_dct[attr] = values
else:
for v in values:
- getattr(obj, attr).add(v)
+ related_model = getattr(obj, attr)
+ # an intermediary model is used
+ if hasattr(related_model, 'through') and \
+ not related_model.through._meta.auto_created:
+ # try to create it with default attributes
+ inter_model = related_model.through
+ target_name, item_name = None, None
+ for field in inter_model._meta.get_fields():
+ rel_model = getattr(field, 'related_model', None)
+ # assume that the first found is correct...
+ if rel_model == v.__class__:
+ target_name = field.name
+ elif rel_model == obj.__class__:
+ item_name = field.name
+ assert target_name is not None
+ assert item_name is not None
+ inter_model.objects.get_or_create(
+ **{item_name: obj, target_name: v}
+ )
+ else:
+ getattr(obj, attr).add(v)
# force post save script
v.save()
if self.simulate: