jeremystretch il y a 4 ans
Parent
commit
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>
         <a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
     {% endif %}
     {% endif %}
 {% elif record.is_wireless and perms.wireless.add_wirelesslink %}
 {% 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>
     </a>
 {% endif %}
 {% 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 netbox.forms import SearchForm
 from tenancy.models import Tenant
 from tenancy.models import Tenant
 from virtualization.models import Cluster, VirtualMachine
 from virtualization.models import Cluster, VirtualMachine
+from wireless.models import WirelessLAN, WirelessLink
 
 
 
 
 class HomeView(View):
 class HomeView(View):
@@ -92,14 +93,19 @@ class HomeView(View):
                 ("dcim.view_powerpanel", "Power Panels", PowerPanel.objects.restrict(request.user, 'view').count),
                 ("dcim.view_powerpanel", "Power Panels", PowerPanel.objects.restrict(request.user, 'view').count),
                 ("dcim.view_powerfeed", "Power Feeds", PowerFeed.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 = (
             sections = (
                 ("Organization", org, "domain"),
                 ("Organization", org, "domain"),
                 ("IPAM", ipam, "counter"),
                 ("IPAM", ipam, "counter"),
                 ("Virtualization", virtualization, "monitor"),
                 ("Virtualization", virtualization, "monitor"),
                 ("Inventory", dcim, "server"),
                 ("Inventory", dcim, "server"),
-                ("Connections", connections, "cable-data"),
                 ("Circuits", circuits, "transit-connection-variant"),
                 ("Circuits", circuits, "transit-connection-variant"),
+                ("Connections", connections, "cable-data"),
                 ("Power", power, "flash"),
                 ("Power", power, "flash"),
+                ("Wireless", wireless, "wifi"),
             )
             )
 
 
             stats = []
             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.forms import CustomFieldModelForm
 from extras.models import Tag
 from extras.models import Tag
 from ipam.models import VLAN
 from ipam.models import VLAN
@@ -64,10 +64,30 @@ class WirelessLANForm(BootstrapMixin, CustomFieldModelForm):
 
 
 
 
 class WirelessLinkForm(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(
     device_a = DynamicModelChoiceField(
         queryset=Device.objects.all(),
         queryset=Device.objects.all(),
+        query_params={
+            'site_id': '$site_a',
+            'location_id': '$location_a',
+        },
         required=False,
         required=False,
-        label='Device A',
+        label='Device',
         initial_params={
         initial_params={
             'interfaces': '$interface_a'
             'interfaces': '$interface_a'
         }
         }
@@ -79,12 +99,32 @@ class WirelessLinkForm(BootstrapMixin, CustomFieldModelForm):
             'device_id': '$device_a',
             'device_id': '$device_a',
         },
         },
         disabled_indicator='_occupied',
         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(
     device_b = DynamicModelChoiceField(
         queryset=Device.objects.all(),
         queryset=Device.objects.all(),
+        query_params={
+            'site_id': '$site_b',
+            'location_id': '$location_b',
+        },
         required=False,
         required=False,
-        label='Device B',
+        label='Device',
         initial_params={
         initial_params={
             'interfaces': '$interface_b'
             'interfaces': '$interface_b'
         }
         }
@@ -96,7 +136,7 @@ class WirelessLinkForm(BootstrapMixin, CustomFieldModelForm):
             'device_id': '$device_b',
             'device_id': '$device_b',
         },
         },
         disabled_indicator='_occupied',
         disabled_indicator='_occupied',
-        label='Interface B'
+        label='Interface'
     )
     )
     tags = DynamicModelMultipleChoiceField(
     tags = DynamicModelMultipleChoiceField(
         queryset=Tag.objects.all(),
         queryset=Tag.objects.all(),
@@ -106,11 +146,13 @@ class WirelessLinkForm(BootstrapMixin, CustomFieldModelForm):
     class Meta:
     class Meta:
         model = WirelessLink
         model = WirelessLink
         fields = [
         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 = (
         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')),
             ('Authentication', ('auth_type', 'auth_cipher', 'auth_psk')),
         )
         )
         widgets = {
         widgets = {
@@ -118,3 +160,7 @@ class WirelessLinkForm(BootstrapMixin, CustomFieldModelForm):
             'auth_type': StaticSelect,
             'auth_type': StaticSelect,
             'auth_cipher': StaticSelect,
             'auth_cipher': StaticSelect,
         }
         }
+        labels = {
+            'auth_type': 'Type',
+            'auth_cipher': 'Cipher',
+        }