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):
     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')

+ 2 - 25
netbox/ipam/filters.py

@@ -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',
-                  'role']
+        fields = ['family', 'site_id', 'site', 'vrf_id', 'vrf', 'vlan_id', 'vlan_vid', 'status', 'role_id', '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']

+ 4 - 13
netbox/ipam/forms.py

@@ -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}))

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

+ 1 - 1
netbox/ipam/tables.py

@@ -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 %}

+ 8 - 8
netbox/ipam/views.py

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