Transitioning ipam.Status from model to static field

This commit is contained in:
Jeremy Stretch 2016-05-17 16:40:15 -04:00
parent 2baa31bde1
commit c1e41410c9
7 changed files with 57 additions and 51 deletions

View File

@ -47,7 +47,7 @@ class PrefixAdmin(admin.ModelAdmin):
def get_queryset(self, request): def get_queryset(self, request):
qs = super(PrefixAdmin, self).get_queryset(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) @admin.register(IPAddress)
@ -71,4 +71,4 @@ class VLANAdmin(admin.ModelAdmin):
def get_queryset(self, request): def get_queryset(self, request):
qs = super(VLANAdmin, self).get_queryset(request) qs = super(VLANAdmin, self).get_queryset(request)
return qs.select_related('site', 'status', 'role') return qs.select_related('site', 'role')

View File

@ -69,17 +69,6 @@ class PrefixFilter(django_filters.FilterSet):
name='vlan__vid', name='vlan__vid',
label='VLAN number (1-4095)', 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( role_id = django_filters.ModelMultipleChoiceFilter(
name='role', name='role',
queryset=Role.objects.all(), queryset=Role.objects.all(),
@ -94,8 +83,7 @@ class PrefixFilter(django_filters.FilterSet):
class Meta: class Meta:
model = Prefix model = Prefix
fields = ['family', 'site_id', 'site', 'vrf_id', 'vrf', 'vlan_id', 'vlan_vid', 'status_id', 'status', 'role_id', fields = ['family', 'site_id', 'site', 'vrf_id', 'vrf', 'vlan_id', 'vlan_vid', 'status', 'role_id', 'role']
'role']
def search(self, queryset, value): def search(self, queryset, value):
value = value.strip() value = value.strip()
@ -188,17 +176,6 @@ class VLANFilter(django_filters.FilterSet):
name='vid', name='vid',
label='VLAN number (1-4095)', 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( role_id = django_filters.ModelMultipleChoiceFilter(
name='role', name='role',
queryset=Role.objects.all(), queryset=Role.objects.all(),
@ -213,4 +190,4 @@ class VLANFilter(django_filters.FilterSet):
class Meta: class Meta:
model = VLAN model = VLAN
fields = ['site_id', 'site', 'vid', 'name', 'status_id', 'status', 'role_id', 'role'] fields = ['site_id', 'site', 'vid', 'name', 'status', 'role_id', 'role']

View File

@ -5,7 +5,8 @@ from django.db.models import Count
from dcim.models import Site, Device, Interface from dcim.models import Site, Device, Interface
from utilities.forms import BootstrapMixin, ConfirmationForm, APISelect, Livesearch, CSVDataField, BulkImportForm 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 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(): def prefix_site_choices():
site_choices = Site.objects.annotate(prefix_count=Count('prefixes')) site_choices = Site.objects.annotate(prefix_count=Count('prefixes'))
return [(s.slug, '{} ({})'.format(s.name, s.prefix_count)) for s in site_choices] 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): class PrefixFilterForm(forms.Form, BootstrapMixin):
parent = forms.CharField(required=False, label='Search Within') parent = forms.CharField(required=False, label='Search Within')
vrf = forms.ChoiceField(required=False, choices=prefix_vrf_choices, label='VRF') 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, site = forms.MultipleChoiceField(required=False, choices=prefix_site_choices,
widget=forms.SelectMultiple(attrs={'size': 8})) widget=forms.SelectMultiple(attrs={'size': 8}))
role = forms.MultipleChoiceField(required=False, choices=prefix_role_choices, 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] 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(): def vlan_role_choices():
role_choices = Role.objects.annotate(vlan_count=Count('vlans')) role_choices = Role.objects.annotate(vlan_count=Count('vlans'))
return [(r.slug, '{} ({})'.format(r.name, r.vlan_count)) for r in role_choices] 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): class VLANFilterForm(forms.Form, BootstrapMixin):
site = forms.MultipleChoiceField(required=False, choices=vlan_site_choices, site = forms.MultipleChoiceField(required=False, choices=vlan_site_choices,
widget=forms.SelectMultiple(attrs={'size': 8})) 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, role = forms.MultipleChoiceField(required=False, choices=vlan_role_choices,
widget=forms.SelectMultiple(attrs={'size': 8})) widget=forms.SelectMultiple(attrs={'size': 8}))

View File

@ -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'),
),
]

View File

