1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00
Files
netbox-community-netbox/netbox/ipam/tables/vlans.py

242 lines
6.6 KiB
Python
Raw Permalink Normal View History

2021-09-17 15:37:19 -04:00
import django_tables2 as tables
from django.utils.safestring import mark_safe
from django.utils.translation import gettext_lazy as _
2021-09-17 15:37:19 -04:00
from django_tables2.utils import Accessor
from dcim.models import Interface
from ipam.models import *
2022-01-27 15:48:05 -05:00
from netbox.tables import NetBoxTable, columns
from tenancy.tables import TenancyColumnsMixin, TenantColumn
2021-09-17 15:37:19 -04:00
from virtualization.models import VMInterface
__all__ = (
'InterfaceVLANTable',
'VLANDevicesTable',
'VLANGroupTable',
'VLANMembersTable',
'VLANTable',
'VLANVirtualMachinesTable',
)
Closes #12128: Refresh the web UI to employ the Tabler CSS framework (#14833) * Remove dark mode styling * Condense & rename light mode stylesheet * Upgrade to Bootstrap 5.3.2 * Swap out Bootstrap for Tabler; remove custom styling * Update base page layout for Tabler * Update login page * Bump node to v18 * Update button styles * Update object list view * Tweak navbar size * Clean up dashboard widgets * Ditch separate stylesheet for print media * Remove simplebar * Remove obsolete sidebar styling * Clean up object view template * Clean up object edit template * Standardize primary button sizing * Clean up object list styling * Add buttons for add & import to navigation menu * Fix global search bar * Fix slim-select form widget styling * Fix toast styling * Set base fonts * Clean up paginator styling * Clean up navigation menu group headings * Clean up footer links * Clean up card styles * Move SVG styles to a designated directory * Restructure SCSS files * Remove obsolete/redundant dependencies * Fix icon spacing * Update background color classes * Tweak banner & footer styling and spacing * Fix badge background colors in table content * Bump @types/bootstrap to 5.2.10 * Clean up form layouts * Fix object selector button style * Fix icon padding inside small buttons * Fix icon & badge spacing inside buttons and tabs * Hide paginator for empty pages * Fix hover color for list items (Tabler bug #1694) * Fix width of checkbox column in empty tables * Clean up bulk edit template * Fix border color of reslug button * Package & serve Google fonts locally * Fix tab styling * Reduce vetical space at top of dashboard * Remove obsolete content-wrapper template block * Fix icon spacing in dropdown menu items * Fix color label sizing * Separate bulk delete form & object list into tabs * Fix styling of filter group headings * Fix styling for object changelog & journal views * Standardize ordering & styling of action buttons * Fix designation of active menu item * Automatically expand menu section containing the active link * Clean up nav menu styling * Remove button colors; hide buttons except on hover/active * Highlight menu group containing the active item * Update & standardize alert styling * Refactor base templates to ensure consistent display of header content * Tweak styling for links inside badges * Clean up top menu * Fix JSON/YAML toggles for config context data * Fix object template header * Constrain tabs to container-xl; tweak header margins * Fix object identifier styling * Fix positioning of card header buttons * Remove padding from HTMX tables inside cards * Ensure consistent use of row headings in attribute tables * Remove padding surrounding tables inside cards * Remove obsolete CSS classes * Misc cleanup of old styling * Refactor 'controls' template block; ditch old classes * Fix login button sizing * Limit object edit form width * Append asterisk to required form field labels * Remove obsolete styling * Remove obsolete styling * Fix position of progress bar outside label * Fix alignment of delete button in report/script lists * Fix <pre> styling * Clean up page headers * Replace SVG icons with Material Design icons * Restore dark mode togle functionality * Fix top navbar background color under dark mode * Rebuild static assets
2024-01-17 16:25:42 -05:00
AVAILABLE_LABEL = mark_safe('<span class="badge text-bg-success">Available</span>')
2021-09-17 15:37:19 -04:00
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 value.all %}
2021-09-17 15:37:19 -04:00
<a href="{% url 'ipam:prefix' pk=prefix.pk %}">{{ prefix }}</a>{% if not forloop.last %}<br />{% endif %}
{% endfor %}
"""
VLANGROUP_BUTTONS = """
2021-09-17 15:37:19 -04:00
{% 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
#
2022-01-27 15:48:05 -05:00
class VLANGroupTable(NetBoxTable):
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
scope_type = columns.ContentTypeColumn(
verbose_name=_('Scope Type'),
)
2021-09-17 15:37:19 -04:00
scope = tables.Column(
verbose_name=_('Scope'),
2021-09-17 15:37:19 -04:00
linkify=True,
orderable=False
)
vlan_count = columns.LinkedCountColumn(
2021-09-17 15:37:19 -04:00
viewname='ipam:vlan_list',
url_params={'group_id': 'pk'},
verbose_name=_('VLANs')
2021-09-17 15:37:19 -04:00
)
utilization = columns.UtilizationColumn(
orderable=False,
verbose_name=_('Utilization')
)
tags = columns.TagColumn(
url_name='ipam:vlangroup_list'
)
actions = columns.ActionsColumn(
extra_buttons=VLANGROUP_BUTTONS
2021-09-17 15:37:19 -04:00
)
2022-01-27 15:48:05 -05:00
class Meta(NetBoxTable.Meta):
2021-09-17 15:37:19 -04:00
model = VLANGroup
fields = (
'pk', 'id', 'name', 'scope_type', 'scope', 'min_vid', 'max_vid', 'vlan_count', 'slug', 'description',
'tags', 'created', 'last_updated', 'actions', 'utilization',
)
default_columns = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'utilization', 'description')
2021-09-17 15:37:19 -04:00
#
# VLANs
#
class VLANTable(TenancyColumnsMixin, NetBoxTable):
2021-09-17 15:37:19 -04:00
vid = tables.TemplateColumn(
template_code=VLAN_LINK,
verbose_name=_('VID')
2021-09-17 15:37:19 -04:00
)
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
2021-09-17 15:37:19 -04:00
site = tables.Column(
verbose_name=_('Site'),
2021-09-17 15:37:19 -04:00
linkify=True
)
group = tables.Column(
verbose_name=_('Group'),
2021-09-17 15:37:19 -04:00
linkify=True
)
status = columns.ChoiceFieldColumn(
verbose_name=_('Status'),
2021-09-17 15:37:19 -04:00
default=AVAILABLE_LABEL
)
role = tables.Column(
verbose_name=_('Role'),
linkify=True
2021-09-17 15:37:19 -04:00
)
l2vpn = tables.Column(
accessor=tables.A('l2vpn_termination__l2vpn'),
linkify=True,
orderable=False,
verbose_name=_('L2VPN')
)
prefixes = columns.TemplateColumn(
2021-09-17 15:37:19 -04:00
template_code=VLAN_PREFIXES,
orderable=False,
verbose_name=_('Prefixes')
)
comments = columns.MarkdownColumn(
verbose_name=_('Comments'),
2021-09-17 15:37:19 -04:00
)
tags = columns.TagColumn(
2021-09-17 15:37:19 -04:00
url_name='ipam:vlan_list'
)
2022-01-27 15:48:05 -05:00
class Meta(NetBoxTable.Meta):
2021-09-17 15:37:19 -04:00
model = VLAN
2022-01-17 11:12:54 -05:00
fields = (
'pk', 'id', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'tenant_group', 'status', 'role',
'description', 'comments', 'tags', 'l2vpn', 'created', 'last_updated',
2022-01-17 11:12:54 -05:00
)
2021-09-17 15:37:19 -04:00
default_columns = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description')
row_attrs = {
'class': lambda record: 'success' if not isinstance(record, VLAN) else '',
}
2022-01-27 15:48:05 -05:00
class VLANMembersTable(NetBoxTable):
2021-09-17 15:37:19 -04:00
"""
Base table for Interface and VMInterface assignments
"""
name = tables.Column(
linkify=True,
verbose_name=_('Interface')
2021-09-17 15:37:19 -04:00
)
tagged = tables.TemplateColumn(
verbose_name=_('Tagged'),
2021-09-17 15:37:19 -04:00
template_code=VLAN_MEMBER_TAGGED,
orderable=False
)
class VLANDevicesTable(VLANMembersTable):
device = tables.Column(
verbose_name=_('Device'),
2021-09-17 15:37:19 -04:00
linkify=True
)
actions = columns.ActionsColumn(
actions=('edit',)
2022-01-06 16:53:24 -05:00
)
2021-09-17 15:37:19 -04:00
2022-01-27 15:48:05 -05:00
class Meta(NetBoxTable.Meta):
2021-09-17 15:37:19 -04:00
model = Interface
fields = ('device', 'name', 'tagged', 'actions')
exclude = ('id', )
2021-09-17 15:37:19 -04:00
class VLANVirtualMachinesTable(VLANMembersTable):
virtual_machine = tables.Column(
verbose_name=_('Virtual Machine'),
2021-09-17 15:37:19 -04:00
linkify=True
)
actions = columns.ActionsColumn(
actions=('edit',)
2022-01-06 16:53:24 -05:00
)
2021-09-17 15:37:19 -04:00
2022-01-27 15:48:05 -05:00
class Meta(NetBoxTable.Meta):
2021-09-17 15:37:19 -04:00
model = VMInterface
fields = ('virtual_machine', 'name', 'tagged', 'actions')
exclude = ('id', )
2021-09-17 15:37:19 -04:00
class InterfaceVLANTable(NetBoxTable):
2021-09-17 15:37:19 -04:00
"""
List VLANs assigned to a specific Interface.
"""
vid = tables.Column(
linkify=True,
verbose_name=_('VID')
)
tagged = columns.BooleanColumn(
verbose_name=_('Tagged'),
2021-09-17 15:37:19 -04:00
)
site = tables.Column(
verbose_name=_('Site'),
2021-09-17 15:37:19 -04:00
linkify=True
)
group = tables.Column(
accessor=Accessor('group__name'),
verbose_name=_('Group')
)
tenant = TenantColumn(
verbose_name=_('Tenant'),
)
status = columns.ChoiceFieldColumn(
verbose_name=_('Status'),
2021-09-17 15:37:19 -04:00
)
role = tables.Column(
verbose_name=_('Role'),
linkify=True
2021-09-17 15:37:19 -04:00
)
2022-01-27 15:48:05 -05:00
class Meta(NetBoxTable.Meta):
2021-09-17 15:37:19 -04:00
model = VLAN
fields = ('vid', 'tagged', 'site', 'group', 'name', 'tenant', 'status', 'role', 'description')
exclude = ('id', )
2021-09-17 15:37:19 -04:00
def __init__(self, interface, *args, **kwargs):
self.interface = interface
super().__init__(*args, **kwargs)