This commit is contained in:
Arthur Hanson 2025-12-08 19:07:14 +00:00 committed by GitHub
commit e40e8b2b43
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
66 changed files with 280 additions and 81 deletions

View File

@ -38,7 +38,7 @@ class CircuitTypeSerializer(OrganizationalModelSerializer):
class Meta:
model = CircuitType
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'owner', 'tags',
'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'owner', 'comments', 'tags',
'custom_fields', 'created', 'last_updated', 'circuit_count',
]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'circuit_count')
@ -71,7 +71,7 @@ class CircuitGroupSerializer(OrganizationalModelSerializer):
class Meta:
model = CircuitGroup
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tenant', 'owner', 'tags',
'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'tenant', 'owner', 'comments', 'tags',
'custom_fields', 'created', 'last_updated', 'circuit_count'
]
brief_fields = ('id', 'url', 'display', 'name')
@ -161,7 +161,7 @@ class VirtualCircuitTypeSerializer(OrganizationalModelSerializer):
class Meta:
model = VirtualCircuitType
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'owner', 'tags',
'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'owner', 'comments', 'tags',
'custom_fields', 'created', 'last_updated', 'virtual_circuit_count',
]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'virtual_circuit_count')

View File

@ -99,7 +99,7 @@ class CircuitTypeBulkEditForm(OrganizationalModelBulkEditForm):
fieldsets = (
FieldSet('color', 'description'),
)
nullable_fields = ('color', 'description')
nullable_fields = ('color', 'description', 'comments')
class CircuitBulkEditForm(PrimaryModelBulkEditForm):
@ -241,7 +241,7 @@ class CircuitGroupBulkEditForm(OrganizationalModelBulkEditForm):
model = CircuitGroup
nullable_fields = (
'description', 'tenant',
'description', 'tenant', 'comments',
)
@ -274,7 +274,7 @@ class VirtualCircuitTypeBulkEditForm(OrganizationalModelBulkEditForm):
fieldsets = (
FieldSet('color', 'description'),
)
nullable_fields = ('color', 'description')
nullable_fields = ('color', 'description', 'comments')
class VirtualCircuitBulkEditForm(PrimaryModelBulkEditForm):

View File

@ -73,7 +73,7 @@ class CircuitTypeImportForm(OrganizationalModelImportForm):
class Meta:
model = CircuitType
fields = ('name', 'slug', 'color', 'description', 'owner', 'tags')
fields = ('name', 'slug', 'color', 'description', 'owner', 'comments', 'tags')
class CircuitImportForm(PrimaryModelImportForm):
@ -176,7 +176,7 @@ class CircuitGroupImportForm(OrganizationalModelImportForm):
class Meta:
model = CircuitGroup
fields = ('name', 'slug', 'description', 'tenant', 'owner', 'tags')
fields = ('name', 'slug', 'description', 'tenant', 'owner', 'comments', 'tags')
class CircuitGroupAssignmentImportForm(NetBoxModelImportForm):
@ -199,7 +199,7 @@ class VirtualCircuitTypeImportForm(OrganizationalModelImportForm):
class Meta:
model = VirtualCircuitType
fields = ('name', 'slug', 'color', 'description', 'owner', 'tags')
fields = ('name', 'slug', 'color', 'description', 'owner', 'comments', 'tags')
class VirtualCircuitImportForm(PrimaryModelImportForm):

View File

@ -97,7 +97,7 @@ class CircuitTypeForm(OrganizationalModelForm):
class Meta:
model = CircuitType
fields = [
'name', 'slug', 'color', 'description', 'tags',
'name', 'slug', 'color', 'description', 'comments', 'tags',
]
@ -236,7 +236,7 @@ class CircuitGroupForm(TenancyForm, OrganizationalModelForm):
class Meta:
model = CircuitGroup
fields = [
'name', 'slug', 'description', 'tenant_group', 'tenant', 'owner', 'tags',
'name', 'slug', 'description', 'tenant_group', 'tenant', 'owner', 'comments', 'tags',
]
@ -307,7 +307,7 @@ class VirtualCircuitTypeForm(OrganizationalModelForm):
class Meta:
model = VirtualCircuitType
fields = [
'name', 'slug', 'color', 'description', 'owner', 'tags',
'name', 'slug', 'color', 'description', 'owner', 'comments', 'tags',
]

View File

@ -0,0 +1,28 @@
# Generated by Django 5.2.8 on 2025-12-08 17:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('circuits', '0054_cable_position'),
]
operations = [
migrations.AddField(
model_name='circuitgroup',
name='comments',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='circuittype',
name='comments',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='virtualcircuittype',
name='comments',
field=models.TextField(blank=True),
),
]

