From f661c233be6144a943aed1310367bf38207373dc Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Mon, 13 Mar 2017 11:18:33 -0400 Subject: [PATCH] Fixes #950: Fix site_id error on child device import --- netbox/dcim/forms.py | 16 ++++++++++++---- netbox/dcim/models.py | 21 +++++++++++---------- netbox/dcim/views.py | 5 ++++- 3 files changed, 27 insertions(+), 15 deletions(-) diff --git a/netbox/dcim/forms.py b/netbox/dcim/forms.py index 9bfe8e84d..abe98e51a 100644 --- a/netbox/dcim/forms.py +++ b/netbox/dcim/forms.py @@ -680,13 +680,21 @@ class DeviceFromCSVForm(BaseDeviceFromCSVForm): class ChildDeviceFromCSVForm(BaseDeviceFromCSVForm): - parent = FlexibleModelChoiceField(queryset=Device.objects.all(), to_field_name='name', required=False, - error_messages={'invalid_choice': 'Parent device not found.'}) + parent = FlexibleModelChoiceField( + queryset=Device.objects.all(), + to_field_name='name', + required=False, + error_messages={ + 'invalid_choice': 'Parent device not found.' + } + ) device_bay_name = forms.CharField(required=False) class Meta(BaseDeviceFromCSVForm.Meta): - fields = ['name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag', - 'parent', 'device_bay_name'] + fields = [ + 'name', 'device_role', 'tenant', 'manufacturer', 'model_name', 'platform', 'serial', 'asset_tag', 'parent', + 'device_bay_name', + ] def clean(self): diff --git a/netbox/dcim/models.py b/netbox/dcim/models.py index b7a0b4492..73678ae1c 100644 --- a/netbox/dcim/models.py +++ b/netbox/dcim/models.py @@ -975,25 +975,26 @@ class Device(CreatedUpdatedModel, CustomFieldModel): # Child devices cannot be assigned to a rack face/unit if self.device_type.is_child_device and self.face is not None: raise ValidationError({ - 'face': "Child device types cannot be assigned to a rack face. This is an attribute of the parent " - "device." + 'face': "Child device types cannot be assigned to a rack face. This is an attribute of the " + "parent device." }) if self.device_type.is_child_device and self.position: raise ValidationError({ - 'position': "Child device types cannot be assigned to a rack position. This is an attribute of the " - "parent device." + 'position': "Child device types cannot be assigned to a rack position. This is an attribute of " + "the parent device." }) # Validate rack space rack_face = self.face if not self.device_type.is_full_depth else None exclude_list = [self.pk] if self.pk else [] try: - available_units = self.rack.get_available_units(u_height=self.device_type.u_height, rack_face=rack_face, - exclude=exclude_list) + available_units = self.rack.get_available_units( + u_height=self.device_type.u_height, rack_face=rack_face, exclude=exclude_list + ) if self.position and self.position not in available_units: raise ValidationError({ - 'position': "U{} is already occupied or does not have sufficient space to accommodate a(n) {} " - "({}U).".format(self.position, self.device_type, self.device_type.u_height) + 'position': "U{} is already occupied or does not have sufficient space to accommodate a(n) " + "{} ({}U).".format(self.position, self.device_type, self.device_type.u_height) }) except Rack.DoesNotExist: pass @@ -1034,8 +1035,8 @@ class Device(CreatedUpdatedModel, CustomFieldModel): self.device_type.device_bay_templates.all()] ) - # Update Rack assignment for any child Devices - Device.objects.filter(parent_bay__device=self).update(rack=self.rack) + # Update Site and Rack assignment for any child Devices + Device.objects.filter(parent_bay__device=self).update(site=self.site, rack=self.rack) def to_csv(self): return csv_format([ diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index 73de16e53..cb307324e 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -763,9 +763,12 @@ class ChildDeviceBulkImportView(PermissionRequiredMixin, BulkImportView): default_return_url = 'dcim:device_list' def save_obj(self, obj): - # Inherent rack from parent device + + # Inherit site and rack from parent device + obj.site = obj.parent_bay.device.site obj.rack = obj.parent_bay.device.rack obj.save() + # Save the reverse relation device_bay = obj.parent_bay device_bay.installed_device = obj