diff --git a/netbox/dcim/tables/template_code.py b/netbox/dcim/tables/template_code.py
index aab15b5ef..f6938807a 100644
--- a/netbox/dcim/tables/template_code.py
+++ b/netbox/dcim/tables/template_code.py
@@ -236,8 +236,8 @@ INTERFACE_BUTTONS = """
{% endif %}
{% elif record.is_wireless and perms.wireless.add_wirelesslink %}
-
-
+
+
{% endif %}
"""
diff --git a/netbox/netbox/views/__init__.py b/netbox/netbox/views/__init__.py
index 2c033e760..b361352d0 100644
--- a/netbox/netbox/views/__init__.py
+++ b/netbox/netbox/views/__init__.py
@@ -27,6 +27,7 @@ from netbox.constants import SEARCH_MAX_RESULTS, SEARCH_TYPES
from netbox.forms import SearchForm
from tenancy.models import Tenant
from virtualization.models import Cluster, VirtualMachine
+from wireless.models import WirelessLAN, WirelessLink
class HomeView(View):
@@ -92,14 +93,19 @@ class HomeView(View):
("dcim.view_powerpanel", "Power Panels", PowerPanel.objects.restrict(request.user, 'view').count),
("dcim.view_powerfeed", "Power Feeds", PowerFeed.objects.restrict(request.user, 'view').count),
)
+ wireless = (
+ ("wireless.view_wirelesslan", "Wireless LANs", WirelessLAN.objects.restrict(request.user, 'view').count),
+ ("wireless.view_wirelesslink", "Wireless Links", WirelessLink.objects.restrict(request.user, 'view').count),
+ )
sections = (
("Organization", org, "domain"),
("IPAM", ipam, "counter"),
("Virtualization", virtualization, "monitor"),
("Inventory", dcim, "server"),
- ("Connections", connections, "cable-data"),
("Circuits", circuits, "transit-connection-variant"),
+ ("Connections", connections, "cable-data"),
("Power", power, "flash"),
+ ("Wireless", wireless, "wifi"),
)
stats = []
diff --git a/netbox/templates/wireless/wirelesslink_edit.html b/netbox/templates/wireless/wirelesslink_edit.html
new file mode 100644
index 000000000..034d147de
--- /dev/null
+++ b/netbox/templates/wireless/wirelesslink_edit.html
@@ -0,0 +1,33 @@
+{% extends 'generic/object_edit.html' %}
+{% load form_helpers %}
+
+{% block form %}
+
+
+
+
+
Side A
+
+ {% render_field form.device_a %}
+ {% render_field form.interface_a %}
+
+
+
+
+
+
Side B
+
+ {% render_field form.device_b %}
+ {% render_field form.interface_b %}
+
+
+
+ {% if form.custom_fields %}
+
+
+
Custom Fields
+
+ {% render_custom_fields form %}
+
+ {% endif %}
+{% endblock %}
diff --git a/netbox/wireless/forms/models.py b/netbox/wireless/forms/models.py
index 544d5823d..f7985a31d 100644
--- a/netbox/wireless/forms/models.py
+++ b/netbox/wireless/forms/models.py
@@ -1,4 +1,4 @@
-from dcim.models import Device, Interface
+from dcim.models import Device, Interface, Location, Site
from extras.forms import CustomFieldModelForm
from extras.models import Tag
from ipam.models import VLAN
@@ -64,10 +64,30 @@ class WirelessLANForm(BootstrapMixin, CustomFieldModelForm):
class WirelessLinkForm(BootstrapMixin, CustomFieldModelForm):
+ site_a = DynamicModelChoiceField(
+ queryset=Site.objects.all(),
+ required=False,
+ label='Site',
+ initial_params={
+ 'devices': '$device_a',
+ }
+ )
+ location_a = DynamicModelChoiceField(
+ queryset=Location.objects.all(),
+ required=False,
+ label='Location',
+ initial_params={
+ 'devices': '$device_a',
+ }
+ )
device_a = DynamicModelChoiceField(
queryset=Device.objects.all(),
+ query_params={
+ 'site_id': '$site_a',
+ 'location_id': '$location_a',
+ },
required=False,
- label='Device A',
+ label='Device',
initial_params={
'interfaces': '$interface_a'
}
@@ -79,12 +99,32 @@ class WirelessLinkForm(BootstrapMixin, CustomFieldModelForm):
'device_id': '$device_a',
},
disabled_indicator='_occupied',
- label='Interface A'
+ label='Interface'
+ )
+ site_b = DynamicModelChoiceField(
+ queryset=Site.objects.all(),
+ required=False,
+ label='Site',
+ initial_params={
+ 'devices': '$device_b',
+ }
+ )
+ location_b = DynamicModelChoiceField(
+ queryset=Location.objects.all(),
+ required=False,
+ label='Location',
+ initial_params={
+ 'devices': '$device_b',
+ }
)
device_b = DynamicModelChoiceField(
queryset=Device.objects.all(),
+ query_params={
+ 'site_id': '$site_b',
+ 'location_id': '$location_b',
+ },
required=False,
- label='Device B',
+ label='Device',
initial_params={
'interfaces': '$interface_b'
}
@@ -96,7 +136,7 @@ class WirelessLinkForm(BootstrapMixin, CustomFieldModelForm):
'device_id': '$device_b',
},
disabled_indicator='_occupied',
- label='Interface B'
+ label='Interface'
)
tags = DynamicModelMultipleChoiceField(
queryset=Tag.objects.all(),
@@ -106,11 +146,13 @@ class WirelessLinkForm(BootstrapMixin, CustomFieldModelForm):
class Meta:
model = WirelessLink
fields = [
- 'device_a', 'interface_a', 'device_b', 'interface_b', 'status', 'ssid', 'description', 'auth_type',
- 'auth_cipher', 'auth_psk', 'tags',
+ 'site_a', 'location_a', 'device_a', 'interface_a', 'site_b', 'location_b', 'device_b', 'interface_b',
+ 'status', 'ssid', 'description', 'auth_type', 'auth_cipher', 'auth_psk', 'tags',
]
fieldsets = (
- ('Link', ('device_a', 'interface_a', 'device_b', 'interface_b', 'status', 'ssid', 'description', 'tags')),
+ ('Side A', ('site_a', 'location_a', 'device_a', 'interface_a')),
+ ('Side B', ('site_b', 'location_b', 'device_b', 'interface_b')),
+ ('Link', ('status', 'ssid', 'description', 'tags')),
('Authentication', ('auth_type', 'auth_cipher', 'auth_psk')),
)
widgets = {
@@ -118,3 +160,7 @@ class WirelessLinkForm(BootstrapMixin, CustomFieldModelForm):
'auth_type': StaticSelect,
'auth_cipher': StaticSelect,
}
+ labels = {
+ 'auth_type': 'Type',
+ 'auth_cipher': 'Cipher',
+ }