summaryrefslogtreecommitdiff
path: root/ishtar_common/data_importer.py
diff options
context:
space:
mode:
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
commita9be4aa52a40a561ec859a3016387dd5920e4139 (patch)
tree1a4336e68f251e4e4ea5b73c9ab839fc7fd96035 /ishtar_common/data_importer.py
parentdad03f626f1028daa44821a7d88551fec21ae88f (diff)
downloadIshtar-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.py48
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)