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:
@ -1,3 +0,0 @@
|
|||||||
from django.test import TestCase
|
|
||||||
|
|
||||||
# Create your tests here.
|
|
@ -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',
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -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']))
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
from django.test import TestCase
|
|
||||||
|
|
||||||
# Create your tests here.
|
|
@ -1,3 +0,0 @@
|
|||||||
from django.shortcuts import render
|
|
||||||
|
|
||||||
# Create your views here.
|
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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):
|
||||||
|
@ -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):
|
||||||
|
@ -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 = []
|
||||||
|
|
||||||
|
@ -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:
|
||||||
|
@ -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
|
||||||
|
@ -1,3 +0,0 @@
|
|||||||
from django.test import TestCase
|
|
||||||
|
|
||||||
# Create your tests here.
|
|
@ -2,6 +2,7 @@ from django.conf.urls import url
|
|||||||
|
|
||||||
from . import views
|
from . import views
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
|
|
||||||
# VRFs
|
# VRFs
|
||||||
|
@ -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'
|
||||||
|
Reference in New Issue
Block a user