Rename SSID model to WirelessLAN

This commit is contained in:
jeremystretch 2021-10-12 17:02:53 -04:00
parent 38f6d22d2d
commit 5271680483
24 changed files with 119 additions and 126 deletions

View File

@ -16,7 +16,7 @@ from utilities.forms import (
SlugField, StaticSelect, SlugField, StaticSelect,
) )
from virtualization.models import Cluster, ClusterGroup from virtualization.models import Cluster, ClusterGroup
from wireless.models import SSID from wireless.models import WirelessLAN
from .common import InterfaceCommonForm from .common import InterfaceCommonForm
__all__ = ( __all__ = (
@ -1069,10 +1069,10 @@ class InterfaceForm(BootstrapMixin, InterfaceCommonForm, CustomFieldModelForm):
'type': 'lag', 'type': 'lag',
} }
) )
ssids = DynamicModelMultipleChoiceField( wireless_lans = DynamicModelMultipleChoiceField(
queryset=SSID.objects.all(), queryset=WirelessLAN.objects.all(),
required=False, required=False,
label='SSIDs' label='Wireless LANs'
) )
vlan_group = DynamicModelChoiceField( vlan_group = DynamicModelChoiceField(
queryset=VLANGroup.objects.all(), queryset=VLANGroup.objects.all(),
@ -1104,7 +1104,7 @@ class InterfaceForm(BootstrapMixin, InterfaceCommonForm, CustomFieldModelForm):
model = Interface model = Interface
fields = [ fields = [
'device', 'name', 'label', 'type', 'enabled', 'parent', 'lag', 'mac_address', 'wwn', 'mtu', 'mgmt_only', 'device', 'name', 'label', 'type', 'enabled', 'parent', 'lag', 'mac_address', 'wwn', 'mtu', 'mgmt_only',
'mark_connected', 'description', 'mode', 'rf_channel', 'rf_channel_width', 'ssids', 'untagged_vlan', 'mark_connected', 'description', 'mode', 'rf_channel', 'rf_channel_width', 'wireless_lans', 'untagged_vlan',
'tagged_vlans', 'tags', 'tagged_vlans', 'tags',
] ]
widgets = { widgets = {

View File

@ -4,7 +4,7 @@ from django.db import migrations, models
class Migration(migrations.Migration): class Migration(migrations.Migration):
dependencies = [ dependencies = [
('wireless', '__first__'), ('wireless', '0001_initial'),
('dcim', '0135_location_tenant'), ('dcim', '0135_location_tenant'),
] ]
@ -21,7 +21,7 @@ class Migration(migrations.Migration):
), ),
migrations.AddField( migrations.AddField(
model_name='interface', model_name='interface',
name='ssids', name='wireless_lans',
field=models.ManyToManyField(blank=True, related_name='interfaces', to='wireless.SSID'), field=models.ManyToManyField(blank=True, related_name='interfaces', to='wireless.WirelessLAN'),
), ),
] ]

View File

@ -529,11 +529,11 @@ class Interface(ComponentModel, BaseInterface, CableTermination, PathEndpoint):
null=True, null=True,
verbose_name='Channel width' verbose_name='Channel width'
) )
ssids = models.ManyToManyField( wireless_lans = models.ManyToManyField(
to='wireless.SSID', to='wireless.WirelessLAN',
related_name='interfaces', related_name='interfaces',
blank=True, blank=True,
verbose_name='SSIDs' verbose_name='Wireless LANs'
) )
untagged_vlan = models.ForeignKey( untagged_vlan = models.ForeignKey(
to='ipam.VLAN', to='ipam.VLAN',

View File

@ -195,7 +195,7 @@ WIRELESS_MENU = Menu(
MenuGroup( MenuGroup(
label='Wireless', label='Wireless',
items=( items=(
get_model_item('wireless', 'ssid', 'SSIDs'), get_model_item('wireless', 'wirelesslan', 'Wireless LANs'),
), ),
), ),
), ),

View File

@ -260,19 +260,19 @@
{% endif %} {% endif %}
{% if object.is_wireless %} {% if object.is_wireless %}
<div class="card"> <div class="card">
<h5 class="card-header">SSIDs</h5> <h5 class="card-header">Wireless LANs</h5>
<div class="card-body"> <div class="card-body">
<table class="table table-hover table-headings"> <table class="table table-hover table-headings">
<thead> <thead>
<tr> <tr>
<th>Name</th> <th>SSID</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for ssid in object.ssids.all %} {% for wlan in object.wlans.all %}
<tr> <tr>
<td> <td>
<a href="{{ ssid.get_absolute_url }}">{{ ssid.name }}</a> <a href="{{ wlan.get_absolute_url }}">{{ wlan.ssid }}</a>
</td> </td>
</tr> </tr>
{% empty %} {% empty %}

