From 16d8981a3fa55bbb32213a2ddc62206307f6b1bd Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 17 Sep 2021 12:04:22 -0400 Subject: [PATCH] Closes #7284: Include comments field in table/export for all appropriate models --- docs/release-notes/version-3.0.md | 1 + netbox/circuits/tables.py | 12 ++++++++---- netbox/dcim/tables/devices.py | 5 +++-- netbox/dcim/tables/devicetypes.py | 5 +++-- netbox/dcim/tables/power.py | 5 +++-- netbox/dcim/tables/racks.py | 7 ++++--- netbox/dcim/tables/sites.py | 5 +++-- netbox/extras/tables.py | 3 ++- netbox/tenancy/tables.py | 7 +++++-- netbox/utilities/tables.py | 23 ++++++++++++++++++++++- netbox/virtualization/tables.py | 9 ++++++--- 11 files changed, 60 insertions(+), 22 deletions(-) diff --git a/docs/release-notes/version-3.0.md b/docs/release-notes/version-3.0.md index f80ebb73d..76cc7cc45 100644 --- a/docs/release-notes/version-3.0.md +++ b/docs/release-notes/version-3.0.md @@ -12,6 +12,7 @@ * [#7208](https://github.com/netbox-community/netbox/issues/7208) - Add navigation breadcrumbs for custom scripts & reports * [#7210](https://github.com/netbox-community/netbox/issues/7210) - Add search/filter forms for all organizational models * [#7239](https://github.com/netbox-community/netbox/issues/7239) - Redirect global search to filtered object list when an object type is selected +* [#7284](https://github.com/netbox-community/netbox/issues/7284) - Include comments field in table/export for all appropriate models ### Bug Fixes diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index 41a3aed7f..c3e616d8a 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -2,7 +2,7 @@ import django_tables2 as tables from django_tables2.utils import Accessor from tenancy.tables import TenantColumn -from utilities.tables import BaseTable, ButtonsColumn, ChoiceFieldColumn, TagColumn, ToggleColumn +from utilities.tables import BaseTable, ButtonsColumn, ChoiceFieldColumn, MarkdownColumn, TagColumn, ToggleColumn from .models import * @@ -28,6 +28,7 @@ class ProviderTable(BaseTable): accessor=Accessor('count_circuits'), verbose_name='Circuits' ) + comments = MarkdownColumn() tags = TagColumn( url_name='circuits:provider_list' ) @@ -35,7 +36,8 @@ class ProviderTable(BaseTable): class Meta(BaseTable.Meta): model = Provider fields = ( - 'pk', 'name', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'circuit_count', 'tags', + 'pk', 'name', 'asn', 'account', 'portal_url', 'noc_contact', 'admin_contact', 'circuit_count', 'comments', + 'tags', ) default_columns = ('pk', 'name', 'asn', 'account', 'circuit_count') @@ -52,13 +54,14 @@ class ProviderNetworkTable(BaseTable): provider = tables.Column( linkify=True ) + comments = MarkdownColumn() tags = TagColumn( url_name='circuits:providernetwork_list' ) class Meta(BaseTable.Meta): model = ProviderNetwork - fields = ('pk', 'name', 'provider', 'description', 'tags') + fields = ('pk', 'name', 'provider', 'description', 'comments', 'tags') default_columns = ('pk', 'name', 'provider', 'description') @@ -105,6 +108,7 @@ class CircuitTable(BaseTable): template_code=CIRCUITTERMINATION_LINK, verbose_name='Side Z' ) + comments = MarkdownColumn() tags = TagColumn( url_name='circuits:circuit_list' ) @@ -113,7 +117,7 @@ class CircuitTable(BaseTable): model = Circuit fields = ( 'pk', 'cid', 'provider', 'type', 'status', 'tenant', 'termination_a', 'termination_z', 'install_date', - 'commit_rate', 'description', 'tags', + 'commit_rate', 'description', 'comments', 'tags', ) default_columns = ( 'pk', 'cid', 'provider', 'type', 'status', 'tenant', 'termination_a', 'termination_z', 'description', diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index 352ac7d5c..dda0af2b4 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -9,7 +9,7 @@ from dcim.models import ( from tenancy.tables import TenantColumn from utilities.tables import ( BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, - TagColumn, ToggleColumn, + MarkdownColumn, TagColumn, ToggleColumn, ) from .template_code import ( CABLETERMINATION, CONSOLEPORT_BUTTONS, CONSOLESERVERPORT_BUTTONS, DEVICE_LINK, DEVICEBAY_BUTTONS, DEVICEBAY_STATUS, @@ -187,6 +187,7 @@ class DeviceTable(BaseTable): vc_priority = tables.Column( verbose_name='VC Priority' ) + comments = MarkdownColumn() tags = TagColumn( url_name='dcim:device_list' ) @@ -196,7 +197,7 @@ class DeviceTable(BaseTable): fields = ( 'pk', 'name', 'status', 'tenant', 'device_role', 'manufacturer', 'device_type', 'platform', 'serial', 'asset_tag', 'site', 'location', 'rack', 'position', 'face', 'primary_ip', 'primary_ip4', 'primary_ip6', - 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority', 'tags', + 'cluster', 'virtual_chassis', 'vc_position', 'vc_priority', 'comments', 'tags', ) default_columns = ( 'pk', 'name', 'status', 'tenant', 'site', 'location', 'rack', 'device_role', 'manufacturer', 'device_type', diff --git a/netbox/dcim/tables/devicetypes.py b/netbox/dcim/tables/devicetypes.py index 6720baf66..3b11a180b 100644 --- a/netbox/dcim/tables/devicetypes.py +++ b/netbox/dcim/tables/devicetypes.py @@ -5,7 +5,7 @@ from dcim.models import ( Manufacturer, PowerOutletTemplate, PowerPortTemplate, RearPortTemplate, ) from utilities.tables import ( - BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, LinkedCountColumn, TagColumn, ToggleColumn, + BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn, ) __all__ = ( @@ -68,6 +68,7 @@ class DeviceTypeTable(BaseTable): url_params={'device_type_id': 'pk'}, verbose_name='Instances' ) + comments = MarkdownColumn() tags = TagColumn( url_name='dcim:devicetype_list' ) @@ -76,7 +77,7 @@ class DeviceTypeTable(BaseTable): model = DeviceType fields = ( 'pk', 'model', 'manufacturer', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role', - 'instance_count', 'tags', + 'comments', 'instance_count', 'tags', ) default_columns = ( 'pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'instance_count', diff --git a/netbox/dcim/tables/power.py b/netbox/dcim/tables/power.py index 1c4d6e921..b8e032e7f 100644 --- a/netbox/dcim/tables/power.py +++ b/netbox/dcim/tables/power.py @@ -1,7 +1,7 @@ import django_tables2 as tables from dcim.models import PowerFeed, PowerPanel -from utilities.tables import BaseTable, ChoiceFieldColumn, LinkedCountColumn, TagColumn, ToggleColumn +from utilities.tables import BaseTable, ChoiceFieldColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn from .devices import CableTerminationTable __all__ = ( @@ -62,6 +62,7 @@ class PowerFeedTable(CableTerminationTable): available_power = tables.Column( verbose_name='Available power (VA)' ) + comments = MarkdownColumn() tags = TagColumn( url_name='dcim:powerfeed_list' ) @@ -71,7 +72,7 @@ class PowerFeedTable(CableTerminationTable): fields = ( 'pk', 'name', 'power_panel', 'rack', 'status', 'type', 'supply', 'voltage', 'amperage', 'phase', 'max_utilization', 'mark_connected', 'cable', 'cable_color', 'cable_peer', 'connection', 'available_power', - 'tags', + 'comments', 'tags', ) default_columns = ( 'pk', 'name', 'power_panel', 'rack', 'status', 'type', 'supply', 'voltage', 'amperage', 'phase', 'cable', diff --git a/netbox/dcim/tables/racks.py b/netbox/dcim/tables/racks.py index ef0517dfc..39a76eade 100644 --- a/netbox/dcim/tables/racks.py +++ b/netbox/dcim/tables/racks.py @@ -4,8 +4,8 @@ from django_tables2.utils import Accessor from dcim.models import Rack, RackReservation, RackRole from tenancy.tables import TenantColumn from utilities.tables import ( - BaseTable, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, TagColumn, - ToggleColumn, UtilizationColumn, + BaseTable, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, + TagColumn, ToggleColumn, UtilizationColumn, ) __all__ = ( @@ -67,6 +67,7 @@ class RackTable(BaseTable): class RackDetailTable(RackTable): + comments = MarkdownColumn() device_count = LinkedCountColumn( viewname='dcim:device_list', url_params={'rack_id': 'pk'}, @@ -87,7 +88,7 @@ class RackDetailTable(RackTable): class Meta(RackTable.Meta): fields = ( 'pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'serial', 'asset_tag', 'type', - 'width', 'u_height', 'device_count', 'get_utilization', 'get_power_utilization', 'tags', + 'width', 'u_height', 'comments', 'device_count', 'get_utilization', 'get_power_utilization', 'tags', ) default_columns = ( 'pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'u_height', 'device_count', diff --git a/netbox/dcim/tables/sites.py b/netbox/dcim/tables/sites.py index 47c912354..37fa019a1 100644 --- a/netbox/dcim/tables/sites.py +++ b/netbox/dcim/tables/sites.py @@ -3,7 +3,7 @@ import django_tables2 as tables from dcim.models import Location, Region, Site, SiteGroup from tenancy.tables import TenantColumn from utilities.tables import ( - BaseTable, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, MPTTColumn, TagColumn, ToggleColumn, + BaseTable, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, MarkdownColumn, MPTTColumn, TagColumn, ToggleColumn, ) from .template_code import LOCATION_ELEVATIONS @@ -76,6 +76,7 @@ class SiteTable(BaseTable): linkify=True ) tenant = TenantColumn() + comments = MarkdownColumn() tags = TagColumn( url_name='dcim:site_list' ) @@ -85,7 +86,7 @@ class SiteTable(BaseTable): fields = ( 'pk', 'name', 'slug', 'status', 'facility', 'region', 'group', 'tenant', 'asn', 'time_zone', 'description', 'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name', 'contact_phone', - 'contact_email', 'tags', + 'contact_email', 'comments', 'tags', ) default_columns = ('pk', 'name', 'status', 'facility', 'region', 'group', 'tenant', 'asn', 'description') diff --git a/netbox/extras/tables.py b/netbox/extras/tables.py index 699bffc9f..c556e312f 100644 --- a/netbox/extras/tables.py +++ b/netbox/extras/tables.py @@ -3,7 +3,7 @@ from django.conf import settings from utilities.tables import ( BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ContentTypeColumn, ContentTypesColumn, - ToggleColumn, + MarkdownColumn, ToggleColumn, ) from .models import * @@ -232,6 +232,7 @@ class JournalEntryTable(ObjectJournalTable): orderable=False, verbose_name='Object' ) + comments = MarkdownColumn() class Meta(BaseTable.Meta): model = JournalEntry diff --git a/netbox/tenancy/tables.py b/netbox/tenancy/tables.py index 803675bfd..961d02dcc 100644 --- a/netbox/tenancy/tables.py +++ b/netbox/tenancy/tables.py @@ -1,6 +1,8 @@ import django_tables2 as tables -from utilities.tables import BaseTable, ButtonsColumn, LinkedCountColumn, MPTTColumn, TagColumn, ToggleColumn +from utilities.tables import ( + BaseTable, ButtonsColumn, LinkedCountColumn, MarkdownColumn, MPTTColumn, TagColumn, ToggleColumn, +) from .models import Tenant, TenantGroup @@ -60,11 +62,12 @@ class TenantTable(BaseTable): name = tables.Column( linkify=True ) + comments = MarkdownColumn() tags = TagColumn( url_name='tenancy:tenant_list' ) class Meta(BaseTable.Meta): model = Tenant - fields = ('pk', 'name', 'slug', 'group', 'description', 'tags') + fields = ('pk', 'name', 'slug', 'group', 'description', 'comments', 'tags') default_columns = ('pk', 'name', 'group', 'description') diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py index ed1dcf5ce..4d8a60114 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables.py @@ -12,7 +12,6 @@ from django_tables2.data import TableQuerysetData from django_tables2.utils import Accessor from extras.models import CustomField -from extras.utils import FeatureQuery from .utils import content_type_name from .paginator import EnhancedPaginator, get_paginate_count @@ -395,6 +394,28 @@ class UtilizationColumn(tables.TemplateColumn): return f'{value}%' +class MarkdownColumn(tables.TemplateColumn): + """ + Render a Markdown string. + """ + template_code = """ + {% load helpers %} + {% if value %} + {{ value|render_markdown }} + {% else %} + — + {% endif %} + """ + + def __init__(self): + super().__init__( + template_code=self.template_code + ) + + def value(self, value): + return value + + # # Pagination # diff --git a/netbox/virtualization/tables.py b/netbox/virtualization/tables.py index b5fb93e5c..c6d42d3c1 100644 --- a/netbox/virtualization/tables.py +++ b/netbox/virtualization/tables.py @@ -3,7 +3,8 @@ from django.conf import settings from dcim.tables.devices import BaseInterfaceTable from tenancy.tables import TenantColumn from utilities.tables import ( - BaseTable, ButtonsColumn, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, TagColumn, ToggleColumn, + BaseTable, ButtonsColumn, ChoiceFieldColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn, TagColumn, + ToggleColumn, ) from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface @@ -91,13 +92,14 @@ class ClusterTable(BaseTable): url_params={'cluster_id': 'pk'}, verbose_name='VMs' ) + comments = MarkdownColumn() tags = TagColumn( url_name='virtualization:cluster_list' ) class Meta(BaseTable.Meta): model = Cluster - fields = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'device_count', 'vm_count', 'tags') + fields = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'comments', 'device_count', 'vm_count', 'tags') default_columns = ('pk', 'name', 'type', 'group', 'tenant', 'site', 'device_count', 'vm_count') @@ -143,6 +145,7 @@ class VirtualMachineDetailTable(VirtualMachineTable): order_by=('primary_ip6', 'primary_ip4'), verbose_name='IP Address' ) + comments = MarkdownColumn() tags = TagColumn( url_name='virtualization:virtualmachine_list' ) @@ -151,7 +154,7 @@ class VirtualMachineDetailTable(VirtualMachineTable): model = VirtualMachine fields = ( 'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'primary_ip4', - 'primary_ip6', 'primary_ip', 'tags', + 'primary_ip6', 'primary_ip', 'comments', 'tags', ) default_columns = ( 'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk', 'primary_ip',