View File

@ -20,6 +20,7 @@ class CircuitGroupIndex(SearchIndex):
('name', 100),
('slug', 110),
('description', 500),
('comments', 5000),
)
display_attrs = ('description',)
@ -44,6 +45,7 @@ class CircuitTypeIndex(SearchIndex):
('name', 100),
('slug', 110),
('description', 500),
('comments', 5000),
)
display_attrs = ('description',)
@ -109,5 +111,6 @@ class VirtualCircuitTypeIndex(SearchIndex):
('name', 100),
('slug', 110),
('description', 500),
('comments', 5000),
)
display_attrs = ('description',)

View File

@ -40,8 +40,8 @@ class CircuitTypeTable(OrganizationalModelTable):
class Meta(OrganizationalModelTable.Meta):
model = CircuitType
fields = (
'pk', 'id', 'name', 'circuit_count', 'color', 'description', 'slug', 'tags', 'created', 'last_updated',
'actions',
'pk', 'id', 'name', 'circuit_count', 'color', 'description', 'slug', 'comments', 'tags', 'created',
'last_updated', 'actions',
)
default_columns = ('pk', 'name', 'circuit_count', 'color', 'description')
@ -175,7 +175,7 @@ class CircuitGroupTable(OrganizationalModelTable):
class Meta(OrganizationalModelTable.Meta):
model = CircuitGroup
fields = (
'pk', 'name', 'description', 'circuit_group_assignment_count', 'tags',
'pk', 'name', 'description', 'circuit_group_assignment_count', 'comments', 'tags',
'created', 'last_updated', 'actions',
)
default_columns = ('pk', 'name', 'description', 'circuit_group_assignment_count')

View File

@ -17,7 +17,7 @@ class ManufacturerSerializer(OrganizationalModelSerializer):
class Meta:
model = Manufacturer
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'tags', 'custom_fields',
'created', 'last_updated', 'devicetype_count', 'inventoryitem_count', 'platform_count',
'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'comments', 'tags',
'custom_fields', 'created', 'last_updated', 'devicetype_count', 'inventoryitem_count', 'platform_count',
]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'devicetype_count')

View File

@ -30,7 +30,7 @@ class RackRoleSerializer(OrganizationalModelSerializer):
class Meta:
model = RackRole
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'owner', 'tags',
'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'owner', 'comments', 'tags',
'custom_fields', 'created', 'last_updated', 'rack_count',
]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'rack_count')

View File

@ -38,7 +38,7 @@ class InventoryItemRoleSerializer(OrganizationalModelSerializer):
class Meta:
model = InventoryItemRole
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'owner', 'tags',
'id', 'url', 'display_url', 'display', 'name', 'slug', 'color', 'description', 'owner', 'comments', 'tags',
'custom_fields', 'created', 'last_updated', 'inventoryitem_count',
]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'inventoryitem_count')

View File

@ -208,7 +208,7 @@ class RackRoleBulkEditForm(OrganizationalModelBulkEditForm):
fieldsets = (
FieldSet('color', 'description'),
)
nullable_fields = ('color', 'description')
nullable_fields = ('color', 'description', 'comments')
class RackTypeBulkEditForm(PrimaryModelBulkEditForm):
@ -474,7 +474,7 @@ class ManufacturerBulkEditForm(OrganizationalModelBulkEditForm):
fieldsets = (
FieldSet('description'),
)
nullable_fields = ('description',)
nullable_fields = ('description', 'comments')
class DeviceTypeBulkEditForm(PrimaryModelBulkEditForm):
@ -1719,7 +1719,7 @@ class InventoryItemRoleBulkEditForm(OrganizationalModelBulkEditForm):
fieldsets = (
FieldSet('color', 'description'),
)
nullable_fields = ('color', 'description')
nullable_fields = ('color', 'description', 'comments')
class VirtualDeviceContextBulkEditForm(PrimaryModelBulkEditForm):

View File

@ -183,7 +183,7 @@ class RackRoleImportForm(OrganizationalModelImportForm):
class Meta:
model = RackRole
fields = ('name', 'slug', 'color', 'description', 'owner', 'tags')
fields = ('name', 'slug', 'color', 'description', 'owner', 'comments', 'tags')
class RackTypeImportForm(PrimaryModelImportForm):
@ -400,7 +400,7 @@ class ManufacturerImportForm(OrganizationalModelImportForm):
class Meta:
model = Manufacturer
fields = ('name', 'slug', 'description', 'owner', 'tags')
fields = ('name', 'slug', 'description', 'owner', 'comments', 'tags')
class DeviceTypeImportForm(PrimaryModelImportForm):
@ -1311,7 +1311,7 @@ class InventoryItemRoleImportForm(OrganizationalModelImportForm):
class Meta:
model = InventoryItemRole
fields = ('name', 'slug', 'color', 'description')
fields = ('name', 'slug', 'color', 'description', 'owner', 'comments')
#

