mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-25 18:08:38 -06:00
Clean up table classes
This commit is contained in:
parent
9cb29f48a0
commit
7b3f6f1c67
@ -6,6 +6,14 @@ from utilities.tables import BaseTable, ButtonsColumn, ChoiceFieldColumn, Markdo
|
|||||||
from .models import *
|
from .models import *
|
||||||
|
|
||||||
|
|
||||||
|
__all__ = (
|
||||||
|
'CircuitTable',
|
||||||
|
'CircuitTypeTable',
|
||||||
|
'ProviderTable',
|
||||||
|
'ProviderNetworkTable',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
CIRCUITTERMINATION_LINK = """
|
CIRCUITTERMINATION_LINK = """
|
||||||
{% if value.site %}
|
{% if value.site %}
|
||||||
<a href="{{ value.site.get_absolute_url }}">{{ value.site }}</a>
|
<a href="{{ value.site.get_absolute_url }}">{{ value.site }}</a>
|
||||||
|
@ -18,6 +18,7 @@ from .template_code import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
|
'BaseInterfaceTable',
|
||||||
'ConsolePortTable',
|
'ConsolePortTable',
|
||||||
'ConsoleServerPortTable',
|
'ConsoleServerPortTable',
|
||||||
'DeviceBayTable',
|
'DeviceBayTable',
|
||||||
|
@ -7,6 +7,19 @@ from utilities.tables import (
|
|||||||
)
|
)
|
||||||
from .models import *
|
from .models import *
|
||||||
|
|
||||||
|
__all__ = (
|
||||||
|
'ConfigContextTable',
|
||||||
|
'CustomFieldTable',
|
||||||
|
'CustomLinkTable',
|
||||||
|
'ExportTemplateTable',
|
||||||
|
'JournalEntryTable',
|
||||||
|
'ObjectChangeTable',
|
||||||
|
'ObjectJournalTable',
|
||||||
|
'TaggedItemTable',
|
||||||
|
'TagTable',
|
||||||
|
'WebhookTable',
|
||||||
|
)
|
||||||
|
|
||||||
CONFIGCONTEXT_ACTIONS = """
|
CONFIGCONTEXT_ACTIONS = """
|
||||||
{% if perms.extras.change_configcontext %}
|
{% if perms.extras.change_configcontext %}
|
||||||
<a href="{% url 'extras:configcontext_edit' pk=record.pk %}" class="btn btn-sm btn-warning"><i class="mdi mdi-pencil" aria-hidden="true"></i></a>
|
<a href="{% url 'extras:configcontext_edit' pk=record.pk %}" class="btn btn-sm btn-warning"><i class="mdi mdi-pencil" aria-hidden="true"></i></a>
|
||||||
|
4
netbox/ipam/tables/__init__.py
Normal file
4
netbox/ipam/tables/__init__.py
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
from .ip import *
|
||||||
|
from .services import *
|
||||||
|
from .vlans import *
|
||||||
|
from .vrfs import *
|
@ -2,14 +2,23 @@ import django_tables2 as tables
|
|||||||
from django.utils.safestring import mark_safe
|
from django.utils.safestring import mark_safe
|
||||||
from django_tables2.utils import Accessor
|
from django_tables2.utils import Accessor
|
||||||
|
|
||||||
from dcim.models import Interface
|
|
||||||
from tenancy.tables import TenantColumn
|
from tenancy.tables import TenantColumn
|
||||||
from utilities.tables import (
|
from utilities.tables import (
|
||||||
BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ContentTypeColumn, LinkedCountColumn, TagColumn,
|
BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, TagColumn,
|
||||||
ToggleColumn, UtilizationColumn,
|
ToggleColumn, UtilizationColumn,
|
||||||
)
|
)
|
||||||
from virtualization.models import VMInterface
|
from ipam.models import *
|
||||||
from .models import *
|
|
||||||
|
__all__ = (
|
||||||
|
'AggregateTable',
|
||||||
|
'InterfaceIPAddressTable',
|
||||||
|
'IPAddressAssignTable',
|
||||||
|
'IPAddressTable',
|
||||||
|
'IPRangeTable',
|
||||||
|
'PrefixTable',
|
||||||
|
'RIRTable',
|
||||||
|
'RoleTable',
|
||||||
|
)
|
||||||
|
|
||||||
AVAILABLE_LABEL = mark_safe('<span class="badge bg-success">Available</span>')
|
AVAILABLE_LABEL = mark_safe('<span class="badge bg-success">Available</span>')
|
||||||
|
|
||||||
@ -66,114 +75,6 @@ VRF_LINK = """
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
VRF_TARGETS = """
|
|
||||||
{% for rt in value.all %}
|
|
||||||
<a href="{{ rt.get_absolute_url }}">{{ rt }}</a>{% if not forloop.last %}<br />{% endif %}
|
|
||||||
{% empty %}
|
|
||||||
—
|
|
||||||
{% endfor %}
|
|
||||||
"""
|
|
||||||
|
|
||||||
VLAN_LINK = """
|
|
||||||
{% if record.pk %}
|
|
||||||
<a href="{{ record.get_absolute_url }}">{{ record.vid }}</a>
|
|
||||||
{% elif perms.ipam.add_vlan %}
|
|
||||||
<a href="{% url 'ipam:vlan_add' %}?vid={{ record.vid }}{% if record.vlan_group %}&group={{ record.vlan_group.pk }}{% endif %}" class="btn btn-sm btn-success">{{ record.available }} VLAN{{ record.available|pluralize }} available</a>
|
|
||||||
{% else %}
|
|
||||||
{{ record.available }} VLAN{{ record.available|pluralize }} available
|
|
||||||
{% endif %}
|
|
||||||
"""
|
|
||||||
|
|
||||||
VLAN_PREFIXES = """
|
|
||||||
{% for prefix in record.prefixes.all %}
|
|
||||||
<a href="{% url 'ipam:prefix' pk=prefix.pk %}">{{ prefix }}</a>{% if not forloop.last %}<br />{% endif %}
|
|
||||||
{% empty %}
|
|
||||||
—
|
|
||||||
{% endfor %}
|
|
||||||
"""
|
|
||||||
|
|
||||||
VLAN_ROLE_LINK = """
|
|
||||||
{% if record.role %}
|
|
||||||
<a href="{% url 'ipam:vlan_list' %}?role={{ record.role.slug }}">{{ record.role }}</a>
|
|
||||||
{% else %}
|
|
||||||
—
|
|
||||||
{% endif %}
|
|
||||||
"""
|
|
||||||
|
|
||||||
VLANGROUP_ADD_VLAN = """
|
|
||||||
{% with next_vid=record.get_next_available_vid %}
|
|
||||||
{% if next_vid and perms.ipam.add_vlan %}
|
|
||||||
<a href="{% url 'ipam:vlan_add' %}?group={{ record.pk }}&vid={{ next_vid }}" title="Add VLAN" class="btn btn-sm btn-success">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i>
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
{% endwith %}
|
|
||||||
"""
|
|
||||||
|
|
||||||
VLAN_MEMBER_TAGGED = """
|
|
||||||
{% if record.untagged_vlan_id == object.pk %}
|
|
||||||
<span class="text-danger"><i class="mdi mdi-close-thick"></i></span>
|
|
||||||
{% else %}
|
|
||||||
<span class="text-success"><i class="mdi mdi-check-bold"></i></span>
|
|
||||||
{% endif %}
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# VRFs
|
|
||||||
#
|
|
||||||
|
|
||||||
class VRFTable(BaseTable):
|
|
||||||
pk = ToggleColumn()
|
|
||||||
name = tables.Column(
|
|
||||||
linkify=True
|
|
||||||
)
|
|
||||||
rd = tables.Column(
|
|
||||||
verbose_name='RD'
|
|
||||||
)
|
|
||||||
tenant = TenantColumn()
|
|
||||||
enforce_unique = BooleanColumn(
|
|
||||||
verbose_name='Unique'
|
|
||||||
)
|
|
||||||
import_targets = tables.TemplateColumn(
|
|
||||||
template_code=VRF_TARGETS,
|
|
||||||
orderable=False
|
|
||||||
)
|
|
||||||
export_targets = tables.TemplateColumn(
|
|
||||||
template_code=VRF_TARGETS,
|
|
||||||
orderable=False
|
|
||||||
)
|
|
||||||
tags = TagColumn(
|
|
||||||
url_name='ipam:vrf_list'
|
|
||||||
)
|
|
||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
|
||||||
model = VRF
|
|
||||||
fields = (
|
|
||||||
'pk', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'import_targets', 'export_targets', 'tags',
|
|
||||||
)
|
|
||||||
default_columns = ('pk', 'name', 'rd', 'tenant', 'description')
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Route targets
|
|
||||||
#
|
|
||||||
|
|
||||||
class RouteTargetTable(BaseTable):
|
|
||||||
pk = ToggleColumn()
|
|
||||||
name = tables.Column(
|
|
||||||
linkify=True
|
|
||||||
)
|
|
||||||
tenant = TenantColumn()
|
|
||||||
tags = TagColumn(
|
|
||||||
url_name='ipam:vrf_list'
|
|
||||||
)
|
|
||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
|
||||||
model = RouteTarget
|
|
||||||
fields = ('pk', 'name', 'tenant', 'description', 'tags')
|
|
||||||
default_columns = ('pk', 'name', 'tenant', 'description')
|
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# RIRs
|
# RIRs
|
||||||
@ -475,166 +376,3 @@ class InterfaceIPAddressTable(BaseTable):
|
|||||||
class Meta(BaseTable.Meta):
|
class Meta(BaseTable.Meta):
|
||||||
model = IPAddress
|
model = IPAddress
|
||||||
fields = ('address', 'vrf', 'status', 'role', 'tenant', 'description')
|
fields = ('address', 'vrf', 'status', 'role', 'tenant', 'description')
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# VLAN groups
|
|
||||||
#
|
|
||||||
|
|
||||||
class VLANGroupTable(BaseTable):
|
|
||||||
pk = ToggleColumn()
|
|
||||||
name = tables.Column(linkify=True)
|
|
||||||
scope_type = ContentTypeColumn()
|
|
||||||
scope = tables.Column(
|
|
||||||
linkify=True,
|
|
||||||
orderable=False
|
|
||||||
)
|
|
||||||
vlan_count = LinkedCountColumn(
|
|
||||||
viewname='ipam:vlan_list',
|
|
||||||
url_params={'group_id': 'pk'},
|
|
||||||
verbose_name='VLANs'
|
|
||||||
)
|
|
||||||
actions = ButtonsColumn(
|
|
||||||
model=VLANGroup,
|
|
||||||
prepend_template=VLANGROUP_ADD_VLAN
|
|
||||||
)
|
|
||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
|
||||||
model = VLANGroup
|
|
||||||
fields = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'slug', 'description', 'actions')
|
|
||||||
default_columns = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'description', 'actions')
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# VLANs
|
|
||||||
#
|
|
||||||
|
|
||||||
class VLANTable(BaseTable):
|
|
||||||
pk = ToggleColumn()
|
|
||||||
vid = tables.TemplateColumn(
|
|
||||||
template_code=VLAN_LINK,
|
|
||||||
verbose_name='ID'
|
|
||||||
)
|
|
||||||
site = tables.Column(
|
|
||||||
linkify=True
|
|
||||||
)
|
|
||||||
group = tables.Column(
|
|
||||||
linkify=True
|
|
||||||
)
|
|
||||||
tenant = TenantColumn()
|
|
||||||
status = ChoiceFieldColumn(
|
|
||||||
default=AVAILABLE_LABEL
|
|
||||||
)
|
|
||||||
role = tables.TemplateColumn(
|
|
||||||
template_code=VLAN_ROLE_LINK
|
|
||||||
)
|
|
||||||
prefixes = tables.TemplateColumn(
|
|
||||||
template_code=VLAN_PREFIXES,
|
|
||||||
orderable=False,
|
|
||||||
verbose_name='Prefixes'
|
|
||||||
)
|
|
||||||
tags = TagColumn(
|
|
||||||
url_name='ipam:vlan_list'
|
|
||||||
)
|
|
||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
|
||||||
model = VLAN
|
|
||||||
fields = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description', 'tags')
|
|
||||||
default_columns = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description')
|
|
||||||
row_attrs = {
|
|
||||||
'class': lambda record: 'success' if not isinstance(record, VLAN) else '',
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
class VLANMembersTable(BaseTable):
|
|
||||||
"""
|
|
||||||
Base table for Interface and VMInterface assignments
|
|
||||||
"""
|
|
||||||
name = tables.Column(
|
|
||||||
linkify=True,
|
|
||||||
verbose_name='Interface'
|
|
||||||
)
|
|
||||||
tagged = tables.TemplateColumn(
|
|
||||||
template_code=VLAN_MEMBER_TAGGED,
|
|
||||||
orderable=False
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
class VLANDevicesTable(VLANMembersTable):
|
|
||||||
device = tables.Column(
|
|
||||||
linkify=True
|
|
||||||
)
|
|
||||||
actions = ButtonsColumn(Interface, buttons=['edit'])
|
|
||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
|
||||||
model = Interface
|
|
||||||
fields = ('device', 'name', 'tagged', 'actions')
|
|
||||||
|
|
||||||
|
|
||||||
class VLANVirtualMachinesTable(VLANMembersTable):
|
|
||||||
virtual_machine = tables.Column(
|
|
||||||
linkify=True
|
|
||||||
)
|
|
||||||
actions = ButtonsColumn(VMInterface, buttons=['edit'])
|
|
||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
|
||||||
model = VMInterface
|
|
||||||
fields = ('virtual_machine', 'name', 'tagged', 'actions')
|
|
||||||
|
|
||||||
|
|
||||||
class InterfaceVLANTable(BaseTable):
|
|
||||||
"""
|
|
||||||
List VLANs assigned to a specific Interface.
|
|
||||||
"""
|
|
||||||
vid = tables.Column(
|
|
||||||
linkify=True,
|
|
||||||
verbose_name='ID'
|
|
||||||
)
|
|
||||||
tagged = BooleanColumn()
|
|
||||||
site = tables.Column(
|
|
||||||
linkify=True
|
|
||||||
)
|
|
||||||
group = tables.Column(
|
|
||||||
accessor=Accessor('group__name'),
|
|
||||||
verbose_name='Group'
|
|
||||||
)
|
|
||||||
tenant = TenantColumn()
|
|
||||||
status = ChoiceFieldColumn()
|
|
||||||
role = tables.TemplateColumn(
|
|
||||||
template_code=VLAN_ROLE_LINK
|
|
||||||
)
|
|
||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
|
||||||
model = VLAN
|
|
||||||
fields = ('vid', 'tagged', 'site', 'group', 'name', 'tenant', 'status', 'role', 'description')
|
|
||||||
|
|
||||||
def __init__(self, interface, *args, **kwargs):
|
|
||||||
self.interface = interface
|
|
||||||
super().__init__(*args, **kwargs)
|
|
||||||
|
|
||||||
|
|
||||||
#
|
|
||||||
# Services
|
|
||||||
#
|
|
||||||
|
|
||||||
class ServiceTable(BaseTable):
|
|
||||||
pk = ToggleColumn()
|
|
||||||
name = tables.Column(
|
|
||||||
linkify=True
|
|
||||||
)
|
|
||||||
parent = tables.Column(
|
|
||||||
linkify=True,
|
|
||||||
order_by=('device', 'virtual_machine')
|
|
||||||
)
|
|
||||||
ports = tables.TemplateColumn(
|
|
||||||
template_code='{{ record.port_list }}',
|
|
||||||
verbose_name='Ports'
|
|
||||||
)
|
|
||||||
tags = TagColumn(
|
|
||||||
url_name='ipam:service_list'
|
|
||||||
)
|
|
||||||
|
|
||||||
class Meta(BaseTable.Meta):
|
|
||||||
model = Service
|
|
||||||
fields = ('pk', 'name', 'parent', 'protocol', 'ports', 'ipaddresses', 'description', 'tags')
|
|
||||||
default_columns = ('pk', 'name', 'parent', 'protocol', 'ports', 'description')
|
|
35
netbox/ipam/tables/services.py
Normal file
35
netbox/ipam/tables/services.py
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
import django_tables2 as tables
|
||||||
|
|
||||||
|
from utilities.tables import BaseTable, TagColumn, ToggleColumn
|
||||||
|
from ipam.models import *
|
||||||
|
|
||||||
|
__all__ = (
|
||||||
|
'ServiceTable',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Services
|
||||||
|
#
|
||||||
|
|
||||||
|
class ServiceTable(BaseTable):
|
||||||
|
pk = ToggleColumn()
|
||||||
|
name = tables.Column(
|
||||||
|
linkify=True
|
||||||
|
)
|
||||||
|
parent = tables.Column(
|
||||||
|
linkify=True,
|
||||||
|
order_by=('device', 'virtual_machine')
|
||||||
|
)
|
||||||
|
ports = tables.TemplateColumn(
|
||||||
|
template_code='{{ record.port_list }}',
|
||||||
|
verbose_name='Ports'
|
||||||
|
)
|
||||||
|
tags = TagColumn(
|
||||||
|
url_name='ipam:service_list'
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta(BaseTable.Meta):
|
||||||
|
model = Service
|
||||||
|
fields = ('pk', 'name', 'parent', 'protocol', 'ports', 'ipaddresses', 'description', 'tags')
|
||||||
|
default_columns = ('pk', 'name', 'parent', 'protocol', 'ports', 'description')
|
203
netbox/ipam/tables/vlans.py
Normal file
203
netbox/ipam/tables/vlans.py
Normal file
@ -0,0 +1,203 @@
|
|||||||
|
import django_tables2 as tables
|
||||||
|
from django.utils.safestring import mark_safe
|
||||||
|
from django_tables2.utils import Accessor
|
||||||
|
|
||||||
|
from dcim.models import Interface
|
||||||
|
from tenancy.tables import TenantColumn
|
||||||
|
from utilities.tables import (
|
||||||
|
BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ContentTypeColumn, LinkedCountColumn, TagColumn,
|
||||||
|
ToggleColumn,
|
||||||
|
)
|
||||||
|
from virtualization.models import VMInterface
|
||||||
|
from ipam.models import *
|
||||||
|
|
||||||
|
__all__ = (
|
||||||
|
'InterfaceVLANTable',
|
||||||
|
'VLANDevicesTable',
|
||||||
|
'VLANGroupTable',
|
||||||
|
'VLANMembersTable',
|
||||||
|
'VLANTable',
|
||||||
|
'VLANVirtualMachinesTable',
|
||||||
|
)
|
||||||
|
|
||||||
|
AVAILABLE_LABEL = mark_safe('<span class="badge bg-success">Available</span>')
|
||||||
|
|
||||||
|
VLAN_LINK = """
|
||||||
|
{% if record.pk %}
|
||||||
|
<a href="{{ record.get_absolute_url }}">{{ record.vid }}</a>
|
||||||
|
{% elif perms.ipam.add_vlan %}
|
||||||
|
<a href="{% url 'ipam:vlan_add' %}?vid={{ record.vid }}{% if record.vlan_group %}&group={{ record.vlan_group.pk }}{% endif %}" class="btn btn-sm btn-success">{{ record.available }} VLAN{{ record.available|pluralize }} available</a>
|
||||||
|
{% else %}
|
||||||
|
{{ record.available }} VLAN{{ record.available|pluralize }} available
|
||||||
|
{% endif %}
|
||||||
|
"""
|
||||||
|
|
||||||
|
VLAN_PREFIXES = """
|
||||||
|
{% for prefix in record.prefixes.all %}
|
||||||
|
<a href="{% url 'ipam:prefix' pk=prefix.pk %}">{{ prefix }}</a>{% if not forloop.last %}<br />{% endif %}
|
||||||
|
{% empty %}
|
||||||
|
—
|
||||||
|
{% endfor %}
|
||||||
|
"""
|
||||||
|
|
||||||
|
VLAN_ROLE_LINK = """
|
||||||
|
{% if record.role %}
|
||||||
|
<a href="{% url 'ipam:vlan_list' %}?role={{ record.role.slug }}">{{ record.role }}</a>
|
||||||
|
{% else %}
|
||||||
|
—
|
||||||
|
{% endif %}
|
||||||
|
"""
|
||||||
|
|
||||||
|
VLANGROUP_ADD_VLAN = """
|
||||||
|
{% with next_vid=record.get_next_available_vid %}
|
||||||
|
{% if next_vid and perms.ipam.add_vlan %}
|
||||||
|
<a href="{% url 'ipam:vlan_add' %}?group={{ record.pk }}&vid={{ next_vid }}" title="Add VLAN" class="btn btn-sm btn-success">
|
||||||
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i>
|
||||||
|
</a>
|
||||||
|
{% endif %}
|
||||||
|
{% endwith %}
|
||||||
|
"""
|
||||||
|
|
||||||
|
VLAN_MEMBER_TAGGED = """
|
||||||
|
{% if record.untagged_vlan_id == object.pk %}
|
||||||
|
<span class="text-danger"><i class="mdi mdi-close-thick"></i></span>
|
||||||
|
{% else %}
|
||||||
|
<span class="text-success"><i class="mdi mdi-check-bold"></i></span>
|
||||||
|
{% endif %}
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# VLAN groups
|
||||||
|
#
|
||||||
|
|
||||||
|
class VLANGroupTable(BaseTable):
|
||||||
|
pk = ToggleColumn()
|
||||||
|
name = tables.Column(linkify=True)
|
||||||
|
scope_type = ContentTypeColumn()
|
||||||
|
scope = tables.Column(
|
||||||
|
linkify=True,
|
||||||
|
orderable=False
|
||||||
|
)
|
||||||
|
vlan_count = LinkedCountColumn(
|
||||||
|
viewname='ipam:vlan_list',
|
||||||
|
url_params={'group_id': 'pk'},
|
||||||
|
verbose_name='VLANs'
|
||||||
|
)
|
||||||
|
actions = ButtonsColumn(
|
||||||
|
model=VLANGroup,
|
||||||
|
prepend_template=VLANGROUP_ADD_VLAN
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta(BaseTable.Meta):
|
||||||
|
model = VLANGroup
|
||||||
|
fields = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'slug', 'description', 'actions')
|
||||||
|
default_columns = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'description', 'actions')
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# VLANs
|
||||||
|
#
|
||||||
|
|
||||||
|
class VLANTable(BaseTable):
|
||||||
|
pk = ToggleColumn()
|
||||||
|
vid = tables.TemplateColumn(
|
||||||
|
template_code=VLAN_LINK,
|
||||||
|
verbose_name='ID'
|
||||||
|
)
|
||||||
|
site = tables.Column(
|
||||||
|
linkify=True
|
||||||
|
)
|
||||||
|
group = tables.Column(
|
||||||
|
linkify=True
|
||||||
|
)
|
||||||
|
tenant = TenantColumn()
|
||||||
|
status = ChoiceFieldColumn(
|
||||||
|
default=AVAILABLE_LABEL
|
||||||
|
)
|
||||||
|
role = tables.TemplateColumn(
|
||||||
|
template_code=VLAN_ROLE_LINK
|
||||||
|
)
|
||||||
|
prefixes = tables.TemplateColumn(
|
||||||
|
template_code=VLAN_PREFIXES,
|
||||||
|
orderable=False,
|
||||||
|
verbose_name='Prefixes'
|
||||||
|
)
|
||||||
|
tags = TagColumn(
|
||||||
|
url_name='ipam:vlan_list'
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta(BaseTable.Meta):
|
||||||
|
model = VLAN
|
||||||
|
fields = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description', 'tags')
|
||||||
|
default_columns = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description')
|
||||||
|
row_attrs = {
|
||||||
|
'class': lambda record: 'success' if not isinstance(record, VLAN) else '',
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
class VLANMembersTable(BaseTable):
|
||||||
|
"""
|
||||||
|
Base table for Interface and VMInterface assignments
|
||||||
|
"""
|
||||||
|
name = tables.Column(
|
||||||
|
linkify=True,
|
||||||
|
verbose_name='Interface'
|
||||||
|
)
|
||||||
|
tagged = tables.TemplateColumn(
|
||||||
|
template_code=VLAN_MEMBER_TAGGED,
|
||||||
|
orderable=False
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class VLANDevicesTable(VLANMembersTable):
|
||||||
|
device = tables.Column(
|
||||||
|
linkify=True
|
||||||
|
)
|
||||||
|
actions = ButtonsColumn(Interface, buttons=['edit'])
|
||||||
|
|
||||||
|
class Meta(BaseTable.Meta):
|
||||||
|
model = Interface
|
||||||
|
fields = ('device', 'name', 'tagged', 'actions')
|
||||||
|
|
||||||
|
|
||||||
|
class VLANVirtualMachinesTable(VLANMembersTable):
|
||||||
|
virtual_machine = tables.Column(
|
||||||
|
linkify=True
|
||||||
|
)
|
||||||
|
actions = ButtonsColumn(VMInterface, buttons=['edit'])
|
||||||
|
|
||||||
|
class Meta(BaseTable.Meta):
|
||||||
|
model = VMInterface
|
||||||
|
fields = ('virtual_machine', 'name', 'tagged', 'actions')
|
||||||
|
|
||||||
|
|
||||||
|
class InterfaceVLANTable(BaseTable):
|
||||||
|
"""
|
||||||
|
List VLANs assigned to a specific Interface.
|
||||||
|
"""
|
||||||
|
vid = tables.Column(
|
||||||
|
linkify=True,
|
||||||
|
verbose_name='ID'
|
||||||
|
)
|
||||||
|
tagged = BooleanColumn()
|
||||||
|
site = tables.Column(
|
||||||
|
linkify=True
|
||||||
|
)
|
||||||
|
group = tables.Column(
|
||||||
|
accessor=Accessor('group__name'),
|
||||||
|
verbose_name='Group'
|
||||||
|
)
|
||||||
|
tenant = TenantColumn()
|
||||||
|
status = ChoiceFieldColumn()
|
||||||
|
role = tables.TemplateColumn(
|
||||||
|
template_code=VLAN_ROLE_LINK
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta(BaseTable.Meta):
|
||||||
|
model = VLAN
|
||||||
|
fields = ('vid', 'tagged', 'site', 'group', 'name', 'tenant', 'status', 'role', 'description')
|
||||||
|
|
||||||
|
def __init__(self, interface, *args, **kwargs):
|
||||||
|
self.interface = interface
|
||||||
|
super().__init__(*args, **kwargs)
|
74
netbox/ipam/tables/vrfs.py
Normal file
74
netbox/ipam/tables/vrfs.py
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
import django_tables2 as tables
|
||||||
|
|
||||||
|
from tenancy.tables import TenantColumn
|
||||||
|
from utilities.tables import BaseTable, BooleanColumn, TagColumn, ToggleColumn
|
||||||
|
from ipam.models import *
|
||||||
|
|
||||||
|
__all__ = (
|
||||||
|
'RouteTargetTable',
|
||||||
|
'VRFTable',
|
||||||
|
)
|
||||||
|
|
||||||
|
VRF_TARGETS = """
|
||||||
|
{% for rt in value.all %}
|
||||||
|
<a href="{{ rt.get_absolute_url }}">{{ rt }}</a>{% if not forloop.last %}<br />{% endif %}
|
||||||
|
{% empty %}
|
||||||
|
—
|
||||||
|
{% endfor %}
|
||||||
|
"""
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# VRFs
|
||||||
|
#
|
||||||
|
|
||||||
|
class VRFTable(BaseTable):
|
||||||
|
pk = ToggleColumn()
|
||||||
|
name = tables.Column(
|
||||||
|
linkify=True
|
||||||
|
)
|
||||||
|
rd = tables.Column(
|
||||||
|
verbose_name='RD'
|
||||||
|
)
|
||||||
|
tenant = TenantColumn()
|
||||||
|
enforce_unique = BooleanColumn(
|
||||||
|
verbose_name='Unique'
|
||||||
|
)
|
||||||
|
import_targets = tables.TemplateColumn(
|
||||||
|
template_code=VRF_TARGETS,
|
||||||
|
orderable=False
|
||||||
|
)
|
||||||
|
export_targets = tables.TemplateColumn(
|
||||||
|
template_code=VRF_TARGETS,
|
||||||
|
orderable=False
|
||||||
|
)
|
||||||
|
tags = TagColumn(
|
||||||
|
url_name='ipam:vrf_list'
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta(BaseTable.Meta):
|
||||||
|
model = VRF
|
||||||
|
fields = (
|
||||||
|
'pk', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'import_targets', 'export_targets', 'tags',
|
||||||
|
)
|
||||||
|
default_columns = ('pk', 'name', 'rd', 'tenant', 'description')
|
||||||
|
|
||||||
|
|
||||||
|
#
|
||||||
|
# Route targets
|
||||||
|
#
|
||||||
|
|
||||||
|
class RouteTargetTable(BaseTable):
|
||||||
|
pk = ToggleColumn()
|
||||||
|
name = tables.Column(
|
||||||
|
linkify=True
|
||||||
|
)
|
||||||
|
tenant = TenantColumn()
|
||||||
|
tags = TagColumn(
|
||||||
|
url_name='ipam:vrf_list'
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta(BaseTable.Meta):
|
||||||
|
model = RouteTarget
|
||||||
|
fields = ('pk', 'name', 'tenant', 'description', 'tags')
|
||||||
|
default_columns = ('pk', 'name', 'tenant', 'description')
|
@ -5,6 +5,12 @@ from utilities.tables import (
|
|||||||
)
|
)
|
||||||
from .models import Tenant, TenantGroup
|
from .models import Tenant, TenantGroup
|
||||||
|
|
||||||
|
__all__ = (
|
||||||
|
'TenantColumn',
|
||||||
|
'TenantGroupTable',
|
||||||
|
'TenantTable',
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Table columns
|
# Table columns
|
||||||
|
Loading…
Reference in New Issue
Block a user