summaryrefslogtreecommitdiff
path: root/ishtar_common/data_importer.py
diff options
context:
space:
mode:
authorÉtienne Loks <etienne.loks@proxience.com>2015-05-19 18:59:52 +0200
committerÉtienne Loks <etienne.loks@proxience.com>2015-05-19 18:59:52 +0200
commit43e5926cd40a785d00d56403aeeb5ece3c312e82 (patch)
tree0999b5307d3cdc6d3c3b77f0390dbda9d02fc8ce /ishtar_common/data_importer.py
parent056947701cf49777695b379089fe134bef9678f7 (diff)
downloadIshtar-43e5926cd40a785d00d56403aeeb5ece3c312e82.tar.bz2
Ishtar-43e5926cd40a785d00d56403aeeb5ece3c312e82.zip
Imports: fix many to many association and treatment
Diffstat (limited to 'ishtar_common/data_importer.py')
-rw-r--r--ishtar_common/data_importer.py71
1 files changed, 53 insertions, 18 deletions
diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py
index 8184f2117..f5e70e0ee 100644
--- a/ishtar_common/data_importer.py
+++ b/ishtar_common/data_importer.py
@@ -780,7 +780,50 @@ class Importer(object):
continue
field_object, model, direct, m2m = \
cls._meta.get_field_by_name(attribute)
- if hasattr(field_object, 'rel') and field_object.rel and \
+ if m2m:
+ val = data.pop(attribute)
+ model = field_object.rel.to
+ if val.__class__ == model:
+ m2ms.append((attribute, val))
+ elif val.__class__ != model and type(val) == dict:
+ vals = []
+
+ # contruct many dict for each values
+ default_dict = {}
+ ## init with simple values that will be duplicated
+ for key in val.keys():
+ if type(val[key]) not in (list, tuple):
+ default_dict[key] = val[key]
+ ## manage multiple values
+ for key in val.keys():
+ if type(val[key]) in (list, tuple):
+ for idx, v in enumerate(val[key]):
+ if len(vals) <= idx:
+ vals.append(default_dict.copy())
+ vals[idx][key] = v
+
+ # check that m2m are not empty
+ notempty = False
+ for dct in vals:
+ for k in dct:
+ if dct[k] not in ("", None):
+ notempty = True
+ break
+ if not notempty:
+ continue
+
+ for v in vals:
+ v['defaults'] = v.get('defaults', {})
+ if 'history_modifier' in \
+ model._meta.get_all_field_names():
+ v['defaults']['history_modifier'] = \
+ self.history_modifier
+ v, created = model.objects.get_or_create(**v)
+ if self.import_instance \
+ and hasattr(v, 'imports'):
+ v.imports.add(self.import_instance)
+ m2ms.append((attribute, v))
+ elif hasattr(field_object, 'rel') and field_object.rel and \
type(data[attribute]) == dict:
c_path.append(attribute)
# put history_modifier for every created item
@@ -790,20 +833,6 @@ class Importer(object):
self.history_modifier
data[attribute], created = self.get_object(
field_object.rel.to, data[attribute], c_path)
- if m2m:
- val = data.pop(attribute)
- model = field_object.model
- if val.__class__ != model and type(val) == dict:
- val['defaults'] = val.get('defaults', {})
- if 'history_modifier' in \
- model._meta.get_all_field_names():
- val['defaults']['history_modifier'] = \
- self.history_modifier
- val, created = field_object.model.objects.get_or_create(
- **val)
- if self.import_instance and hasattr(val, 'imports'):
- val.imports.add(self.import_instance)
- m2ms.append((attribute, val))
path = tuple(path)
if path in self._defaults:
for k in self._defaults[path]:
@@ -817,7 +846,8 @@ class Importer(object):
create_dict.pop(k)
defaults = {}
if 'history_modifier' in create_dict:
- defaults = {'history_modifier':create_dict.pop('history_modifier')}
+ defaults = {
+ 'history_modifier':create_dict.pop('history_modifier')}
try:
try:
dct = create_dict.copy()
@@ -828,6 +858,10 @@ class Importer(object):
except IntegrityError as e:
raise IntegrityError(e.message)
except:
+ q = cls.objects.filter(**create_dict)
+ if not q.count():
+ raise ImporterError("Erreur d'import %s, contexte : %s"\
+ % (unicode(cls), unicode(data)))
created = False
obj = cls.objects.filter(**create_dict).all()[0]
for attr, value in m2ms:
@@ -837,8 +871,9 @@ class Importer(object):
for v in values:
getattr(obj, attr).add(v)
except IntegrityError as e:
- raise ImporterError("Erreur d'import %s, contexte : %s, erreur : %s" \
- % (unicode(cls), unicode(data), e.message.decode('utf-8')))
+ raise ImporterError(
+ "Erreur d'import %s, contexte : %s, erreur : %s" \
+ % (unicode(cls), unicode(data), e.message.decode('utf-8')))
return obj, created
return data