18981 Make Device Roles Hierarchical

This commit is contained in:
Arthur 2025-03-25 13:04:06 -07:00
parent fe7cc8cae9
commit b5b1827893
4 changed files with 90 additions and 1 deletions

View File

@ -338,6 +338,8 @@ class InventoryItemTemplateType(ComponentTemplateType):
pagination=True
)
class DeviceRoleType(OrganizationalObjectType):
parent: Annotated['DeviceRoleType', strawberry.lazy('dcim.graphql.types')] | None
children: List[Annotated['DeviceRoleType', strawberry.lazy('dcim.graphql.types')]]
color: str
config_template: Annotated["ConfigTemplateType", strawberry.lazy('extras.graphql.types')] | None

View File

@ -0,0 +1,56 @@
# Generated by Django 5.1.7 on 2025-03-25 18:06
import django.db.models.manager
import mptt.fields
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('dcim', '0202_location_comments_region_comments_sitegroup_comments'),
]
operations = [
migrations.AlterModelManagers(
name='devicerole',
managers=[
('_tree_manager', django.db.models.manager.Manager()),
],
),
migrations.AddField(
model_name='devicerole',
name='level',
field=models.PositiveIntegerField(default=0, editable=False),
preserve_default=False,
),
migrations.AddField(
model_name='devicerole',
name='lft',
field=models.PositiveIntegerField(default=0, editable=False),
preserve_default=False,
),
migrations.AddField(
model_name='devicerole',
name='rght',
field=models.PositiveIntegerField(default=0, editable=False),
preserve_default=False,
),
migrations.AddField(
model_name='devicerole',
name='tree_id',
field=models.PositiveIntegerField(db_index=True, default=0, editable=False),
preserve_default=False,
),
migrations.AddField(
model_name='devicerole',
name='parent',
field=mptt.fields.TreeForeignKey(
blank=True,
null=True,
on_delete=django.db.models.deletion.CASCADE,
related_name='children',
to='dcim.devicerole',
),
),
]

View File

@ -0,0 +1,22 @@
from django.db import migrations
import mptt
import mptt.managers
def rebuild_mptt(apps, schema_editor):
manager = mptt.managers.TreeManager()
DeviceRole = apps.get_model('dcim', 'DeviceRole')
manager.model = DeviceRole
mptt.register(DeviceRole)
manager.contribute_to_class(DeviceRole, 'objects')
manager.rebuild()
class Migration(migrations.Migration):
dependencies = [
('dcim', '0203_device_role_nested'),
]
operations = [
migrations.RunPython(code=rebuild_mptt, reverse_code=migrations.RunPython.noop),
]

View File

@ -21,6 +21,7 @@ from dcim.constants import *
from dcim.fields import MACAddressField
from extras.models import ConfigContextModel, CustomField
from extras.querysets import ConfigContextModelQuerySet
from mptt.models import MPTTModel, TreeForeignKey
from netbox.choices import ColorChoices
from netbox.config import ConfigItem
from netbox.models import OrganizationalModel, PrimaryModel
@ -468,12 +469,20 @@ class ModuleType(ImageAttachmentsMixin, PrimaryModel, WeightMixin):
# Devices
#
class DeviceRole(OrganizationalModel):
class DeviceRole(OrganizationalModel, MPTTModel):
"""
Devices are organized by functional role; for example, "Core Switch" or "File Server". Each DeviceRole is assigned a
color to be used when displaying rack elevations. The vm_role field determines whether the role is applicable to
virtual machines as well.
"""
parent = TreeForeignKey(
to='self',
on_delete=models.CASCADE,
related_name='children',
blank=True,
null=True,
db_index=True
)
color = ColorField(
verbose_name=_('color'),
default=ColorChoices.COLOR_GREY