mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-23 04:22:01 -06:00
Convert device front ports list to table
This commit is contained in:
parent
eed2e4a15b
commit
68060cf9e9
@ -11,8 +11,8 @@ from utilities.tables import (
|
|||||||
TagColumn, ToggleColumn,
|
TagColumn, ToggleColumn,
|
||||||
)
|
)
|
||||||
from .template_code import (
|
from .template_code import (
|
||||||
CABLETERMINATION, CONSOLEPORT_BUTTONS, CONSOLESERVERPORT_BUTTONS, DEVICE_LINK, INTERFACE_IPADDRESSES,
|
CABLETERMINATION, CONSOLEPORT_BUTTONS, CONSOLESERVERPORT_BUTTONS, DEVICE_LINK, FRONTPORT_BUTTONS,
|
||||||
INTERFACE_TAGGED_VLANS, POWEROUTLET_BUTTONS, POWERPORT_BUTTONS,
|
INTERFACE_IPADDRESSES, INTERFACE_TAGGED_VLANS, POWEROUTLET_BUTTONS, POWERPORT_BUTTONS,
|
||||||
)
|
)
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
@ -21,6 +21,7 @@ __all__ = (
|
|||||||
'DeviceBayTable',
|
'DeviceBayTable',
|
||||||
'DeviceConsolePortTable',
|
'DeviceConsolePortTable',
|
||||||
'DeviceConsoleServerPortTable',
|
'DeviceConsoleServerPortTable',
|
||||||
|
'DeviceFrontPortTable',
|
||||||
'DeviceImportTable',
|
'DeviceImportTable',
|
||||||
'DevicePowerPortTable',
|
'DevicePowerPortTable',
|
||||||
'DevicePowerOutletTable',
|
'DevicePowerOutletTable',
|
||||||
@ -420,6 +421,32 @@ class FrontPortTable(DeviceComponentTable, CableTerminationTable):
|
|||||||
default_columns = ('pk', 'device', 'name', 'label', 'type', 'rear_port', 'rear_port_position', 'description')
|
default_columns = ('pk', 'device', 'name', 'label', 'type', 'rear_port', 'rear_port_position', 'description')
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceFrontPortTable(FrontPortTable):
|
||||||
|
name = tables.TemplateColumn(
|
||||||
|
template_code='<i class="fa fa-square{% if not record.cable %}-o{% endif %}"></i> '
|
||||||
|
'<a href="{{ record.get_absolute_url }}">{{ value }}</a>'
|
||||||
|
)
|
||||||
|
actions = ButtonsColumn(
|
||||||
|
model=FrontPort,
|
||||||
|
buttons=('edit', 'delete'),
|
||||||
|
prepend_template=FRONTPORT_BUTTONS
|
||||||
|
)
|
||||||
|
|
||||||
|
class Meta(DeviceComponentTable.Meta):
|
||||||
|
model = FrontPort
|
||||||
|
fields = (
|
||||||
|
'pk', 'name', 'label', 'type', 'rear_port', 'rear_port_position', 'description', 'cable', 'cable_peer',
|
||||||
|
'connection', 'tags', 'actions',
|
||||||
|
)
|
||||||
|
default_columns = (
|
||||||
|
'pk', 'name', 'label', 'type', 'rear_port', 'rear_port_position', 'description', 'cable', 'cable_peer',
|
||||||
|
'actions',
|
||||||
|
)
|
||||||
|
row_attrs = {
|
||||||
|
'class': lambda record: record.cable.get_status_class() if record.cable else ''
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
class RearPortTable(DeviceComponentTable, CableTerminationTable):
|
class RearPortTable(DeviceComponentTable, CableTerminationTable):
|
||||||
tags = TagColumn(
|
tags = TagColumn(
|
||||||
url_name='dcim:rearport_list'
|
url_name='dcim:rearport_list'
|
||||||
|
@ -137,3 +137,23 @@ POWEROUTLET_BUTTONS = """
|
|||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
FRONTPORT_BUTTONS = """
|
||||||
|
{% if frontport.cable %}
|
||||||
|
{% include 'dcim/inc/cable_toggle_buttons.html' with cable=record.cable %}
|
||||||
|
{% elif perms.dcim.add_cable %}
|
||||||
|
<span class="dropdown">
|
||||||
|
<button type="button" class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<span class="glyphicon glyphicon-resize-small" aria-hidden="true"></span>
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu dropdown-menu-right">
|
||||||
|
<li><a href="{% url 'dcim:frontport_connect' termination_a_id=record.pk termination_b_type='interface' %}?return_url={{ device.get_absolute_url }}">Interface</a></li>
|
||||||
|
<li><a href="{% url 'dcim:frontport_connect' termination_a_id=record.pk termination_b_type='console-server-port' %}?return_url={{ device.get_absolute_url }}">Console Server Port</a></li>
|
||||||
|
<li><a href="{% url 'dcim:frontport_connect' termination_a_id=record.pk termination_b_type='console-port' %}?return_url={{ device.get_absolute_url }}">Console Port</a></li>
|
||||||
|
<li><a href="{% url 'dcim:frontport_connect' termination_a_id=record.pk termination_b_type='front-port' %}?return_url={{ device.get_absolute_url }}">Front Port</a></li>
|
||||||
|
<li><a href="{% url 'dcim:frontport_connect' termination_a_id=record.pk termination_b_type='rear-port' %}?return_url={{ device.get_absolute_url }}">Rear Port</a></li>
|
||||||
|
<li><a href="{% url 'dcim:frontport_connect' termination_a_id=record.pk termination_b_type='circuit-termination' %}?return_url={{ device.get_absolute_url }}">Circuit Termination</a></li>
|
||||||
|
</ul>
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
|
"""
|
||||||
|
@ -1061,6 +1061,9 @@ class DeviceView(ObjectView):
|
|||||||
frontports = FrontPort.objects.restrict(request.user, 'view').filter(device=device).prefetch_related(
|
frontports = FrontPort.objects.restrict(request.user, 'view').filter(device=device).prefetch_related(
|
||||||
'rear_port', 'cable',
|
'rear_port', 'cable',
|
||||||
)
|
)
|
||||||
|
frontport_table = tables.DeviceFrontPortTable(frontports, orderable=False)
|
||||||
|
if request.user.has_perm('dcim.change_frontport') or request.user.has_perm('dcim.delete_frontport'):
|
||||||
|
frontport_table.columns.show('pk')
|
||||||
|
|
||||||
# Rear ports
|
# Rear ports
|
||||||
rearports = RearPort.objects.restrict(request.user, 'view').filter(device=device).prefetch_related('cable')
|
rearports = RearPort.objects.restrict(request.user, 'view').filter(device=device).prefetch_related('cable')
|
||||||
@ -1097,7 +1100,7 @@ class DeviceView(ObjectView):
|
|||||||
'powerport_table': powerport_table,
|
'powerport_table': powerport_table,
|
||||||
'poweroutlet_table': poweroutlet_table,
|
'poweroutlet_table': poweroutlet_table,
|
||||||
'interfaces': interfaces,
|
'interfaces': interfaces,
|
||||||
'frontports': frontports,
|
'frontport_table': frontport_table,
|
||||||
'rearports': rearports,
|
'rearports': rearports,
|
||||||
'devicebays': devicebays,
|
'devicebays': devicebays,
|
||||||
'inventoryitems': inventoryitems,
|
'inventoryitems': inventoryitems,
|
||||||
|
@ -125,7 +125,7 @@
|
|||||||
<a href="#interfaces" role="tab" data-toggle="tab">Interfaces {% badge interfaces|length %}</a>
|
<a href="#interfaces" role="tab" data-toggle="tab">Interfaces {% badge interfaces|length %}</a>
|
||||||
</li>
|
</li>
|
||||||
<li role="presentation">
|
<li role="presentation">
|
||||||
<a href="#frontports" role="tab" data-toggle="tab">Front Ports {% badge frontports|length %}</a>
|
<a href="#frontports" role="tab" data-toggle="tab">Front Ports {% badge frontport_table.rows|length %}</a>
|
||||||
</li>
|
</li>
|
||||||
<li role="presentation">
|
<li role="presentation">
|
||||||
<a href="#rearports" role="tab" data-toggle="tab">Rear Ports {% badge rearports|length %}</a>
|
<a href="#rearports" role="tab" data-toggle="tab">Rear Ports {% badge rearports|length %}</a>
|
||||||
@ -542,8 +542,8 @@
|
|||||||
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add interfaces
|
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add interfaces
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="clearfix"></div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="clearfix"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@ -555,28 +555,7 @@
|
|||||||
<div class="panel-heading">
|
<div class="panel-heading">
|
||||||
<strong>Front Ports</strong>
|
<strong>Front Ports</strong>
|
||||||
</div>
|
</div>
|
||||||
<table class="table table-hover table-headings panel-body component-list">
|
{% include 'responsive_table.html' with table=frontport_table %}
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
{% if perms.dcim.change_frontport or perms.dcim.delete_frontport %}
|
|
||||||
<th class="pk"><input type="checkbox" class="toggle" title="Toggle all" /></th>
|
|
||||||
{% endif %}
|
|
||||||
<th>Name</th>
|
|
||||||
<th>Type</th>
|
|
||||||
<th>Rear Port</th>
|
|
||||||
<th>Position</th>
|
|
||||||
<th>Description</th>
|
|
||||||
<th>Cable</th>
|
|
||||||
<th colspan="2">Cable Termination</th>
|
|
||||||
<th></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
|
||||||
{% for frontport in frontports %}
|
|
||||||
{% include 'dcim/inc/frontport.html' %}
|
|
||||||
{% endfor %}
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
<div class="panel-footer noprint">
|
<div class="panel-footer noprint">
|
||||||
{% if frontports and perms.dcim.change_frontport %}
|
{% if frontports and perms.dcim.change_frontport %}
|
||||||
<button type="submit" name="_rename" formaction="{% url 'dcim:frontport_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs">
|
<button type="submit" name="_rename" formaction="{% url 'dcim:frontport_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs">
|
||||||
@ -600,8 +579,8 @@
|
|||||||
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add front ports
|
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add front ports
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="clearfix"></div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="clearfix"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@ -657,8 +636,8 @@
|
|||||||
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add rear ports
|
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add rear ports
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="clearfix"></div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="clearfix"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@ -804,8 +783,8 @@
|
|||||||
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add power outlets
|
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add power outlets
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="clearfix"></div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="clearfix"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
@ -857,8 +836,8 @@
|
|||||||
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add device bays
|
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add device bays
|
||||||
</a>
|
</a>
|
||||||
</div>
|
</div>
|
||||||
<div class="clearfix"></div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="clearfix"></div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
@ -1,72 +0,0 @@
|
|||||||
{% load helpers %}
|
|
||||||
<tr class="frontport{% if frontport.cable %} {{ frontport.cable.get_status_class }}{% endif %}">
|
|
||||||
|
|
||||||
{# Checkbox #}
|
|
||||||
{% if perms.dcim.change_frontport or perms.dcim.delete_frontport %}
|
|
||||||
<td class="pk">
|
|
||||||
<input name="pk" type="checkbox" value="{{ frontport.pk }}" />
|
|
||||||
</td>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{# Name #}
|
|
||||||
<td>
|
|
||||||
<i class="fa fa-fw fa-square{% if not frontport.cable %}-o{% endif %}"></i>
|
|
||||||
<a href="{{ frontport.get_absolute_url }}">{{ frontport }}</a>
|
|
||||||
</td>
|
|
||||||
|
|
||||||
{# Type #}
|
|
||||||
<td>{{ frontport.get_type_display }}</td>
|
|
||||||
|
|
||||||
{# Rear port #}
|
|
||||||
<td>{{ frontport.rear_port }}</td>
|
|
||||||
<td>{{ frontport.rear_port_position }}</td>
|
|
||||||
|
|
||||||
{# Description #}
|
|
||||||
<td>{{ frontport.description|placeholder }}</td>
|
|
||||||
|
|
||||||
{# Cable #}
|
|
||||||
{% if frontport.cable %}
|
|
||||||
<td>
|
|
||||||
<a href="{{ frontport.cable.get_absolute_url }}">{{ frontport.cable }}</a>
|
|
||||||
<a href="{% url 'dcim:frontport_trace' pk=frontport.pk %}" class="btn btn-primary btn-xs" title="Trace">
|
|
||||||
<i class="fa fa-share-alt" aria-hidden="true"></i>
|
|
||||||
</a>
|
|
||||||
</td>
|
|
||||||
{% include 'dcim/inc/cabletermination.html' with termination=frontport.get_cable_peer %}
|
|
||||||
{% else %}
|
|
||||||
<td colspan="3">
|
|
||||||
<span class="text-muted">Not connected</span>
|
|
||||||
</td>
|
|
||||||
{% endif %}
|
|
||||||
|
|
||||||
{# Actions #}
|
|
||||||
<td class="text-right noprint">
|
|
||||||
{% if frontport.cable %}
|
|
||||||
{% include 'dcim/inc/cable_toggle_buttons.html' with cable=frontport.cable %}
|
|
||||||
{% elif perms.dcim.add_cable %}
|
|
||||||
<span class="dropdown">
|
|
||||||
<button type="button" class="btn btn-success btn-xs dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
||||||
<span class="glyphicon glyphicon-resize-small" aria-hidden="true"></span>
|
|
||||||
</button>
|
|
||||||
<ul class="dropdown-menu dropdown-menu-right">
|
|
||||||
<li><a href="{% url 'dcim:frontport_connect' termination_a_id=frontport.pk termination_b_type='interface' %}?return_url={{ device.get_absolute_url }}">Interface</a></li>
|
|
||||||
<li><a href="{% url 'dcim:frontport_connect' termination_a_id=frontport.pk termination_b_type='console-server-port' %}?return_url={{ device.get_absolute_url }}">Console Server Port</a></li>
|
|
||||||
<li><a href="{% url 'dcim:frontport_connect' termination_a_id=frontport.pk termination_b_type='console-port' %}?return_url={{ device.get_absolute_url }}">Console Port</a></li>
|
|
||||||
<li><a href="{% url 'dcim:frontport_connect' termination_a_id=frontport.pk termination_b_type='front-port' %}?return_url={{ device.get_absolute_url }}">Front Port</a></li>
|
|
||||||
<li><a href="{% url 'dcim:frontport_connect' termination_a_id=frontport.pk termination_b_type='rear-port' %}?return_url={{ device.get_absolute_url }}">Rear Port</a></li>
|
|
||||||
<li><a href="{% url 'dcim:frontport_connect' termination_a_id=frontport.pk termination_b_type='circuit-termination' %}?return_url={{ device.get_absolute_url }}">Circuit Termination</a></li>
|
|
||||||
</ul>
|
|
||||||
</span>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.change_frontport %}
|
|
||||||
<a href="{% url 'dcim:frontport_edit' pk=frontport.pk %}?return_url={{ device.get_absolute_url }}" title="Edit port" class="btn btn-info btn-xs">
|
|
||||||
<i class="glyphicon glyphicon-pencil" aria-hidden="true"></i>
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.delete_frontport %}
|
|
||||||
<a href="{% url 'dcim:frontport_delete' pk=frontport.pk %}?return_url={{ device.get_absolute_url }}" title="Delete port" class="btn btn-danger btn-xs">
|
|
||||||
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
|
|
||||||
</a>
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
Loading…
Reference in New Issue
Block a user