1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Code cleanup

This commit is contained in:
Jeremy Stretch
2016-05-18 16:20:30 -04:00
parent 112e2ccde7
commit f690be60fd
17 changed files with 120 additions and 112 deletions

View File

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

View File

@ -1,6 +1,7 @@
import json import json
from rest_framework import renderers from rest_framework import renderers
# IP address family designations # IP address family designations
AF = { AF = {
4: 'A', 4: 'A',

View File

@ -11,6 +11,7 @@ from django.shortcuts import get_object_or_404
from circuits.models import Provider from circuits.models import Provider
from dcim.models import Site, Device, Interface, InterfaceConnection from dcim.models import Site, Device, Interface, InterfaceConnection
from extras.models import Graph, TopologyMap, GRAPH_TYPE_INTERFACE, GRAPH_TYPE_PROVIDER, GRAPH_TYPE_SITE from extras.models import Graph, TopologyMap, GRAPH_TYPE_INTERFACE, GRAPH_TYPE_PROVIDER, GRAPH_TYPE_SITE
from .serializers import GraphSerializer from .serializers import GraphSerializer

View File

@ -17,7 +17,8 @@ class Command(BaseCommand):
def add_arguments(self, parser): def add_arguments(self, parser):
parser.add_argument('-u', '--username', dest='username', help="Specify the username to use") parser.add_argument('-u', '--username', dest='username', help="Specify the username to use")
parser.add_argument('-p', '--password', action='store_true', default=False, help="Prompt for password to use") parser.add_argument('-p', '--password', action='store_true', default=False, help="Prompt for password to use")
parser.add_argument('-s', '--site', dest='site', action='append', help="Filter devices by site (include argument once per site)") parser.add_argument('-s', '--site', dest='site', action='append',
help="Filter devices by site (include argument once per site)")
parser.add_argument('-n', '--name', dest='name', help="Filter devices by name (regular expression)") parser.add_argument('-n', '--name', dest='name', help="Filter devices by name (regular expression)")
parser.add_argument('--full', action='store_true', default=False, help="For inventory update for all devices") parser.add_argument('--full', action='store_true', default=False, help="For inventory update for all devices")
parser.add_argument('--fake', action='store_true', default=False, help="Do not actually update database") parser.add_argument('--fake', action='store_true', default=False, help="Do not actually update database")
@ -107,7 +108,8 @@ class Command(BaseCommand):
self.stdout.write("\tSerial: {}".format(inventory['chassis']['serial'])) self.stdout.write("\tSerial: {}".format(inventory['chassis']['serial']))
self.stdout.write("\tDescription: {}".format(inventory['chassis']['description'])) self.stdout.write("\tDescription: {}".format(inventory['chassis']['description']))
for module in inventory['modules']: for module in inventory['modules']:
self.stdout.write("\tModule: {} / {} ({})".format(module['name'], module['part_id'], module['serial'])) self.stdout.write("\tModule: {} / {} ({})".format(module['name'], module['part_id'],
module['serial']))
else: else:
self.stdout.write("{} ({})".format(inventory['chassis']['description'], inventory['chassis']['serial'])) self.stdout.write("{} ({})".format(inventory['chassis']['description'], inventory['chassis']['serial']))

View File

@ -3,7 +3,6 @@ from django.db import models
from django.http import HttpResponse from django.http import HttpResponse
from django.template import Template, Context from django.template import Template, Context
from dcim.models import Site from dcim.models import Site

View File

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

View File

@ -1,3 +0,0 @@
from django.shortcuts import render
# Create your views here.

View File

@ -1,6 +1,8 @@
from django.contrib import admin from django.contrib import admin
from .models import * from .models import (
Aggregate, IPAddress, Prefix, RIR, Role, VLAN, VRF,
)
@admin.register(VRF) @admin.register(VRF)

View File

@ -2,8 +2,8 @@ from rest_framework import generics
from ipam.models import VRF, Role, RIR, Aggregate, Prefix, IPAddress, VLAN from ipam.models import VRF, Role, RIR, Aggregate, Prefix, IPAddress, VLAN
from ipam.filters import AggregateFilter, PrefixFilter, IPAddressFilter, VLANFilter from ipam.filters import AggregateFilter, PrefixFilter, IPAddressFilter, VLANFilter
from .serializers import VRFSerializer, RoleSerializer, RIRSerializer, AggregateSerializer, PrefixSerializer,\
IPAddressSerializer, VLANSerializer from . import serializers
class VRFListView(generics.ListAPIView): class VRFListView(generics.ListAPIView):
@ -11,7 +11,7 @@ class VRFListView(generics.ListAPIView):
List all VRFs List all VRFs
""" """
queryset = VRF.objects.all() queryset = VRF.objects.all()
serializer_class = VRFSerializer serializer_class = serializers.VRFSerializer
class VRFDetailView(generics.RetrieveAPIView): class VRFDetailView(generics.RetrieveAPIView):
@ -19,7 +19,7 @@ class VRFDetailView(generics.RetrieveAPIView):
Retrieve a single VRF Retrieve a single VRF
""" """
queryset = VRF.objects.all() queryset = VRF.objects.all()
serializer_class = VRFSerializer serializer_class = serializers.VRFSerializer
class RoleListView(generics.ListAPIView): class RoleListView(generics.ListAPIView):
@ -27,7 +27,7 @@ class RoleListView(generics.ListAPIView):
List all roles List all roles
""" """
queryset = Role.objects.all() queryset = Role.objects.all()
serializer_class = RoleSerializer serializer_class = serializers.RoleSerializer
class RoleDetailView(generics.RetrieveAPIView): class RoleDetailView(generics.RetrieveAPIView):
@ -35,7 +35,7 @@ class RoleDetailView(generics.RetrieveAPIView):
Retrieve a single role Retrieve a single role
""" """
queryset = Role.objects.all() queryset = Role.objects.all()
serializer_class = RoleSerializer serializer_class = serializers.RoleSerializer
class RIRListView(generics.ListAPIView): class RIRListView(generics.ListAPIView):
@ -43,7 +43,7 @@ class RIRListView(generics.ListAPIView):
List all RIRs List all RIRs
""" """
queryset = RIR.objects.all() queryset = RIR.objects.all()
serializer_class = RIRSerializer serializer_class = serializers.RIRSerializer
class RIRDetailView(generics.RetrieveAPIView): class RIRDetailView(generics.RetrieveAPIView):
@ -51,7 +51,7 @@ class RIRDetailView(generics.RetrieveAPIView):
Retrieve a single RIR Retrieve a single RIR
""" """
queryset = RIR.objects.all() queryset = RIR.objects.all()
serializer_class = RIRSerializer serializer_class = serializers.RIRSerializer
class AggregateListView(generics.ListAPIView): class AggregateListView(generics.ListAPIView):
@ -59,7 +59,7 @@ class AggregateListView(generics.ListAPIView):
List aggregates (filterable) List aggregates (filterable)
""" """
queryset = Aggregate.objects.select_related('rir') queryset = Aggregate.objects.select_related('rir')
serializer_class = AggregateSerializer serializer_class = serializers.AggregateSerializer
filter_class = AggregateFilter filter_class = AggregateFilter
@ -68,7 +68,7 @@ class AggregateDetailView(generics.RetrieveAPIView):
Retrieve a single aggregate Retrieve a single aggregate
""" """
queryset = Aggregate.objects.select_related('rir') queryset = Aggregate.objects.select_related('rir')
serializer_class = AggregateSerializer serializer_class = serializers.AggregateSerializer
class PrefixListView(generics.ListAPIView): class PrefixListView(generics.ListAPIView):
@ -76,7 +76,7 @@ class PrefixListView(generics.ListAPIView):
List prefixes (filterable) List prefixes (filterable)
""" """
queryset = Prefix.objects.select_related('site', 'vrf', 'vlan', 'role') queryset = Prefix.objects.select_related('site', 'vrf', 'vlan', 'role')
serializer_class = PrefixSerializer serializer_class = serializers.PrefixSerializer
filter_class = PrefixFilter filter_class = PrefixFilter
@ -85,7 +85,7 @@ class PrefixDetailView(generics.RetrieveAPIView):
Retrieve a single prefix Retrieve a single prefix
""" """
queryset = Prefix.objects.select_related('site', 'vrf', 'vlan', 'role') queryset = Prefix.objects.select_related('site', 'vrf', 'vlan', 'role')
serializer_class = PrefixSerializer serializer_class = serializers.PrefixSerializer
class IPAddressListView(generics.ListAPIView): class IPAddressListView(generics.ListAPIView):
@ -94,7 +94,7 @@ class IPAddressListView(generics.ListAPIView):
""" """
queryset = IPAddress.objects.select_related('vrf', 'interface__device', 'nat_inside')\ queryset = IPAddress.objects.select_related('vrf', 'interface__device', 'nat_inside')\
.prefetch_related('nat_outside') .prefetch_related('nat_outside')
serializer_class = IPAddressSerializer serializer_class = serializers.IPAddressSerializer
filter_class = IPAddressFilter filter_class = IPAddressFilter
@ -104,7 +104,7 @@ class IPAddressDetailView(generics.RetrieveAPIView):
""" """
queryset = IPAddress.objects.select_related('vrf', 'interface__device', 'nat_inside')\ queryset = IPAddress.objects.select_related('vrf', 'interface__device', 'nat_inside')\
.prefetch_related('nat_outside') .prefetch_related('nat_outside')
serializer_class = IPAddressSerializer serializer_class = serializers.IPAddressSerializer
class VLANListView(generics.ListAPIView): class VLANListView(generics.ListAPIView):
@ -112,7 +112,7 @@ class VLANListView(generics.ListAPIView):
List VLANs (filterable) List VLANs (filterable)
""" """
queryset = VLAN.objects.select_related('site', 'role') queryset = VLAN.objects.select_related('site', 'role')
serializer_class = VLANSerializer serializer_class = serializers.VLANSerializer
filter_class = VLANFilter filter_class = VLANFilter
@ -121,4 +121,4 @@ class VLANDetailView(generics.RetrieveAPIView):
Retrieve a single VLAN Retrieve a single VLAN
""" """
queryset = VLAN.objects.select_related('site', 'role') queryset = VLAN.objects.select_related('site', 'role')
serializer_class = VLANSerializer serializer_class = serializers.VLANSerializer

View File

@ -4,8 +4,10 @@ from django.core.exceptions import ValidationError
from django.db import models from django.db import models
from .formfields import IPFormField from .formfields import IPFormField
from .lookups import EndsWith, IEndsWith, StartsWith, IStartsWith, Regex, IRegex, NetContained, NetContainedOrEqual, \ from .lookups import (
NetContains, NetContainsOrEquals, NetHost EndsWith, IEndsWith, IRegex, IStartsWith, NetContained, NetContainedOrEqual, NetContains, NetContainsOrEquals,
NetHost, Regex, StartsWith,
)
class BaseIPField(models.Field): class BaseIPField(models.Field):

View File

@ -3,7 +3,8 @@ from netaddr import IPNetwork
from netaddr.core import AddrFormatError from netaddr.core import AddrFormatError
from dcim.models import Site, Device, Interface from dcim.models import Site, Device, Interface
from ipam.models import RIR, Aggregate, VRF, Prefix, IPAddress, VLAN, Role
from .models import RIR, Aggregate, VRF, Prefix, IPAddress, VLAN, Role
class VRFFilter(django_filters.FilterSet): class VRFFilter(django_filters.FilterSet):

View File

@ -5,7 +5,10 @@ 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, Prefix, IPAddress, VLAN, PREFIX_STATUS_CHOICES, VLAN_STATUS_CHOICES
from .models import (
Aggregate, IPAddress, Prefix, PREFIX_STATUS_CHOICES, RIR, Role, VLAN, VLAN_STATUS_CHOICES, VRF,
)
# #
@ -286,8 +289,10 @@ class IPAddressForm(forms.ModelForm, BootstrapMixin):
if self.instance.nat_inside.interface: if self.instance.nat_inside.interface:
self.initial['nat_site'] = self.instance.nat_inside.interface.device.rack.site.pk self.initial['nat_site'] = self.instance.nat_inside.interface.device.rack.site.pk
self.initial['nat_device'] = self.instance.nat_inside.interface.device.pk self.initial['nat_device'] = self.instance.nat_inside.interface.device.pk
self.fields['nat_device'].queryset = Device.objects.filter(rack__site=nat_inside.interface.device.rack.site) self.fields['nat_device'].queryset = Device.objects.filter(
self.fields['nat_inside'].queryset = IPAddress.objects.filter(interface__device=nat_inside.interface.device) rack__site=nat_inside.interface.device.rack.site)
self.fields['nat_inside'].queryset = IPAddress.objects.filter(
interface__device=nat_inside.interface.device)
else: else:
self.fields['nat_inside'].queryset = IPAddress.objects.filter(pk=nat_inside.pk) self.fields['nat_inside'].queryset = IPAddress.objects.filter(pk=nat_inside.pk)
@ -303,9 +308,11 @@ class IPAddressForm(forms.ModelForm, BootstrapMixin):
# Initialize nat_inside choices if nat_device is set # Initialize nat_inside choices if nat_device is set
if self.is_bound and self.data.get('nat_device'): if self.is_bound and self.data.get('nat_device'):
self.fields['nat_inside'].queryset = IPAddress.objects.filter(interface__device__pk=self.data['nat_device']) self.fields['nat_inside'].queryset = IPAddress.objects.filter(
interface__device__pk=self.data['nat_device'])
elif self.initial.get('nat_device'): elif self.initial.get('nat_device'):
self.fields['nat_inside'].queryset = IPAddress.objects.filter(interface__device__pk=self.initial['nat_device']) self.fields['nat_inside'].queryset = IPAddress.objects.filter(
interface__device__pk=self.initial['nat_device'])
else: else:
self.fields['nat_inside'].choices = [] self.fields['nat_inside'].choices = []

View File

@ -6,6 +6,7 @@ from django.core.validators import MaxValueValidator, MinValueValidator
from django.db import models from django.db import models
from dcim.models import Interface from dcim.models import Interface
from .fields import IPNetworkField, IPAddressField from .fields import IPNetworkField, IPAddressField
@ -192,8 +193,10 @@ class Prefix(models.Model):
family = models.PositiveSmallIntegerField(choices=AF_CHOICES, editable=False) family = models.PositiveSmallIntegerField(choices=AF_CHOICES, editable=False)
prefix = IPNetworkField() prefix = IPNetworkField()
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,
vlan = models.ForeignKey('VLAN', related_name='prefixes', on_delete=models.PROTECT, blank=True, null=True, verbose_name='VLAN') verbose_name='VRF')
vlan = models.ForeignKey('VLAN', related_name='prefixes', on_delete=models.PROTECT, blank=True, null=True,
verbose_name='VLAN')
status = models.PositiveSmallIntegerField('Status', choices=PREFIX_STATUS_CHOICES, default=1) status = 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)
@ -239,9 +242,12 @@ class IPAddress(models.Model):
""" """
family = models.PositiveSmallIntegerField(choices=AF_CHOICES, editable=False) family = models.PositiveSmallIntegerField(choices=AF_CHOICES, editable=False)
address = IPAddressField() address = IPAddressField()
vrf = models.ForeignKey('VRF', related_name='ip_addresses', on_delete=models.PROTECT, blank=True, null=True, verbose_name='VRF') vrf = models.ForeignKey('VRF', related_name='ip_addresses', on_delete=models.PROTECT, blank=True, null=True,
interface = models.ForeignKey(Interface, related_name='ip_addresses', on_delete=models.CASCADE, blank=True, null=True) verbose_name='VRF')
nat_inside = models.OneToOneField('self', related_name='nat_outside', on_delete=models.SET_NULL, blank=True, null=True, verbose_name='NAT IP (inside)') interface = models.ForeignKey(Interface, related_name='ip_addresses', on_delete=models.CASCADE, blank=True,
null=True)
nat_inside = models.OneToOneField('self', related_name='nat_outside', on_delete=models.SET_NULL, blank=True,
null=True, verbose_name='NAT IP (inside)')
description = models.CharField(max_length=100, blank=True) description = models.CharField(max_length=100, blank=True)
class Meta: class Meta:

