diff options
| author | Étienne Loks <etienne.loks@proxience.com> | 2015-10-07 17:35:34 +0200 | 
|---|---|---|
| committer | Étienne Loks <etienne.loks@proxience.com> | 2015-10-07 17:35:34 +0200 | 
| commit | a9be4aa52a40a561ec859a3016387dd5920e4139 (patch) | |
| tree | 1a4336e68f251e4e4ea5b73c9ab839fc7fd96035 /ishtar_common/data_importer.py | |
| parent | dad03f626f1028daa44821a7d88551fec21ae88f (diff) | |
| download | Ishtar-a9be4aa52a40a561ec859a3016387dd5920e4139.tar.bz2 Ishtar-a9be4aa52a40a561ec859a3016387dd5920e4139.zip | |
Imports: allow to force creation of an item
Diffstat (limited to 'ishtar_common/data_importer.py')
| -rw-r--r-- | ishtar_common/data_importer.py | 48 | 
1 files changed, 36 insertions, 12 deletions
| diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index 16d9ce8d8..c5b3a94ae 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -40,7 +40,8 @@ class ImportFormater(object):                   through_key=None, through_dict=None,                   through_unicity_keys=None, duplicate_fields=[], regexp=None,                   regexp_formater_args=[], force_value=None, -                 post_processing=False, concat=False, comment=""): +                 post_processing=False, concat=False, comment="", +                 force_new=None):          self.field_name = field_name          self.formater = formater          self.required = required @@ -58,6 +59,7 @@ class ImportFormater(object):          # concatenate with existing value          self.concat = concat          self.comment = comment +        self.force_new = force_new      def __unicode__(self):          return self.field_name @@ -580,8 +582,9 @@ class Importer(object):          self._importation(table)      @classmethod -    def _field_name_to_data_dict(cls, field_name, value, data, -                                 force_value=False, concat=False): +    def _field_name_to_data_dict( +            cls, field_name, value, data, force_value=False, concat=False, +            force_new=False):          field_names = field_name          if type(field_names) not in (list, tuple):              field_names = [field_name] @@ -599,6 +602,8 @@ class Importer(object):                          current_data[key] = value                      elif key not in current_data or not current_data[key]:                          current_data[key] = value +                    if force_new: +                        current_data['__force_new'] = True                  elif key not in current_data:                      current_data[key] = {}                  current_data = current_data[key] @@ -742,7 +747,11 @@ class Importer(object):                      if k not in formater.through_unicity_keys \                         and k != 'defaults':                          data['defaults'][k] = data.pop(k) -            t_obj, created = through_cls.objects.get_or_create(**data) +            if '__force_new' in data: +                created = data.pop('__force_new') +                t_obj = through_cls.objects.create(**data) +            else: +                t_obj, created = through_cls.objects.get_or_create(**data)              if not created and 'defaults' in data:                  for k in data['defaults']:                      setattr(t_obj, k, data['defaults'][k]) @@ -845,20 +854,27 @@ class Importer(object):                  return              field_name = formater.field_name +            force_new = formater.force_new              if type(field_name) in (list, tuple):                  field_name = field_name[idx_v] +                force_new = force_new[idx_v]              field_names = [field_name] +            force_news = [force_new]              for duplicate_field in formater.duplicate_fields:                  if type(duplicate_field) in (list, tuple): -                    duplicate_field = duplicate_field[idx_v] +                    duplicate_field, force_new = duplicate_field[idx_v] +                else: +                    duplicate_field, force_new = duplicate_field                  field_names += [duplicate_field] +                force_news += [force_new]              if formater.through:                  self._throughs.append((formater, value))              else: -                for field_name in field_names: +                for idx, field_name in enumerate(field_names):                      self._field_name_to_data_dict( -                        field_name, value, data, formater.force_value) +                        field_name, value, data, formater.force_value, +                        force_new=force_news[idx])          c_row.append(u" ; ".join([v for v in c_values]))      def get_field(self, cls, attribute, data, m2ms, c_path): @@ -907,7 +923,6 @@ class Importer(object):                      field_names = model._meta.get_all_field_names()                      for v in vals: -                        v['defaults'] = v.get('defaults', {})                          if 'history_modifier' in field_names:                              v['defaults']['history_modifier'] = \                                  self.history_modifier @@ -917,8 +932,13 @@ class Importer(object):                              if k not in field_names:                                  continue                              self.get_field(model, k, v, m2m_m2ms, c_c_path) -                        v, created = model.objects.get_or_create( -                            **v) +                        if '__force_new' in v: +                            created = v.pop('__force_new') +                            v = model.objects.create(**v) +                        else: +                            v['defaults'] = v.get('defaults', {}) +                            v, created = model.objects.get_or_create( +                                **v)                          for att, objs in m2m_m2ms:                              if type(objs) not in (list, tuple):                                  objs = [objs] @@ -978,8 +998,12 @@ class Importer(object):              try:                  try:                      dct = create_dict.copy() -                    dct['defaults'] = defaults -                    obj, created = cls.objects.get_or_create(**dct) +                    if '__force_new' in dct: +                        created = dct.pop('__force_new') +                        obj = cls.objects.create(**dct) +                    else: +                        dct['defaults'] = defaults +                        obj, created = cls.objects.get_or_create(**dct)                      if self.import_instance and hasattr(obj, 'imports') \                         and created:                          obj.imports.add(self.import_instance) | 
