Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
32 changes: 20 additions & 12 deletions netbox/virtualization/forms/model_forms.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
from django import forms
from django.apps import apps
from django.contrib.contenttypes.models import ContentType
from django.core.exceptions import ValidationError
from django.utils.translation import gettext_lazy as _
Expand Down Expand Up @@ -143,19 +144,26 @@ def __init__(self, cluster, *args, **kwargs):
def clean(self):
super().clean()

# If the Cluster is assigned to a Site, all Devices must be assigned to that Site.
if self.cluster.site is not None:
# If the Cluster is assigned to a Site or Location, all Devices must be assigned to that same scope.
if self.cluster.scope is not None:
for device in self.cleaned_data.get('devices', []):
if device.site != self.cluster.site:
raise ValidationError({
'devices': _(
"{device} belongs to a different site ({device_site}) than the cluster ({cluster_site})"
).format(
device=device,
device_site=device.site,
cluster_site=self.cluster.site
)
})
for scope_field in ['site', 'location']:
device_scope = getattr(device, scope_field)
if (
self.cluster.scope_type.model_class() == apps.get_model('dcim', scope_field)
and device_scope != self.cluster.scope
):
raise ValidationError({
'devices': _(
"{device} belongs to a different {scope_field} ({device_scope}) than the "
"cluster ({cluster_scope})"
).format(
device=device,
scope_field=scope_field,
device_scope=device_scope,
cluster_scope=self.cluster.scope
)
})


class ClusterRemoveDevicesForm(ConfirmationForm):
Expand Down
Loading