View File

@ -1,7 +1,7 @@
import django_tables2 as tables import django_tables2 as tables
from django_tables2.utils import Accessor from django_tables2.utils import Accessor
from .models import VRF, RIR, Aggregate, Role, Prefix, IPAddress, VLAN from .models import Aggregate, IPAddress, Prefix, RIR, Role, VLAN, VRF
RIR_EDIT_LINK = """ RIR_EDIT_LINK = """
@ -12,7 +12,8 @@ UTILIZATION_GRAPH = """
{% with record.get_utilization as percentage %} {% with record.get_utilization as percentage %}
<div class="progress text-center"> <div class="progress text-center">
{% if percentage < 15 %}<span style="font-size: 12px;">{{ percentage }}%</span>{% endif %} {% if percentage < 15 %}<span style="font-size: 12px;">{{ percentage }}%</span>{% endif %}
<div class="progress-bar progress-bar-{% if percentage >= 90 %}danger{% elif percentage >= 75 %}warning{% else %}success{% endif %}" role="progressbar" aria-valuenow="{{ percentage }}" aria-valuemin="0" aria-valuemax="100" style="width: {{ percentage }}%"> <div class="progress-bar progress-bar-{% if percentage >= 90 %}danger{% elif percentage >= 75 %}warning{% else %}success{% endif %}"
role="progressbar" aria-valuenow="{{ percentage }}" aria-valuemin="0" aria-valuemax="100" style="width: {{ percentage }}%">
{% if percentage >= 15 %}{{ percentage }}%{% endif %} {% if percentage >= 15 %}{{ percentage }}%{% endif %}
</div> </div>
</div> </div>
@ -175,7 +176,8 @@ class IPAddressTable(tables.Table):
pk = tables.CheckBoxColumn(visible=False, default='') pk = tables.CheckBoxColumn(visible=False, default='')
address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address') address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address')
vrf = tables.Column(orderable=False, default='Global', verbose_name='VRF') vrf = tables.Column(orderable=False, default='Global', verbose_name='VRF')
device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False, verbose_name='Device') device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False,
verbose_name='Device')
interface = tables.Column(orderable=False, verbose_name='Interface') interface = tables.Column(orderable=False, verbose_name='Interface')
description = tables.Column(sortable=False, verbose_name='Description') description = tables.Column(sortable=False, verbose_name='Description')
@ -190,9 +192,11 @@ class IPAddressTable(tables.Table):
class IPAddressBriefTable(tables.Table): class IPAddressBriefTable(tables.Table):
address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address') address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address')
device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False, verbose_name='Device') device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False,
verbose_name='Device')
interface = tables.Column(orderable=False, verbose_name='Interface') interface = tables.Column(orderable=False, verbose_name='Interface')
nat_inside = tables.LinkColumn('ipam:ipaddress', args=[Accessor('nat_inside.pk')], orderable=False, verbose_name='NAT (Inside)') nat_inside = tables.LinkColumn('ipam:ipaddress', args=[Accessor('nat_inside.pk')], orderable=False,
verbose_name='NAT (Inside)')
class Meta: class Meta:
model = IPAddress model = IPAddress

View File

@ -1,3 +0,0 @@
from django.test import TestCase
# Create your tests here.

View File

@ -2,6 +2,7 @@ from django.conf.urls import url
from . import views from . import views
urlpatterns = [ urlpatterns = [
# VRFs # VRFs

View File

@ -9,18 +9,12 @@ from django.shortcuts import get_object_or_404, render
from dcim.models import Device from dcim.models import Device
from utilities.paginator import EnhancedPaginator from utilities.paginator import EnhancedPaginator
from utilities.views import BulkImportView, BulkEditView, BulkDeleteView, ObjectListView, ObjectEditView,\ from utilities.views import (
ObjectDeleteView BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
)
from .filters import AggregateFilter, PrefixFilter, IPAddressFilter, VLANFilter, VRFFilter from . import filters, forms, tables
from .forms import AggregateForm, AggregateImportForm, AggregateBulkEditForm, AggregateBulkDeleteForm,\ from .models import Aggregate, IPAddress, Prefix, RIR, Role, VLAN, VRF
AggregateFilterForm, RoleForm, RoleBulkDeleteForm, PrefixForm, PrefixImportForm, PrefixBulkEditForm,\
PrefixBulkDeleteForm, PrefixFilterForm, IPAddressForm, IPAddressImportForm, IPAddressBulkEditForm,\
IPAddressBulkDeleteForm, IPAddressFilterForm, VLANForm, VLANImportForm, VLANBulkEditForm, VLANBulkDeleteForm,\
VRFForm, VRFImportForm, VRFBulkEditForm, VRFBulkDeleteForm, VLANFilterForm, RIRForm, RIRBulkDeleteForm
from .models import VRF, RIR, Aggregate, Role, Prefix, IPAddress, VLAN
from .tables import VRFTable, RIRTable, AggregateTable, RoleTable, PrefixTable, PrefixBriefTable, IPAddressBriefTable,\
IPAddressTable, VLANTable
def add_available_prefixes(parent, prefix_list): def add_available_prefixes(parent, prefix_list):
@ -45,8 +39,8 @@ def add_available_prefixes(parent, prefix_list):
class VRFListView(ObjectListView): class VRFListView(ObjectListView):
queryset = VRF.objects.all() queryset = VRF.objects.all()
filter = VRFFilter filter = filters.VRFFilter
table = VRFTable table = tables.VRFTable
edit_permissions = ['ipam.change_vrf', 'ipam.delete_vrf'] edit_permissions = ['ipam.change_vrf', 'ipam.delete_vrf']
template_name = 'ipam/vrf_list.html' template_name = 'ipam/vrf_list.html'
@ -65,7 +59,7 @@ def vrf(request, pk):
class VRFEditView(PermissionRequiredMixin, ObjectEditView): class VRFEditView(PermissionRequiredMixin, ObjectEditView):
permission_required = 'ipam.change_vrf' permission_required = 'ipam.change_vrf'
model = VRF model = VRF
form_class = VRFForm form_class = forms.VRFForm
cancel_url = 'ipam:vrf_list' cancel_url = 'ipam:vrf_list'
@ -77,8 +71,8 @@ class VRFDeleteView(PermissionRequiredMixin, ObjectDeleteView):
class VRFBulkImportView(PermissionRequiredMixin, BulkImportView): class VRFBulkImportView(PermissionRequiredMixin, BulkImportView):
permission_required = 'ipam.add_vrf' permission_required = 'ipam.add_vrf'
form = VRFImportForm form = forms.VRFImportForm
table = VRFTable table = tables.VRFTable
template_name = 'ipam/vrf_import.html' template_name = 'ipam/vrf_import.html'
obj_list_url = 'ipam:vrf_list' obj_list_url = 'ipam:vrf_list'
@ -86,7 +80,7 @@ class VRFBulkImportView(PermissionRequiredMixin, BulkImportView):
class VRFBulkEditView(PermissionRequiredMixin, BulkEditView): class VRFBulkEditView(PermissionRequiredMixin, BulkEditView):
permission_required = 'ipam.change_vrf' permission_required = 'ipam.change_vrf'
cls = VRF cls = VRF
form = VRFBulkEditForm form = forms.VRFBulkEditForm
template_name = 'ipam/vrf_bulk_edit.html' template_name = 'ipam/vrf_bulk_edit.html'
default_redirect_url = 'ipam:vrf_list' default_redirect_url = 'ipam:vrf_list'
@ -104,7 +98,7 @@ class VRFBulkEditView(PermissionRequiredMixin, BulkEditView):
class VRFBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class VRFBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_vrf' permission_required = 'ipam.delete_vrf'
cls = VRF cls = VRF
form = VRFBulkDeleteForm form = forms.VRFBulkDeleteForm
default_redirect_url = 'ipam:vrf_list' default_redirect_url = 'ipam:vrf_list'
@ -114,7 +108,7 @@ class VRFBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
class RIRListView(ObjectListView): class RIRListView(ObjectListView):
queryset = RIR.objects.annotate(aggregate_count=Count('aggregates')) queryset = RIR.objects.annotate(aggregate_count=Count('aggregates'))
table = RIRTable table = tables.RIRTable
edit_permissions = ['ipam.change_rir', 'ipam.delete_rir'] edit_permissions = ['ipam.change_rir', 'ipam.delete_rir']
template_name = 'ipam/rir_list.html' template_name = 'ipam/rir_list.html'
@ -122,7 +116,7 @@ class RIRListView(ObjectListView):
class RIREditView(PermissionRequiredMixin, ObjectEditView): class RIREditView(PermissionRequiredMixin, ObjectEditView):
permission_required = 'ipam.change_rir' permission_required = 'ipam.change_rir'
model = RIR model = RIR
form_class = RIRForm form_class = forms.RIRForm
success_url = 'ipam:rir_list' success_url = 'ipam:rir_list'
cancel_url = 'ipam:rir_list' cancel_url = 'ipam:rir_list'
@ -130,7 +124,7 @@ class RIREditView(PermissionRequiredMixin, ObjectEditView):
class RIRBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class RIRBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_rir' permission_required = 'ipam.delete_rir'
cls = RIR cls = RIR
form = RIRBulkDeleteForm form = forms.RIRBulkDeleteForm
default_redirect_url = 'ipam:rir_list' default_redirect_url = 'ipam:rir_list'
@ -142,9 +136,9 @@ class AggregateListView(ObjectListView):
queryset = Aggregate.objects.select_related('rir').extra(select={ queryset = Aggregate.objects.select_related('rir').extra(select={
'child_count': 'SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix', 'child_count': 'SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix',
}) })
filter = AggregateFilter filter = filters.AggregateFilter
filter_form = AggregateFilterForm filter_form = forms.AggregateFilterForm
table = AggregateTable table = tables.AggregateTable
edit_permissions = ['ipam.change_aggregate', 'ipam.delete_aggregate'] edit_permissions = ['ipam.change_aggregate', 'ipam.delete_aggregate']
template_name = 'ipam/aggregate_list.html' template_name = 'ipam/aggregate_list.html'
@ -158,7 +152,7 @@ def aggregate(request, pk):
.select_related('site', '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 = tables.PrefixTable(child_prefixes)
prefix_table.model = Prefix prefix_table.model = Prefix
if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'): if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
prefix_table.base_columns['pk'].visible = True prefix_table.base_columns['pk'].visible = True
@ -174,7 +168,7 @@ def aggregate(request, pk):
class AggregateEditView(PermissionRequiredMixin, ObjectEditView): class AggregateEditView(PermissionRequiredMixin, ObjectEditView):
permission_required = 'ipam.change_aggregate' permission_required = 'ipam.change_aggregate'
model = Aggregate model = Aggregate
form_class = AggregateForm form_class = forms.AggregateForm
cancel_url = 'ipam:aggregate_list' cancel_url = 'ipam:aggregate_list'
@ -186,8 +180,8 @@ class AggregateDeleteView(PermissionRequiredMixin, ObjectDeleteView):
class AggregateBulkImportView(PermissionRequiredMixin, BulkImportView): class AggregateBulkImportView(PermissionRequiredMixin, BulkImportView):
permission_required = 'ipam.add_aggregate' permission_required = 'ipam.add_aggregate'
form = AggregateImportForm form = forms.AggregateImportForm
table = AggregateTable table = tables.AggregateTable
template_name = 'ipam/aggregate_import.html' template_name = 'ipam/aggregate_import.html'
obj_list_url = 'ipam:aggregate_list' obj_list_url = 'ipam:aggregate_list'
@ -195,7 +189,7 @@ class AggregateBulkImportView(PermissionRequiredMixin, BulkImportView):
class AggregateBulkEditView(PermissionRequiredMixin, BulkEditView): class AggregateBulkEditView(PermissionRequiredMixin, BulkEditView):
permission_required = 'ipam.change_aggregate' permission_required = 'ipam.change_aggregate'
cls = Aggregate cls = Aggregate
form = AggregateBulkEditForm form = forms.AggregateBulkEditForm
template_name = 'ipam/aggregate_bulk_edit.html' template_name = 'ipam/aggregate_bulk_edit.html'
default_redirect_url = 'ipam:aggregate_list' default_redirect_url = 'ipam:aggregate_list'
@ -213,7 +207,7 @@ class AggregateBulkEditView(PermissionRequiredMixin, BulkEditView):
class AggregateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class AggregateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_aggregate' permission_required = 'ipam.delete_aggregate'
cls = Aggregate cls = Aggregate
form = AggregateBulkDeleteForm form = forms.AggregateBulkDeleteForm
default_redirect_url = 'ipam:aggregate_list' default_redirect_url = 'ipam:aggregate_list'
@ -223,7 +217,7 @@ class AggregateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
class RoleListView(ObjectListView): class RoleListView(ObjectListView):
queryset = Role.objects.all() queryset = Role.objects.all()
table = RoleTable table = tables.RoleTable
edit_permissions = ['ipam.change_role', 'ipam.delete_role'] edit_permissions = ['ipam.change_role', 'ipam.delete_role']
template_name = 'ipam/role_list.html' template_name = 'ipam/role_list.html'
@ -231,7 +225,7 @@ class RoleListView(ObjectListView):
class RoleEditView(PermissionRequiredMixin, ObjectEditView): class RoleEditView(PermissionRequiredMixin, ObjectEditView):
permission_required = 'ipam.change_role' permission_required = 'ipam.change_role'
model = Role model = Role
form_class = RoleForm form_class = forms.RoleForm
success_url = 'ipam:role_list' success_url = 'ipam:role_list'
cancel_url = 'ipam:role_list' cancel_url = 'ipam:role_list'
@ -239,7 +233,7 @@ class RoleEditView(PermissionRequiredMixin, ObjectEditView):
class RoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class RoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_role' permission_required = 'ipam.delete_role'
cls = Role cls = Role
form = RoleBulkDeleteForm form = forms.RoleBulkDeleteForm
default_redirect_url = 'ipam:role_list' default_redirect_url = 'ipam:role_list'
@ -249,9 +243,9 @@ class RoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
class PrefixListView(ObjectListView): class PrefixListView(ObjectListView):
queryset = Prefix.objects.select_related('site', 'role') queryset = Prefix.objects.select_related('site', 'role')
filter = PrefixFilter filter = filters.PrefixFilter
filter_form = PrefixFilterForm filter_form = forms.PrefixFilterForm
table = PrefixTable table = tables.PrefixTable
edit_permissions = ['ipam.change_prefix', 'ipam.delete_prefix'] edit_permissions = ['ipam.change_prefix', 'ipam.delete_prefix']
template_name = 'ipam/prefix_list.html' template_name = 'ipam/prefix_list.html'
@ -276,19 +270,19 @@ 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', 'role').annotate_depth() .select_related('site', 'role').annotate_depth()
parent_prefix_table = PrefixBriefTable(parent_prefixes) parent_prefix_table = tables.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', 'role') .select_related('site', 'role')
duplicate_prefix_table = PrefixBriefTable(duplicate_prefixes) duplicate_prefix_table = tables.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', '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 = tables.PrefixTable(child_prefixes)
child_prefix_table.model = Prefix child_prefix_table.model = Prefix
if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'): if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
child_prefix_table.base_columns['pk'].visible = True child_prefix_table.base_columns['pk'].visible = True
@ -308,7 +302,7 @@ def prefix(request, pk):
class PrefixEditView(PermissionRequiredMixin, ObjectEditView): class PrefixEditView(PermissionRequiredMixin, ObjectEditView):
permission_required = 'ipam.change_prefix' permission_required = 'ipam.change_prefix'
model = Prefix model = Prefix
form_class = PrefixForm form_class = forms.PrefixForm
fields_initial = ['site', 'vrf', 'prefix'] fields_initial = ['site', 'vrf', 'prefix']
cancel_url = 'ipam:prefix_list' cancel_url = 'ipam:prefix_list'
@ -321,8 +315,8 @@ class PrefixDeleteView(PermissionRequiredMixin, ObjectDeleteView):
class PrefixBulkImportView(PermissionRequiredMixin, BulkImportView): class PrefixBulkImportView(PermissionRequiredMixin, BulkImportView):
permission_required = 'ipam.add_prefix' permission_required = 'ipam.add_prefix'
form = PrefixImportForm form = forms.PrefixImportForm
table = PrefixTable table = tables.PrefixTable
template_name = 'ipam/prefix_import.html' template_name = 'ipam/prefix_import.html'
obj_list_url = 'ipam:prefix_list' obj_list_url = 'ipam:prefix_list'
@ -330,7 +324,7 @@ class PrefixBulkImportView(PermissionRequiredMixin, BulkImportView):
class PrefixBulkEditView(PermissionRequiredMixin, BulkEditView): class PrefixBulkEditView(PermissionRequiredMixin, BulkEditView):
permission_required = 'ipam.change_prefix' permission_required = 'ipam.change_prefix'
cls = Prefix cls = Prefix
form = PrefixBulkEditForm form = forms.PrefixBulkEditForm
template_name = 'ipam/prefix_bulk_edit.html' template_name = 'ipam/prefix_bulk_edit.html'
default_redirect_url = 'ipam:prefix_list' default_redirect_url = 'ipam:prefix_list'
@ -352,7 +346,7 @@ class PrefixBulkEditView(PermissionRequiredMixin, BulkEditView):
class PrefixBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class PrefixBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_prefix' permission_required = 'ipam.delete_prefix'
cls = Prefix cls = Prefix
form = PrefixBulkDeleteForm form = forms.PrefixBulkDeleteForm
default_redirect_url = 'ipam:prefix_list' default_redirect_url = 'ipam:prefix_list'
@ -364,7 +358,7 @@ def prefix_ipaddresses(request, pk):
ipaddresses = IPAddress.objects.filter(address__net_contained_or_equal=str(prefix.prefix))\ ipaddresses = IPAddress.objects.filter(address__net_contained_or_equal=str(prefix.prefix))\
.select_related('vrf', 'interface__device', 'primary_for') .select_related('vrf', 'interface__device', 'primary_for')
ip_table = IPAddressTable(ipaddresses) ip_table = tables.IPAddressTable(ipaddresses)
ip_table.model = IPAddress ip_table.model = IPAddress
if request.user.has_perm('ipam.change_ipaddress') or request.user.has_perm('ipam.delete_ipaddress'): if request.user.has_perm('ipam.change_ipaddress') or request.user.has_perm('ipam.delete_ipaddress'):
ip_table.base_columns['pk'].visible = True ip_table.base_columns['pk'].visible = True
@ -383,9 +377,9 @@ def prefix_ipaddresses(request, pk):
class IPAddressListView(ObjectListView): class IPAddressListView(ObjectListView):
queryset = IPAddress.objects.select_related('vrf', 'interface__device', 'primary_for') queryset = IPAddress.objects.select_related('vrf', 'interface__device', 'primary_for')
filter = IPAddressFilter filter = filters.IPAddressFilter
filter_form = IPAddressFilterForm filter_form = forms.IPAddressFilterForm
table = IPAddressTable table = tables.IPAddressTable
edit_permissions = ['ipam.change_ipaddress', 'ipam.delete_ipaddress'] edit_permissions = ['ipam.change_ipaddress', 'ipam.delete_ipaddress']
template_name = 'ipam/ipaddress_list.html' template_name = 'ipam/ipaddress_list.html'
@ -397,7 +391,7 @@ def ipaddress(request, pk):
parent_prefixes = Prefix.objects.filter(vrf=ipaddress.vrf, prefix__net_contains=str(ipaddress.address.ip)) parent_prefixes = Prefix.objects.filter(vrf=ipaddress.vrf, prefix__net_contains=str(ipaddress.address.ip))
related_ips = IPAddress.objects.select_related('interface__device').exclude(pk=ipaddress.pk).filter(vrf=ipaddress.vrf, address__net_contained_or_equal=str(ipaddress.address)) related_ips = IPAddress.objects.select_related('interface__device').exclude(pk=ipaddress.pk).filter(vrf=ipaddress.vrf, address__net_contained_or_equal=str(ipaddress.address))
related_ips_table = IPAddressBriefTable(related_ips) related_ips_table = tables.IPAddressBriefTable(related_ips)
RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator}).configure(related_ips_table) RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator}).configure(related_ips_table)
return render(request, 'ipam/ipaddress.html', { return render(request, 'ipam/ipaddress.html', {
@ -410,7 +404,7 @@ def ipaddress(request, pk):
class IPAddressEditView(PermissionRequiredMixin, ObjectEditView): class IPAddressEditView(PermissionRequiredMixin, ObjectEditView):
permission_required = 'ipam.change_ipaddress' permission_required = 'ipam.change_ipaddress'
model = IPAddress model = IPAddress
form_class = IPAddressForm form_class = forms.IPAddressForm
fields_initial = ['ipaddress'] fields_initial = ['ipaddress']
template_name = 'ipam/ipaddress_edit.html' template_name = 'ipam/ipaddress_edit.html'
cancel_url = 'ipam:ipaddress_list' cancel_url = 'ipam:ipaddress_list'
@ -424,8 +418,8 @@ class IPAddressDeleteView(PermissionRequiredMixin, ObjectDeleteView):
class IPAddressBulkImportView(PermissionRequiredMixin, BulkImportView): class IPAddressBulkImportView(PermissionRequiredMixin, BulkImportView):
permission_required = 'ipam.add_ipaddress' permission_required = 'ipam.add_ipaddress'
form = IPAddressImportForm form = forms.IPAddressImportForm
table = IPAddressTable table = tables.IPAddressTable
template_name = 'ipam/ipaddress_import.html' template_name = 'ipam/ipaddress_import.html'
obj_list_url = 'ipam:ipaddress_list' obj_list_url = 'ipam:ipaddress_list'
@ -443,7 +437,7 @@ class IPAddressBulkImportView(PermissionRequiredMixin, BulkImportView):
class IPAddressBulkEditView(PermissionRequiredMixin, BulkEditView): class IPAddressBulkEditView(PermissionRequiredMixin, BulkEditView):
permission_required = 'ipam.change_ipaddress' permission_required = 'ipam.change_ipaddress'
cls = IPAddress cls = IPAddress
form = IPAddressBulkEditForm form = forms.IPAddressBulkEditForm
template_name = 'ipam/ipaddress_bulk_edit.html' template_name = 'ipam/ipaddress_bulk_edit.html'
default_redirect_url = 'ipam:ipaddress_list' default_redirect_url = 'ipam:ipaddress_list'
@ -465,7 +459,7 @@ class IPAddressBulkEditView(PermissionRequiredMixin, BulkEditView):
class IPAddressBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class IPAddressBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_ipaddress' permission_required = 'ipam.delete_ipaddress'
cls = IPAddress cls = IPAddress
form = IPAddressBulkDeleteForm form = forms.IPAddressBulkDeleteForm
default_redirect_url = 'ipam:ipaddress_list' default_redirect_url = 'ipam:ipaddress_list'
@ -475,9 +469,9 @@ class IPAddressBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
class VLANListView(ObjectListView): class VLANListView(ObjectListView):
queryset = VLAN.objects.select_related('site', 'role') queryset = VLAN.objects.select_related('site', 'role')
filter = VLANFilter filter = filters.VLANFilter
filter_form = VLANFilterForm filter_form = forms.VLANFilterForm
table = VLANTable table = tables.VLANTable
edit_permissions = ['ipam.change_vlan', 'ipam.delete_vlan'] edit_permissions = ['ipam.change_vlan', 'ipam.delete_vlan']
template_name = 'ipam/vlan_list.html' template_name = 'ipam/vlan_list.html'
@ -496,7 +490,7 @@ def vlan(request, pk):
class VLANEditView(PermissionRequiredMixin, ObjectEditView): class VLANEditView(PermissionRequiredMixin, ObjectEditView):
permission_required = 'ipam.change_vlan' permission_required = 'ipam.change_vlan'
model = VLAN model = VLAN
form_class = VLANForm form_class = forms.VLANForm
cancel_url = 'ipam:vlan_list' cancel_url = 'ipam:vlan_list'
@ -508,8 +502,8 @@ class VLANDeleteView(PermissionRequiredMixin, ObjectDeleteView):
class VLANBulkImportView(PermissionRequiredMixin, BulkImportView): class VLANBulkImportView(PermissionRequiredMixin, BulkImportView):
permission_required = 'ipam.add_vlan' permission_required = 'ipam.add_vlan'
form = VLANImportForm form = forms.VLANImportForm
table = VLANTable table = tables.VLANTable
template_name = 'ipam/vlan_import.html' template_name = 'ipam/vlan_import.html'
obj_list_url = 'ipam:vlan_list' obj_list_url = 'ipam:vlan_list'
@ -517,7 +511,7 @@ class VLANBulkImportView(PermissionRequiredMixin, BulkImportView):
class VLANBulkEditView(PermissionRequiredMixin, BulkEditView): class VLANBulkEditView(PermissionRequiredMixin, BulkEditView):
permission_required = 'ipam.change_vlan' permission_required = 'ipam.change_vlan'
cls = VLAN cls = VLAN
form = VLANBulkEditForm form = forms.VLANBulkEditForm
template_name = 'ipam/vlan_bulk_edit.html' template_name = 'ipam/vlan_bulk_edit.html'
default_redirect_url = 'ipam:vlan_list' default_redirect_url = 'ipam:vlan_list'
@ -535,5 +529,5 @@ class VLANBulkEditView(PermissionRequiredMixin, BulkEditView):
class VLANBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class VLANBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'ipam.delete_vlan' permission_required = 'ipam.delete_vlan'
cls = VLAN cls = VLAN
form = VLANBulkDeleteForm form = forms.VLANBulkDeleteForm
default_redirect_url = 'ipam:vlan_list' default_redirect_url = 'ipam:vlan_list'