From b75d3163bed945b58e643982820883e72e4b8dc4 Mon Sep 17 00:00:00 2001 From: Étienne Loks Date: Thu, 5 Oct 2023 13:14:56 +0200 Subject: ✨ improve import and import group sheet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - link to errors, match, result files - pre import values - link to associated imports and group imports --- ishtar_common/models_imports.py | 84 ++++++++++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 18 deletions(-) (limited to 'ishtar_common/models_imports.py') diff --git a/ishtar_common/models_imports.py b/ishtar_common/models_imports.py index 84ea42112..1723fc5bf 100644 --- a/ishtar_common/models_imports.py +++ b/ishtar_common/models_imports.py @@ -1498,6 +1498,20 @@ class ImportGroup(BaseImport): def has_pre_import_form(self) -> bool: return False + @property + def pre_import_items(self) -> list: + """ + Get list of tuple : (label, value) of pre-import values for this group import. Cached in memory. + :return: pre import as a list of 2-tuple + """ + if hasattr(self, "_pre_import_items"): + return self._pre_import_items + values = [] + for imprt in self.imports.all(): + values += imprt.pre_import_items + self._pre_import_items = values + return values + @property def has_error(self) -> bool: return any(1 for imprt in self.imports.all() if imprt.has_error) @@ -1949,6 +1963,55 @@ class Import(BaseImport): return False return True + def _get_pre_import_value(self, value, target): + if value == "": + return + many = target.formater_type.many_split + if many: + if value.startswith("['") and value.endswith("']"): + value = value[2:-2].split("', '") + associated_model = target.formater_type.associated_model + if associated_model: + if many: + try: + value = [associated_model.objects.get(pk=int(pk)) for pk in value] + except (associated_model.DoesNotExist, ValueError): + return + else: + try: + value = associated_model.objects.get(pk=value) + except (associated_model.DoesNotExist, ValueError): + return + return value + + @property + def pre_import_items(self) -> list: + """ + Get list of tuple : (label, value) of pre-import values for this import. Cached in memory. + :return: pre import as a list of 2-tuple + """ + if hasattr(self, "_pre_import_items"): + return self._pre_import_items + values = [] + for column in self.importer_type.columns.filter(col_number__lte=0): + q = ImportColumnValue.objects.filter(column=column, import_item=self) + if not q.count(): + continue + column_value = q.all()[0] + q = column_value.column.targets.all() + if not q.count(): + continue + + target = q.all()[0] + value = column_value.value + value = self._get_pre_import_value(value, target) + if value is None: + continue + + values.append((column_value.column.label, value)) + self._pre_import_items = values + return values + @property def pre_import_values(self) -> dict: """ @@ -1966,27 +2029,12 @@ class Import(BaseImport): q = column_value.column.targets.all() if not q.count(): continue - target = q.all()[0] + target = q.all()[0] value = column_value.value - if value == "": + value = self._get_pre_import_value(value, target) + if value is None: continue - many = target.formater_type.many_split - if many: - if value.startswith("['") and value.endswith("']"): - value = value[2:-2].split("', '") - associated_model = target.formater_type.associated_model - if associated_model: - if many: - try: - value = [associated_model.objects.get(pk=int(pk)) for pk in value] - except (associated_model.DoesNotExist, ValueError): - continue - else: - try: - value = associated_model.objects.get(pk=value) - except (associated_model.DoesNotExist, ValueError): - continue keys = target.target.split("__") dct = generate_dict_from_list(keys, value) -- cgit v1.2.3