mirror of
https://github.com/netbox-community/netbox.git
synced 2025-12-24 22:27:48 -06:00
Add status field to WirelessLink
This commit is contained in:
@@ -1,7 +1,9 @@
|
||||
from rest_framework import serializers
|
||||
|
||||
from dcim.choices import LinkStatusChoices
|
||||
from dcim.api.serializers import NestedInterfaceSerializer
|
||||
from ipam.api.serializers import NestedVLANSerializer
|
||||
from netbox.api import ChoiceField
|
||||
from netbox.api.serializers import PrimaryModelSerializer
|
||||
from wireless.models import *
|
||||
from .nested_serializers import *
|
||||
@@ -25,11 +27,12 @@ class WirelessLANSerializer(PrimaryModelSerializer):
|
||||
|
||||
class WirelessLinkSerializer(PrimaryModelSerializer):
|
||||
url = serializers.HyperlinkedIdentityField(view_name='wireless-api:wirelesslink-detail')
|
||||
status = ChoiceField(choices=LinkStatusChoices, required=False)
|
||||
interface_a = NestedInterfaceSerializer()
|
||||
interface_b = NestedInterfaceSerializer()
|
||||
|
||||
class Meta:
|
||||
model = WirelessLink
|
||||
fields = [
|
||||
'id', 'url', 'display', 'interface_a', 'interface_b', 'ssid', 'description',
|
||||
'id', 'url', 'display', 'interface_a', 'interface_b', 'ssid', 'status', 'description',
|
||||
]
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import django_filters
|
||||
from django.db.models import Q
|
||||
|
||||
from dcim.choices import LinkStatusChoices
|
||||
from extras.filters import TagFilter
|
||||
from netbox.filtersets import PrimaryModelFilterSet
|
||||
from .models import *
|
||||
@@ -37,6 +38,9 @@ class WirelessLinkFilterSet(PrimaryModelFilterSet):
|
||||
method='search',
|
||||
label='Search',
|
||||
)
|
||||
status = django_filters.MultipleChoiceFilter(
|
||||
choices=LinkStatusChoices
|
||||
)
|
||||
tag = TagFilter()
|
||||
|
||||
class Meta:
|
||||
|
||||
@@ -1,10 +1,11 @@
|
||||
from django import forms
|
||||
|
||||
from dcim.models import *
|
||||
from dcim.choices import LinkStatusChoices
|
||||
from extras.forms import AddRemoveTagsForm, CustomFieldModelBulkEditForm
|
||||
from ipam.models import VLAN
|
||||
from utilities.forms import BootstrapMixin, DynamicModelChoiceField
|
||||
from wireless.constants import SSID_MAX_LENGTH
|
||||
from wireless.models import *
|
||||
|
||||
__all__ = (
|
||||
'WirelessLANBulkEditForm',
|
||||
@@ -14,7 +15,7 @@ __all__ = (
|
||||
|
||||
class WirelessLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
|
||||
pk = forms.ModelMultipleChoiceField(
|
||||
queryset=PowerFeed.objects.all(),
|
||||
queryset=WirelessLAN.objects.all(),
|
||||
widget=forms.MultipleHiddenInput
|
||||
)
|
||||
vlan = DynamicModelChoiceField(
|
||||
@@ -35,13 +36,17 @@ class WirelessLANBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldMode
|
||||
|
||||
class WirelessLinkBulkEditForm(BootstrapMixin, AddRemoveTagsForm, CustomFieldModelBulkEditForm):
|
||||
pk = forms.ModelMultipleChoiceField(
|
||||
queryset=PowerFeed.objects.all(),
|
||||
queryset=WirelessLink.objects.all(),
|
||||
widget=forms.MultipleHiddenInput
|
||||
)
|
||||
ssid = forms.CharField(
|
||||
max_length=SSID_MAX_LENGTH,
|
||||
required=False
|
||||
)
|
||||
status = forms.ChoiceField(
|
||||
choices=LinkStatusChoices,
|
||||
required=False
|
||||
)
|
||||
description = forms.CharField(
|
||||
required=False
|
||||
)
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
from dcim.choices import LinkStatusChoices
|
||||
from dcim.models import Interface
|
||||
from extras.forms import CustomFieldModelCSVForm
|
||||
from ipam.models import VLAN
|
||||
from utilities.forms import CSVModelChoiceField
|
||||
from utilities.forms import CSVChoiceField, CSVModelChoiceField
|
||||
from wireless.models import *
|
||||
|
||||
__all__ = (
|
||||
@@ -23,6 +24,10 @@ class WirelessLANCSVForm(CustomFieldModelCSVForm):
|
||||
|
||||
|
||||
class WirelessLinkCSVForm(CustomFieldModelCSVForm):
|
||||
status = CSVChoiceField(
|
||||
choices=LinkStatusChoices,
|
||||
help_text='Connection status'
|
||||
)
|
||||
interface_a = CSVModelChoiceField(
|
||||
queryset=Interface.objects.all()
|
||||
)
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
from django import forms
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
from dcim.choices import LinkStatusChoices
|
||||
from extras.forms import CustomFieldModelFilterForm
|
||||
from utilities.forms import BootstrapMixin, TagFilterField
|
||||
from utilities.forms import add_blank_choice, BootstrapMixin, StaticSelect, TagFilterField
|
||||
from wireless.models import *
|
||||
|
||||
__all__ = (
|
||||
@@ -42,4 +43,9 @@ class WirelessLinkFilterForm(BootstrapMixin, CustomFieldModelFilterForm):
|
||||
required=False,
|
||||
label='SSID'
|
||||
)
|
||||
status = forms.ChoiceField(
|
||||
required=False,
|
||||
choices=add_blank_choice(LinkStatusChoices),
|
||||
widget=StaticSelect()
|
||||
)
|
||||
tag = TagFilterField(model)
|
||||
|
||||
@@ -2,7 +2,7 @@ from dcim.models import Interface
|
||||
from extras.forms import CustomFieldModelForm
|
||||
from extras.models import Tag
|
||||
from ipam.models import VLAN
|
||||
from utilities.forms import BootstrapMixin, DynamicModelChoiceField, DynamicModelMultipleChoiceField
|
||||
from utilities.forms import BootstrapMixin, DynamicModelChoiceField, DynamicModelMultipleChoiceField, StaticSelect
|
||||
from wireless.models import *
|
||||
|
||||
__all__ = (
|
||||
@@ -55,5 +55,8 @@ class WirelessLinkForm(BootstrapMixin, CustomFieldModelForm):
|
||||
class Meta:
|
||||
model = WirelessLink
|
||||
fields = [
|
||||
'interface_a', 'interface_b', 'ssid', 'description', 'tags',
|
||||
'interface_a', 'interface_b', 'status', 'ssid', 'description', 'tags',
|
||||
]
|
||||
widgets = {
|
||||
'status': StaticSelect,
|
||||
}
|
||||
|
||||
@@ -42,6 +42,7 @@ class Migration(migrations.Migration):
|
||||
('custom_field_data', models.JSONField(blank=True, default=dict, encoder=django.core.serializers.json.DjangoJSONEncoder)),
|
||||
('id', models.BigAutoField(primary_key=True, serialize=False)),
|
||||
('ssid', models.CharField(blank=True, max_length=32)),
|
||||
('status', models.CharField(default='connected', max_length=50)),
|
||||
('description', models.CharField(blank=True, max_length=200)),
|
||||
('_interface_a_device', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='dcim.device')),
|
||||
('_interface_b_device', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='+', to='dcim.device')),
|
||||
|
||||
@@ -2,6 +2,7 @@ from django.core.exceptions import ValidationError
|
||||
from django.db import models
|
||||
from django.urls import reverse
|
||||
|
||||
from dcim.choices import LinkStatusChoices
|
||||
from dcim.constants import WIRELESS_IFACE_TYPES
|
||||
from extras.utils import extras_features
|
||||
from netbox.models import BigIDModel, PrimaryModel
|
||||
@@ -70,6 +71,11 @@ class WirelessLink(PrimaryModel):
|
||||
blank=True,
|
||||
verbose_name='SSID'
|
||||
)
|
||||
status = models.CharField(
|
||||
max_length=50,
|
||||
choices=LinkStatusChoices,
|
||||
default=LinkStatusChoices.STATUS_CONNECTED
|
||||
)
|
||||
description = models.CharField(
|
||||
max_length=200,
|
||||
blank=True
|
||||
@@ -94,6 +100,8 @@ class WirelessLink(PrimaryModel):
|
||||
|
||||
objects = RestrictedQuerySet.as_manager()
|
||||
|
||||
clone_fields = ('ssid', 'status')
|
||||
|
||||
class Meta:
|
||||
ordering = ['pk']
|
||||
unique_together = ('interface_a', 'interface_b')
|
||||
@@ -104,6 +112,9 @@ class WirelessLink(PrimaryModel):
|
||||
def get_absolute_url(self):
|
||||
return reverse('wireless:wirelesslink', args=[self.pk])
|
||||
|
||||
def get_status_class(self):
|
||||
return LinkStatusChoices.CSS_CLASSES.get(self.status)
|
||||
|
||||
def clean(self):
|
||||
|
||||
# Validate interface types
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import django_tables2 as tables
|
||||
|
||||
from .models import *
|
||||
from utilities.tables import BaseTable, TagColumn, ToggleColumn
|
||||
from utilities.tables import BaseTable, ChoiceFieldColumn, TagColumn, ToggleColumn
|
||||
|
||||
__all__ = (
|
||||
'WirelessLANTable',
|
||||
@@ -30,6 +30,7 @@ class WirelessLinkTable(BaseTable):
|
||||
linkify=True,
|
||||
verbose_name='ID'
|
||||
)
|
||||
status = ChoiceFieldColumn()
|
||||
interface_a = tables.Column(
|
||||
linkify=True
|
||||
)
|
||||
@@ -42,5 +43,5 @@ class WirelessLinkTable(BaseTable):
|
||||
|
||||
class Meta(BaseTable.Meta):
|
||||
model = WirelessLink
|
||||
fields = ('pk', 'id', 'interface_a', 'interface_b', 'ssid', 'description')
|
||||
default_columns = ('pk', 'id', 'interface_a', 'interface_b', 'ssid', 'description')
|
||||
fields = ('pk', 'id', 'status', 'interface_a', 'interface_b', 'ssid', 'description')
|
||||
default_columns = ('pk', 'id', 'status', 'interface_a', 'interface_b', 'ssid', 'description')
|
||||
|
||||
Reference in New Issue
Block a user