@ -36,6 +36,13 @@ BOOTSTRAP_CLASS_CHOICES = (
(5, 'Danger'), (5, 'Danger'),
) )
STATUS_CHOICE_CLASSES = {
0: 'default',
1: 'primary',
2: 'info',
3: 'danger',
}
class VRF(models.Model): 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) 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') 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') 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) 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) role = models.ForeignKey('Role', related_name='prefixes', on_delete=models.SET_NULL, blank=True, null=True)
description = models.CharField(max_length=100, blank=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 IPNetwork('{}/{}'.format(self.prefix.network, self.prefix.prefixlen + 1))
return None return None
def get_status_class(self):
return STATUS_CHOICE_CLASSES[self.status]
class IPAddress(models.Model): class IPAddress(models.Model):
""" """
@ -295,7 +305,7 @@ class VLAN(models.Model):
MaxValueValidator(4094) MaxValueValidator(4094)
]) ])
name = models.CharField(max_length=30) 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) 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) 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): def get_absolute_url(self):
return reverse('ipam:vlan', args=[self.pk]) return reverse('ipam:vlan', args=[self.pk])
def get_status_class(self):
return STATUS_CHOICE_CLASSES[self.status]

View File

@ -41,7 +41,7 @@ PREFIX_LINK_BRIEF = """
STATUS_LABEL = """ STATUS_LABEL = """
{% if record.pk %} {% if record.pk %}
<span class="label label-{{ record.status.get_bootstrap_class_display|lower }}">{{ record.status.name }}</span> <span class="label label-{{ record.get_status_class }}">{{ record.get_status_display }}</span>
{% else %} {% else %}
<span class="label label-success">Available</span> <span class="label label-success">Available</span>
{% endif %} {% endif %}

View File

@ -155,7 +155,7 @@ def aggregate(request, pk):
# Find all child prefixes contained by this aggregate # Find all child prefixes contained by this aggregate
child_prefixes = Prefix.objects.filter(prefix__net_contained_or_equal=str(aggregate.prefix))\ 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) child_prefixes = add_available_prefixes(aggregate.prefix, child_prefixes)
prefix_table = PrefixTable(child_prefixes) prefix_table = PrefixTable(child_prefixes)
@ -248,7 +248,7 @@ class RoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
# #
class PrefixListView(ObjectListView): class PrefixListView(ObjectListView):
queryset = Prefix.objects.select_related('site', 'status', 'role') queryset = Prefix.objects.select_related('site', 'role')
filter = PrefixFilter filter = PrefixFilter
filter_form = PrefixFilterForm filter_form = PrefixFilterForm
table = PrefixTable table = PrefixTable
@ -263,7 +263,7 @@ class PrefixListView(ObjectListView):
def prefix(request, pk): 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: try:
aggregate = Aggregate.objects.get(prefix__net_contains_or_equals=str(prefix.prefix)) 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 table
parent_prefixes = Prefix.objects.filter(vrf=prefix.vrf, prefix__net_contains=str(prefix.prefix))\ 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) parent_prefix_table = PrefixBriefTable(parent_prefixes)
# Duplicate prefixes table # Duplicate prefixes table
duplicate_prefixes = Prefix.objects.filter(vrf=prefix.vrf, prefix=str(prefix.prefix)).exclude(pk=prefix.pk)\ 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) duplicate_prefix_table = PrefixBriefTable(duplicate_prefixes)
# Child prefixes table # Child prefixes table
child_prefixes = Prefix.objects.filter(vrf=prefix.vrf, prefix__net_contained=str(prefix.prefix))\ 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: if child_prefixes:
child_prefixes = add_available_prefixes(prefix.prefix, child_prefixes) child_prefixes = add_available_prefixes(prefix.prefix, child_prefixes)
child_prefix_table = PrefixTable(child_prefixes) child_prefix_table = PrefixTable(child_prefixes)
@ -474,7 +474,7 @@ class IPAddressBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
# #
class VLANListView(ObjectListView): class VLANListView(ObjectListView):
queryset = VLAN.objects.select_related('site', 'status', 'role') queryset = VLAN.objects.select_related('site', 'role')
filter = VLANFilter filter = VLANFilter
filter_form = VLANFilterForm filter_form = VLANFilterForm
table = VLANTable table = VLANTable
@ -484,7 +484,7 @@ class VLANListView(ObjectListView):
def vlan(request, pk): 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) prefixes = Prefix.objects.filter(vlan=vlan)
return render(request, 'ipam/vlan.html', { return render(request, 'ipam/vlan.html', {