diff --git a/netbox/templates/extras/object_journal.html b/netbox/templates/extras/object_journal.html
index 363b067a8ad..0ed95d9eb0b 100644
--- a/netbox/templates/extras/object_journal.html
+++ b/netbox/templates/extras/object_journal.html
@@ -5,25 +5,29 @@
{% render_errors form %}
{% block content %}
- {% if perms.extras.add_journalentry %}
-
- {% endif %}
{% render_table table 'inc/table.html' %}
{% include 'inc/paginator.html' with paginator=table.paginator page=table.page %}
+ {% if perms.extras.add_journalentry %}
+
+ {% endif %}
{% endblock %}
diff --git a/netbox/tenancy/tables/columns.py b/netbox/tenancy/tables/columns.py
index bb5aba5dea1..21622f18ba6 100644
--- a/netbox/tenancy/tables/columns.py
+++ b/netbox/tenancy/tables/columns.py
@@ -2,6 +2,8 @@ import django_tables2 as tables
__all__ = (
'TenantColumn',
+ 'TenantGroupColumn',
+ 'TenancyColumnsMixin',
)
@@ -24,3 +26,32 @@ class TenantColumn(tables.TemplateColumn):
def value(self, value):
return str(value) if value else None
+
+
+class TenantGroupColumn(tables.TemplateColumn):
+ """
+ Include the tenant group description.
+ """
+ template_code = """
+ {% if record.tenant and record.tenant.group %}
+
{{ record.tenant.group }}
+ {% elif record.vrf.tenant and record.vrf.tenant.group %}
+
{{ record.vrf.tenant.group }}*
+ {% else %}
+ —
+ {% endif %}
+ """
+
+ def __init__(self, accessor=tables.A('tenant__group'), *args, **kwargs):
+ if 'verbose_name' not in kwargs:
+ kwargs['verbose_name'] = 'Tenant Group'
+
+ super().__init__(template_code=self.template_code, accessor=accessor, *args, **kwargs)
+
+ def value(self, value):
+ return str(value) if value else None
+
+
+class TenancyColumnsMixin(tables.Table):
+ tenant_group = TenantGroupColumn()
+ tenant = TenantColumn()
diff --git a/netbox/utilities/management/commands/__init__.py b/netbox/utilities/management/commands/__init__.py
index bdd4face642..2c261b0d30c 100644
--- a/netbox/utilities/management/commands/__init__.py
+++ b/netbox/utilities/management/commands/__init__.py
@@ -1,6 +1,8 @@
from django.db import models
from timezone_field import TimeZoneField
+from netbox.config import ConfigItem
+
SKIP_FIELDS = (
TimeZoneField,
@@ -26,4 +28,9 @@ def custom_deconstruct(field):
for attr in EXEMPT_ATTRS:
kwargs.pop(attr, None)
+ # Ignore any field defaults which reference a ConfigItem
+ kwargs = {
+ k: v for k, v in kwargs.items() if not isinstance(v, ConfigItem)
+ }
+
return name, path, args, kwargs
diff --git a/netbox/virtualization/tables/clusters.py b/netbox/virtualization/tables/clusters.py
index a0c98425a23..ccffe23fdcb 100644
--- a/netbox/virtualization/tables/clusters.py
+++ b/netbox/virtualization/tables/clusters.py
@@ -1,6 +1,7 @@
import django_tables2 as tables
from netbox.tables import NetBoxTable, columns
+from tenancy.tables import TenancyColumnsMixin
from virtualization.models import Cluster, ClusterGroup, ClusterType
__all__ = (
@@ -56,7 +57,7 @@ class ClusterGroupTable(NetBoxTable):
default_columns = ('pk', 'name', 'cluster_count', 'description')
-class ClusterTable(NetBoxTable):
+class ClusterTable(TenancyColumnsMixin, NetBoxTable):
name = tables.Column(
linkify=True
)
@@ -66,9 +67,6 @@ class ClusterTable(NetBoxTable):
group = tables.Column(
linkify=True
)
- tenant = tables.Column(
- linkify=True
- )
site = tables.Column(
linkify=True
)
@@ -93,7 +91,7 @@ class ClusterTable(NetBoxTable):
class Meta(NetBoxTable.Meta):
model = Cluster
fields = (
- 'pk', 'id', 'name', 'type', 'group', 'tenant', 'site', 'comments', 'device_count', 'vm_count', 'contacts',
+ 'pk', 'id', 'name', 'type', 'group', 'tenant', 'tenant_group', 'site', 'comments', 'device_count', 'vm_count', 'contacts',
'tags', 'created', 'last_updated',
)
default_columns = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'device_count', 'vm_count')
diff --git a/netbox/virtualization/tables/virtualmachines.py b/netbox/virtualization/tables/virtualmachines.py
index 89dbdf901be..8cff9622788 100644
--- a/netbox/virtualization/tables/virtualmachines.py
+++ b/netbox/virtualization/tables/virtualmachines.py
@@ -2,7 +2,7 @@ import django_tables2 as tables
from dcim.tables.devices import BaseInterfaceTable
from netbox.tables import NetBoxTable, columns
-from tenancy.tables import TenantColumn
+from tenancy.tables import TenancyColumnsMixin
from virtualization.models import VirtualMachine, VMInterface
__all__ = (
@@ -24,7 +24,7 @@ VMINTERFACE_BUTTONS = """
# Virtual machines
#
-class VirtualMachineTable(NetBoxTable):
+class VirtualMachineTable(TenancyColumnsMixin, NetBoxTable):
name = tables.Column(
order_by=('_name',),
linkify=True
@@ -34,7 +34,6 @@ class VirtualMachineTable(NetBoxTable):
linkify=True
)
role = columns.ColoredLabelColumn()
- tenant = TenantColumn()
comments = columns.MarkdownColumn()
primary_ip4 = tables.Column(
linkify=True,
@@ -56,7 +55,7 @@ class VirtualMachineTable(NetBoxTable):
class Meta(NetBoxTable.Meta):
model = VirtualMachine
fields = (
- 'pk', 'id', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk',
+ 'pk', 'id', 'name', 'status', 'cluster', 'role', 'tenant', 'tenant_group', 'platform', 'vcpus', 'memory', 'disk',
'primary_ip4', 'primary_ip6', 'primary_ip', 'comments', 'tags', 'created', 'last_updated',
)
default_columns = (
diff --git a/requirements.txt b/requirements.txt
index 1fdace4f0f1..f987ad7babc 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,7 +1,7 @@
-bleach==5.0.0
-Django==4.0.5
+bleach==5.0.1
+Django==4.0.6
django-cors-headers==3.13.0
-django-debug-toolbar==3.4.0
+django-debug-toolbar==3.5.0
django-filter==22.1
django-graphiql-debug-toolbar==0.2.0
django-mptt==0.13.4
@@ -19,13 +19,13 @@ gunicorn==20.1.0
Jinja2==3.1.2
Markdown==3.3.7
markdown-include==0.6.0
-mkdocs-material==8.3.6
+mkdocs-material==8.3.9
mkdocstrings[python-legacy]==0.19.0
netaddr==0.8.0
-Pillow==9.1.1
+Pillow==9.2.0
psycopg2-binary==2.9.3
PyYAML==6.0
-sentry-sdk==1.5.12
+sentry-sdk==1.7.0
social-auth-app-django==5.0.0
social-auth-core==4.3.0
svgwrite==1.4.2