View File

@ -36,7 +36,7 @@
</div> </div>
{% render_field form.rf_channel %} {% render_field form.rf_channel %}
{% render_field form.rf_channel_width %} {% render_field form.rf_channel_width %}
{% render_field form.ssids %} {% render_field form.wireless_lans %}
</div> </div>
{% endif %} {% endif %}

View File

@ -6,12 +6,12 @@
<div class="row"> <div class="row">
<div class="col col-md-6"> <div class="col col-md-6">
<div class="card"> <div class="card">
<h5 class="card-header">SSID</h5> <h5 class="card-header">Wireless LAN</h5>
<div class="card-body"> <div class="card-body">
<table class="table table-hover attr-table"> <table class="table table-hover attr-table">
<tr> <tr>
<th scope="row">Name</th> <th scope="row">SSID</th>
<td>{{ object.name }}</td> <td>{{ object.ssid }}</td>
</tr> </tr>
<tr> <tr>
<th scope="row">Description</th> <th scope="row">Description</th>

View File

@ -4,13 +4,13 @@ from netbox.api import WritableNestedSerializer
from wireless.models import * from wireless.models import *
__all__ = ( __all__ = (
'NestedSSIDSerializer', 'NestedWirelessLANSerializer',
) )
class NestedSSIDSerializer(WritableNestedSerializer): class NestedWirelessLANSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='wireless-api:ssid-detail') url = serializers.HyperlinkedIdentityField(view_name='wireless-api:ssid-detail')
class Meta: class Meta:
model = SSID model = WirelessLAN
fields = ['id', 'url', 'display', 'name'] fields = ['id', 'url', 'display', 'ssid']

View File

@ -1,21 +1,20 @@
from rest_framework import serializers from rest_framework import serializers
from dcim.api.serializers import NestedInterfaceSerializer
from ipam.api.serializers import NestedVLANSerializer from ipam.api.serializers import NestedVLANSerializer
from netbox.api.serializers import PrimaryModelSerializer from netbox.api.serializers import PrimaryModelSerializer
from wireless.models import * from wireless.models import *
__all__ = ( __all__ = (
'SSIDSerializer', 'WirelessLANSerializer',
) )
class SSIDSerializer(PrimaryModelSerializer): class WirelessLANSerializer(PrimaryModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name='wireless-api:ssid-detail') url = serializers.HyperlinkedIdentityField(view_name='wireless-api:ssid-detail')
vlan = NestedVLANSerializer(required=False, allow_null=True) vlan = NestedVLANSerializer(required=False, allow_null=True)
class Meta: class Meta:
model = SSID model = WirelessLAN
fields = [ fields = [
'id', 'url', 'display', 'name', 'description', 'vlan', 'id', 'url', 'display', 'ssid', 'description', 'vlan',
] ]

View File

