Просмотр исходного кода

Closes #7284: Include comments field in table/export for all appropriate models

jeremystretch 4 лет назад
Родитель
Сommit
16d8981a3f

+ 1 - 0
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
 * [#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
 * [#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
 * [#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
 ### Bug Fixes
 
 

+ 8 - 4
netbox/circuits/tables.py

@@ -2,7 +2,7 @@ import django_tables2 as tables
 from django_tables2.utils import Accessor
 from django_tables2.utils import Accessor
 
 
 from tenancy.tables import TenantColumn
 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 *
 from .models import *
 
 
 
 
@@ -28,6 +28,7 @@ class ProviderTable(BaseTable):
         accessor=Accessor('count_circuits'),
         accessor=Accessor('count_circuits'),
         verbose_name='Circuits'
         verbose_name='Circuits'
     )
     )
+    comments = MarkdownColumn()
     tags = TagColumn(
     tags = TagColumn(
         url_name='circuits:provider_list'
         url_name='circuits:provider_list'
     )
     )
@@ -35,7 +36,8 @@ class ProviderTable(BaseTable):
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = Provider
         model = Provider
         fields = (
         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')
         default_columns = ('pk', 'name', 'asn', 'account', 'circuit_count')
 
 
@@ -52,13 +54,14 @@ class ProviderNetworkTable(BaseTable):
     provider = tables.Column(
     provider = tables.Column(
         linkify=True
         linkify=True
     )
     )
+    comments = MarkdownColumn()
     tags = TagColumn(
     tags = TagColumn(
         url_name='circuits:providernetwork_list'
         url_name='circuits:providernetwork_list'
     )
     )
 
 
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = ProviderNetwork
         model = ProviderNetwork
-        fields = ('pk', 'name', 'provider', 'description', 'tags')
+        fields = ('pk', 'name', 'provider', 'description', 'comments', 'tags')
         default_columns = ('pk', 'name', 'provider', 'description')
         default_columns = ('pk', 'name', 'provider', 'description')
 
 
 
 
@@ -105,6 +108,7 @@ class CircuitTable(BaseTable):
         template_code=CIRCUITTERMINATION_LINK,
         template_code=CIRCUITTERMINATION_LINK,
         verbose_name='Side Z'
         verbose_name='Side Z'
     )
     )
+    comments = MarkdownColumn()
     tags = TagColumn(
     tags = TagColumn(
         url_name='circuits:circuit_list'
         url_name='circuits:circuit_list'
     )
     )
