mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Fixes #6117: Handle exception when attempting to assign an MPTT-enabled model as its own parent
This commit is contained in:
@ -17,6 +17,7 @@
|
|||||||
* [#6073](https://github.com/netbox-community/netbox/issues/6073) - Permit users to manage their own REST API tokens without needing explicit permission
|
* [#6073](https://github.com/netbox-community/netbox/issues/6073) - Permit users to manage their own REST API tokens without needing explicit permission
|
||||||
* [#6081](https://github.com/netbox-community/netbox/issues/6081) - Fix interface connections REST API endpoint
|
* [#6081](https://github.com/netbox-community/netbox/issues/6081) - Fix interface connections REST API endpoint
|
||||||
* [#6108](https://github.com/netbox-community/netbox/issues/6108) - Do not infer tenant assignment from parent objects for prefixes, IP addresses
|
* [#6108](https://github.com/netbox-community/netbox/issues/6108) - Do not infer tenant assignment from parent objects for prefixes, IP addresses
|
||||||
|
* [#6117](https://github.com/netbox-community/netbox/issues/6117) - Handle exception when attempting to assign an MPTT-enabled model as its own parent
|
||||||
* [#6131](https://github.com/netbox-community/netbox/issues/6131) - Correct handling of boolean fields when cloning objects
|
* [#6131](https://github.com/netbox-community/netbox/issues/6131) - Correct handling of boolean fields when cloning objects
|
||||||
|
|
||||||
---
|
---
|
||||||
|
@ -111,6 +111,12 @@ class RackGroup(MPTTModel, ChangeLoggedModel):
|
|||||||
def clean(self):
|
def clean(self):
|
||||||
super().clean()
|
super().clean()
|
||||||
|
|
||||||
|
# An MPTT model cannot be its own parent
|
||||||
|
if self.pk and self.parent_id == self.pk:
|
||||||
|
raise ValidationError({
|
||||||
|
"parent": "Cannot assign self as parent."
|
||||||
|
})
|
||||||
|
|
||||||
# Parent RackGroup (if any) must belong to the same Site
|
# Parent RackGroup (if any) must belong to the same Site
|
||||||
if self.parent and self.parent.site != self.site:
|
if self.parent and self.parent.site != self.site:
|
||||||
raise ValidationError(f"Parent rack group ({self.parent}) must belong to the same site ({self.site})")
|
raise ValidationError(f"Parent rack group ({self.parent}) must belong to the same site ({self.site})")
|
||||||
|
@ -7,6 +7,7 @@ from timezone_field import TimeZoneField
|
|||||||
|
|
||||||
from dcim.choices import *
|
from dcim.choices import *
|
||||||
from dcim.constants import *
|
from dcim.constants import *
|
||||||
|
from django.core.exceptions import ValidationError
|
||||||
from dcim.fields import ASNField
|
from dcim.fields import ASNField
|
||||||
from extras.models import ChangeLoggedModel, CustomFieldModel, ObjectChange, TaggedItem
|
from extras.models import ChangeLoggedModel, CustomFieldModel, ObjectChange, TaggedItem
|
||||||
from extras.utils import extras_features
|
from extras.utils import extras_features
|
||||||
@ -87,6 +88,15 @@ class Region(MPTTModel, ChangeLoggedModel):
|
|||||||
object_data=serialize_object(self, exclude=['level', 'lft', 'rght', 'tree_id'])
|
object_data=serialize_object(self, exclude=['level', 'lft', 'rght', 'tree_id'])
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
super().clean()
|
||||||
|
|
||||||
|
# An MPTT model cannot be its own parent
|
||||||
|
if self.pk and self.parent_id == self.pk:
|
||||||
|
raise ValidationError({
|
||||||
|
"parent": "Cannot assign self as parent."
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Sites
|
# Sites
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
from django.core.exceptions import ValidationError
|
||||||
from django.db import models
|
from django.db import models
|
||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from mptt.models import MPTTModel, TreeForeignKey
|
from mptt.models import MPTTModel, TreeForeignKey
|
||||||
@ -74,6 +75,15 @@ class TenantGroup(MPTTModel, ChangeLoggedModel):
|
|||||||
object_data=serialize_object(self, exclude=['level', 'lft', 'rght', 'tree_id'])
|
object_data=serialize_object(self, exclude=['level', 'lft', 'rght', 'tree_id'])
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
super().clean()
|
||||||
|
|
||||||
|
# An MPTT model cannot be its own parent
|
||||||
|
if self.pk and self.parent_id == self.pk:
|
||||||
|
raise ValidationError({
|
||||||
|
"parent": "Cannot assign self as parent."
|
||||||
|
})
|
||||||
|
|
||||||
|
|
||||||
@extras_features('custom_fields', 'custom_links', 'export_templates', 'webhooks')
|
@extras_features('custom_fields', 'custom_links', 'export_templates', 'webhooks')
|
||||||
class Tenant(ChangeLoggedModel, CustomFieldModel):
|
class Tenant(ChangeLoggedModel, CustomFieldModel):
|
||||||
|
Reference in New Issue
Block a user