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', {