@@ -113,7 +117,7 @@ class CircuitTable(BaseTable):
         model = Circuit
         model = Circuit
         fields = (
         fields = (
             'pk', 'cid', 'provider', 'type', 'status', 'tenant', 'termination_a', 'termination_z', 'install_date',
             'pk', 'cid', 'provider', 'type', 'status', 'tenant', 'termination_a', 'termination_z', 'install_date',
-            'commit_rate', 'description', 'tags',
+            'commit_rate', 'description', 'comments', 'tags',
         )
         )
         default_columns = (
         default_columns = (
             'pk', 'cid', 'provider', 'type', 'status', 'tenant', 'termination_a', 'termination_z', 'description',
             'pk', 'cid', 'provider', 'type', 'status', 'tenant', 'termination_a', 'termination_z', 'description',

+ 3 - 2
netbox/dcim/tables/devices.py

@@ -9,7 +9,7 @@ from dcim.models import (
 from tenancy.tables import TenantColumn
 from tenancy.tables import TenantColumn
 from utilities.tables import (
 from utilities.tables import (
     BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn,
     BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn,
-    TagColumn, ToggleColumn,
+    MarkdownColumn, TagColumn, ToggleColumn,
 )
 )
 from .template_code import (
 from .template_code import (
     CABLETERMINATION, CONSOLEPORT_BUTTONS, CONSOLESERVERPORT_BUTTONS, DEVICE_LINK, DEVICEBAY_BUTTONS, DEVICEBAY_STATUS,
     CABLETERMINATION, CONSOLEPORT_BUTTONS, CONSOLESERVERPORT_BUTTONS, DEVICE_LINK, DEVICEBAY_BUTTONS, DEVICEBAY_STATUS,
@@ -187,6 +187,7 @@ class DeviceTable(BaseTable):
     vc_priority = tables.Column(
     vc_priority = tables.Column(
         verbose_name='VC Priority'
         verbose_name='VC Priority'
     )
     )
+    comments = MarkdownColumn()
     tags = TagColumn(
     tags = TagColumn(
         url_name='dcim:device_list'
         url_name='dcim:device_list'
     )
     )
@@ -196,7 +197,7 @@ class DeviceTable(BaseTable):
         fields = (
         fields = (
             'pk', 'name', 'status', 'tenant', 'device_role', 'manufacturer', 'device_type', 'platform', 'serial',
             'pk', 'name', 'status', 'tenant', 'device_role', 'manufacturer', 'device_type', 'platform', 'serial',
             'asset_tag', 'site', 'location', 'rack', 'position', 'face', 'primary_ip', 'primary_ip4', 'primary_ip6',
             '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 = (
         default_columns = (
             'pk', 'name', 'status', 'tenant', 'site', 'location', 'rack', 'device_role', 'manufacturer', 'device_type',
             'pk', 'name', 'status', 'tenant', 'site', 'location', 'rack', 'device_role', 'manufacturer', 'device_type',

+ 3 - 2
netbox/dcim/tables/devicetypes.py

@@ -5,7 +5,7 @@ from dcim.models import (
     Manufacturer, PowerOutletTemplate, PowerPortTemplate, RearPortTemplate,
     Manufacturer, PowerOutletTemplate, PowerPortTemplate, RearPortTemplate,
 )
 )
 from utilities.tables import (
 from utilities.tables import (
-    BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, LinkedCountColumn, TagColumn, ToggleColumn,
+    BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, LinkedCountColumn, MarkdownColumn, TagColumn, ToggleColumn,
 )
 )
 
 
 __all__ = (
 __all__ = (
@@ -68,6 +68,7 @@ class DeviceTypeTable(BaseTable):
         url_params={'device_type_id': 'pk'},
         url_params={'device_type_id': 'pk'},
         verbose_name='Instances'
         verbose_name='Instances'
     )
     )
+    comments = MarkdownColumn()
     tags = TagColumn(
     tags = TagColumn(
         url_name='dcim:devicetype_list'
         url_name='dcim:devicetype_list'
     )
     )
@@ -76,7 +77,7 @@ class DeviceTypeTable(BaseTable):
         model = DeviceType
         model = DeviceType
         fields = (
         fields = (
             'pk', 'model', 'manufacturer', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role',
             'pk', 'model', 'manufacturer', 'slug', 'part_number', 'u_height', 'is_full_depth', 'subdevice_role',
-            'instance_count', 'tags',
+            'comments', 'instance_count', 'tags',
         )
         )
         default_columns = (
         default_columns = (
             'pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'instance_count',
             'pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'instance_count',

+ 3 - 2
netbox/dcim/tables/power.py

@@ -1,7 +1,7 @@
 import django_tables2 as tables
 import django_tables2 as tables
 
 
 from dcim.models import PowerFeed, PowerPanel
 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
 from .devices import CableTerminationTable
 
 
 __all__ = (
 __all__ = (
@@ -62,6 +62,7 @@ class PowerFeedTable(CableTerminationTable):
     available_power = tables.Column(
     available_power = tables.Column(
         verbose_name='Available power (VA)'
         verbose_name='Available power (VA)'
     )
     )
+    comments = MarkdownColumn()
     tags = TagColumn(
     tags = TagColumn(
         url_name='dcim:powerfeed_list'
         url_name='dcim:powerfeed_list'
     )
     )
@@ -71,7 +72,7 @@ class PowerFeedTable(CableTerminationTable):
         fields = (
         fields = (
             'pk', 'name', 'power_panel', 'rack', 'status', 'type', 'supply', 'voltage', 'amperage', 'phase',
             'pk', 'name', 'power_panel', 'rack', 'status', 'type', 'supply', 'voltage', 'amperage', 'phase',
             'max_utilization', 'mark_connected', 'cable', 'cable_color', 'cable_peer', 'connection', 'available_power',
             'max_utilization', 'mark_connected', 'cable', 'cable_color', 'cable_peer', 'connection', 'available_power',
-            'tags',
+            'comments', 'tags',
         )
         )
         default_columns = (
         default_columns = (
             'pk', 'name', 'power_panel', 'rack', 'status', 'type', 'supply', 'voltage', 'amperage', 'phase', 'cable',
             'pk', 'name', 'power_panel', 'rack', 'status', 'type', 'supply', 'voltage', 'amperage', 'phase', 'cable',

+ 4 - 3
netbox/dcim/tables/racks.py

@@ -4,8 +4,8 @@ from django_tables2.utils import Accessor
 from dcim.models import Rack, RackReservation, RackRole
 from dcim.models import Rack, RackReservation, RackRole
 from tenancy.tables import TenantColumn
 from tenancy.tables import TenantColumn
 from utilities.tables import (
 from utilities.tables import (
-    BaseTable, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, TagColumn,
-    ToggleColumn, UtilizationColumn,
+    BaseTable, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, LinkedCountColumn, MarkdownColumn,
+    TagColumn, ToggleColumn, UtilizationColumn,
 )
 )
 
 
 __all__ = (
 __all__ = (
@@ -67,6 +67,7 @@ class RackTable(BaseTable):
 
 
 
 
 class RackDetailTable(RackTable):
 class RackDetailTable(RackTable):
+    comments = MarkdownColumn()
     device_count = LinkedCountColumn(
     device_count = LinkedCountColumn(
         viewname='dcim:device_list',
         viewname='dcim:device_list',
         url_params={'rack_id': 'pk'},
         url_params={'rack_id': 'pk'},
@@ -87,7 +88,7 @@ class RackDetailTable(RackTable):
     class Meta(RackTable.Meta):
     class Meta(RackTable.Meta):
         fields = (
         fields = (
             'pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'serial', 'asset_tag', 'type',
             '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 = (
         default_columns = (
             'pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'u_height', 'device_count',
             'pk', 'name', 'site', 'location', 'status', 'facility_id', 'tenant', 'role', 'u_height', 'device_count',

+ 3 - 2
netbox/dcim/tables/sites.py

@@ -3,7 +3,7 @@ import django_tables2 as tables
 from dcim.models import Location, Region, Site, SiteGroup
 from dcim.models import Location, Region, Site, SiteGroup
 from tenancy.tables import TenantColumn
 from tenancy.tables import TenantColumn
 from utilities.tables import (
 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
 from .template_code import LOCATION_ELEVATIONS
 
 
@@ -76,6 +76,7 @@ class SiteTable(BaseTable):
         linkify=True
         linkify=True
     )
     )
     tenant = TenantColumn()
     tenant = TenantColumn()
+    comments = MarkdownColumn()
     tags = TagColumn(
     tags = TagColumn(
         url_name='dcim:site_list'
         url_name='dcim:site_list'
     )
     )
@@ -85,7 +86,7 @@ class SiteTable(BaseTable):
         fields = (
         fields = (
             'pk', 'name', 'slug', 'status', 'facility', 'region', 'group', 'tenant', 'asn', 'time_zone', 'description',
             'pk', 'name', 'slug', 'status', 'facility', 'region', 'group', 'tenant', 'asn', 'time_zone', 'description',
             'physical_address', 'shipping_address', 'latitude', 'longitude', 'contact_name', 'contact_phone',
             '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')
         default_columns = ('pk', 'name', 'status', 'facility', 'region', 'group', 'tenant', 'asn', 'description')
 
 

+ 2 - 1
netbox/extras/tables.py

@@ -3,7 +3,7 @@ from django.conf import settings
 
 
 from utilities.tables import (
 from utilities.tables import (
     BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ContentTypeColumn, ContentTypesColumn,
     BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ContentTypeColumn, ContentTypesColumn,
-    ToggleColumn,
+    MarkdownColumn, ToggleColumn,
 )
 )
 from .models import *
 from .models import *
 
 
@@ -232,6 +232,7 @@ class JournalEntryTable(ObjectJournalTable):
         orderable=False,
         orderable=False,
         verbose_name='Object'
         verbose_name='Object'
     )
     )
+    comments = MarkdownColumn()
 
 
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = JournalEntry
         model = JournalEntry

+ 5 - 2
netbox/tenancy/tables.py

@@ -1,6 +1,8 @@
 import django_tables2 as tables
 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
 from .models import Tenant, TenantGroup
 
 
 
 
@@ -60,11 +62,12 @@ class TenantTable(BaseTable):
     name = tables.Column(
     name = tables.Column(
         linkify=True
         linkify=True
     )
     )
+    comments = MarkdownColumn()
     tags = TagColumn(
     tags = TagColumn(
         url_name='tenancy:tenant_list'
         url_name='tenancy:tenant_list'
     )
     )
 
 
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = Tenant
         model = Tenant
-        fields = ('pk', 'name', 'slug', 'group', 'description', 'tags')
+        fields = ('pk', 'name', 'slug', 'group', 'description', 'comments', 'tags')
         default_columns = ('pk', 'name', 'group', 'description')
         default_columns = ('pk', 'name', 'group', 'description')

+ 22 - 1
netbox/utilities/tables.py

@@ -12,7 +12,6 @@ from django_tables2.data import TableQuerysetData
 from django_tables2.utils import Accessor
 from django_tables2.utils import Accessor
 
 
 from extras.models import CustomField
 from extras.models import CustomField
-from extras.utils import FeatureQuery
 from .utils import content_type_name
 from .utils import content_type_name
 from .paginator import EnhancedPaginator, get_paginate_count
 from .paginator import EnhancedPaginator, get_paginate_count
 
 
@@ -395,6 +394,28 @@ class UtilizationColumn(tables.TemplateColumn):
         return f'{value}%'
         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
 # Pagination
 #
 #

+ 6 - 3
netbox/virtualization/tables.py

@@ -3,7 +3,8 @@ from django.conf import settings
 from dcim.tables.devices import BaseInterfaceTable
 from dcim.tables.devices import BaseInterfaceTable
 from tenancy.tables import TenantColumn
 from tenancy.tables import TenantColumn
 from utilities.tables import (
 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
 from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
 
 
@@ -91,13 +92,14 @@ class ClusterTable(BaseTable):
         url_params={'cluster_id': 'pk'},
         url_params={'cluster_id': 'pk'},
         verbose_name='VMs'
         verbose_name='VMs'
     )
     )
+    comments = MarkdownColumn()
     tags = TagColumn(
     tags = TagColumn(
         url_name='virtualization:cluster_list'
         url_name='virtualization:cluster_list'
     )
     )
 
 
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = Cluster
         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')
         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'),
             order_by=('primary_ip6', 'primary_ip4'),
             verbose_name='IP Address'
             verbose_name='IP Address'
         )
         )
+    comments = MarkdownColumn()
     tags = TagColumn(
     tags = TagColumn(
         url_name='virtualization:virtualmachine_list'
         url_name='virtualization:virtualmachine_list'
     )
     )
@@ -151,7 +154,7 @@ class VirtualMachineDetailTable(VirtualMachineTable):
         model = VirtualMachine
         model = VirtualMachine
         fields = (
         fields = (
             'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'platform', 'vcpus', 'memory', 'disk', 'primary_ip4',
             '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 = (
         default_columns = (
             'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk', 'primary_ip',
             'pk', 'name', 'status', 'cluster', 'role', 'tenant', 'vcpus', 'memory', 'disk', 'primary_ip',