diff --git a/netbox/ipam/admin.py b/netbox/ipam/admin.py index e3d4315dc..caa508f85 100644 --- a/netbox/ipam/admin.py +++ b/netbox/ipam/admin.py @@ -47,7 +47,7 @@ class PrefixAdmin(admin.ModelAdmin): def get_queryset(self, request): qs = super(PrefixAdmin, self).get_queryset(request) - return qs.select_related('vrf', 'site', 'status', 'role', 'vlan') + return qs.select_related('vrf', 'site', 'role', 'vlan') @admin.register(IPAddress) @@ -71,4 +71,4 @@ class VLANAdmin(admin.ModelAdmin): def get_queryset(self, request): qs = super(VLANAdmin, self).get_queryset(request) - return qs.select_related('site', 'status', 'role') + return qs.select_related('site', 'role') diff --git a/netbox/ipam/filters.py b/netbox/ipam/filters.py index 412f0b8d2..af26f7021 100644 --- a/netbox/ipam/filters.py +++ b/netbox/ipam/filters.py @@ -69,17 +69,6 @@ class PrefixFilter(django_filters.FilterSet): name='vlan__vid', label='VLAN number (1-4095)', ) - status_id = django_filters.ModelMultipleChoiceFilter( - name='status', - queryset=Status.objects.all(), - label='Status (ID)', - ) - status = django_filters.ModelMultipleChoiceFilter( - name='status', - queryset=Status.objects.all(), - to_field_name='slug', - label='Status (slug)', - ) role_id = django_filters.ModelMultipleChoiceFilter( name='role', queryset=Role.objects.all(), @@ -94,8 +83,7 @@ class PrefixFilter(django_filters.FilterSet): class Meta: model = Prefix - fields = ['family', 'site_id', 'site', 'vrf_id', 'vrf', 'vlan_id', 'vlan_vid', 'status_id', 'status', 'role_id', - 'role'] + fields = ['family', 'site_id', 'site', 'vrf_id', 'vrf', 'vlan_id', 'vlan_vid', 'status', 'role_id', 'role'] def search(self, queryset, value): value = value.strip() @@ -188,17 +176,6 @@ class VLANFilter(django_filters.FilterSet): name='vid', label='VLAN number (1-4095)', ) - status_id = django_filters.ModelMultipleChoiceFilter( - name='status', - queryset=Status.objects.all(), - label='Status (ID)', - ) - status = django_filters.ModelMultipleChoiceFilter( - name='status', - queryset=Status.objects.all(), - to_field_name='slug', - label='Status (slug)', - ) role_id = django_filters.ModelMultipleChoiceFilter( name='role', queryset=Role.objects.all(), @@ -213,4 +190,4 @@ class VLANFilter(django_filters.FilterSet): class Meta: model = VLAN - fields = ['site_id', 'site', 'vid', 'name', 'status_id', 'status', 'role_id', 'role'] + fields = ['site_id', 'site', 'vid', 'name', 'status', 'role_id', 'role'] diff --git a/netbox/ipam/forms.py b/netbox/ipam/forms.py index 869d95aa9..59ee0765d 100644 --- a/netbox/ipam/forms.py +++ b/netbox/ipam/forms.py @@ -5,7 +5,8 @@ from django.db.models import Count from dcim.models import Site, Device, Interface from utilities.forms import BootstrapMixin, ConfirmationForm, APISelect, Livesearch, CSVDataField, BulkImportForm -from .models import VRF, RIR, Aggregate, Role, Status, Prefix, IPAddress, VLAN +from .models import VRF, RIR, Aggregate, Role, Status, Prefix, IPAddress, VLAN, PREFIX_STATUS_CHOICES,\ + VLAN_STATUS_CHOICES # @@ -215,11 +216,6 @@ def prefix_vrf_choices(): return vrf_choices -def prefix_status_choices(): - status_choices = Status.objects.annotate(prefix_count=Count('prefixes')) - return [(s.slug, '{} ({})'.format(s.name, s.prefix_count)) for s in status_choices] - - def prefix_site_choices(): site_choices = Site.objects.annotate(prefix_count=Count('prefixes')) return [(s.slug, '{} ({})'.format(s.name, s.prefix_count)) for s in site_choices] @@ -233,7 +229,7 @@ def prefix_role_choices(): class PrefixFilterForm(forms.Form, BootstrapMixin): parent = forms.CharField(required=False, label='Search Within') vrf = forms.ChoiceField(required=False, choices=prefix_vrf_choices, label='VRF') - status = forms.MultipleChoiceField(required=False, choices=prefix_status_choices) + status = forms.MultipleChoiceField(required=False, choices=PREFIX_STATUS_CHOICES) site = forms.MultipleChoiceField(required=False, choices=prefix_site_choices, widget=forms.SelectMultiple(attrs={'size': 8})) role = forms.MultipleChoiceField(required=False, choices=prefix_role_choices, @@ -430,11 +426,6 @@ def vlan_site_choices(): return [(s.slug, '{} ({})'.format(s.name, s.vlan_count)) for s in site_choices] -def vlan_status_choices(): - status_choices = Status.objects.annotate(vlan_count=Count('vlans')) - return [(s.slug, '{} ({})'.format(s.name, s.vlan_count)) for s in status_choices] - - def vlan_role_choices(): role_choices = Role.objects.annotate(vlan_count=Count('vlans')) return [(r.slug, '{} ({})'.format(r.name, r.vlan_count)) for r in role_choices] @@ -443,6 +434,6 @@ def vlan_role_choices(): class VLANFilterForm(forms.Form, BootstrapMixin): site = forms.MultipleChoiceField(required=False, choices=vlan_site_choices, widget=forms.SelectMultiple(attrs={'size': 8})) - status = forms.MultipleChoiceField(required=False, choices=vlan_status_choices) + status = forms.MultipleChoiceField(required=False, choices=VLAN_STATUS_CHOICES) role = forms.MultipleChoiceField(required=False, choices=vlan_role_choices, widget=forms.SelectMultiple(attrs={'size': 8})) diff --git a/netbox/ipam/migrations/0003_auto_20160517_2026.py b/netbox/ipam/migrations/0003_auto_20160517_2026.py new file mode 100644 index 000000000..4bd50c28a --- /dev/null +++ b/netbox/ipam/migrations/0003_auto_20160517_2026.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.5 on 2016-05-17 20:26 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipam', '0002_auto_20160517_2007'), + ] + + operations = [ + migrations.AlterField( + model_name='prefix', + name='status', + field=models.PositiveSmallIntegerField(choices=[(0, b'Container'), (1, b'Active'), (2, b'Reserved'), (3, b'Deprecated')], default=1, verbose_name=b'Status'), + ), + migrations.AlterField( + model_name='vlan', + name='status', + field=models.PositiveSmallIntegerField(choices=[(1, b'Active'), (2, b'Reserved'), (3, b'Deprecated')], default=1, verbose_name=b'Status'), + ), + ] diff --git a/netbox/ipam/models.py b/netbox/ipam/models.py index 2d78d03c3..a0fef2ea2 100644 --- a/netbox/ipam/models.py +++ b/netbox/ipam/models.py @@ -36,6 +36,13 @@ BOOTSTRAP_CLASS_CHOICES = ( (5, 'Danger'), ) +STATUS_CHOICE_CLASSES = { + 0: 'default', + 1: 'primary', + 2: 'info', + 3: 'danger', +} + class VRF(models.Model): """ @@ -213,7 +220,7 @@ class Prefix(models.Model): site = models.ForeignKey('dcim.Site', related_name='prefixes', on_delete=models.PROTECT, blank=True, null=True) vrf = models.ForeignKey('VRF', related_name='prefixes', on_delete=models.PROTECT, blank=True, null=True, verbose_name='VRF') vlan = models.ForeignKey('VLAN', related_name='prefixes', on_delete=models.PROTECT, blank=True, null=True, verbose_name='VLAN') - status = models.ForeignKey('Status', related_name='prefixes', on_delete=models.PROTECT) + status = models.PositiveSmallIntegerField('Status', choices=PREFIX_STATUS_CHOICES, default=1) status_new = models.PositiveSmallIntegerField('Status', choices=PREFIX_STATUS_CHOICES, default=1) role = models.ForeignKey('Role', related_name='prefixes', on_delete=models.SET_NULL, blank=True, null=True) description = models.CharField(max_length=100, blank=True) @@ -249,6 +256,9 @@ class Prefix(models.Model): return IPNetwork('{}/{}'.format(self.prefix.network, self.prefix.prefixlen + 1)) return None + def get_status_class(self): + return STATUS_CHOICE_CLASSES[self.status] + class IPAddress(models.Model): """ @@ -295,7 +305,7 @@ class VLAN(models.Model): MaxValueValidator(4094) ]) name = models.CharField(max_length=30) - status = models.ForeignKey('Status', related_name='vlans', on_delete=models.PROTECT) + status = models.PositiveSmallIntegerField('Status', choices=VLAN_STATUS_CHOICES, default=1) status_new = models.PositiveSmallIntegerField('Status', choices=VLAN_STATUS_CHOICES, default=1) role = models.ForeignKey('Role', related_name='vlans', on_delete=models.SET_NULL, blank=True, null=True) @@ -309,3 +319,6 @@ class VLAN(models.Model): def get_absolute_url(self): return reverse('ipam:vlan', args=[self.pk]) + + def get_status_class(self): + return STATUS_CHOICE_CLASSES[self.status] diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables.py index 7862b4233..39360a8ca 100644 --- a/netbox/ipam/tables.py +++ b/netbox/ipam/tables.py @@ -41,7 +41,7 @@ PREFIX_LINK_BRIEF = """ STATUS_LABEL = """ {% if record.pk %} - {{ record.status.name }} + {{ record.get_status_display }} {% else %} Available {% endif %} diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index f53bb05ed..e2d807dad 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -155,7 +155,7 @@ def aggregate(request, pk): # Find all child prefixes contained by this aggregate child_prefixes = Prefix.objects.filter(prefix__net_contained_or_equal=str(aggregate.prefix))\ - .select_related('site', 'status', 'role').annotate_depth(limit=0) + .select_related('site', 'role').annotate_depth(limit=0) child_prefixes = add_available_prefixes(aggregate.prefix, child_prefixes) prefix_table = PrefixTable(child_prefixes) @@ -248,7 +248,7 @@ class RoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): # class PrefixListView(ObjectListView): - queryset = Prefix.objects.select_related('site', 'status', 'role') + queryset = Prefix.objects.select_related('site', 'role') filter = PrefixFilter filter_form = PrefixFilterForm table = PrefixTable @@ -263,7 +263,7 @@ class PrefixListView(ObjectListView): def prefix(request, pk): - prefix = get_object_or_404(Prefix.objects.select_related('site', 'vlan', 'status', 'role'), pk=pk) + prefix = get_object_or_404(Prefix.objects.select_related('site', 'vlan', 'role'), pk=pk) try: aggregate = Aggregate.objects.get(prefix__net_contains_or_equals=str(prefix.prefix)) @@ -275,17 +275,17 @@ def prefix(request, pk): # Parent prefixes table parent_prefixes = Prefix.objects.filter(vrf=prefix.vrf, prefix__net_contains=str(prefix.prefix))\ - .select_related('site', 'status', 'role').annotate_depth() + .select_related('site', 'role').annotate_depth() parent_prefix_table = PrefixBriefTable(parent_prefixes) # Duplicate prefixes table duplicate_prefixes = Prefix.objects.filter(vrf=prefix.vrf, prefix=str(prefix.prefix)).exclude(pk=prefix.pk)\ - .select_related('site', 'status', 'role') + .select_related('site', 'role') duplicate_prefix_table = PrefixBriefTable(duplicate_prefixes) # Child prefixes table child_prefixes = Prefix.objects.filter(vrf=prefix.vrf, prefix__net_contained=str(prefix.prefix))\ - .select_related('site', 'status', 'role').annotate_depth(limit=0) + .select_related('site', 'role').annotate_depth(limit=0) if child_prefixes: child_prefixes = add_available_prefixes(prefix.prefix, child_prefixes) child_prefix_table = PrefixTable(child_prefixes) @@ -474,7 +474,7 @@ class IPAddressBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): # class VLANListView(ObjectListView): - queryset = VLAN.objects.select_related('site', 'status', 'role') + queryset = VLAN.objects.select_related('site', 'role') filter = VLANFilter filter_form = VLANFilterForm table = VLANTable @@ -484,7 +484,7 @@ class VLANListView(ObjectListView): def vlan(request, pk): - vlan = get_object_or_404(VLAN.objects.select_related('site', 'status', 'role'), pk=pk) + vlan = get_object_or_404(VLAN.objects.select_related('site', 'role'), pk=pk) prefixes = Prefix.objects.filter(vlan=vlan) return render(request, 'ipam/vlan.html', {