@ -5,8 +5,7 @@ from . import views
router = OrderedDefaultRouter() router = OrderedDefaultRouter()
router.APIRootView = views.WirelessRootView router.APIRootView = views.WirelessRootView
# SSIDs router.register('wireless-lans', views.WirelessLANViewSet)
router.register('ssids', views.SSIDViewSet)
app_name = 'wireless-api' app_name = 'wireless-api'
urlpatterns = router.urls urlpatterns = router.urls

View File

@ -18,7 +18,7 @@ class WirelessRootView(APIRootView):
# Providers # Providers
# #
class SSIDViewSet(CustomFieldModelViewSet): class WirelessLANViewSet(CustomFieldModelViewSet):
queryset = SSID.objects.prefetch_related('tags') queryset = WirelessLAN.objects.prefetch_related('tags')
serializer_class = serializers.SSIDSerializer serializer_class = serializers.WirelessLANSerializer
filterset_class = filtersets.SSIDFilterSet filterset_class = filtersets.WirelessLANFilterSet

View File

@ -0,0 +1 @@
SSID_MAX_LENGTH = 32 # Per IEEE 802.11-2007

View File

@ -6,11 +6,11 @@ from netbox.filtersets import PrimaryModelFilterSet
from .models import * from .models import *
__all__ = ( __all__ = (
'SSIDFilterSet', 'WirelessLANFilterSet',
) )
class SSIDFilterSet(PrimaryModelFilterSet): class WirelessLANFilterSet(PrimaryModelFilterSet):
q = django_filters.CharFilter( q = django_filters.CharFilter(
method='search', method='search',
label='Search', label='Search',
@ -18,14 +18,14 @@ class SSIDFilterSet(PrimaryModelFilterSet):
tag = TagFilter() tag = TagFilter()
class Meta: class Meta:
model = SSID model = WirelessLAN
fields = ['id', 'name'] fields = ['id', 'ssid']
def search(self, queryset, name, value): def search(self, queryset, name, value):
if not value.strip(): if not value.strip():
return queryset return queryset
qs_filter = ( qs_filter = (
Q(name__icontains=value) | Q(ssid__icontains=value) |
Q(description__icontains=value) Q(description__icontains=value)
) )
return queryset.filter(qs_filter) return queryset.filter(qs_filter)

View File

@ -6,11 +6,11 @@ from ipam.models import VLAN
from utilities.forms import BootstrapMixin, DynamicModelChoiceField from utilities.forms import BootstrapMixin, DynamicModelChoiceField
__all__ = ( __all__ = (
'SSIDBulkEditForm', 'WirelessLANBulkEditForm',
) )
class SSIDBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm): class WirelessLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
pk = forms.ModelMultipleChoiceField( pk = forms.ModelMultipleChoiceField(
queryset=PowerFeed.objects.all(), queryset=PowerFeed.objects.all(),
widget=forms.MultipleHiddenInput widget=forms.MultipleHiddenInput

View File

@ -1,14 +1,14 @@
from extras.forms import CustomFieldModelCSVForm from extras.forms import CustomFieldModelCSVForm
from ipam.models import VLAN from ipam.models import VLAN
from utilities.forms import CSVModelChoiceField from utilities.forms import CSVModelChoiceField
from wireless.models import SSID from wireless.models import WirelessLAN
__all__ = ( __all__ = (
'SSIDCSVForm', 'WirelessLANCSVForm',
) )
class SSIDCSVForm(CustomFieldModelCSVForm): class WirelessLANCSVForm(CustomFieldModelCSVForm):
vlan = CSVModelChoiceField( vlan = CSVModelChoiceField(
queryset=VLAN.objects.all(), queryset=VLAN.objects.all(),
to_field_name='name', to_field_name='name',
@ -16,5 +16,5 @@ class SSIDCSVForm(CustomFieldModelCSVForm):
) )
class Meta: class Meta:
model = SSID model = WirelessLAN
fields = ('name', 'description', 'vlan') fields = ('ssid', 'description', 'vlan')

View File

@ -1,13 +1,13 @@
from django import forms from django import forms
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from dcim.models import *
from extras.forms import CustomFieldModelFilterForm from extras.forms import CustomFieldModelFilterForm
from utilities.forms import BootstrapMixin, TagFilterField from utilities.forms import BootstrapMixin, TagFilterField
from .models import WirelessLAN
class SSIDFilterForm(BootstrapMixin, CustomFieldModelFilterForm): class WirelessLANFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
model = PowerFeed model = WirelessLAN
field_groups = [ field_groups = [
['q', 'tag'], ['q', 'tag'],
] ]

View File

@ -1,17 +1,15 @@
from dcim.constants import *
from dcim.models import *
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
from utilities.forms import BootstrapMixin, DynamicModelChoiceField, DynamicModelMultipleChoiceField from utilities.forms import BootstrapMixin, DynamicModelChoiceField, DynamicModelMultipleChoiceField
from wireless.models import SSID from wireless.models import WirelessLAN
__all__ = ( __all__ = (
'SSIDForm', 'WirelessLANForm',
) )
class SSIDForm(BootstrapMixin, CustomFieldModelForm): class WirelessLANForm(BootstrapMixin, CustomFieldModelForm):
vlan = DynamicModelChoiceField( vlan = DynamicModelChoiceField(
queryset=VLAN.objects.all(), queryset=VLAN.objects.all(),
required=False required=False
@ -22,11 +20,11 @@ class SSIDForm(BootstrapMixin, CustomFieldModelForm):
) )
class Meta: class Meta:
model = SSID model = WirelessLAN
fields = [ fields = [
'name', 'description', 'vlan', 'tags', 'ssid', 'description', 'vlan', 'tags',
] ]
fieldsets = ( fieldsets = (
('SSID', ('name', 'description', 'tags')), ('Wireless LAN', ('ssid', 'description', 'tags')),
('VLAN', ('vlan',)), ('VLAN', ('vlan',)),
) )

View File

@ -5,5 +5,5 @@ from .types import *
class WirelessQuery(graphene.ObjectType): class WirelessQuery(graphene.ObjectType):
ssid = ObjectField(SSIDType) wirelesslan = ObjectField(WirelessLANType)
ssid_list = ObjectListField(SSIDType) wirelesslan_list = ObjectListField(WirelessLANType)

View File

@ -2,13 +2,13 @@ from wireless import filtersets, models
from netbox.graphql.types import ObjectType from netbox.graphql.types import ObjectType
__all__ = ( __all__ = (
'SSIDType', 'WirelessLANType',
) )
class SSIDType(ObjectType): class WirelessLANType(ObjectType):
class Meta: class Meta:
model = models.SSID model = models.WirelessLAN
fields = '__all__' fields = '__all__'
filterset_class = filtersets.SSIDFilterSet filterset_class = filtersets.WirelessLANFilterSet

View File

@ -9,27 +9,26 @@ class Migration(migrations.Migration):
initial = True initial = True
dependencies = [ dependencies = [
('extras', '0062_clear_secrets_changelog'),
('ipam', '0050_iprange'), ('ipam', '0050_iprange'),
('extras', '0062_clear_secrets_changelog'),
] ]
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='SSID', name='WirelessLAN',
fields=[ fields=[
('created', models.DateField(auto_now_add=True, null=True)), ('created', models.DateField(auto_now_add=True, null=True)),
('last_updated', models.DateTimeField(auto_now=True, null=True)), ('last_updated', models.DateTimeField(auto_now=True, null=True)),
('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)), ('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
('id', models.BigAutoField(primary_key=True, serialize=False)), ('id', models.BigAutoField(primary_key=True, serialize=False)),
('name', models.CharField(max_length=32)), ('ssid', models.CharField(max_length=32)),
('description', models.CharField(blank=True, max_length=200)), ('description', models.CharField(blank=True, max_length=200)),
('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')),
('vlan', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ipam.vlan')), ('vlan', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='ipam.vlan')),
], ],
options={ options={
'verbose_name': 'SSID', 'verbose_name': 'Wireless LAN',
'verbose_name_plural': 'SSIDs', 'ordering': ('ssid', 'pk'),
'ordering': ('name', 'pk'),
}, },
), ),
] ]

View File

@ -1,25 +1,23 @@
from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from django.urls import reverse from django.urls import reverse
from dcim.constants import WIRELESS_IFACE_TYPES
from extras.utils import extras_features from extras.utils import extras_features
from netbox.models import BigIDModel, PrimaryModel from netbox.models import BigIDModel, PrimaryModel
from utilities.querysets import RestrictedQuerySet from utilities.querysets import RestrictedQuerySet
__all__ = ( __all__ = (
'SSID', 'WirelessLAN',
) )
#
# SSIDs
#
@extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks') @extras_features('custom_fields', 'custom_links', 'export_templates', 'tags', 'webhooks')
class SSID(PrimaryModel): class WirelessLAN(PrimaryModel):
""" """
A service set identifier belonging to a wireless network. A service set identifier belonging to a wireless network.
""" """
name = models.CharField( ssid = models.CharField(
max_length=32 max_length=32
) )
vlan = models.ForeignKey( vlan = models.ForeignKey(
@ -37,12 +35,11 @@ class SSID(PrimaryModel):
objects = RestrictedQuerySet.as_manager() objects = RestrictedQuerySet.as_manager()
class Meta: class Meta:
ordering = ('name', 'pk') ordering = ('ssid', 'pk')
verbose_name = 'SSID' verbose_name = 'Wireless LAN'
verbose_name_plural = 'SSIDs'
def __str__(self): def __str__(self):
return self.name return self.ssid
def get_absolute_url(self): def get_absolute_url(self):
return reverse('wireless:ssid', args=[self.pk]) return reverse('wireless:ssid', args=[self.pk])

View File

@ -1,23 +1,23 @@
import django_tables2 as tables import django_tables2 as tables
from .models import SSID from .models import WirelessLAN
from utilities.tables import BaseTable, TagColumn, ToggleColumn from utilities.tables import BaseTable, TagColumn, ToggleColumn
__all__ = ( __all__ = (
'SSIDTable', 'WirelessLANTable',
) )
class SSIDTable(BaseTable): class WirelessLANTable(BaseTable):
pk = ToggleColumn() pk = ToggleColumn()
name = tables.Column( ssid = tables.Column(
linkify=True linkify=True
) )
tags = TagColumn( tags = TagColumn(
url_name='dcim:cable_list' url_name='wireless:wirelesslan_list'
) )
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = SSID model = WirelessLAN
fields = ('pk', 'name', 'description', 'vlan') fields = ('pk', 'ssid', 'description', 'vlan')
default_columns = ('pk', 'name', 'description', 'vlan') default_columns = ('pk', 'ssid', 'description', 'vlan')

View File

@ -7,16 +7,16 @@ from .models import *
app_name = 'wireless' app_name = 'wireless'
urlpatterns = ( urlpatterns = (
# SSIDs # Wireless LANs
path('ssids/', views.SSIDListView.as_view(), name='ssid_list'), path('wireless-lans/', views.WirelessLANListView.as_view(), name='wirelesslan_list'),
path('ssids/add/', views.SSIDEditView.as_view(), name='ssid_add'), path('wireless-lans/add/', views.WirelessLANEditView.as_view(), name='wirelesslan_add'),
path('ssids/import/', views.SSIDBulkImportView.as_view(), name='ssid_import'), path('wireless-lans/import/', views.WirelessLANBulkImportView.as_view(), name='wirelesslan_import'),
path('ssids/edit/', views.SSIDBulkEditView.as_view(), name='ssid_bulk_edit'), path('wireless-lans/edit/', views.WirelessLANBulkEditView.as_view(), name='wirelesslan_bulk_edit'),
path('ssids/delete/', views.SSIDBulkDeleteView.as_view(), name='ssid_bulk_delete'), path('wireless-lans/delete/', views.WirelessLANBulkDeleteView.as_view(), name='wirelesslan_bulk_delete'),
path('ssids/<int:pk>/', views.SSIDView.as_view(), name='ssid'), path('wireless-lans/<int:pk>/', views.WirelessLANView.as_view(), name='wirelesslan'),
path('ssids/<int:pk>/edit/', views.SSIDEditView.as_view(), name='ssid_edit'), path('wireless-lans/<int:pk>/edit/', views.WirelessLANEditView.as_view(), name='wirelesslan_edit'),
path('ssids/<int:pk>/delete/', views.SSIDDeleteView.as_view(), name='ssid_delete'), path('wireless-lans/<int:pk>/delete/', views.WirelessLANDeleteView.as_view(), name='wirelesslan_delete'),
path('ssids/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='ssid_changelog', kwargs={'model': SSID}), path('wireless-lans/<int:pk>/changelog/', ObjectChangeLogView.as_view(), name='wirelesslan_changelog', kwargs={'model': WirelessLAN}),
path('ssids/<int:pk>/journal/', ObjectJournalView.as_view(), name='ssid_journal', kwargs={'model': SSID}), path('wireless-lans/<int:pk>/journal/', ObjectJournalView.as_view(), name='wirelesslan_journal', kwargs={'model': WirelessLAN}),
) )

View File

@ -4,43 +4,43 @@ from .models import *
# #
# SSIDs # Wireless LANs
# #
class SSIDListView(generic.ObjectListView): class WirelessLANListView(generic.ObjectListView):
queryset = SSID.objects.all() queryset = WirelessLAN.objects.all()
filterset = filtersets.SSIDFilterSet filterset = filtersets.WirelessLANFilterSet
filterset_form = forms.SSIDFilterForm filterset_form = forms.WirelessLANFilterForm
table = tables.SSIDTable table = tables.WirelessLANTable
class SSIDView(generic.ObjectView): class WirelessLANView(generic.ObjectView):
queryset = SSID.objects.all() queryset = WirelessLAN.objects.all()
class SSIDEditView(generic.ObjectEditView): class WirelessLANEditView(generic.ObjectEditView):
queryset = SSID.objects.all() queryset = WirelessLAN.objects.all()
model_form = forms.SSIDForm model_form = forms.WirelessLANForm
class SSIDDeleteView(generic.ObjectDeleteView): class WirelessLANDeleteView(generic.ObjectDeleteView):
queryset = SSID.objects.all() queryset = WirelessLAN.objects.all()
class SSIDBulkImportView(generic.BulkImportView): class WirelessLANBulkImportView(generic.BulkImportView):
queryset = SSID.objects.all() queryset = WirelessLAN.objects.all()
model_form = forms.SSIDCSVForm model_form = forms.WirelessLANCSVForm
table = tables.SSIDTable table = tables.WirelessLANTable
class SSIDBulkEditView(generic.BulkEditView): class WirelessLANBulkEditView(generic.BulkEditView):
queryset = SSID.objects.all() queryset = WirelessLAN.objects.all()
filterset = filtersets.SSIDFilterSet filterset = filtersets.WirelessLANFilterSet
table = tables.SSIDTable table = tables.WirelessLANTable
form = forms.SSIDBulkEditForm form = forms.WirelessLANBulkEditForm
class SSIDBulkDeleteView(generic.BulkDeleteView): class WirelessLANBulkDeleteView(generic.BulkDeleteView):
queryset = SSID.objects.all() queryset = WirelessLAN.objects.all()
filterset = filtersets.SSIDFilterSet filterset = filtersets.WirelessLANFilterSet
table = tables.SSIDTable table = tables.WirelessLANTable