From 0cda10a204247993b39f50e5ec9564ec46c87c3d Mon Sep 17 00:00:00 2001 From: bctiemann Date: Mon, 30 Dec 2024 12:36:46 -0500 Subject: [PATCH] Fixes: #18203 - Validate that scope is selected if scope type is specified (#18254) * Validate that a scope has been selected if a scope_type is specified, on CachedScopeMixin models * Cleaner logic * Call super().clean() after validating scope_type/scope --- netbox/dcim/models/mixins.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/netbox/dcim/models/mixins.py b/netbox/dcim/models/mixins.py index ac4d7dab9..a0fc15a25 100644 --- a/netbox/dcim/models/mixins.py +++ b/netbox/dcim/models/mixins.py @@ -1,6 +1,8 @@ from django.apps import apps from django.contrib.contenttypes.fields import GenericForeignKey +from django.core.exceptions import ValidationError from django.db import models +from django.utils.translation import gettext_lazy as _ from dcim.constants import LOCATION_SCOPE_TYPES __all__ = ( @@ -84,6 +86,16 @@ class CachedScopeMixin(models.Model): class Meta: abstract = True + def clean(self): + if self.scope_type and not self.scope: + scope_type = self.scope_type.model_class() + raise ValidationError({ + 'scope': _( + "Please select a {scope_type}." + ).format(scope_type=scope_type._meta.model_name) + }) + super().clean() + def save(self, *args, **kwargs): # Cache objects associated with the terminating object (for filtering) self.cache_related_objects()