Skip to content

Commit

Permalink
Fixes netbox-community#950: Fix site_id error on child device import
Browse files Browse the repository at this point in the history
  • Loading branch information
jeremystretch committed Mar 13, 2017
1 parent d9591b8 commit 858d473
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 15 deletions.
16 changes: 12 additions & 4 deletions netbox/dcim/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -680,13 +680,21 @@ def clean_face(self):


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):

Expand Down
21 changes: 11 additions & 10 deletions netbox/dcim/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -975,25 +975,26 @@ def clean(self):
# 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
Expand Down Expand Up @@ -1034,8 +1035,8 @@ def save(self, *args, **kwargs):
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([
Expand Down
5 changes: 4 additions & 1 deletion netbox/dcim/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 858d473

Please sign in to comment.