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> <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"> <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" aria-hidden="true"></span> <span class="mdi mdi-wifi-plus" aria-hidden="true"></span>
</a> </a>
{% endif %} {% endif %}
""" """

View File

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

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.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', 'site_a', 'location_a', 'device_a', 'interface_a', 'site_b', 'location_b', 'device_b', 'interface_b',
'auth_cipher', 'auth_psk', 'tags', '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',
}