jeremystretch 4 лет назад
Родитель
Сommit
1c6a84659c

+ 2 - 2
netbox/dcim/tables/template_code.py

@@ -236,8 +236,8 @@ INTERFACE_BUTTONS = """
         <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
     {% endif %}
 {% elif record.is_wireless and perms.wireless.add_wirelesslink %}
-    <a href="{% url 'wireless:wirelesslink_add' %}?interface_a={{ record.pk }}" class="btn btn-success btn-sm">
-        <span class="mdi mdi-wifi" aria-hidden="true"></span>
+    <a href="{% url 'wireless:wirelesslink_add' %}?site_a={{ record.device.site.pk }}&location_a={{ record.device.location.pk }}&device_a={{ record.device.pk }}&interface_a={{ record.pk }}&site_b={{ record.device.site.pk }}&location_b={{ record.device.location.pk }}" class="btn btn-success btn-sm">
+        <span class="mdi mdi-wifi-plus" aria-hidden="true"></span>
     </a>
 {% endif %}
 """

+ 7 - 1
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 = []

+ 33 - 0
netbox/templates/wireless/wirelesslink_edit.html

@@ -0,0 +1,33 @@
+{% extends 'generic/object_edit.html' %}
+{% load form_helpers %}
+
+{% block form %}
+  <div class="row">
+    <div class="col">
+      <div class="field-group">
+        <div class="row mb-2">
+          <h5 class="offset-sm-3">Side A</h5>
+        </div>
+        {% render_field form.device_a %}
+        {% render_field form.interface_a %}
+      </div>
+    </div>
+    <div class="col">
+      <div class="field-group">
+        <div class="row mb-2">
+          <h5 class="offset-sm-3">Side B</h5>
+        </div>
+        {% render_field form.device_b %}
+        {% render_field form.interface_b %}
+      </div>
+    </div>
+  </div>
+  {% if form.custom_fields %}
+    <div class="field-group my-5">
+      <div class="row mb-2">
+        <h5 class="offset-sm-3">Custom Fields</h5>
+      </div>
+      {% render_custom_fields form %}
+    </div>
+  {% endif %}
+{% endblock %}

+ 54 - 8
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',
+        }