View File

@ -201,7 +201,7 @@ class RackRoleForm(OrganizationalModelForm):
class Meta:
model = RackRole
fields = [
'name', 'slug', 'color', 'description', 'owner', 'tags',
'name', 'slug', 'color', 'description', 'owner', 'comments', 'tags',
]
@ -344,7 +344,7 @@ class ManufacturerForm(OrganizationalModelForm):
class Meta:
model = Manufacturer
fields = [
'name', 'slug', 'description', 'owner', 'tags',
'name', 'slug', 'description', 'owner', 'comments', 'tags',
]
@ -1815,7 +1815,7 @@ class InventoryItemRoleForm(OrganizationalModelForm):
class Meta:
model = InventoryItemRole
fields = [
'name', 'slug', 'color', 'description', 'owner', 'tags',
'name', 'slug', 'color', 'description', 'owner', 'comments', 'tags',
]

View File

@ -0,0 +1,28 @@
# Generated by Django 5.2.8 on 2025-12-08 17:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('dcim', '0221_cable_position'),
]
operations = [
migrations.AddField(
model_name='inventoryitemrole',
name='comments',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='manufacturer',
name='comments',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='rackrole',
name='comments',
field=models.TextField(blank=True),
),
]

View File

@ -137,6 +137,18 @@ class InventoryItemIndex(SearchIndex):
display_attrs = ('device', 'manufacturer', 'parent', 'part_id', 'serial', 'asset_tag', 'description')
@register_search
class InventoryItemRoleIndex(SearchIndex):
model = models.InventoryItemRole
fields = (
('name', 100),
('slug', 110),
('description', 500),
('comments', 5000),
)
display_attrs = ('description',)
@register_search
class LocationIndex(SearchIndex):
model = models.Location
@ -157,6 +169,7 @@ class ManufacturerIndex(SearchIndex):
('name', 100),
('slug', 110),
('description', 500),
('comments', 5000),
)
display_attrs = ('description',)
@ -308,6 +321,7 @@ class RackRoleIndex(SearchIndex):
('name', 100),
('slug', 110),
('description', 500),
('comments', 5000),
)
display_attrs = ('description',)

View File

@ -1053,7 +1053,7 @@ class InventoryItemRoleTable(OrganizationalModelTable):
class Meta(OrganizationalModelTable.Meta):
model = models.InventoryItemRole
fields = (
'pk', 'id', 'name', 'inventoryitem_count', 'color', 'description', 'slug', 'tags', 'actions',
'pk', 'id', 'name', 'inventoryitem_count', 'color', 'description', 'slug', 'comments', 'tags', 'actions',
)
default_columns = ('pk', 'name', 'inventoryitem_count', 'color', 'description')

View File

@ -64,7 +64,8 @@ class ManufacturerTable(ContactsColumnMixin, OrganizationalModelTable):
model = models.Manufacturer
fields = (
'pk', 'id', 'name', 'racktype_count', 'devicetype_count', 'moduletype_count', 'inventoryitem_count',
'platform_count', 'description', 'slug', 'tags', 'contacts', 'actions', 'created', 'last_updated',
'platform_count', 'description', 'slug', 'comments', 'tags', 'contacts', 'actions', 'created',
'last_updated',
)
default_columns = (
'pk', 'name', 'racktype_count', 'devicetype_count', 'moduletype_count', 'inventoryitem_count',

View File

@ -35,7 +35,7 @@ class RackRoleTable(OrganizationalModelTable):
class Meta(OrganizationalModelTable.Meta):
model = RackRole
fields = (
'pk', 'id', 'name', 'rack_count', 'color', 'description', 'slug', 'tags', 'actions', 'created',
'pk', 'id', 'name', 'rack_count', 'color', 'description', 'slug', 'comments', 'tags', 'actions', 'created',
'last_updated',
)
default_columns = ('pk', 'name', 'rack_count', 'color', 'description')

View File

@ -21,8 +21,8 @@ class RIRSerializer(OrganizationalModelSerializer):
class Meta:
model = RIR
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'is_private', 'description', 'owner', 'tags',
'custom_fields', 'created', 'last_updated', 'aggregate_count',
'id', 'url', 'display_url', 'display', 'name', 'slug', 'is_private', 'description', 'owner', 'comments',
'tags', 'custom_fields', 'created', 'last_updated', 'aggregate_count',
]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'aggregate_count')
@ -36,7 +36,7 @@ class ASNRangeSerializer(OrganizationalModelSerializer):
model = ASNRange
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'rir', 'start', 'end', 'tenant', 'description',
'owner', 'tags', 'custom_fields', 'created', 'last_updated', 'asn_count',
'owner', 'comments', 'tags', 'custom_fields', 'created', 'last_updated', 'asn_count',
]
brief_fields = ('id', 'url', 'display', 'name', 'description')

