From c50083de33ee424f82d65c06a5764c3f6a9c3b2d Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Mon, 13 Aug 2018 17:41:51 +0200 Subject: Imports: do not stop on m2m error. Fix model and error report on M2M - Document add M2M import field. --- ishtar_common/data_importer.py | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) (limited to 'ishtar_common/data_importer.py') diff --git a/ishtar_common/data_importer.py b/ishtar_common/data_importer.py index defa5b091..af8cc461e 100644 --- a/ishtar_common/data_importer.py +++ b/ishtar_common/data_importer.py @@ -1068,6 +1068,7 @@ class Importer(object): sys.stdout.write("\n") results = [] for idx_line, line in enumerate(table): + self.idx_line = idx_line if line_to_process is not None: if line_to_process != idx_line: continue @@ -1381,6 +1382,8 @@ class Importer(object): many_values = data.pop(attribute) if hasattr(field_object, 'rel'): model = field_object.rel.to + elif hasattr(field_object, 'related_model'): + model = field_object.related_model elif hasattr(field_object, 'to'): model = field_object.to elif hasattr(field_object, 'model'): @@ -1489,6 +1492,12 @@ class Importer(object): unicode( _(u"Importer configuration error: " u"\"{}\".")).format(e.message)) + except Exception as e: + msg = unicode( + _(u"Import error: {} - \"{}\".") + ).format(model, e.message.decode('utf-8')) + e.message = msg + raise e else: get_v = v.copy() if 'defaults' in get_v: @@ -1566,8 +1575,11 @@ class Importer(object): _(u"Importer configuration error: field \"{}\" does not exist " u"for {}.")).format(attribute, cls._meta.verbose_name)) if field_object.many_to_many: - m2ms += self._get_field_m2m(attribute, data, c_path, - new_created, field_object) + try: + m2ms += self._get_field_m2m(attribute, data, c_path, + new_created, field_object) + except Exception as e: + self.errors.append((self.idx_line, None, e.message)) return if not hasattr(field_object, 'rel') or not field_object.rel: return @@ -1664,7 +1676,7 @@ class Importer(object): defaults = {} if path in self._defaults: for k in self._defaults[path]: - if k not in data or not data[k]: + if (k not in data or not data[k]) and self._defaults[path][k]: defaults[k] = self._defaults[path][k] if 'history_modifier' in create_dict: @@ -1698,7 +1710,10 @@ class Importer(object): for k in dct.keys(): if k not in self.UNICITY_KEYS \ and k != 'defaults': - defaults[k] = dct.pop(k) + if dct[k]: + defaults[k] = dct.pop(k) + else: + dct.pop(k) if self.simulate: q = cls.objects.filter(**dct) -- cgit v1.2.3