diff options
| author | Étienne Loks <etienne.loks@proxience.com> | 2015-05-19 19:03:50 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@proxience.com> | 2015-05-19 19:03:50 +0200 | 
| commit | ea424eb36b3adef831683ec354b3dbd7d6b853f9 (patch) | |
| tree | 31b6978a694d5233fe100fcc4390b8a4666972b9 /ishtar_common/data_importer.py | |
| parent | 927115ea5e23f30996b8f4f67ba13bf4f92dfb95 (diff) | |
| parent | bdb50e2e41e863ddf59676e0ce8b06cfaf96c237 (diff) | |
| download | Ishtar-ea424eb36b3adef831683ec354b3dbd7d6b853f9.tar.bz2 Ishtar-ea424eb36b3adef831683ec354b3dbd7d6b853f9.zip | |
Merge branch 'stable'
Conflicts:
	ishtar_common/data_importer.py
Diffstat (limited to 'ishtar_common/data_importer.py')
| -rw-r--r-- | ishtar_common/data_importer.py | 67 | 
1 files changed, 49 insertions, 18 deletions
| diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index 98e681635..a7c32e6a8 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -835,7 +835,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 @@ -845,20 +888,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))              # default values              path = tuple(path)              if path in self._defaults: @@ -879,7 +908,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() @@ -908,8 +938,9 @@ class Importer(object):                      data = unicode(data)                  except UnicodeDecodeError:                      data = '' -                raise ImporterError(u"Erreur d'import %s, contexte : %s, erreur : %s" \ -                        % (unicode(cls), data, message)) +                raise ImporterError( +                    "Erreur d'import %s, contexte : %s, erreur : %s" \ +                    % (unicode(cls), unicode(data), e.message.decode('utf-8')))              return obj, created          return data | 
