|
@@ -9,9 +9,9 @@ from extras.forms import CustomFieldForm, CustomFieldBulkEditForm, CustomFieldFi
|
|
|
from tenancy.forms import TenancyForm
|
|
|
from tenancy.models import Tenant
|
|
|
from utilities.forms import (
|
|
|
- APISelect, BootstrapMixin, BulkEditNullBooleanSelect, ChainedModelChoiceField, CSVChoiceField,
|
|
|
- ExpandableIPAddressField, FilterChoiceField, FlexibleModelChoiceField, Livesearch, ReturnURLForm, SlugField,
|
|
|
- add_blank_choice,
|
|
|
+ AnnotatedMultipleChoiceField, APISelect, BootstrapMixin, BulkEditNullBooleanSelect, ChainedModelChoiceField,
|
|
|
+ CSVChoiceField, ExpandableIPAddressField, FilterChoiceField, FlexibleModelChoiceField, Livesearch, ReturnURLForm,
|
|
|
+ SlugField, add_blank_choice,
|
|
|
)
|
|
|
from virtualization.models import VirtualMachine
|
|
|
from .constants import IPADDRESS_ROLE_CHOICES, IPADDRESS_STATUS_CHOICES, PREFIX_STATUS_CHOICES, VLAN_STATUS_CHOICES
|
|
@@ -350,13 +350,6 @@ class PrefixBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
|
|
|
nullable_fields = ['site', 'vrf', 'tenant', 'role', 'description']
|
|
|
|
|
|
|
|
|
-def prefix_status_choices():
|
|
|
- status_counts = {}
|
|
|
- for status in Prefix.objects.values('status').annotate(count=Count('status')).order_by('status'):
|
|
|
- status_counts[status['status']] = status['count']
|
|
|
- return [(s[0], '{} ({})'.format(s[1], status_counts.get(s[0], 0))) for s in PREFIX_STATUS_CHOICES]
|
|
|
-
|
|
|
-
|
|
|
class PrefixFilterForm(BootstrapMixin, CustomFieldFilterForm):
|
|
|
model = Prefix
|
|
|
q = forms.CharField(required=False, label='Search')
|
|
@@ -376,7 +369,12 @@ class PrefixFilterForm(BootstrapMixin, CustomFieldFilterForm):
|
|
|
to_field_name='slug',
|
|
|
null_label='-- None --'
|
|
|
)
|
|
|
- status = forms.MultipleChoiceField(choices=prefix_status_choices, required=False)
|
|
|
+ status = AnnotatedMultipleChoiceField(
|
|
|
+ choices=PREFIX_STATUS_CHOICES,
|
|
|
+ annotate=Prefix.objects.all(),
|
|
|
+ annotate_field='status',
|
|
|
+ required=False
|
|
|
+ )
|
|
|
site = FilterChoiceField(
|
|
|
queryset=Site.objects.annotate(filter_count=Count('prefixes')),
|
|
|
to_field_name='slug',
|
|
@@ -688,20 +686,6 @@ class IPAddressAssignForm(BootstrapMixin, forms.Form):
|
|
|
address = forms.CharField(label='IP Address')
|
|
|
|
|
|
|
|
|
-def ipaddress_status_choices():
|
|
|
- status_counts = {}
|
|
|
- for status in IPAddress.objects.values('status').annotate(count=Count('status')).order_by('status'):
|
|
|
- status_counts[status['status']] = status['count']
|
|
|
- return [(s[0], '{} ({})'.format(s[1], status_counts.get(s[0], 0))) for s in IPADDRESS_STATUS_CHOICES]
|
|
|
-
|
|
|
-
|
|
|
-def ipaddress_role_choices():
|
|
|
- role_counts = {}
|
|
|
- for role in IPAddress.objects.values('role').annotate(count=Count('role')).order_by('role'):
|
|
|
- role_counts[role['role']] = role['count']
|
|
|
- return [(r[0], '{} ({})'.format(r[1], role_counts.get(r[0], 0))) for r in IPADDRESS_ROLE_CHOICES]
|
|
|
-
|
|
|
-
|
|
|
class IPAddressFilterForm(BootstrapMixin, CustomFieldFilterForm):
|
|
|
model = IPAddress
|
|
|
q = forms.CharField(required=False, label='Search')
|
|
@@ -721,8 +705,18 @@ class IPAddressFilterForm(BootstrapMixin, CustomFieldFilterForm):
|
|
|
to_field_name='slug',
|
|
|
null_label='-- None --'
|
|
|
)
|
|
|
- status = forms.MultipleChoiceField(choices=ipaddress_status_choices, required=False)
|
|
|
- role = forms.MultipleChoiceField(choices=ipaddress_role_choices, required=False)
|
|
|
+ status = AnnotatedMultipleChoiceField(
|
|
|
+ choices=IPADDRESS_STATUS_CHOICES,
|
|
|
+ annotate=IPAddress.objects.all(),
|
|
|
+ annotate_field='status',
|
|
|
+ required=False
|
|
|
+ )
|
|
|
+ role = AnnotatedMultipleChoiceField(
|
|
|
+ choices=IPADDRESS_ROLE_CHOICES,
|
|
|
+ annotate=IPAddress.objects.all(),
|
|
|
+ annotate_field='role',
|
|
|
+ required=False
|
|
|
+ )
|
|
|
|
|
|
|
|
|
#
|
|
@@ -878,13 +872,6 @@ class VLANBulkEditForm(BootstrapMixin, CustomFieldBulkEditForm):
|
|
|
nullable_fields = ['site', 'group', 'tenant', 'role', 'description']
|
|
|
|
|
|
|
|
|
-def vlan_status_choices():
|
|
|
- status_counts = {}
|
|
|
- for status in VLAN.objects.values('status').annotate(count=Count('status')).order_by('status'):
|
|
|
- status_counts[status['status']] = status['count']
|
|
|
- return [(s[0], '{} ({})'.format(s[1], status_counts.get(s[0], 0))) for s in VLAN_STATUS_CHOICES]
|
|
|
-
|
|
|
-
|
|
|
class VLANFilterForm(BootstrapMixin, CustomFieldFilterForm):
|
|
|
model = VLAN
|
|
|
q = forms.CharField(required=False, label='Search')
|
|
@@ -903,7 +890,12 @@ class VLANFilterForm(BootstrapMixin, CustomFieldFilterForm):
|
|
|
to_field_name='slug',
|
|
|
null_label='-- None --'
|
|
|
)
|
|
|
- status = forms.MultipleChoiceField(choices=vlan_status_choices, required=False)
|
|
|
+ status = AnnotatedMultipleChoiceField(
|
|
|
+ choices=VLAN_STATUS_CHOICES,
|
|
|
+ annotate=VLAN.objects.all(),
|
|
|
+ annotate_field='status',
|
|
|
+ required=False
|
|
|
+ )
|
|
|
role = FilterChoiceField(
|
|
|
queryset=Role.objects.annotate(filter_count=Count('vlans')),
|
|
|
to_field_name='slug',
|