From ae5716d625396f916b703d4515d70769d3c4bc20 Mon Sep 17 00:00:00 2001 From: Oliver Date: Tue, 12 Aug 2025 12:54:30 +1000 Subject: [PATCH] Bom export fix (#10163) * Bug fix for BOM exporter - Handle edge case with null manufacturer value * Mark failed data exports --- src/backend/InvenTree/data_exporter/mixins.py | 19 +++++++++++++++---- .../plugin/builtin/exporter/bom_exporter.py | 8 ++++++-- 2 files changed, 21 insertions(+), 6 deletions(-) diff --git a/src/backend/InvenTree/data_exporter/mixins.py b/src/backend/InvenTree/data_exporter/mixins.py index 24e6b7c684..404c686056 100644 --- a/src/backend/InvenTree/data_exporter/mixins.py +++ b/src/backend/InvenTree/data_exporter/mixins.py @@ -351,10 +351,13 @@ class DataExportViewMixin: filename = export_plugin.generate_filename( serializer_class.Meta.model, export_format ) - except Exception: + except Exception as e: InvenTree.exceptions.log_error( 'generate_filename', plugin=export_plugin.slug ) + + output.mark_failure(error=str(e)) + raise ValidationError(export_error) # The provided plugin is responsible for exporting the data @@ -364,8 +367,12 @@ class DataExportViewMixin: queryset, serializer_class, headers, export_context, output ) - except Exception: + except Exception as e: InvenTree.exceptions.log_error('export_data', plugin=export_plugin.slug) + + # Log the error against the output object + output.mark_failure(error=str(e)) + raise ValidationError(export_error) if not isinstance(data, list): @@ -377,17 +384,21 @@ class DataExportViewMixin: if hasattr(export_plugin, 'update_headers'): try: headers = export_plugin.update_headers(headers, export_context) - except Exception: + except Exception as e: InvenTree.exceptions.log_error( 'update_headers', plugin=export_plugin.slug ) + + output.mark_failure(error=str(e)) + raise ValidationError(export_error) # Now, export the data to file try: datafile = serializer.export_to_file(data, headers, export_format) - except Exception: + except Exception as e: InvenTree.exceptions.log_error('export_to_file', plugin=export_plugin.slug) + output.mark_failure(error=str(e)) raise ValidationError(_('Error occurred during data export')) # Update the output object with the exported data diff --git a/src/backend/InvenTree/plugin/builtin/exporter/bom_exporter.py b/src/backend/InvenTree/plugin/builtin/exporter/bom_exporter.py index 3e793361dd..a432a2c6e2 100644 --- a/src/backend/InvenTree/plugin/builtin/exporter/bom_exporter.py +++ b/src/backend/InvenTree/plugin/builtin/exporter/bom_exporter.py @@ -275,7 +275,9 @@ class BomExporterPlugin(DataExportMixin, InvenTreePlugin): for supplier_part in bom_item.sub_part.supplier_parts.all(): manufacturer_part = supplier_part.manufacturer_part supplier_part_data.update({ - f'supplier_name_{idx}': supplier_part.supplier.name, + f'supplier_name_{idx}': supplier_part.supplier.name + if supplier_part.supplier + else '', f'supplier_sku_{idx}': supplier_part.SKU, f'supplier_mpn_{idx}': manufacturer_part.MPN if manufacturer_part @@ -296,7 +298,9 @@ class BomExporterPlugin(DataExportMixin, InvenTreePlugin): for manufacturer_part in bom_item.sub_part.manufacturer_parts.all(): manufacturer_part_data.update({ - f'manufacturer_name_{idx}': manufacturer_part.manufacturer.name, + f'manufacturer_name_{idx}': manufacturer_part.manufacturer.name + if manufacturer_part.manufacturer + else '', f'manufacturer_mpn_{idx}': manufacturer_part.MPN, })