diff options
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 |
commit | 43e5926cd40a785d00d56403aeeb5ece3c312e82 (patch) | |
tree | 0999b5307d3cdc6d3c3b77f0390dbda9d02fc8ce /ishtar_common/data_importer.py | |
parent | 056947701cf49777695b379089fe134bef9678f7 (diff) | |
download | Ishtar-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.py | 71 |
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 |