View File

@ -16,7 +16,7 @@ class RoleSerializer(OrganizationalModelSerializer):
class Meta:
model = Role
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'weight', 'description', 'owner', 'tags',
'id', 'url', 'display_url', 'display', 'name', 'slug', 'weight', 'description', 'owner', 'comments', 'tags',
'custom_fields', 'created', 'last_updated', 'prefix_count', 'vlan_count',
]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'prefix_count', 'vlan_count')

View File

@ -45,8 +45,8 @@ class VLANGroupSerializer(OrganizationalModelSerializer):
model = VLANGroup
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'scope_type', 'scope_id', 'scope', 'vid_ranges',
'tenant', 'description', 'owner', 'tags', 'custom_fields', 'created', 'last_updated', 'vlan_count',
'utilization',
'tenant', 'description', 'owner', 'comments', 'tags', 'custom_fields', 'created', 'last_updated',
'vlan_count', 'utilization',
]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'vlan_count')
validators = []

View File

@ -85,7 +85,7 @@ class RIRBulkEditForm(OrganizationalModelBulkEditForm):
fieldsets = (
FieldSet('is_private', 'description'),
)
nullable_fields = ('is_private', 'description')
nullable_fields = ('is_private', 'description', 'comments')
class ASNRangeBulkEditForm(OrganizationalModelBulkEditForm):
@ -104,7 +104,7 @@ class ASNRangeBulkEditForm(OrganizationalModelBulkEditForm):
fieldsets = (
FieldSet('rir', 'tenant', 'description'),
)
nullable_fields = ('description',)
nullable_fields = ('description', 'comments')
class ASNBulkEditForm(PrimaryModelBulkEditForm):
@ -164,7 +164,7 @@ class RoleBulkEditForm(OrganizationalModelBulkEditForm):
fieldsets = (
FieldSet('weight', 'description'),
)
nullable_fields = ('description',)
nullable_fields = ('description', 'comments')
class PrefixBulkEditForm(ScopedBulkEditForm, PrimaryModelBulkEditForm):
@ -379,7 +379,7 @@ class VLANGroupBulkEditForm(OrganizationalModelBulkEditForm):
FieldSet('scope_type', 'scope', name=_('Scope')),
FieldSet('tenant', name=_('Tenancy')),
)
nullable_fields = ('description', 'scope')
nullable_fields = ('description', 'scope', 'comments')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

View File

@ -84,7 +84,7 @@ class RIRImportForm(OrganizationalModelImportForm):
class Meta:
model = RIR
fields = ('name', 'slug', 'is_private', 'description', 'owner', 'tags')
fields = ('name', 'slug', 'is_private', 'description', 'owner', 'comments', 'tags')
class AggregateImportForm(PrimaryModelImportForm):
@ -124,7 +124,7 @@ class ASNRangeImportForm(OrganizationalModelImportForm):
class Meta:
model = ASNRange
fields = ('name', 'slug', 'rir', 'start', 'end', 'tenant', 'description', 'owner', 'tags')
fields = ('name', 'slug', 'rir', 'start', 'end', 'tenant', 'description', 'owner', 'comments', 'tags')
class ASNImportForm(PrimaryModelImportForm):
@ -151,7 +151,7 @@ class RoleImportForm(OrganizationalModelImportForm):
class Meta:
model = Role
fields = ('name', 'slug', 'weight', 'description', 'owner', 'tags')
fields = ('name', 'slug', 'weight', 'description', 'owner', 'comments', 'tags')
class PrefixImportForm(ScopedImportForm, PrimaryModelImportForm):
@ -476,7 +476,9 @@ class VLANGroupImportForm(OrganizationalModelImportForm):
class Meta:
model = VLANGroup
fields = ('name', 'slug', 'scope_type', 'scope_id', 'vid_ranges', 'tenant', 'description', 'owner', 'tags')
fields = (
'name', 'slug', 'scope_type', 'scope_id', 'vid_ranges', 'tenant', 'description', 'owner', 'comments', 'tags'
)
labels = {
'scope_id': 'Scope ID',
}

