This commit is contained in:
jeremystretch 2021-10-21 14:11:11 -04:00
parent 3a3ed8bf64
commit 1c6a84659c
4 changed files with 96 additions and 11 deletions

View File

@ -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 %}
"""

View File

@ -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 = []

View File

@ -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 %}

View File

@ -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',
}