From 2a14c132708e83d5abc5247c4556af87ed5dedb3 Mon Sep 17 00:00:00 2001 From: Abhimanyu Saharan Date: Wed, 21 Feb 2024 12:47:22 +0530 Subject: [PATCH 1/2] fixed error display on parent import form #15185 --- netbox/netbox/views/generic/bulk_views.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index d5de2bfd367..f7c86cf6400 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -321,7 +321,7 @@ def _get_form_fields(self): if type(field.widget) is not HiddenInput } - def _save_object(self, model_form, request): + def _save_object(self, parent_form, model_form, request): # Save the primary object obj = self.save_object(model_form, request) @@ -350,7 +350,7 @@ def _save_object(self, model_form, request): for subfield_name, errors in f.errors.items(): for err in errors: err_msg = "{}[{}] {}: {}".format(field_name, i, subfield_name, err) - model_form.add_error(None, err_msg) + parent_form.add_error(None, err_msg) raise AbortTransaction() # Enforce object-level permissions on related objects @@ -417,7 +417,7 @@ def create_and_update_objects(self, form, request): restrict_form_fields(model_form, request.user) if model_form.is_valid(): - obj = self._save_object(model_form, request) + obj = self._save_object(form, model_form, request) saved_objects.append(obj) else: # Replicate model form errors for display From 6a15c8ada8e1bfbb4dc861ea1c21ba2123d2f616 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 21 Feb 2024 13:37:00 -0500 Subject: [PATCH 2/2] Rename parent_form; handle errors assigned to __all__ --- netbox/netbox/views/generic/bulk_views.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index f7c86cf6400..0aa681f5db4 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -321,7 +321,7 @@ def _get_form_fields(self): if type(field.widget) is not HiddenInput } - def _save_object(self, parent_form, model_form, request): + def _save_object(self, import_form, model_form, request): # Save the primary object obj = self.save_object(model_form, request) @@ -346,11 +346,14 @@ def _save_object(self, parent_form, model_form, request): related_obj = f.save() related_obj_pks.append(related_obj.pk) else: - # Replicate errors on the related object form to the primary form for display + # Replicate errors on the related object form to the import form for display and abort for subfield_name, errors in f.errors.items(): for err in errors: - err_msg = "{}[{}] {}: {}".format(field_name, i, subfield_name, err) - parent_form.add_error(None, err_msg) + if subfield_name == '__all__': + err_msg = f"{field_name}[{i}]: {err}" + else: + err_msg = f"{field_name}[{i}] {subfield_name}: {err}" + import_form.add_error(None, err_msg) raise AbortTransaction() # Enforce object-level permissions on related objects