View File

@ -99,7 +99,7 @@ class RIRForm(OrganizationalModelForm):
class Meta:
model = RIR
fields = [
'name', 'slug', 'is_private', 'description', 'owner', 'tags',
'name', 'slug', 'is_private', 'description', 'owner', 'comments', 'tags',
]
@ -139,7 +139,7 @@ class ASNRangeForm(TenancyForm, OrganizationalModelForm):
class Meta:
model = ASNRange
fields = [
'name', 'slug', 'rir', 'start', 'end', 'tenant_group', 'tenant', 'owner', 'description', 'tags'
'name', 'slug', 'rir', 'start', 'end', 'tenant_group', 'tenant', 'owner', 'description', 'comments', 'tags'
]
@ -189,7 +189,7 @@ class RoleForm(OrganizationalModelForm):
class Meta:
model = Role
fields = [
'name', 'slug', 'weight', 'description', 'owner', 'tags',
'name', 'slug', 'weight', 'description', 'owner', 'comments', 'tags',
]
@ -614,7 +614,8 @@ class VLANGroupForm(TenancyForm, OrganizationalModelForm):
class Meta:
model = VLANGroup
fields = [
'name', 'slug', 'description', 'vid_ranges', 'scope_type', 'tenant_group', 'tenant', 'owner', 'tags',
'name', 'slug', 'description', 'vid_ranges', 'scope_type', 'tenant_group', 'tenant', 'owner', 'comments',
'tags',
]
def __init__(self, *args, **kwargs):

View File

@ -0,0 +1,33 @@
# Generated by Django 5.2.8 on 2025-12-08 17:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ipam', '0084_owner'),
]
operations = [
migrations.AddField(
model_name='asnrange',
name='comments',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='rir',
name='comments',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='role',
name='comments',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='vlangroup',
name='comments',
field=models.TextField(blank=True),
),
]

View File

@ -31,6 +31,7 @@ class ASNRangeIndex(SearchIndex):
fields = (
('name', 100),
('description', 500),
('comments', 5000),
)
display_attrs = ('rir', 'tenant', 'description')
@ -89,6 +90,7 @@ class RIRIndex(SearchIndex):
('name', 100),
('slug', 110),
('description', 500),
('comments', 5000),
)
display_attrs = ('description',)
@ -100,6 +102,7 @@ class RoleIndex(SearchIndex):
('name', 100),
('slug', 110),
('description', 500),
('comments', 5000),
)
display_attrs = ('description',)
@ -156,6 +159,7 @@ class VLANGroupIndex(SearchIndex):
('name', 100),
('slug', 110),
('description', 500),
('comments', 5000),
)
display_attrs = ('scope_type', 'description')

View File

@ -30,8 +30,8 @@ class ASNRangeTable(TenancyColumnsMixin, OrganizationalModelTable):
class Meta(OrganizationalModelTable.Meta):
model = ASNRange
fields = (
'pk', 'name', 'slug', 'rir', 'start', 'end', 'asn_count', 'tenant', 'tenant_group', 'description', 'tags',
'created', 'last_updated', 'actions',
'pk', 'name', 'slug', 'rir', 'start', 'end', 'asn_count', 'tenant', 'tenant_group', 'description',
'comments', 'tags', 'created', 'last_updated', 'actions',
)
default_columns = ('pk', 'name', 'rir', 'start', 'end', 'tenant', 'asn_count', 'description')

View File

@ -48,7 +48,7 @@ class RIRTable(OrganizationalModelTable):
class Meta(OrganizationalModelTable.Meta):
model = RIR
fields = (
'pk', 'id', 'name', 'slug', 'is_private', 'aggregate_count', 'description', 'tags', 'created',
'pk', 'id', 'name', 'slug', 'is_private', 'aggregate_count', 'description', 'comments', 'tags', 'created',
'last_updated', 'actions',
)
default_columns = ('pk', 'name', 'is_private', 'aggregate_count', 'description')
@ -126,8 +126,8 @@ class RoleTable(OrganizationalModelTable):
class Meta(OrganizationalModelTable.Meta):
model = Role
fields = (
'pk', 'id', 'name', 'slug', 'prefix_count', 'iprange_count', 'vlan_count', 'description', 'weight', 'tags',
'created', 'last_updated', 'actions',
'pk', 'id', 'name', 'slug', 'prefix_count', 'iprange_count', 'vlan_count', 'description', 'weight',
'comments', 'tags', 'created', 'last_updated', 'actions',
)
default_columns = ('pk', 'name', 'prefix_count', 'iprange_count', 'vlan_count', 'description')

