diff --git a/netbox/dcim/forms/models.py b/netbox/dcim/forms/models.py
index 603767518..9ce0b54aa 100644
--- a/netbox/dcim/forms/models.py
+++ b/netbox/dcim/forms/models.py
@@ -16,7 +16,7 @@ from utilities.forms import (
SlugField, StaticSelect,
)
from virtualization.models import Cluster, ClusterGroup
-from wireless.models import WirelessLAN
+from wireless.models import WirelessLAN, WirelessLANGroup
from .common import InterfaceCommonForm
__all__ = (
@@ -1073,10 +1073,18 @@ class InterfaceForm(BootstrapMixin, InterfaceCommonForm, CustomFieldModelForm):
'type': 'lag',
}
)
+ wireless_lan_group = DynamicModelChoiceField(
+ queryset=WirelessLANGroup.objects.all(),
+ required=False,
+ label='Wireless LAN group'
+ )
wireless_lans = DynamicModelMultipleChoiceField(
queryset=WirelessLAN.objects.all(),
required=False,
- label='Wireless LANs'
+ label='Wireless LANs',
+ query_params={
+ 'group_id': '$wireless_lan_group',
+ }
)
vlan_group = DynamicModelChoiceField(
queryset=VLANGroup.objects.all(),
diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py
index 3b0ec349e..3b92efd76 100644
--- a/netbox/dcim/tables/devices.py
+++ b/netbox/dcim/tables/devices.py
@@ -505,8 +505,8 @@ class InterfaceTable(DeviceComponentTable, BaseInterfaceTable, PathEndpointTable
class DeviceInterfaceTable(InterfaceTable):
name = tables.TemplateColumn(
- template_code=' {{ value }}',
order_by=Accessor('_name'),
attrs={'td': {'class': 'text-nowrap'}}
diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py
index a5a4d9979..a948baffd 100644
--- a/netbox/dcim/tables/template_code.py
+++ b/netbox/dcim/tables/template_code.py
@@ -205,6 +205,12 @@ INTERFACE_BUTTONS = """
{% endif %}
+{% elif record.wireless_link %}
+ {% if perms.wireless.delete_wirelesslink %}
+
+
+
+ {% endif %}
{% elif record.is_wired and perms.dcim.add_cable %}
@@ -223,6 +229,10 @@ INTERFACE_BUTTONS = """
{% else %}
{% endif %}
+{% elif record.is_wireless and perms.wireless.add_wirelesslink %}
+
+
+
{% endif %}
"""
diff --git a/netbox/templates/dcim/interface.html b/netbox/templates/dcim/interface.html
index 6e01dee98..e9230fbf9 100644
--- a/netbox/templates/dcim/interface.html
+++ b/netbox/templates/dcim/interface.html
@@ -217,8 +217,29 @@
Wireless Link |
{{ object.wireless_link }}
+
+
+
|
+ {% with peer_interface=object.connected_endpoint %}
+
+ Device |
+
+ {{ peer_interface.device }}
+ |
+
+
+ Name |
+
+ {{ peer_interface }}
+ |
+
+
+ Type |
+ {{ peer_interface.get_type_display }} |
+
+ {% endwith %}
{% else %}
@@ -267,36 +288,73 @@
-
-
- Role |
- {{ object.get_rf_role_display|placeholder }} |
-
-
- Channel |
- {{ object.get_rf_channel_display|placeholder }} |
-
-
- Channel Frequency |
-
- {% if object.rf_channel_frequency %}
- {{ object.rf_channel_frequency|simplify_decimal }} MHz
- {% else %}
- —
- {% endif %}
- |
-
-
- Channel Width |
-
- {% if object.rf_channel_width %}
- {{ object.rf_channel_width|simplify_decimal }} MHz
- {% else %}
- —
- {% endif %}
- |
-
-
+ {% with peer=object.connected_endpoint %}
+
+
+
+ |
+ Local |
+ {% if peer %}
+ Peer |
+ {% endif %}
+
+
+
+ Role |
+ {{ object.get_rf_role_display|placeholder }} |
+ {% if peer %}
+ {{ peer.get_rf_role_display|placeholder }} |
+ {% endif %}
+
+
+ Channel |
+ {{ object.get_rf_channel_display|placeholder }} |
+ {% if peer %}
+
+ {{ peer.get_rf_channel_display|placeholder }}
+ |
+ {% endif %}
+
+
+ Channel Frequency |
+
+ {% if object.rf_channel_frequency %}
+ {{ object.rf_channel_frequency|simplify_decimal }} MHz
+ {% else %}
+ —
+ {% endif %}
+ |
+ {% if peer %}
+
+ {% if peer.rf_channel_frequency %}
+ {{ peer.rf_channel_frequency|simplify_decimal }} MHz
+ {% else %}
+ —
+ {% endif %}
+ |
+ {% endif %}
+
+
+ Channel Width |
+
+ {% if object.rf_channel_width %}
+ {{ object.rf_channel_width|simplify_decimal }} MHz
+ {% else %}
+ —
+ {% endif %}
+ |
+ {% if peer %}
+
+ {% if peer.rf_channel_width %}
+ {{ peer.rf_channel_width|simplify_decimal }} MHz
+ {% else %}
+ —
+ {% endif %}
+ |
+ {% endif %}
+
+
+ {% endwith %}
@@ -305,12 +363,20 @@
+ Group |
SSID |
- {% for wlan in object.wlans.all %}
+ {% for wlan in object.wireless_lans.all %}
+
+ {% if wlan.group %}
+ {{ wlan.group }}
+ {% else %}
+ —
+ {% endif %}
+ |
{{ wlan.ssid }}
|
diff --git a/netbox/templates/dcim/interface_edit.html b/netbox/templates/dcim/interface_edit.html
index de7d21269..aec88d25a 100644
--- a/netbox/templates/dcim/interface_edit.html
+++ b/netbox/templates/dcim/interface_edit.html
@@ -38,6 +38,7 @@
{% render_field form.rf_channel %}
{% render_field form.rf_channel_frequency %}
{% render_field form.rf_channel_width %}
+ {% render_field form.wireless_lan_group %}
{% render_field form.wireless_lans %}
{% endif %}
diff --git a/netbox/utilities/templatetags/helpers.py b/netbox/utilities/templatetags/helpers.py
index 668596c8e..3318fe1e7 100644
--- a/netbox/utilities/templatetags/helpers.py
+++ b/netbox/utilities/templatetags/helpers.py
@@ -157,7 +157,7 @@ def simplify_decimal(value):
"""
if type(value) is not decimal.Decimal:
return value
- return str(value).rstrip('0.')
+ return str(value).rstrip('0').rstrip('.')
@register.filter()
diff --git a/netbox/wireless/filtersets.py b/netbox/wireless/filtersets.py
index ac503e474..a5d9b7d75 100644
--- a/netbox/wireless/filtersets.py
+++ b/netbox/wireless/filtersets.py
@@ -33,6 +33,9 @@ class WirelessLANFilterSet(PrimaryModelFilterSet):
method='search',
label='Search',
)
+ group_id = django_filters.ModelMultipleChoiceFilter(
+ queryset=WirelessLANGroup.objects.all()
+ )
tag = TagFilter()
class Meta: