Просмотр исходного кода

Enable attachment of wireless interfaces to SSIDs

jeremystretch 4 лет назад
Родитель
Сommit
38f6d22d2d

+ 8 - 2
netbox/dcim/forms/models.py

@@ -16,6 +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 .common import InterfaceCommonForm
 from .common import InterfaceCommonForm
 
 
 __all__ = (
 __all__ = (
@@ -1068,6 +1069,11 @@ class InterfaceForm(BootstrapMixin, InterfaceCommonForm, CustomFieldModelForm):
             'type': 'lag',
             'type': 'lag',
         }
         }
     )
     )
+    ssids = DynamicModelMultipleChoiceField(
+        queryset=SSID.objects.all(),
+        required=False,
+        label='SSIDs'
+    )
     vlan_group = DynamicModelChoiceField(
     vlan_group = DynamicModelChoiceField(
         queryset=VLANGroup.objects.all(),
         queryset=VLANGroup.objects.all(),
         required=False,
         required=False,
@@ -1098,8 +1104,8 @@ 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', 'untagged_vlan', 'tagged_vlans',
-            'tags',
+            'mark_connected', 'description', 'mode', 'rf_channel', 'rf_channel_width', 'ssids', 'untagged_vlan',
+            'tagged_vlans', 'tags',
         ]
         ]
         widgets = {
         widgets = {
             'device': forms.HiddenInput(),
             'device': forms.HiddenInput(),

+ 6 - 0
netbox/dcim/migrations/0136_wireless.py

@@ -4,6 +4,7 @@ from django.db import migrations, models
 class Migration(migrations.Migration):
 class Migration(migrations.Migration):
 
 
     dependencies = [
     dependencies = [
+        ('wireless', '__first__'),
         ('dcim', '0135_location_tenant'),
         ('dcim', '0135_location_tenant'),
     ]
     ]
 
 
@@ -18,4 +19,9 @@ class Migration(migrations.Migration):
             name='rf_channel_width',
             name='rf_channel_width',
             field=models.PositiveSmallIntegerField(blank=True, null=True),
             field=models.PositiveSmallIntegerField(blank=True, null=True),
         ),
         ),
+        migrations.AddField(
+            model_name='interface',
+            name='ssids',
+            field=models.ManyToManyField(blank=True, related_name='interfaces', to='wireless.SSID'),
+        ),
     ]
     ]

+ 6 - 0
netbox/dcim/models/device_components.py

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

+ 27 - 0
netbox/templates/dcim/interface.html

@@ -258,6 +258,33 @@
                     </div>
                     </div>
                 </div>
                 </div>
             {% endif %}
             {% endif %}
+            {% if object.is_wireless %}
+                <div class="card">
+                    <h5 class="card-header">SSIDs</h5>
+                    <div class="card-body">
+                        <table class="table table-hover table-headings">
+                            <thead>
+                                <tr>
+                                    <th>Name</th>
+                                </tr>
+                            </thead>
+                            <tbody>
+                                {% for ssid in object.ssids.all %}
+                                    <tr>
+                                        <td>
+                                            <a href="{{ ssid.get_absolute_url }}">{{ ssid.name }}</a>
+                                        </td>
+                                    </tr>
+                                {% empty %}
+                                    <tr>
+                                        <td colspan="3" class="text-muted">None</td>
+                                    </tr>
+                                {% endfor %}
+                            </tbody>
+                        </table>
+                    </div>
+                </div>
+            {% endif %}
             {% if object.is_lag %}
             {% if object.is_lag %}
                 <div class="card">
                 <div class="card">
                     <h5 class="card-header">LAG Members</h5>
                     <h5 class="card-header">LAG Members</h5>

+ 1 - 0
netbox/templates/dcim/interface_edit.html

@@ -36,6 +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 %}
         </div>
         </div>
     {% endif %}
     {% endif %}
 
 

+ 0 - 1
netbox/wireless/migrations/0001_initial.py

@@ -9,7 +9,6 @@ class Migration(migrations.Migration):
     initial = True
     initial = True
 
 
     dependencies = [
     dependencies = [
-        ('dcim', '0136_wireless'),
         ('extras', '0062_clear_secrets_changelog'),
         ('extras', '0062_clear_secrets_changelog'),
         ('ipam', '0050_iprange'),
         ('ipam', '0050_iprange'),
     ]
     ]

+ 9 - 1
netbox/wireless/models.py

@@ -1,7 +1,8 @@
 from django.db import models
 from django.db import models
+from django.urls import reverse
 
 
 from extras.utils import extras_features
 from extras.utils import extras_features
-from netbox.models import PrimaryModel
+from netbox.models import BigIDModel, PrimaryModel
 from utilities.querysets import RestrictedQuerySet
 from utilities.querysets import RestrictedQuerySet
 
 
 __all__ = (
 __all__ = (
@@ -9,6 +10,10 @@ __all__ = (
 )
 )
 
 
 
 
+#
+# 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 SSID(PrimaryModel):
     """
     """
@@ -38,3 +43,6 @@ class SSID(PrimaryModel):
 
 
     def __str__(self):
     def __str__(self):
         return self.name
         return self.name
+
+    def get_absolute_url(self):
+        return reverse('wireless:ssid', args=[self.pk])

+ 3 - 4
netbox/wireless/tables.py

@@ -10,9 +10,8 @@ __all__ = (
 
 
 class SSIDTable(BaseTable):
 class SSIDTable(BaseTable):
     pk = ToggleColumn()
     pk = ToggleColumn()
-    id = tables.Column(
-        linkify=True,
-        verbose_name='ID'
+    name = tables.Column(
+        linkify=True
     )
     )
     tags = TagColumn(
     tags = TagColumn(
         url_name='dcim:cable_list'
         url_name='dcim:cable_list'
@@ -20,5 +19,5 @@ class SSIDTable(BaseTable):
 
 
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = SSID
         model = SSID
-        fields = ('pk', 'id', 'name', 'description', 'vlan')
+        fields = ('pk', 'name', 'description', 'vlan')
         default_columns = ('pk', 'name', 'description', 'vlan')
         default_columns = ('pk', 'name', 'description', 'vlan')

+ 3 - 3
netbox/wireless/views.py

@@ -15,7 +15,7 @@ class SSIDListView(generic.ObjectListView):
 
 
 
 
 class SSIDView(generic.ObjectView):
 class SSIDView(generic.ObjectView):
-    queryset = SSID.objects.prefetch_related('power_panel', 'rack')
+    queryset = SSID.objects.all()
 
 
 
 
 class SSIDEditView(generic.ObjectEditView):
 class SSIDEditView(generic.ObjectEditView):
@@ -34,13 +34,13 @@ class SSIDBulkImportView(generic.BulkImportView):
 
 
 
 
 class SSIDBulkEditView(generic.BulkEditView):
 class SSIDBulkEditView(generic.BulkEditView):
-    queryset = SSID.objects.prefetch_related('power_panel', 'rack')
+    queryset = SSID.objects.all()
     filterset = filtersets.SSIDFilterSet
     filterset = filtersets.SSIDFilterSet
     table = tables.SSIDTable
     table = tables.SSIDTable
     form = forms.SSIDBulkEditForm
     form = forms.SSIDBulkEditForm
 
 
 
 
 class SSIDBulkDeleteView(generic.BulkDeleteView):
 class SSIDBulkDeleteView(generic.BulkDeleteView):
-    queryset = SSID.objects.prefetch_related('power_panel', 'rack')
+    queryset = SSID.objects.all()
     filterset = filtersets.SSIDFilterSet
     filterset = filtersets.SSIDFilterSet
     table = tables.SSIDTable
     table = tables.SSIDTable