From 1c6a84659cc0a401b43f2abae8334fbf8eaf5774 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Thu, 21 Oct 2021 14:11:11 -0400 Subject: [PATCH] #3979 cleanup --- netbox/dcim/tables/template_code.py | 4 +- netbox/netbox/views/__init__.py | 8 ++- .../templates/wireless/wirelesslink_edit.html | 33 ++++++++++ netbox/wireless/forms/models.py | 62 ++++++++++++++++--- 4 files changed, 96 insertions(+), 11 deletions(-) create mode 100644 netbox/templates/wireless/wirelesslink_edit.html 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', + }