diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py index da50b8f2a..579851651 100644 --- a/netbox/dcim/forms/models.py +++ b/netbox/dcim/forms/models.py @@ -1610,6 +1610,13 @@ class InventoryItemForm(DeviceComponentForm): ('Hardware', ('manufacturer', 'part_id', 'serial', 'asset_tag')), ) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + + # Specifically allow editing the device of IntentoryItems + if self.instance.pk: + self.fields['device'].disabled = False + class Meta: model = InventoryItem fields = [ diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index ce768e439..b425d8dbd 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -1153,3 +1153,20 @@ class InventoryItem(MPTTModel, ComponentModel): raise ValidationError({ "parent": "Cannot assign self as parent." }) + + # Validation for moving InventoryItems + if self.pk: + # Cannot move an InventoryItem to another device if it has a parent + if self.parent and self.parent.device != self.device: + raise ValidationError({ + "parent": "Parent inventory item does not belong to the same device." + }) + + # Prevent moving InventoryItems with children + first_child = self.get_children().first() + if first_child and first_child.device != self.device: + raise ValidationError("Cannot move an InventoryItem with dependent children") + + # When moving an InventoryItem to another device, remove any associated component + if self.component and self.component.device != self.device: + self.component = None \ No newline at end of file