diff options
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 | 