View File

@ -66,7 +66,7 @@ class VLANGroupTable(TenancyColumnsMixin, OrganizationalModelTable):
model = VLANGroup
fields = (
'pk', 'id', 'name', 'scope_type', 'scope', 'vid_ranges_list', 'vlan_count', 'slug', 'description',
'tenant', 'tenant_group', 'tags', 'created', 'last_updated', 'actions', 'utilization',
'tenant', 'tenant_group', 'comments', 'tags', 'created', 'last_updated', 'actions', 'utilization',
)
default_columns = (
'pk', 'name', 'scope_type', 'scope', 'vlan_count', 'utilization', 'tenant', 'description'

View File

@ -91,6 +91,7 @@ class OrganizationalModelBulkEditForm(OwnerMixin, NetBoxModelBulkEditForm):
max_length=200,
required=False
)
comments = CommentField()
class NestedGroupModelBulkEditForm(OwnerMixin, NetBoxModelBulkEditForm):

View File

@ -91,6 +91,7 @@ class OrganizationalModelForm(OwnerMixin, NetBoxModelForm):
Form for models which inherit from OrganizationalModel.
"""
slug = SlugField()
comments = CommentField()
class NestedGroupModelForm(OwnerMixin, NetBoxModelForm):

View File

@ -58,6 +58,7 @@ class OrganizationalModelFilterMixin(
name: FilterLookup[str] | None = strawberry_django.filter_field()
slug: FilterLookup[str] | None = strawberry_django.filter_field()
description: FilterLookup[str] | None = strawberry_django.filter_field()
comments: FilterLookup[str] | None = strawberry_django.filter_field()
@dataclass

View File

@ -215,6 +215,10 @@ class OrganizationalModel(OwnerMixin, NetBoxModel):
max_length=200,
blank=True
)
comments = models.TextField(
verbose_name=_('comments'),
blank=True
)
class Meta:
abstract = True

View File

@ -285,6 +285,9 @@ class OrganizationalModelTable(NetBoxTable):
linkify=True,
verbose_name=_('Owner')
)
comments = columns.MarkdownColumn(
verbose_name=_('Comments'),
)
class NestedGroupModelTable(NetBoxTable):

View File

@ -43,6 +43,7 @@
</div>
<div class="col col-12 col-md-6">
{% include 'inc/panels/related_objects.html' %}
{% include 'inc/panels/comments.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %}
</div>

View File

@ -43,6 +43,7 @@
</div>
<div class="col col-12 col-md-6">
{% include 'inc/panels/related_objects.html' %}
{% include 'inc/panels/comments.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %}
</div>

View File

@ -40,6 +40,7 @@
{% plugin_left_page object %}
</div>
<div class="col col-12 col-md-6">
{% include 'inc/panels/comments.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %}
</div>

View File

@ -44,6 +44,7 @@
{% include 'inc/panels/tags.html' %}
</div>
<div class="col col-12 col-md-6">
{% include 'inc/panels/comments.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %}
</div>

View File

@ -37,6 +37,7 @@
</div>
<div class="col col-12 col-md-6">
{% include 'inc/panels/related_objects.html' %}
{% include 'inc/panels/comments.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %}
</div>

View File

@ -37,6 +37,7 @@
</div>
<div class="col col-12 col-md-6">
{% include 'inc/panels/related_objects.html' %}
{% include 'inc/panels/comments.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %}
</div>

View File

@ -62,6 +62,7 @@
</div>
<div class="col col-12 col-md-6">
{% include 'inc/panels/related_objects.html' %}
{% include 'inc/panels/comments.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %}
</div>

View File

@ -29,6 +29,7 @@
</div>
<div class="col col-12 col-md-6">
{% include 'inc/panels/related_objects.html' %}
{% include 'inc/panels/comments.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %}
</div>

View File

@ -33,6 +33,7 @@
</div>
<div class="col col-12 col-md-6">
{% include 'inc/panels/related_objects.html' %}
{% include 'inc/panels/comments.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %}
</div>

View File

@ -39,6 +39,7 @@
</div>
<div class="col col-12 col-md-6">
{% include 'inc/panels/related_objects.html' %}
{% include 'inc/panels/comments.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %}
</div>

View File

@ -37,6 +37,7 @@
</div>
<div class="col col-12 col-md-6">
{% include 'inc/panels/related_objects.html' %}
{% include 'inc/panels/comments.html' %}
{% include 'inc/panels/custom_fields.html' %}
{% plugin_right_page object %}
</div>

View File

@ -36,8 +36,8 @@ class ContactRoleSerializer(OrganizationalModelSerializer):
class Meta:
model = ContactRole
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'tags', 'custom_fields',
'created', 'last_updated',
'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'comments', 'tags',
'custom_fields', 'created', 'last_updated',
]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description')

View File

@ -72,7 +72,7 @@ class ContactRoleBulkEditForm(OrganizationalModelBulkEditForm):
fieldsets = (
FieldSet('description'),
)
nullable_fields = ('description',)
nullable_fields = ('description', 'comments')
class ContactBulkEditForm(PrimaryModelBulkEditForm):

View File

@ -74,7 +74,7 @@ class ContactRoleImportForm(OrganizationalModelImportForm):
class Meta:
model = ContactRole
fields = ('name', 'slug', 'description', 'owner', 'tags')
fields = ('name', 'slug', 'description', 'owner', 'comments', 'tags')
class ContactImportForm(PrimaryModelImportForm):

View File

@ -84,7 +84,7 @@ class ContactRoleForm(OrganizationalModelForm):
class Meta:
model = ContactRole
fields = ('name', 'slug', 'description', 'owner', 'tags')
fields = ('name', 'slug', 'description', 'owner', 'comments', 'tags')
class ContactForm(PrimaryModelForm):

View File

@ -0,0 +1,18 @@
# Generated by Django 5.2.8 on 2025-12-08 17:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('tenancy', '0021_owner'),
]
operations = [
migrations.AddField(
model_name='contactrole',
name='comments',
field=models.TextField(blank=True),
),
]

View File

@ -37,6 +37,7 @@ class ContactRoleIndex(SearchIndex):
('name', 100),
('slug', 110),
('description', 500),
('comments', 5000),
)
display_attrs = ('description',)

View File

@ -44,7 +44,7 @@ class ContactRoleTable(OrganizationalModelTable):
class Meta(OrganizationalModelTable.Meta):
model = ContactRole
fields = ('pk', 'name', 'description', 'slug', 'tags', 'created', 'last_updated', 'actions')
fields = ('pk', 'name', 'description', 'comments', 'slug', 'tags', 'created', 'last_updated', 'actions')
default_columns = ('pk', 'name', 'description')

View File

@ -23,8 +23,8 @@ class ClusterTypeSerializer(OrganizationalModelSerializer):
class Meta:
model = ClusterType
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'tags', 'custom_fields',
'created', 'last_updated', 'cluster_count',
'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'comments', 'tags',
'custom_fields', 'created', 'last_updated', 'cluster_count',
]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'cluster_count')
@ -37,8 +37,8 @@ class ClusterGroupSerializer(OrganizationalModelSerializer):
class Meta:
model = ClusterGroup
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'tags', 'custom_fields',
'created', 'last_updated', 'cluster_count',
'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'comments', 'tags',
'custom_fields', 'created', 'last_updated', 'cluster_count',
]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'cluster_count')

View File

@ -34,7 +34,7 @@ class ClusterTypeBulkEditForm(OrganizationalModelBulkEditForm):
fieldsets = (
FieldSet('description'),
)
nullable_fields = ('description',)
nullable_fields = ('description', 'comments')
class ClusterGroupBulkEditForm(OrganizationalModelBulkEditForm):
@ -42,7 +42,7 @@ class ClusterGroupBulkEditForm(OrganizationalModelBulkEditForm):
fieldsets = (
FieldSet('description'),
)
nullable_fields = ('description',)
nullable_fields = ('description', 'comments')
class ClusterBulkEditForm(ScopedBulkEditForm, PrimaryModelBulkEditForm):

View File

@ -28,14 +28,14 @@ class ClusterTypeImportForm(OrganizationalModelImportForm):
class Meta:
model = ClusterType
fields = ('name', 'slug', 'description', 'owner', 'tags')
fields = ('name', 'slug', 'description', 'owner', 'comments', 'tags')
class ClusterGroupImportForm(OrganizationalModelImportForm):
class Meta:
model = ClusterGroup
fields = ('name', 'slug', 'description', 'owner', 'tags')
fields = ('name', 'slug', 'description', 'owner', 'comments', 'tags')
class ClusterImportForm(ScopedImportForm, PrimaryModelImportForm):

View File

@ -39,7 +39,7 @@ class ClusterTypeForm(OrganizationalModelForm):
class Meta:
model = ClusterType
fields = (
'name', 'slug', 'description', 'owner', 'tags',
'name', 'slug', 'description', 'owner', 'comments', 'tags',
)
@ -51,7 +51,7 @@ class ClusterGroupForm(OrganizationalModelForm):
class Meta:
model = ClusterGroup
fields = (
'name', 'slug', 'description', 'owner', 'tags',
'name', 'slug', 'description', 'owner', 'comments', 'tags',
)

View File

@ -0,0 +1,23 @@
# Generated by Django 5.2.8 on 2025-12-08 17:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('virtualization', '0050_virtualmachine_start_on_boot'),
]
operations = [
migrations.AddField(
model_name='clustergroup',
name='comments',
field=models.TextField(blank=True),
),
migrations.AddField(
model_name='clustertype',
name='comments',
field=models.TextField(blank=True),
),
]

View File

@ -20,6 +20,7 @@ class ClusterGroupIndex(SearchIndex):
('name', 100),
('slug', 110),
('description', 500),
('comments', 5000),
)
display_attrs = ('description',)
@ -31,6 +32,7 @@ class ClusterTypeIndex(SearchIndex):
('name', 100),
('slug', 110),
('description', 500),
('comments', 5000),
)
display_attrs = ('description',)

View File

@ -29,7 +29,8 @@ class ClusterTypeTable(OrganizationalModelTable):
class Meta(OrganizationalModelTable.Meta):
model = ClusterType
fields = (
'pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'created', 'last_updated', 'tags', 'actions',
'pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'comments', 'created', 'last_updated', 'tags',
'actions',
)
default_columns = ('pk', 'name', 'cluster_count', 'description')
@ -51,8 +52,8 @@ class ClusterGroupTable(ContactsColumnMixin, OrganizationalModelTable):
class Meta(OrganizationalModelTable.Meta):
model = ClusterGroup
fields = (
'pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'contacts', 'tags', 'created', 'last_updated',
'actions',
'pk', 'id', 'name', 'slug', 'cluster_count', 'description', 'comments', 'contacts', 'tags', 'created',
'last_updated', 'actions',
)
default_columns = ('pk', 'name', 'cluster_count', 'description')

View File

@ -28,8 +28,8 @@ class TunnelGroupSerializer(OrganizationalModelSerializer):
class Meta:
model = TunnelGroup
fields = [
'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'tags', 'custom_fields',
'created', 'last_updated', 'tunnel_count',
'id', 'url', 'display_url', 'display', 'name', 'slug', 'description', 'owner', 'comments', 'tags',
'custom_fields', 'created', 'last_updated', 'tunnel_count',
]
brief_fields = ('id', 'url', 'display', 'name', 'slug', 'description', 'tunnel_count')

View File

@ -25,7 +25,7 @@ __all__ = (
class TunnelGroupBulkEditForm(OrganizationalModelBulkEditForm):
model = TunnelGroup
nullable_fields = ('description',)
nullable_fields = ('description', 'comments')
class TunnelBulkEditForm(PrimaryModelBulkEditForm):

View File

@ -28,7 +28,7 @@ class TunnelGroupImportForm(OrganizationalModelImportForm):
class Meta:
model = TunnelGroup
fields = ('name', 'slug', 'description', 'owner', 'tags')
fields = ('name', 'slug', 'description', 'owner', 'comments', 'tags')
class TunnelImportForm(PrimaryModelImportForm):

View File

@ -37,7 +37,7 @@ class TunnelGroupForm(OrganizationalModelForm):
class Meta:
model = TunnelGroup
fields = [
'name', 'slug', 'description', 'owner', 'tags',
'name', 'slug', 'description', 'owner', 'comments', 'tags',
]

View File

@ -0,0 +1,18 @@
# Generated by Django 5.2.8 on 2025-12-08 17:38
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('vpn', '0010_owner'),
]
operations = [
migrations.AddField(
model_name='tunnelgroup',
name='comments',
field=models.TextField(blank=True),
),
]

View File

@ -21,6 +21,7 @@ class TunnelGroupIndex(SearchIndex):
('name', 100),
('slug', 110),
('description', 500),
('comments', 5000),
)
display_attrs = ('description',)

View File

@ -30,8 +30,8 @@ class TunnelGroupTable(ContactsColumnMixin, OrganizationalModelTable):
class Meta(OrganizationalModelTable.Meta):
model = TunnelGroup
fields = (
'pk', 'id', 'name', 'tunnel_count', 'description', 'slug', 'contacts', 'tags', 'actions', 'created',
'last_updated',
'pk', 'id', 'name', 'tunnel_count', 'description', 'comments', 'slug', 'contacts', 'tags', 'actions',
'created', 'last_updated',
)
default_columns = ('pk', 'name', 'tunnel_count', 'description')