Просмотр исходного кода

Fixes: #18373 - Fix validation of site in Assign Device to Cluster flow (#18375)

* Fix validation of site in Assign Device to Cluster flow

* Validate Location as well as Site scope
bctiemann 1 год назад
Родитель
Сommit
993d8f1480
1 измененных файлов с 20 добавлено и 12 удалено
  1. 20 12
      netbox/virtualization/forms/model_forms.py

+ 20 - 12
netbox/virtualization/forms/model_forms.py

@@ -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 _
@@ -143,19 +144,26 @@ class ClusterAddDevicesForm(forms.Form):
     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):