diff --git a/netbox/dcim/forms/common.py b/netbox/dcim/forms/common.py index 515ff9b83..031d4cdf5 100644 --- a/netbox/dcim/forms/common.py +++ b/netbox/dcim/forms/common.py @@ -72,7 +72,6 @@ class ModuleCommonForm(forms.Form): def _get_module_bay_tree(self, module_bay): module_bays = [] - all_module_bays = module.device.modulebays.all().select_related('module') while module_bay: module_bays.append(module_bay) if module_bay.module: diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index adc543d79..660dbe935 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -1116,19 +1116,14 @@ class ModuleBay(ModularComponentModel, TrackingModelMixin): def clean(self): super().clean() - # Check for recursion of moduleX -> module bay -> modulex + # Check for recursion if module := self.module: - all_module_bays = self.device.modulebays.all().select_related('module') - found = [] + tree = [] while module: - if module.id in found: - raise ValidationError(_("Cannot have a recursion in Module Bay -> Module relationships.")) - - found.append(module.id) - if module.module_bay: - module = module.module_bay.module - else: - module = None + if module.pk in tree: + raise ValidationError(_("A module bay cannot belong to a module installed within it.")) + tree.append(module.pk) + module = module.module_bay.module if module.module_bay else None class DeviceBay(ComponentModel, TrackingModelMixin): diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 9cf1fbd1d..ad093d6b8 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -1203,19 +1203,14 @@ class Module(PrimaryModel, ConfigContextModel): ) ) - # Check for recursion of moduleX -> module bay -> modulex + # Check for recursion module = self - all_module_bays = self.device.modulebays.all().select_related('module') - found = [] + tree = [] while module: - if module.id in found: - raise ValidationError(_("Cannot have a recursion in Module Bay -> Module relationships.")) - - found.append(module.id) - if module.module_bay: - module = module.module_bay.module - else: - module = None + if module.pk in tree: + raise ValidationError(_("A module cannot be installed in a bay which depends on itself.")) + tree.append(module.pk) + module = module.module_bay.module if module.module_bay else None def save(self, *args, **kwargs): is_new = self.pk is None