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) |