From 6793e384df8cbfec3d34e3d0913b1f59dce95eeb Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 10 Nov 2022 09:05:16 -0500 Subject: [PATCH] Clean up bulk import view --- netbox/dcim/views.py | 5 ++--- netbox/netbox/views/generic/bulk_views.py | 19 +++++++------------ netbox/utilities/forms/forms.py | 10 +++++++++- 3 files changed, 18 insertions(+), 16 deletions(-) diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index a16a2b9fc..437162bce 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -807,7 +807,7 @@ class RackReservationImportView(generic.BulkImportView): model_form = forms.RackReservationCSVForm table = tables.RackReservationTable - def _save_obj(self, obj_form, request): + def save_object(self, obj_form, request): """ Assign the currently authenticated user to the RackReservation. """ @@ -2028,8 +2028,7 @@ class ChildDeviceBulkImportView(generic.BulkImportView): table = tables.DeviceImportTable template_name = 'dcim/device_import_child.html' - def _save_obj(self, obj_form, request): - + def save_object(self, obj_form, request): obj = obj_form.save() # Save the reverse relation to the parent device bay diff --git a/netbox/netbox/views/generic/bulk_views.py b/netbox/netbox/views/generic/bulk_views.py index 33ef071a8..1a83c9de2 100644 --- a/netbox/netbox/views/generic/bulk_views.py +++ b/netbox/netbox/views/generic/bulk_views.py @@ -306,10 +306,10 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): """ return data - def _create_object(self, request, model_form): + def _save_object(self, model_form, request): # Save the primary object - obj = self._save_obj(model_form, request) + obj = self.save_object(model_form, request) # Enforce object-level permissions if not self.queryset.filter(pk=obj.pk).first(): @@ -345,15 +345,14 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): return obj - def _save_obj(self, obj_form, request): + def save_object(self, obj_form, request): """ Provide a hook to modify the object immediately before saving it (e.g. to encrypt secret data). """ return obj_form.save() def create_and_update_objects(self, form, request): - created_objects = [] - updated_objects = [] + saved_objects = [] records = list(form.cleaned_data['data']) @@ -400,12 +399,8 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): restrict_form_fields(model_form, request.user) if model_form.is_valid(): - if object_id: - obj = self._save_obj(model_form, request) - updated_objects.append(obj) - else: - obj = self._create_object(request, model_form) - created_objects.append(obj) + obj = self._save_object(model_form, request) + saved_objects.append(obj) else: # Replicate model form errors for display for field, errors in model_form.errors.items(): @@ -417,7 +412,7 @@ class BulkImportView(GetReturnURLMixin, BaseMultiObjectView): raise ValidationError("") - return [*created_objects, *updated_objects] + return saved_objects # # Request handlers diff --git a/netbox/utilities/forms/forms.py b/netbox/utilities/forms/forms.py index b63b78895..0569853b8 100644 --- a/netbox/utilities/forms/forms.py +++ b/netbox/utilities/forms/forms.py @@ -123,8 +123,9 @@ class CSVModelForm(forms.ModelForm): """ ModelForm used for the import of objects in CSV format. """ - def __init__(self, *args, headers=None, **kwargs): + def __init__(self, *args, headers=None, fields=None, **kwargs): headers = headers or {} + fields = fields or [] super().__init__(*args, **kwargs) # Modify the model form to accommodate any customized to_field_name properties @@ -132,6 +133,13 @@ class CSVModelForm(forms.ModelForm): if to_field is not None: self.fields[field].to_field_name = to_field + # Omit any fields not specified (e.g. because the form is being used to + # updated rather than create objects) + if fields: + for field in list(self.fields.keys()): + if field not in fields: + del self.fields[field] + class ImportForm(BootstrapMixin, forms.Form): data = forms.CharField(