mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-14 09:51:22 -06:00
Transitioning ipam.Status from model to static field
This commit is contained in:
parent
2baa31bde1
commit
c1e41410c9
@ -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')
|
||||||
|
@ -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']
|
||||||
|
@ -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
netbox/ipam/migrations/0003_auto_20160517_2026.py
Normal file
25
netbox/ipam/migrations/0003_auto_20160517_2026.py
Normal 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'),
|
||||||
|
),
|
||||||
|
]
|
@ -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]
|
||||||
|
@ -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 %}
|
||||||
|
@ -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', {
|
||||||
|
Loading…
Reference in New Issue
Block a user