Parcourir la source

Transitioning ipam.Status from model to static field

Jeremy Stretch il y a 9 ans
Parent
commit
c1e41410c9

+ 2 - 2
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')

+ 2 - 25
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']

+ 4 - 13
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}))

+ 25 - 0
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'),
+        ),
+    ]

+ 15 - 2
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]

+ 1 - 1
netbox/ipam/tables.py

@@ -41,7 +41,7 @@ PREFIX_LINK_BRIEF = """
 
 STATUS_LABEL = """
 {% 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 %}
     <span class="label label-success">Available</span>
 {% endif %}

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