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,7 +1,7 @@
 | 
			
		||||
import django_filters
 | 
			
		||||
 | 
			
		||||
from dcim.models import Site
 | 
			
		||||
from circuits.models import Provider, Circuit, CircuitType
 | 
			
		||||
from .models import Provider, Circuit, CircuitType
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CircuitFilter(django_filters.FilterSet):
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ from django.db.models import Count
 | 
			
		||||
from django.shortcuts import get_object_or_404, render
 | 
			
		||||
 | 
			
		||||
from utilities.views import (
 | 
			
		||||
    BulkImportView, BulkEditView, BulkDeleteView, ObjectListView, ObjectEditView, ObjectDeleteView,
 | 
			
		||||
    BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
from . import forms
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,11 @@
 | 
			
		||||
from django.contrib import admin
 | 
			
		||||
from django.db.models import Count
 | 
			
		||||
 | 
			
		||||
from .models import *
 | 
			
		||||
from .models import (
 | 
			
		||||
    ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceRole, DeviceType,
 | 
			
		||||
    Interface, InterfaceTemplate, Manufacturer, Module, Platform, PowerOutlet, PowerOutletTemplate, PowerPort,
 | 
			
		||||
    PowerPortTemplate, Rack, RackGroup, Site,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@admin.register(Site)
 | 
			
		||||
@@ -143,6 +147,7 @@ class InterfaceAdmin(admin.TabularInline):
 | 
			
		||||
class ModuleAdmin(admin.TabularInline):
 | 
			
		||||
    model = Module
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@admin.register(Device)
 | 
			
		||||
class DeviceAdmin(admin.ModelAdmin):
 | 
			
		||||
    inlines = [
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,11 @@
 | 
			
		||||
from rest_framework import serializers
 | 
			
		||||
 | 
			
		||||
from ipam.models import IPAddress
 | 
			
		||||
from dcim.models import Site, Rack, RackGroup, Manufacturer, ConsolePortTemplate, ConsoleServerPortTemplate, \
 | 
			
		||||
    PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate, DeviceType, DeviceRole, Platform, Device, ConsolePort, \
 | 
			
		||||
    ConsoleServerPort, PowerPort, PowerOutlet, Interface, InterfaceConnection, RACK_FACE_FRONT, RACK_FACE_REAR
 | 
			
		||||
from dcim.models import (
 | 
			
		||||
    ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceType, DeviceRole,
 | 
			
		||||
    Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate,
 | 
			
		||||
    PowerPort, PowerPortTemplate, Rack, RackGroup, RACK_FACE_FRONT, RACK_FACE_REAR, Site,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
 
 | 
			
		||||
@@ -44,7 +44,8 @@ urlpatterns = [
 | 
			
		||||
    url(r'^devices/(?P<pk>\d+)/$', DeviceDetailView.as_view(), name='device_detail'),
 | 
			
		||||
    url(r'^devices/(?P<pk>\d+)/lldp-neighbors/$', LLDPNeighborsView.as_view(), name='device_lldp-neighbors'),
 | 
			
		||||
    url(r'^devices/(?P<pk>\d+)/console-ports/$', ConsolePortListView.as_view(), name='device_consoleports'),
 | 
			
		||||
    url(r'^devices/(?P<pk>\d+)/console-server-ports/$', ConsoleServerPortListView.as_view(), name='device_consoleserverports'),
 | 
			
		||||
    url(r'^devices/(?P<pk>\d+)/console-server-ports/$', ConsoleServerPortListView.as_view(),
 | 
			
		||||
        name='device_consoleserverports'),
 | 
			
		||||
    url(r'^devices/(?P<pk>\d+)/power-ports/$', PowerPortListView.as_view(), name='device_powerports'),
 | 
			
		||||
    url(r'^devices/(?P<pk>\d+)/power-outlets/$', PowerOutletListView.as_view(), name='device_poweroutlets'),
 | 
			
		||||
    url(r'^devices/(?P<pk>\d+)/interfaces/$', InterfaceListView.as_view(), name='device_interfaces'),
 | 
			
		||||
@@ -57,7 +58,8 @@ urlpatterns = [
 | 
			
		||||
 | 
			
		||||
    # Interfaces
 | 
			
		||||
    url(r'^interfaces/(?P<pk>\d+)/$', InterfaceDetailView.as_view(), name='interface_detail'),
 | 
			
		||||
    url(r'^interfaces/(?P<pk>\d+)/graphs/$', GraphListView.as_view(), {'type': GRAPH_TYPE_INTERFACE}, name='interface_graphs'),
 | 
			
		||||
    url(r'^interfaces/(?P<pk>\d+)/graphs/$', GraphListView.as_view(), {'type': GRAPH_TYPE_INTERFACE},
 | 
			
		||||
        name='interface_graphs'),
 | 
			
		||||
    url(r'^interface-connections/(?P<pk>\d+)/$', InterfaceConnectionView.as_view(), name='interfaceconnection'),
 | 
			
		||||
 | 
			
		||||
    # Miscellaneous
 | 
			
		||||
 
 | 
			
		||||
@@ -8,14 +8,13 @@ from django.conf import settings
 | 
			
		||||
from django.http import Http404
 | 
			
		||||
from django.shortcuts import get_object_or_404
 | 
			
		||||
 | 
			
		||||
from dcim.models import Site, Rack, RackGroup, Manufacturer, DeviceType, DeviceRole, Platform, Device, ConsolePort, \
 | 
			
		||||
    ConsoleServerPort, PowerPort, PowerOutlet, Interface, InterfaceConnection, IFACE_FF_VIRTUAL
 | 
			
		||||
from dcim.filters import RackGroupFilter, RackFilter, DeviceTypeFilter, DeviceFilter, InterfaceFilter
 | 
			
		||||
from dcim.models import (
 | 
			
		||||
    ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, IFACE_FF_VIRTUAL, Interface, InterfaceConnection,
 | 
			
		||||
    Manufacturer, Platform, PowerOutlet, PowerPort, Rack, RackGroup, Site,
 | 
			
		||||
)
 | 
			
		||||
from dcim import filters
 | 
			
		||||
from .exceptions import MissingFilterException
 | 
			
		||||
from .serializers import SiteSerializer, RackGroupSerializer, RackSerializer, RackDetailSerializer, \
 | 
			
		||||
    ManufacturerSerializer, DeviceTypeSerializer, DeviceRoleSerializer, PlatformSerializer, DeviceSerializer, \
 | 
			
		||||
    DeviceNestedSerializer, ConsolePortSerializer, ConsoleServerPortSerializer, PowerPortSerializer, \
 | 
			
		||||
    PowerOutletSerializer, InterfaceSerializer, InterfaceDetailSerializer, InterfaceConnectionSerializer
 | 
			
		||||
from . import serializers
 | 
			
		||||
from extras.api.renderers import BINDZoneRenderer, FlatJSONRenderer
 | 
			
		||||
from utilities.api import ServiceUnavailable
 | 
			
		||||
 | 
			
		||||
@@ -29,7 +28,7 @@ class SiteListView(generics.ListAPIView):
 | 
			
		||||
    List all sites
 | 
			
		||||
    """
 | 
			
		||||
    queryset = Site.objects.all()
 | 
			
		||||
    serializer_class = SiteSerializer
 | 
			
		||||
    serializer_class = serializers.SiteSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class SiteDetailView(generics.RetrieveAPIView):
 | 
			
		||||
@@ -37,7 +36,7 @@ class SiteDetailView(generics.RetrieveAPIView):
 | 
			
		||||
    Retrieve a single site
 | 
			
		||||
    """
 | 
			
		||||
    queryset = Site.objects.all()
 | 
			
		||||
    serializer_class = SiteSerializer
 | 
			
		||||
    serializer_class = serializers.SiteSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
@@ -49,8 +48,8 @@ class RackGroupListView(generics.ListAPIView):
 | 
			
		||||
    List all rack groups
 | 
			
		||||
    """
 | 
			
		||||
    queryset = RackGroup.objects.all()
 | 
			
		||||
    serializer_class = RackGroupSerializer
 | 
			
		||||
    filter_class = RackGroupFilter
 | 
			
		||||
    serializer_class = serializers.RackGroupSerializer
 | 
			
		||||
    filter_class = filters.RackGroupFilter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RackGroupDetailView(generics.RetrieveAPIView):
 | 
			
		||||
@@ -58,7 +57,7 @@ class RackGroupDetailView(generics.RetrieveAPIView):
 | 
			
		||||
    Retrieve a single rack group
 | 
			
		||||
    """
 | 
			
		||||
    queryset = RackGroup.objects.all()
 | 
			
		||||
    serializer_class = RackGroupSerializer
 | 
			
		||||
    serializer_class = serializers.RackGroupSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
@@ -70,8 +69,8 @@ class RackListView(generics.ListAPIView):
 | 
			
		||||
    List racks (filterable)
 | 
			
		||||
    """
 | 
			
		||||
    queryset = Rack.objects.select_related('site')
 | 
			
		||||
    serializer_class = RackSerializer
 | 
			
		||||
    filter_class = RackFilter
 | 
			
		||||
    serializer_class = serializers.RackSerializer
 | 
			
		||||
    filter_class = filters.RackFilter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RackDetailView(generics.RetrieveAPIView):
 | 
			
		||||
@@ -79,7 +78,7 @@ class RackDetailView(generics.RetrieveAPIView):
 | 
			
		||||
    Retrieve a single rack
 | 
			
		||||
    """
 | 
			
		||||
    queryset = Rack.objects.select_related('site')
 | 
			
		||||
    serializer_class = RackDetailSerializer
 | 
			
		||||
    serializer_class = serializers.RackDetailSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
@@ -100,7 +99,7 @@ class RackUnitListView(APIView):
 | 
			
		||||
        # Serialize Devices within the rack elevation
 | 
			
		||||
        for u in elevation:
 | 
			
		||||
            if u['device']:
 | 
			
		||||
                u['device'] = DeviceNestedSerializer(instance=u['device']).data
 | 
			
		||||
                u['device'] = serializers.DeviceNestedSerializer(instance=u['device']).data
 | 
			
		||||
 | 
			
		||||
        return Response(elevation)
 | 
			
		||||
 | 
			
		||||
@@ -114,7 +113,7 @@ class ManufacturerListView(generics.ListAPIView):
 | 
			
		||||
    List all hardware manufacturers
 | 
			
		||||
    """
 | 
			
		||||
    queryset = Manufacturer.objects.all()
 | 
			
		||||
    serializer_class = ManufacturerSerializer
 | 
			
		||||
    serializer_class = serializers.ManufacturerSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ManufacturerDetailView(generics.RetrieveAPIView):
 | 
			
		||||
@@ -122,7 +121,7 @@ class ManufacturerDetailView(generics.RetrieveAPIView):
 | 
			
		||||
    Retrieve a single hardware manufacturers
 | 
			
		||||
    """
 | 
			
		||||
    queryset = Manufacturer.objects.all()
 | 
			
		||||
    serializer_class = ManufacturerSerializer
 | 
			
		||||
    serializer_class = serializers.ManufacturerSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
@@ -134,8 +133,8 @@ class DeviceTypeListView(generics.ListAPIView):
 | 
			
		||||
    List device types (filterable)
 | 
			
		||||
    """
 | 
			
		||||
    queryset = DeviceType.objects.select_related('manufacturer')
 | 
			
		||||
    serializer_class = DeviceTypeSerializer
 | 
			
		||||
    filter_class = DeviceTypeFilter
 | 
			
		||||
    serializer_class = serializers.DeviceTypeSerializer
 | 
			
		||||
    filter_class = filters.DeviceTypeFilter
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DeviceTypeDetailView(generics.RetrieveAPIView):
 | 
			
		||||
@@ -143,7 +142,7 @@ class DeviceTypeDetailView(generics.RetrieveAPIView):
 | 
			
		||||
    Retrieve a single device type
 | 
			
		||||
    """
 | 
			
		||||
    queryset = DeviceType.objects.select_related('manufacturer')
 | 
			
		||||
    serializer_class = DeviceTypeSerializer
 | 
			
		||||
    serializer_class = serializers.DeviceTypeSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
@@ -155,7 +154,7 @@ class DeviceRoleListView(generics.ListAPIView):
 | 
			
		||||
    List all device roles
 | 
			
		||||
    """
 | 
			
		||||
    queryset = DeviceRole.objects.all()
 | 
			
		||||
    serializer_class = DeviceRoleSerializer
 | 
			
		||||
    serializer_class = serializers.DeviceRoleSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DeviceRoleDetailView(generics.RetrieveAPIView):
 | 
			
		||||
@@ -163,7 +162,7 @@ class DeviceRoleDetailView(generics.RetrieveAPIView):
 | 
			
		||||
    Retrieve a single device role
 | 
			
		||||
    """
 | 
			
		||||
    queryset = DeviceRole.objects.all()
 | 
			
		||||
    serializer_class = DeviceRoleSerializer
 | 
			
		||||
    serializer_class = serializers.DeviceRoleSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
@@ -175,7 +174,7 @@ class PlatformListView(generics.ListAPIView):
 | 
			
		||||
    List all platforms
 | 
			
		||||
    """
 | 
			
		||||
    queryset = Platform.objects.all()
 | 
			
		||||
    serializer_class = PlatformSerializer
 | 
			
		||||
    serializer_class = serializers.PlatformSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PlatformDetailView(generics.RetrieveAPIView):
 | 
			
		||||
@@ -183,7 +182,7 @@ class PlatformDetailView(generics.RetrieveAPIView):
 | 
			
		||||
    Retrieve a single platform
 | 
			
		||||
    """
 | 
			
		||||
    queryset = Platform.objects.all()
 | 
			
		||||
    serializer_class = PlatformSerializer
 | 
			
		||||
    serializer_class = serializers.PlatformSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
@@ -196,8 +195,8 @@ class DeviceListView(generics.ListAPIView):
 | 
			
		||||
    """
 | 
			
		||||
    queryset = Device.objects.select_related('device_type__manufacturer', 'device_role', 'platform', 'rack__site')\
 | 
			
		||||
        .prefetch_related('primary_ip__nat_outside')
 | 
			
		||||
    serializer_class = DeviceSerializer
 | 
			
		||||
    filter_class = DeviceFilter
 | 
			
		||||
    serializer_class = serializers.DeviceSerializer
 | 
			
		||||
    filter_class = filters.DeviceFilter
 | 
			
		||||
    renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES + [BINDZoneRenderer, FlatJSONRenderer]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -206,7 +205,7 @@ class DeviceDetailView(generics.RetrieveAPIView):
 | 
			
		||||
    Retrieve a single device
 | 
			
		||||
    """
 | 
			
		||||
    queryset = Device.objects.all()
 | 
			
		||||
    serializer_class = DeviceSerializer
 | 
			
		||||
    serializer_class = serializers.DeviceSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
@@ -217,7 +216,7 @@ class ConsolePortListView(generics.ListAPIView):
 | 
			
		||||
    """
 | 
			
		||||
    List console ports (by device)
 | 
			
		||||
    """
 | 
			
		||||
    serializer_class = ConsolePortSerializer
 | 
			
		||||
    serializer_class = serializers.ConsolePortSerializer
 | 
			
		||||
 | 
			
		||||
    def get_queryset(self):
 | 
			
		||||
 | 
			
		||||
@@ -227,7 +226,7 @@ class ConsolePortListView(generics.ListAPIView):
 | 
			
		||||
 | 
			
		||||
class ConsolePortView(generics.RetrieveUpdateDestroyAPIView):
 | 
			
		||||
    permission_classes = [DjangoModelPermissionsOrAnonReadOnly]
 | 
			
		||||
    serializer_class = ConsolePortSerializer
 | 
			
		||||
    serializer_class = serializers.ConsolePortSerializer
 | 
			
		||||
    queryset = ConsolePort.objects.all()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -239,7 +238,7 @@ class ConsoleServerPortListView(generics.ListAPIView):
 | 
			
		||||
    """
 | 
			
		||||
    List console server ports (by device)
 | 
			
		||||
    """
 | 
			
		||||
    serializer_class = ConsoleServerPortSerializer
 | 
			
		||||
    serializer_class = serializers.ConsoleServerPortSerializer
 | 
			
		||||
 | 
			
		||||
    def get_queryset(self):
 | 
			
		||||
 | 
			
		||||
@@ -255,7 +254,7 @@ class PowerPortListView(generics.ListAPIView):
 | 
			
		||||
    """
 | 
			
		||||
    List power ports (by device)
 | 
			
		||||
    """
 | 
			
		||||
    serializer_class = PowerPortSerializer
 | 
			
		||||
    serializer_class = serializers.PowerPortSerializer
 | 
			
		||||
 | 
			
		||||
    def get_queryset(self):
 | 
			
		||||
 | 
			
		||||
@@ -265,7 +264,7 @@ class PowerPortListView(generics.ListAPIView):
 | 
			
		||||
 | 
			
		||||
class PowerPortView(generics.RetrieveUpdateDestroyAPIView):
 | 
			
		||||
    permission_classes = [DjangoModelPermissionsOrAnonReadOnly]
 | 
			
		||||
    serializer_class = PowerPortSerializer
 | 
			
		||||
    serializer_class = serializers.PowerPortSerializer
 | 
			
		||||
    queryset = PowerPort.objects.all()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -277,7 +276,7 @@ class PowerOutletListView(generics.ListAPIView):
 | 
			
		||||
    """
 | 
			
		||||
    List power outlets (by device)
 | 
			
		||||
    """
 | 
			
		||||
    serializer_class = PowerOutletSerializer
 | 
			
		||||
    serializer_class = serializers.PowerOutletSerializer
 | 
			
		||||
 | 
			
		||||
    def get_queryset(self):
 | 
			
		||||
 | 
			
		||||
@@ -293,8 +292,8 @@ class InterfaceListView(generics.ListAPIView):
 | 
			
		||||
    """
 | 
			
		||||
    List interfaces (by device)
 | 
			
		||||
    """
 | 
			
		||||
    serializer_class = InterfaceSerializer
 | 
			
		||||
    filter_class = InterfaceFilter
 | 
			
		||||
    serializer_class = serializers.InterfaceSerializer
 | 
			
		||||
    filter_class = filters.InterfaceFilter
 | 
			
		||||
 | 
			
		||||
    def get_queryset(self):
 | 
			
		||||
 | 
			
		||||
@@ -318,12 +317,12 @@ class InterfaceDetailView(generics.RetrieveAPIView):
 | 
			
		||||
    Retrieve a single interface
 | 
			
		||||
    """
 | 
			
		||||
    queryset = Interface.objects.select_related('device')
 | 
			
		||||
    serializer_class = InterfaceDetailSerializer
 | 
			
		||||
    serializer_class = serializers.InterfaceDetailSerializer
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class InterfaceConnectionView(generics.RetrieveUpdateDestroyAPIView):
 | 
			
		||||
    permission_classes = [DjangoModelPermissionsOrAnonReadOnly]
 | 
			
		||||
    serializer_class = InterfaceConnectionSerializer
 | 
			
		||||
    serializer_class = serializers.InterfaceConnectionSerializer
 | 
			
		||||
    queryset = InterfaceConnection.objects.all()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -341,7 +340,6 @@ class LLDPNeighborsView(APIView):
 | 
			
		||||
        device = get_object_or_404(Device, pk=pk)
 | 
			
		||||
        if not device.primary_ip:
 | 
			
		||||
            raise ServiceUnavailable(detail="No IP configured for this device.")
 | 
			
		||||
        hostname = str(device.primary_ip.address.ip)
 | 
			
		||||
 | 
			
		||||
        RPC = device.get_rpc_client()
 | 
			
		||||
        if not RPC:
 | 
			
		||||
@@ -390,7 +388,7 @@ class RelatedConnectionsView(APIView):
 | 
			
		||||
 | 
			
		||||
        # Initialize response skeleton
 | 
			
		||||
        response = dict()
 | 
			
		||||
        response['device'] = DeviceSerializer(device).data
 | 
			
		||||
        response['device'] = serializers.DeviceSerializer(device).data
 | 
			
		||||
        response['console-ports'] = []
 | 
			
		||||
        response['power-ports'] = []
 | 
			
		||||
        response['interfaces'] = []
 | 
			
		||||
 
 | 
			
		||||
@@ -2,8 +2,10 @@ import django_filters
 | 
			
		||||
 | 
			
		||||
from django.db.models import Q
 | 
			
		||||
 | 
			
		||||
from .models import Site, RackGroup, Rack, Manufacturer, DeviceType, DeviceRole, Device, ConsolePort, \
 | 
			
		||||
    ConsoleServerPort, Platform, PowerPort, PowerOutlet, Interface, InterfaceConnection
 | 
			
		||||
from .models import (
 | 
			
		||||
    ConsolePort, ConsoleServerPort, Device, DeviceRole, DeviceType, Interface, InterfaceConnection, Manufacturer,
 | 
			
		||||
    Platform, PowerOutlet, PowerPort, Rack, RackGroup, Site,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RackGroupFilter(django_filters.FilterSet):
 | 
			
		||||
 
 | 
			
		||||
@@ -4,18 +4,23 @@ from django import forms
 | 
			
		||||
from django.db.models import Count, Q
 | 
			
		||||
 | 
			
		||||
from ipam.models import IPAddress
 | 
			
		||||
from utilities.forms import BootstrapMixin, SmallTextarea, SelectWithDisabled, ConfirmationForm, APISelect, \
 | 
			
		||||
    Livesearch, CSVDataField, CommentField, BulkImportForm, FlexibleModelChoiceField, ExpandableNameField
 | 
			
		||||
from utilities.forms import (
 | 
			
		||||
    APISelect, BootstrapMixin, BulkImportForm, CommentField, ConfirmationForm, CSVDataField, ExpandableNameField,
 | 
			
		||||
    FlexibleModelChoiceField, Livesearch, SelectWithDisabled, SmallTextarea,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
from .models import Site, Rack, RackGroup, Device, Manufacturer, DeviceType, DeviceRole, Platform, ConsolePort, \
 | 
			
		||||
    ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, PowerPort, PowerPortTemplate, PowerOutlet, \
 | 
			
		||||
    PowerOutletTemplate, Interface, InterfaceTemplate, InterfaceConnection, CONNECTION_STATUS_CHOICES, \
 | 
			
		||||
    CONNECTION_STATUS_PLANNED, CONNECTION_STATUS_CONNECTED, IFACE_FF_VIRTUAL, STATUS_CHOICES
 | 
			
		||||
from .models import (
 | 
			
		||||
    CONNECTION_STATUS_CHOICES, CONNECTION_STATUS_PLANNED, CONNECTION_STATUS_CONNECTED, ConsolePort, ConsolePortTemplate,
 | 
			
		||||
    ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceRole, DeviceType, Interface, IFACE_FF_VIRTUAL,
 | 
			
		||||
    InterfaceConnection, InterfaceTemplate, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate, PowerPort,
 | 
			
		||||
    PowerPortTemplate, Rack, RackGroup, Site, STATUS_CHOICES
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
FORM_STATUS_CHOICES = [
 | 
			
		||||
    ['', '---------'],
 | 
			
		||||
]
 | 
			
		||||
 | 
			
		||||
FORM_STATUS_CHOICES += STATUS_CHOICES
 | 
			
		||||
 | 
			
		||||
DEVICE_BY_PK_RE = '{\d+\}'
 | 
			
		||||
@@ -182,7 +187,7 @@ class RackFilterForm(forms.Form, BootstrapMixin):
 | 
			
		||||
    site = forms.MultipleChoiceField(required=False, choices=rack_site_choices,
 | 
			
		||||
                                     widget=forms.SelectMultiple(attrs={'size': 8}))
 | 
			
		||||
    group_id = forms.MultipleChoiceField(required=False, choices=rack_group_choices,
 | 
			
		||||
                                      widget=forms.SelectMultiple(attrs={'size': 8}))
 | 
			
		||||
                                         widget=forms.SelectMultiple(attrs={'size': 8}))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
#
 | 
			
		||||
 
 | 
			
		||||
@@ -427,10 +427,13 @@ class Device(models.Model):
 | 
			
		||||
    name = NullableCharField(max_length=50, blank=True, null=True, unique=True)
 | 
			
		||||
    serial = models.CharField(max_length=50, blank=True, verbose_name='Serial number')
 | 
			
		||||
    rack = models.ForeignKey('Rack', related_name='devices', on_delete=models.PROTECT)
 | 
			
		||||
    position = models.PositiveSmallIntegerField(blank=True, null=True, validators=[MinValueValidator(1)], verbose_name='Position (U)', help_text='Number of the lowest U position occupied by the device')
 | 
			
		||||
    position = models.PositiveSmallIntegerField(blank=True, null=True, validators=[MinValueValidator(1)],
 | 
			
		||||
                                                verbose_name='Position (U)',
 | 
			
		||||
                                                help_text='Number of the lowest U position occupied by the device')
 | 
			
		||||
    face = models.PositiveSmallIntegerField(blank=True, null=True, choices=RACK_FACE_CHOICES, verbose_name='Rack face')
 | 
			
		||||
    status = models.BooleanField(choices=STATUS_CHOICES, default=STATUS_ACTIVE, verbose_name='Status')
 | 
			
		||||
    primary_ip = models.OneToOneField('ipam.IPAddress', related_name='primary_for', on_delete=models.SET_NULL, blank=True, null=True, verbose_name='Primary IP')
 | 
			
		||||
    primary_ip = models.OneToOneField('ipam.IPAddress', related_name='primary_for', on_delete=models.SET_NULL,
 | 
			
		||||
                                      blank=True, null=True, verbose_name='Primary IP')
 | 
			
		||||
    ro_snmp = models.CharField(max_length=50, blank=True, verbose_name='SNMP (RO)')
 | 
			
		||||
    comments = models.TextField(blank=True)
 | 
			
		||||
 | 
			
		||||
@@ -480,19 +483,24 @@ class Device(models.Model):
 | 
			
		||||
        # If this is a new Device, instantiate all of the related components per the DeviceType definition
 | 
			
		||||
        if is_new:
 | 
			
		||||
            ConsolePort.objects.bulk_create(
 | 
			
		||||
                [ConsolePort(device=self, name=template.name) for template in self.device_type.console_port_templates.all()]
 | 
			
		||||
                [ConsolePort(device=self, name=template.name) for template in
 | 
			
		||||
                 self.device_type.console_port_templates.all()]
 | 
			
		||||
            )
 | 
			
		||||
            ConsoleServerPort.objects.bulk_create(
 | 
			
		||||
                [ConsoleServerPort(device=self, name=template.name) for template in self.device_type.cs_port_templates.all()]
 | 
			
		||||
                [ConsoleServerPort(device=self, name=template.name) for template in
 | 
			
		||||
                 self.device_type.cs_port_templates.all()]
 | 
			
		||||
            )
 | 
			
		||||
            PowerPort.objects.bulk_create(
 | 
			
		||||
                [PowerPort(device=self, name=template.name) for template in self.device_type.power_port_templates.all()]
 | 
			
		||||
                [PowerPort(device=self, name=template.name) for template in
 | 
			
		||||
                 self.device_type.power_port_templates.all()]
 | 
			
		||||
            )
 | 
			
		||||
            PowerOutlet.objects.bulk_create(
 | 
			
		||||
                [PowerOutlet(device=self, name=template.name) for template in self.device_type.power_outlet_templates.all()]
 | 
			
		||||
                [PowerOutlet(device=self, name=template.name) for template in
 | 
			
		||||
                 self.device_type.power_outlet_templates.all()]
 | 
			
		||||
            )
 | 
			
		||||
            Interface.objects.bulk_create(
 | 
			
		||||
                [Interface(device=self, name=template.name, form_factor=template.form_factor, mgmt_only=template.mgmt_only) for template in self.device_type.interface_templates.all()]
 | 
			
		||||
                [Interface(device=self, name=template.name, form_factor=template.form_factor,
 | 
			
		||||
                           mgmt_only=template.mgmt_only) for template in self.device_type.interface_templates.all()]
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
    def get_rpc_client(self):
 | 
			
		||||
@@ -510,7 +518,8 @@ class ConsolePort(models.Model):
 | 
			
		||||
    """
 | 
			
		||||
    device = models.ForeignKey('Device', related_name='console_ports', on_delete=models.CASCADE)
 | 
			
		||||
    name = models.CharField(max_length=30)
 | 
			
		||||
    cs_port = models.OneToOneField('ConsoleServerPort', related_name='connected_console', on_delete=models.SET_NULL, verbose_name='Console server port', blank=True, null=True)
 | 
			
		||||
    cs_port = models.OneToOneField('ConsoleServerPort', related_name='connected_console', on_delete=models.SET_NULL,
 | 
			
		||||
                                   verbose_name='Console server port', blank=True, null=True)
 | 
			
		||||
    connection_status = models.NullBooleanField(choices=CONNECTION_STATUS_CHOICES, default=CONNECTION_STATUS_CONNECTED)
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
@@ -558,7 +567,8 @@ class PowerPort(models.Model):
 | 
			
		||||
    """
 | 
			
		||||
    device = models.ForeignKey('Device', related_name='power_ports', on_delete=models.CASCADE)
 | 
			
		||||
    name = models.CharField(max_length=30)
 | 
			
		||||
    power_outlet = models.OneToOneField('PowerOutlet', related_name='connected_port', on_delete=models.SET_NULL, blank=True, null=True)
 | 
			
		||||
    power_outlet = models.OneToOneField('PowerOutlet', related_name='connected_port', on_delete=models.SET_NULL,
 | 
			
		||||
                                        blank=True, null=True)
 | 
			
		||||
    connection_status = models.NullBooleanField(choices=CONNECTION_STATUS_CHOICES, default=CONNECTION_STATUS_CONNECTED)
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
@@ -573,7 +583,8 @@ class PowerOutletManager(models.Manager):
 | 
			
		||||
 | 
			
		||||
    def get_queryset(self):
 | 
			
		||||
        return super(PowerOutletManager, self).get_queryset().extra(select={
 | 
			
		||||
            'name_padded': "CONCAT(SUBSTRING(dcim_poweroutlet.name FROM '^[^0-9]+'), LPAD(SUBSTRING(dcim_poweroutlet.name FROM '[0-9\/]+$'), 8, '0'))",
 | 
			
		||||
            'name_padded': "CONCAT(SUBSTRING(dcim_poweroutlet.name FROM '^[^0-9]+'), "
 | 
			
		||||
                           "LPAD(SUBSTRING(dcim_poweroutlet.name FROM '[0-9\/]+$'), 8, '0'))",
 | 
			
		||||
        }).order_by('device', 'name_padded')
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -678,7 +689,8 @@ class InterfaceConnection(models.Model):
 | 
			
		||||
    """
 | 
			
		||||
    interface_a = models.OneToOneField('Interface', related_name='connected_as_a', on_delete=models.CASCADE)
 | 
			
		||||
    interface_b = models.OneToOneField('Interface', related_name='connected_as_b', on_delete=models.CASCADE)
 | 
			
		||||
    connection_status = models.BooleanField(choices=CONNECTION_STATUS_CHOICES, default=CONNECTION_STATUS_CONNECTED, verbose_name='Status')
 | 
			
		||||
    connection_status = models.BooleanField(choices=CONNECTION_STATUS_CHOICES, default=CONNECTION_STATUS_CONNECTED,
 | 
			
		||||
                                            verbose_name='Status')
 | 
			
		||||
 | 
			
		||||
    def clean(self):
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,31 +1,48 @@
 | 
			
		||||
import django_tables2 as tables
 | 
			
		||||
from django_tables2.utils import Accessor
 | 
			
		||||
 | 
			
		||||
from .models import Site, RackGroup, Rack, Manufacturer, DeviceType, ConsolePortTemplate, ConsoleServerPortTemplate,\
 | 
			
		||||
    PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate, DeviceRole, Platform, Device, ConsolePort, PowerPort
 | 
			
		||||
from .models import (
 | 
			
		||||
    ConsolePort, ConsolePortTemplate, ConsoleServerPortTemplate, Device, DeviceRole, DeviceType, InterfaceTemplate,
 | 
			
		||||
    Manufacturer, Platform, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, Site,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
DEVICE_LINK = """
 | 
			
		||||
<a href="{% url 'dcim:device' pk=record.pk %}">{{ record.name|default:'<span class="label label-info">Unnamed device</span>' }}</a>
 | 
			
		||||
<a href="{% url 'dcim:device' pk=record.pk %}">
 | 
			
		||||
    {{ record.name|default:'<span class="label label-info">Unnamed device</span>' }}
 | 
			
		||||
</a>
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
RACKGROUP_EDIT_LINK = """
 | 
			
		||||
{% if perms.dcim.change_rackgroup %}<a href="{% url 'dcim:rackgroup_edit' pk=record.pk %}">Edit</a>{% endif %}
 | 
			
		||||
{% if perms.dcim.change_rackgroup %}
 | 
			
		||||
    <a href="{% url 'dcim:rackgroup_edit' pk=record.pk %}">Edit</a>
 | 
			
		||||
{% endif %}
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
DEVICEROLE_EDIT_LINK = """
 | 
			
		||||
{% if perms.dcim.change_devicerole %}<a href="{% url 'dcim:devicerole_edit' slug=record.slug %}">Edit</a>{% endif %}
 | 
			
		||||
{% if perms.dcim.change_devicerole %}
 | 
			
		||||
    <a href="{% url 'dcim:devicerole_edit' slug=record.slug %}">Edit</a>
 | 
			
		||||
{% endif %}
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
MANUFACTURER_EDIT_LINK = """
 | 
			
		||||
{% if perms.dcim.change_manufacturer %}<a href="{% url 'dcim:manufacturer_edit' slug=record.slug %}">Edit</a>{% endif %}
 | 
			
		||||
{% if perms.dcim.change_manufacturer %}
 | 
			
		||||
    <a href="{% url 'dcim:manufacturer_edit' slug=record.slug %}">Edit</a>
 | 
			
		||||
{% endif %}
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
PLATFORM_EDIT_LINK = """
 | 
			
		||||
{% if perms.dcim.change_platform %}<a href="{% url 'dcim:platform_edit' slug=record.slug %}">Edit</a>{% endif %}
 | 
			
		||||
{% if perms.dcim.change_platform %}
 | 
			
		||||
    <a href="{% url 'dcim:platform_edit' slug=record.slug %}">Edit</a>
 | 
			
		||||
{% endif %}
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
STATUS_ICON = """
 | 
			
		||||
<span class="glyphicon glyphicon-{% if record.status %}ok-sign text-success" title="Active{% else %}minus-sign text-danger" title="Offline{% endif %}" aria-hidden="true"></span>
 | 
			
		||||
{% if record.status %}
 | 
			
		||||
    <span class="glyphicon glyphicon-ok-sign text-success" title="Active" aria-hidden="true"></span>
 | 
			
		||||
{% else %}
 | 
			
		||||
    <span class="glyphicon glyphicon-minus-sign text-danger" title="Offline" aria-hidden="true"></span>
 | 
			
		||||
{% endif %}
 | 
			
		||||
"""
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -45,7 +62,8 @@ class SiteTable(tables.Table):
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = Site
 | 
			
		||||
        fields = ('name', 'facility', 'asn', 'rack_count', 'device_count', 'prefix_count', 'vlan_count', 'circuit_count')
 | 
			
		||||
        fields = ('name', 'facility', 'asn', 'rack_count', 'device_count', 'prefix_count', 'vlan_count',
 | 
			
		||||
                  'circuit_count')
 | 
			
		||||
        empty_text = "No sites have been defined."
 | 
			
		||||
        attrs = {
 | 
			
		||||
            'class': 'table table-hover',
 | 
			
		||||
@@ -254,7 +272,8 @@ class DeviceTable(tables.Table):
 | 
			
		||||
    rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')], verbose_name='Rack')
 | 
			
		||||
    device_role = tables.Column(verbose_name='Role')
 | 
			
		||||
    device_type = tables.Column(verbose_name='Type')
 | 
			
		||||
    primary_ip = tables.TemplateColumn(orderable=False, verbose_name='IP Address', template_code="{{ record.primary_ip.address.ip }}")
 | 
			
		||||
    primary_ip = tables.TemplateColumn(orderable=False, verbose_name='IP Address',
 | 
			
		||||
                                       template_code="{{ record.primary_ip.address.ip }}")
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
        model = Device
 | 
			
		||||
@@ -286,7 +305,8 @@ class DeviceImportTable(tables.Table):
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
class ConsoleConnectionTable(tables.Table):
 | 
			
		||||
    console_server = tables.LinkColumn('dcim:device', accessor=Accessor('cs_port.device'), args=[Accessor('cs_port.device.pk')], verbose_name='Console server')
 | 
			
		||||
    console_server = tables.LinkColumn('dcim:device', accessor=Accessor('cs_port.device'),
 | 
			
		||||
                                       args=[Accessor('cs_port.device.pk')], verbose_name='Console server')
 | 
			
		||||
    cs_port = tables.Column(verbose_name='Port')
 | 
			
		||||
    device = tables.LinkColumn('dcim:device', args=[Accessor('device.pk')], verbose_name='Device')
 | 
			
		||||
    name = tables.Column(verbose_name='Console port')
 | 
			
		||||
@@ -300,7 +320,8 @@ class ConsoleConnectionTable(tables.Table):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PowerConnectionTable(tables.Table):
 | 
			
		||||
    pdu = tables.LinkColumn('dcim:device', accessor=Accessor('power_outlet.device'), args=[Accessor('power_outlet.device.pk')], verbose_name='PDU')
 | 
			
		||||
    pdu = tables.LinkColumn('dcim:device', accessor=Accessor('power_outlet.device'),
 | 
			
		||||
                            args=[Accessor('power_outlet.device.pk')], verbose_name='PDU')
 | 
			
		||||
    power_outlet = tables.Column(verbose_name='Outlet')
 | 
			
		||||
    device = tables.LinkColumn('dcim:device', args=[Accessor('device.pk')], verbose_name='Device')
 | 
			
		||||
    name = tables.Column(verbose_name='Console port')
 | 
			
		||||
@@ -314,9 +335,11 @@ class PowerConnectionTable(tables.Table):
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class InterfaceConnectionTable(tables.Table):
 | 
			
		||||
    device_a = tables.LinkColumn('dcim:device', accessor=Accessor('interface_a.device'), args=[Accessor('interface_a.device.pk')], verbose_name='Device A')
 | 
			
		||||
    device_a = tables.LinkColumn('dcim:device', accessor=Accessor('interface_a.device'),
 | 
			
		||||
                                 args=[Accessor('interface_a.device.pk')], verbose_name='Device A')
 | 
			
		||||
    interface_a = tables.Column(verbose_name='Interface A')
 | 
			
		||||
    device_b = tables.LinkColumn('dcim:device', accessor=Accessor('interface_b.device'), args=[Accessor('interface_b.device.pk')], verbose_name='Device B')
 | 
			
		||||
    device_b = tables.LinkColumn('dcim:device', accessor=Accessor('interface_b.device'),
 | 
			
		||||
                                 args=[Accessor('interface_b.device.pk')], verbose_name='Device B')
 | 
			
		||||
    interface_b = tables.Column(verbose_name='Interface B')
 | 
			
		||||
 | 
			
		||||
    class Meta:
 | 
			
		||||
 
 | 
			
		||||
@@ -3,8 +3,9 @@ from django.conf.urls import url
 | 
			
		||||
from secrets.views import secret_add
 | 
			
		||||
 | 
			
		||||
from . import views
 | 
			
		||||
from .models import ConsolePortTemplate, ConsoleServerPortTemplate, PowerPortTemplate, PowerOutletTemplate, \
 | 
			
		||||
    InterfaceTemplate
 | 
			
		||||
from .models import (
 | 
			
		||||
    ConsolePortTemplate, ConsoleServerPortTemplate, PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
urlpatterns = [
 | 
			
		||||
 
 | 
			
		||||
@@ -17,30 +17,16 @@ from circuits.models import Circuit
 | 
			
		||||
from extras.models import TopologyMap
 | 
			
		||||
from utilities.error_handlers import handle_protectederror
 | 
			
		||||
from utilities.forms import ConfirmationForm
 | 
			
		||||
from utilities.views import ObjectListView, BulkImportView, BulkEditView, BulkDeleteView, ObjectEditView,\
 | 
			
		||||
    ObjectDeleteView
 | 
			
		||||
from utilities.views import (
 | 
			
		||||
    BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
from .filters import RackGroupFilter, RackFilter, DeviceTypeFilter, DeviceFilter, ConsoleConnectionFilter,\
 | 
			
		||||
    PowerConnectionFilter, InterfaceConnectionFilter
 | 
			
		||||
from .forms import SiteForm, SiteImportForm, RackGroupForm, RackGroupFilterForm, RackGroupBulkDeleteForm, RackForm,\
 | 
			
		||||
    RackImportForm, RackBulkEditForm, RackBulkDeleteForm, RackFilterForm, ManufacturerForm, ManufacturerBulkDeleteForm,\
 | 
			
		||||
    DeviceTypeForm, DeviceTypeBulkEditForm, DeviceTypeBulkDeleteForm, DeviceTypeFilterForm, DeviceRoleForm,\
 | 
			
		||||
    DeviceRoleBulkDeleteForm, PlatformForm, PlatformBulkDeleteForm, DeviceForm, DeviceImportForm, DeviceBulkEditForm,\
 | 
			
		||||
    DeviceBulkDeleteForm, DeviceFilterForm, ConsolePortForm, ConsolePortCreateForm, ConsolePortConnectionForm,\
 | 
			
		||||
    ConsoleConnectionImportForm, ConsoleServerPortForm, ConsoleServerPortCreateForm, ConsoleServerPortConnectionForm,\
 | 
			
		||||
    PowerPortForm, PowerPortCreateForm, PowerPortConnectionForm, PowerConnectionImportForm, PowerOutletForm,\
 | 
			
		||||
    PowerOutletCreateForm, PowerOutletConnectionForm, InterfaceForm, InterfaceCreateForm, InterfaceBulkCreateForm,\
 | 
			
		||||
    InterfaceConnectionForm, InterfaceConnectionDeletionForm, InterfaceConnectionImportForm,\
 | 
			
		||||
    ConsoleConnectionFilterForm, PowerConnectionFilterForm, InterfaceConnectionFilterForm, IPAddressForm,\
 | 
			
		||||
    ConsolePortTemplateForm, ConsoleServerPortTemplateForm, PowerPortTemplateForm, PowerOutletTemplateForm,\
 | 
			
		||||
    InterfaceTemplateForm
 | 
			
		||||
from .models import Site, RackGroup, Rack, Manufacturer, DeviceType, ConsolePortTemplate, ConsoleServerPortTemplate,\
 | 
			
		||||
    PowerPortTemplate, PowerOutletTemplate, InterfaceTemplate, DeviceRole, Platform, Device, ConsolePort,\
 | 
			
		||||
    ConsoleServerPort, PowerPort, PowerOutlet, Interface, InterfaceConnection, Module, CONNECTION_STATUS_CONNECTED
 | 
			
		||||
from .tables import SiteTable, RackGroupTable, RackTable, ManufacturerTable, DeviceTypeTable, DeviceRoleTable,\
 | 
			
		||||
    PlatformTable, DeviceTable, DeviceImportTable, ConsoleConnectionTable, PowerConnectionTable,\
 | 
			
		||||
    InterfaceConnectionTable, ConsolePortTemplateTable, ConsoleServerPortTemplateTable, PowerPortTemplateTable,\
 | 
			
		||||
    PowerOutletTemplateTable, InterfaceTemplateTable
 | 
			
		||||
from . import filters, forms, tables
 | 
			
		||||
from .models import (
 | 
			
		||||
    CONNECTION_STATUS_CONNECTED, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device,
 | 
			
		||||
    DeviceRole, DeviceType, Interface, InterfaceConnection, InterfaceTemplate, Manufacturer, Module, Platform,
 | 
			
		||||
    PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, Site,
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
EXPANSION_PATTERN = '\[(\d+-\d+)\]'
 | 
			
		||||
@@ -75,7 +61,7 @@ def expand_pattern(string):
 | 
			
		||||
 | 
			
		||||
class SiteListView(ObjectListView):
 | 
			
		||||
    queryset = Site.objects.all()
 | 
			
		||||
    table = SiteTable
 | 
			
		||||
    table = tables.SiteTable
 | 
			
		||||
    template_name = 'dcim/site_list.html'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -101,7 +87,7 @@ def site(request, slug):
 | 
			
		||||
class SiteEditView(PermissionRequiredMixin, ObjectEditView):
 | 
			
		||||
    permission_required = 'dcim.change_site'
 | 
			
		||||
    model = Site
 | 
			
		||||
    form_class = SiteForm
 | 
			
		||||
    form_class = forms.SiteForm
 | 
			
		||||
    template_name = 'dcim/site_edit.html'
 | 
			
		||||
    cancel_url = 'dcim:site_list'
 | 
			
		||||
 | 
			
		||||
@@ -114,8 +100,8 @@ class SiteDeleteView(PermissionRequiredMixin, ObjectDeleteView):
 | 
			
		||||
 | 
			
		||||
class SiteBulkImportView(PermissionRequiredMixin, BulkImportView):
 | 
			
		||||
    permission_required = 'dcim.add_site'
 | 
			
		||||
    form = SiteImportForm
 | 
			
		||||
    table = SiteTable
 | 
			
		||||
    form = forms.SiteImportForm
 | 
			
		||||
    table = tables.SiteTable
 | 
			
		||||
    template_name = 'dcim/site_import.html'
 | 
			
		||||
    obj_list_url = 'dcim:site_list'
 | 
			
		||||
 | 
			
		||||
@@ -126,9 +112,9 @@ class SiteBulkImportView(PermissionRequiredMixin, BulkImportView):
 | 
			
		||||
 | 
			
		||||
class RackGroupListView(ObjectListView):
 | 
			
		||||
    queryset = RackGroup.objects.annotate(rack_count=Count('racks'))
 | 
			
		||||
    filter = RackGroupFilter
 | 
			
		||||
    filter_form = RackGroupFilterForm
 | 
			
		||||
    table = RackGroupTable
 | 
			
		||||
    filter = filters.RackGroupFilter
 | 
			
		||||
    filter_form = forms.RackGroupFilterForm
 | 
			
		||||
    table = tables.RackGroupTable
 | 
			
		||||
    edit_permissions = ['dcim.change_rackgroup', 'dcim.delete_rackgroup']
 | 
			
		||||
    template_name = 'dcim/rackgroup_list.html'
 | 
			
		||||
 | 
			
		||||
@@ -136,14 +122,14 @@ class RackGroupListView(ObjectListView):
 | 
			
		||||
class RackGroupEditView(PermissionRequiredMixin, ObjectEditView):
 | 
			
		||||
    permission_required = 'dcim.change_rackgroup'
 | 
			
		||||
    model = RackGroup
 | 
			
		||||
    form_class = RackGroupForm
 | 
			
		||||
    form_class = forms.RackGroupForm
 | 
			
		||||
    cancel_url = 'dcim:rackgroup_list'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class RackGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 | 
			
		||||
    permission_required = 'dcim.delete_rackgroup'
 | 
			
		||||
    cls = RackGroup
 | 
			
		||||
    form = RackGroupBulkDeleteForm
 | 
			
		||||
    form = forms.RackGroupBulkDeleteForm
 | 
			
		||||
    default_redirect_url = 'dcim:rackgroup_list'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -153,9 +139,9 @@ class RackGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 | 
			
		||||
 | 
			
		||||
class RackListView(ObjectListView):
 | 
			
		||||
    queryset = Rack.objects.select_related('site').annotate(device_count=Count('devices', distinct=True))
 | 
			
		||||
    filter = RackFilter
 | 
			
		||||
    filter_form = RackFilterForm
 | 
			
		||||
    table = RackTable
 | 
			
		||||
    filter = filters.RackFilter
 | 
			
		||||
    filter_form = forms.RackFilterForm
 | 
			
		||||
    table = tables.RackTable
 | 
			
		||||
    edit_permissions = ['dcim.change_rack', 'dcim.delete_rack']
 | 
			
		||||
    template_name = 'dcim/rack_list.html'
 | 
			
		||||
 | 
			
		||||
@@ -181,7 +167,7 @@ def rack(request, pk):
 | 
			
		||||
class RackEditView(PermissionRequiredMixin, ObjectEditView):
 | 
			
		||||
    permission_required = 'dcim.change_rack'
 | 
			
		||||
    model = Rack
 | 
			
		||||
    form_class = RackForm
 | 
			
		||||
    form_class = forms.RackForm
 | 
			
		||||
    template_name = 'dcim/rack_edit.html'
 | 
			
		||||
    cancel_url = 'dcim:rack_list'
 | 
			
		||||
 | 
			
		||||
@@ -194,8 +180,8 @@ class RackDeleteView(PermissionRequiredMixin, ObjectDeleteView):
 | 
			
		||||
 | 
			
		||||
class RackBulkImportView(PermissionRequiredMixin, BulkImportView):
 | 
			
		||||
    permission_required = 'dcim.add_rack'
 | 
			
		||||
    form = RackImportForm
 | 
			
		||||
    table = RackTable
 | 
			
		||||
    form = forms.RackImportForm
 | 
			
		||||
    table = tables.RackTable
 | 
			
		||||
    template_name = 'dcim/rack_import.html'
 | 
			
		||||
    obj_list_url = 'dcim:rack_list'
 | 
			
		||||
 | 
			
		||||
@@ -203,7 +189,7 @@ class RackBulkImportView(PermissionRequiredMixin, BulkImportView):
 | 
			
		||||
class RackBulkEditView(PermissionRequiredMixin, BulkEditView):
 | 
			
		||||
    permission_required = 'dcim.change_rack'
 | 
			
		||||
    cls = Rack
 | 
			
		||||
    form = RackBulkEditForm
 | 
			
		||||
    form = forms.RackBulkEditForm
 | 
			
		||||
    template_name = 'dcim/rack_bulk_edit.html'
 | 
			
		||||
    default_redirect_url = 'dcim:rack_list'
 | 
			
		||||
 | 
			
		||||
@@ -221,7 +207,7 @@ class RackBulkEditView(PermissionRequiredMixin, BulkEditView):
 | 
			
		||||
class RackBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 | 
			
		||||
    permission_required = 'dcim.delete_rack'
 | 
			
		||||
    cls = Rack
 | 
			
		||||
    form = RackBulkDeleteForm
 | 
			
		||||
    form = forms.RackBulkDeleteForm
 | 
			
		||||
    default_redirect_url = 'dcim:rack_list'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -231,7 +217,7 @@ class RackBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 | 
			
		||||
 | 
			
		||||
class ManufacturerListView(ObjectListView):
 | 
			
		||||
    queryset = Manufacturer.objects.annotate(devicetype_count=Count('device_types'))
 | 
			
		||||
    table = ManufacturerTable
 | 
			
		||||
    table = tables.ManufacturerTable
 | 
			
		||||
    edit_permissions = ['dcim.change_manufacturer', 'dcim.delete_manufacturer']
 | 
			
		||||
    template_name = 'dcim/manufacturer_list.html'
 | 
			
		||||
 | 
			
		||||
@@ -239,7 +225,7 @@ class ManufacturerListView(ObjectListView):
 | 
			
		||||
class ManufacturerEditView(PermissionRequiredMixin, ObjectEditView):
 | 
			
		||||
    permission_required = 'dcim.change_manufacturer'
 | 
			
		||||
    model = Manufacturer
 | 
			
		||||
    form_class = ManufacturerForm
 | 
			
		||||
    form_class = forms.ManufacturerForm
 | 
			
		||||
    success_url = 'dcim:manufacturer_list'
 | 
			
		||||
    cancel_url = 'dcim:manufacturer_list'
 | 
			
		||||
 | 
			
		||||
@@ -247,7 +233,7 @@ class ManufacturerEditView(PermissionRequiredMixin, ObjectEditView):
 | 
			
		||||
class ManufacturerBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 | 
			
		||||
    permission_required = 'dcim.delete_manufacturer'
 | 
			
		||||
    cls = Manufacturer
 | 
			
		||||
    form = ManufacturerBulkDeleteForm
 | 
			
		||||
    form = forms.ManufacturerBulkDeleteForm
 | 
			
		||||
    default_redirect_url = 'dcim:manufacturer_list'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -257,9 +243,9 @@ class ManufacturerBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 | 
			
		||||
 | 
			
		||||
class DeviceTypeListView(ObjectListView):
 | 
			
		||||
    queryset = DeviceType.objects.select_related('manufacturer')
 | 
			
		||||
    filter = DeviceTypeFilter
 | 
			
		||||
    filter_form = DeviceTypeFilterForm
 | 
			
		||||
    table = DeviceTypeTable
 | 
			
		||||
    filter = filters.DeviceTypeFilter
 | 
			
		||||
    filter_form = forms.DeviceTypeFilterForm
 | 
			
		||||
    table = tables.DeviceTypeTable
 | 
			
		||||
    edit_permissions = ['dcim.change_devicetype', 'dcim.delete_devicetype']
 | 
			
		||||
    template_name = 'dcim/devicetype_list.html'
 | 
			
		||||
 | 
			
		||||
@@ -269,11 +255,12 @@ def devicetype(request, pk):
 | 
			
		||||
    devicetype = get_object_or_404(DeviceType, pk=pk)
 | 
			
		||||
 | 
			
		||||
    # Component tables
 | 
			
		||||
    consoleport_table = ConsolePortTemplateTable(ConsolePortTemplate.objects.filter(device_type=devicetype))
 | 
			
		||||
    consoleserverport_table = ConsoleServerPortTemplateTable(ConsoleServerPortTemplate.objects.filter(device_type=devicetype))
 | 
			
		||||
    powerport_table = PowerPortTemplateTable(PowerPortTemplate.objects.filter(device_type=devicetype))
 | 
			
		||||
    poweroutlet_table = PowerOutletTemplateTable(PowerOutletTemplate.objects.filter(device_type=devicetype))
 | 
			
		||||
    interface_table = InterfaceTemplateTable(InterfaceTemplate.objects.filter(device_type=devicetype))
 | 
			
		||||
    consoleport_table = tables.ConsolePortTemplateTable(ConsolePortTemplate.objects.filter(device_type=devicetype))
 | 
			
		||||
    consoleserverport_table = tables.ConsoleServerPortTemplateTable(ConsoleServerPortTemplate.objects
 | 
			
		||||
                                                                    .filter(device_type=devicetype))
 | 
			
		||||
    powerport_table = tables.PowerPortTemplateTable(PowerPortTemplate.objects.filter(device_type=devicetype))
 | 
			
		||||
    poweroutlet_table = tables.PowerOutletTemplateTable(PowerOutletTemplate.objects.filter(device_type=devicetype))
 | 
			
		||||
    interface_table = tables.InterfaceTemplateTable(InterfaceTemplate.objects.filter(device_type=devicetype))
 | 
			
		||||
    if request.user.has_perm('dcim.change_devicetype'):
 | 
			
		||||
        consoleport_table.base_columns['pk'].visible = True
 | 
			
		||||
        consoleserverport_table.base_columns['pk'].visible = True
 | 
			
		||||
@@ -294,7 +281,7 @@ def devicetype(request, pk):
 | 
			
		||||
class DeviceTypeEditView(PermissionRequiredMixin, ObjectEditView):
 | 
			
		||||
    permission_required = 'dcim.change_devicetype'
 | 
			
		||||
    model = DeviceType
 | 
			
		||||
    form_class = DeviceTypeForm
 | 
			
		||||
    form_class = forms.DeviceTypeForm
 | 
			
		||||
    cancel_url = 'dcim:devicetype_list'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -307,7 +294,7 @@ class DeviceTypeDeleteView(PermissionRequiredMixin, ObjectDeleteView):
 | 
			
		||||
class DeviceTypeBulkEditView(PermissionRequiredMixin, BulkEditView):
 | 
			
		||||
    permission_required = 'dcim.change_devicetype'
 | 
			
		||||
    cls = DeviceType
 | 
			
		||||
    form = DeviceTypeBulkEditForm
 | 
			
		||||
    form = forms.DeviceTypeBulkEditForm
 | 
			
		||||
    template_name = 'dcim/devicetype_bulk_edit.html'
 | 
			
		||||
    default_redirect_url = 'dcim:devicetype_list'
 | 
			
		||||
 | 
			
		||||
@@ -325,7 +312,7 @@ class DeviceTypeBulkEditView(PermissionRequiredMixin, BulkEditView):
 | 
			
		||||
class DeviceTypeBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 | 
			
		||||
    permission_required = 'dcim.delete_devicetype'
 | 
			
		||||
    cls = DeviceType
 | 
			
		||||
    form = DeviceTypeBulkDeleteForm
 | 
			
		||||
    form = forms.DeviceTypeBulkDeleteForm
 | 
			
		||||
    default_redirect_url = 'dcim:devicetype_list'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -384,27 +371,27 @@ class ComponentTemplateCreateView(View):
 | 
			
		||||
 | 
			
		||||
class ConsolePortTemplateAddView(ComponentTemplateCreateView):
 | 
			
		||||
    model = ConsolePortTemplate
 | 
			
		||||
    form = ConsolePortTemplateForm
 | 
			
		||||
    form = forms.ConsolePortTemplateForm
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class ConsoleServerPortTemplateAddView(ComponentTemplateCreateView):
 | 
			
		||||
    model = ConsoleServerPortTemplate
 | 
			
		||||
    form = ConsoleServerPortTemplateForm
 | 
			
		||||
    form = forms.ConsoleServerPortTemplateForm
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PowerPortTemplateAddView(ComponentTemplateCreateView):
 | 
			
		||||
    model = PowerPortTemplate
 | 
			
		||||
    form = PowerPortTemplateForm
 | 
			
		||||
    form = forms.PowerPortTemplateForm
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PowerOutletTemplateAddView(ComponentTemplateCreateView):
 | 
			
		||||
    model = PowerOutletTemplate
 | 
			
		||||
    form = PowerOutletTemplateForm
 | 
			
		||||
    form = forms.PowerOutletTemplateForm
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class InterfaceTemplateAddView(ComponentTemplateCreateView):
 | 
			
		||||
    model = InterfaceTemplate
 | 
			
		||||
    form = InterfaceTemplateForm
 | 
			
		||||
    form = forms.InterfaceTemplateForm
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
def component_template_delete(request, pk, model):
 | 
			
		||||
@@ -452,7 +439,7 @@ def component_template_delete(request, pk, model):
 | 
			
		||||
 | 
			
		||||
class DeviceRoleListView(ObjectListView):
 | 
			
		||||
    queryset = DeviceRole.objects.annotate(device_count=Count('devices'))
 | 
			
		||||
    table = DeviceRoleTable
 | 
			
		||||
    table = tables.DeviceRoleTable
 | 
			
		||||
    edit_permissions = ['dcim.change_devicerole', 'dcim.delete_devicerole']
 | 
			
		||||
    template_name = 'dcim/devicerole_list.html'
 | 
			
		||||
 | 
			
		||||
@@ -460,7 +447,7 @@ class DeviceRoleListView(ObjectListView):
 | 
			
		||||
class DeviceRoleEditView(PermissionRequiredMixin, ObjectEditView):
 | 
			
		||||
    permission_required = 'dcim.change_devicerole'
 | 
			
		||||
    model = DeviceRole
 | 
			
		||||
    form_class = DeviceRoleForm
 | 
			
		||||
    form_class = forms.DeviceRoleForm
 | 
			
		||||
    success_url = 'dcim:devicerole_list'
 | 
			
		||||
    cancel_url = 'dcim:devicerole_list'
 | 
			
		||||
 | 
			
		||||
@@ -468,7 +455,7 @@ class DeviceRoleEditView(PermissionRequiredMixin, ObjectEditView):
 | 
			
		||||
class DeviceRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 | 
			
		||||
    permission_required = 'dcim.delete_devicerole'
 | 
			
		||||
    cls = DeviceRole
 | 
			
		||||
    form = DeviceRoleBulkDeleteForm
 | 
			
		||||
    form = forms.DeviceRoleBulkDeleteForm
 | 
			
		||||
    default_redirect_url = 'dcim:devicerole_list'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -478,7 +465,7 @@ class DeviceRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 | 
			
		||||
 | 
			
		||||
class PlatformListView(ObjectListView):
 | 
			
		||||
    queryset = Platform.objects.annotate(device_count=Count('devices'))
 | 
			
		||||
    table = PlatformTable
 | 
			
		||||
    table = tables.PlatformTable
 | 
			
		||||
    edit_permissions = ['dcim.change_platform', 'dcim.delete_platform']
 | 
			
		||||
    template_name = 'dcim/platform_list.html'
 | 
			
		||||
 | 
			
		||||
@@ -486,7 +473,7 @@ class PlatformListView(ObjectListView):
 | 
			
		||||
class PlatformEditView(PermissionRequiredMixin, ObjectEditView):
 | 
			
		||||
    permission_required = 'dcim.change_platform'
 | 
			
		||||
    model = Platform
 | 
			
		||||
    form_class = PlatformForm
 | 
			
		||||
    form_class = forms.PlatformForm
 | 
			
		||||
    success_url = 'dcim:platform_list'
 | 
			
		||||
    cancel_url = 'dcim:platform_list'
 | 
			
		||||
 | 
			
		||||
@@ -494,7 +481,7 @@ class PlatformEditView(PermissionRequiredMixin, ObjectEditView):
 | 
			
		||||
class PlatformBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 | 
			
		||||
    permission_required = 'dcim.delete_platform'
 | 
			
		||||
    cls = Platform
 | 
			
		||||
    form = PlatformBulkDeleteForm
 | 
			
		||||
    form = forms.PlatformBulkDeleteForm
 | 
			
		||||
    default_redirect_url = 'dcim:platform_list'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -505,9 +492,9 @@ class PlatformBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 | 
			
		||||
class DeviceListView(ObjectListView):
 | 
			
		||||
    queryset = Device.objects.select_related('device_type', 'device_type__manufacturer', 'device_role', 'rack',
 | 
			
		||||
                                             'rack__site', 'primary_ip')
 | 
			
		||||
    filter = DeviceFilter
 | 
			
		||||
    filter_form = DeviceFilterForm
 | 
			
		||||
    table = DeviceTable
 | 
			
		||||
    filter = filters.DeviceFilter
 | 
			
		||||
    filter_form = forms.DeviceFilterForm
 | 
			
		||||
    table = tables.DeviceTable
 | 
			
		||||
    edit_permissions = ['dcim.change_device', 'dcim.delete_device']
 | 
			
		||||
    template_name = 'dcim/device_list.html'
 | 
			
		||||
 | 
			
		||||
@@ -519,8 +506,10 @@ def device(request, pk):
 | 
			
		||||
    cs_ports = ConsoleServerPort.objects.filter(device=device).select_related('connected_console')
 | 
			
		||||
    power_ports = PowerPort.objects.filter(device=device).select_related('power_outlet__device')
 | 
			
		||||
    power_outlets = PowerOutlet.objects.filter(device=device).select_related('connected_port')
 | 
			
		||||
    interfaces = Interface.objects.filter(device=device, mgmt_only=False).select_related('connected_as_a', 'connected_as_b', 'circuit')
 | 
			
		||||
    mgmt_interfaces = Interface.objects.filter(device=device, mgmt_only=True).select_related('connected_as_a', 'connected_as_b', 'circuit')
 | 
			
		||||
    interfaces = Interface.objects.filter(device=device, mgmt_only=False)\
 | 
			
		||||
        .select_related('connected_as_a', 'connected_as_b', 'circuit')
 | 
			
		||||
    mgmt_interfaces = Interface.objects.filter(device=device, mgmt_only=True)\
 | 
			
		||||
        .select_related('connected_as_a', 'connected_as_b', 'circuit')
 | 
			
		||||
 | 
			
		||||
    # Gather any secrets which belong to this device
 | 
			
		||||
    secrets = device.secrets.all()
 | 
			
		||||
@@ -540,7 +529,8 @@ def device(request, pk):
 | 
			
		||||
        else:
 | 
			
		||||
            base_name = None
 | 
			
		||||
        if base_name:
 | 
			
		||||
            related_devices = Device.objects.filter(name__istartswith=base_name).exclude(pk=device.pk).select_related('rack', 'device_type__manufacturer')[:10]
 | 
			
		||||
            related_devices = Device.objects.filter(name__istartswith=base_name).exclude(pk=device.pk)\
 | 
			
		||||
                .select_related('rack', 'device_type__manufacturer')[:10]
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/device.html', {
 | 
			
		||||
        'device': device,
 | 
			
		||||
@@ -559,7 +549,7 @@ def device(request, pk):
 | 
			
		||||
class DeviceEditView(PermissionRequiredMixin, ObjectEditView):
 | 
			
		||||
    permission_required = 'dcim.change_device'
 | 
			
		||||
    model = Device
 | 
			
		||||
    form_class = DeviceForm
 | 
			
		||||
    form_class = forms.DeviceForm
 | 
			
		||||
    fields_initial = ['site', 'rack', 'position', 'face']
 | 
			
		||||
    template_name = 'dcim/device_edit.html'
 | 
			
		||||
    cancel_url = 'dcim:device_list'
 | 
			
		||||
@@ -573,8 +563,8 @@ class DeviceDeleteView(PermissionRequiredMixin, ObjectDeleteView):
 | 
			
		||||
 | 
			
		||||
class DeviceBulkImportView(PermissionRequiredMixin, BulkImportView):
 | 
			
		||||
    permission_required = 'dcim.add_device'
 | 
			
		||||
    form = DeviceImportForm
 | 
			
		||||
    table = DeviceImportTable
 | 
			
		||||
    form = forms.DeviceImportForm
 | 
			
		||||
    table = tables.DeviceImportTable
 | 
			
		||||
    template_name = 'dcim/device_import.html'
 | 
			
		||||
    obj_list_url = 'dcim:device_list'
 | 
			
		||||
 | 
			
		||||
@@ -582,7 +572,7 @@ class DeviceBulkImportView(PermissionRequiredMixin, BulkImportView):
 | 
			
		||||
class DeviceBulkEditView(PermissionRequiredMixin, BulkEditView):
 | 
			
		||||
    permission_required = 'dcim.change_device'
 | 
			
		||||
    cls = Device
 | 
			
		||||
    form = DeviceBulkEditForm
 | 
			
		||||
    form = forms.DeviceBulkEditForm
 | 
			
		||||
    template_name = 'dcim/device_bulk_edit.html'
 | 
			
		||||
    default_redirect_url = 'dcim:device_list'
 | 
			
		||||
 | 
			
		||||
@@ -607,7 +597,7 @@ class DeviceBulkEditView(PermissionRequiredMixin, BulkEditView):
 | 
			
		||||
class DeviceBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 | 
			
		||||
    permission_required = 'dcim.delete_device'
 | 
			
		||||
    cls = Device
 | 
			
		||||
    form = DeviceBulkDeleteForm
 | 
			
		||||
    form = forms.DeviceBulkDeleteForm
 | 
			
		||||
    default_redirect_url = 'dcim:device_list'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -643,12 +633,12 @@ def consoleport_add(request, pk):
 | 
			
		||||
    device = get_object_or_404(Device, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = ConsolePortCreateForm(request.POST)
 | 
			
		||||
        form = forms.ConsolePortCreateForm(request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
 | 
			
		||||
            console_ports = []
 | 
			
		||||
            for name in form.cleaned_data['name_pattern']:
 | 
			
		||||
                cp_form = ConsolePortForm({
 | 
			
		||||
                cp_form = forms.ConsolePortForm({
 | 
			
		||||
                    'device': device.pk,
 | 
			
		||||
                    'name': name,
 | 
			
		||||
                })
 | 
			
		||||
@@ -666,7 +656,7 @@ def consoleport_add(request, pk):
 | 
			
		||||
                    return redirect('dcim:device', pk=device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = ConsolePortCreateForm()
 | 
			
		||||
        form = forms.ConsolePortCreateForm()
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/consoleport_edit.html', {
 | 
			
		||||
        'device': device,
 | 
			
		||||
@@ -681,7 +671,7 @@ def consoleport_connect(request, pk):
 | 
			
		||||
    consoleport = get_object_or_404(ConsolePort, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = ConsolePortConnectionForm(request.POST, instance=consoleport)
 | 
			
		||||
        form = forms.ConsolePortConnectionForm(request.POST, instance=consoleport)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            consoleport = form.save()
 | 
			
		||||
            messages.success(request, "Connected {0} {1} to {2} {3}".format(
 | 
			
		||||
@@ -693,7 +683,7 @@ def consoleport_connect(request, pk):
 | 
			
		||||
            return redirect('dcim:device', pk=consoleport.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = ConsolePortConnectionForm(instance=consoleport, initial={
 | 
			
		||||
        form = forms.ConsolePortConnectionForm(instance=consoleport, initial={
 | 
			
		||||
            'rack': consoleport.device.rack,
 | 
			
		||||
            'connection_status': CONNECTION_STATUS_CONNECTED,
 | 
			
		||||
        })
 | 
			
		||||
@@ -711,7 +701,8 @@ def consoleport_disconnect(request, pk):
 | 
			
		||||
    consoleport = get_object_or_404(ConsolePort, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if not consoleport.cs_port:
 | 
			
		||||
        messages.warning(request, "Cannot disconnect console port {0}: It is not connected to anything".format(consoleport))
 | 
			
		||||
        messages.warning(request, "Cannot disconnect console port {0}: It is not connected to anything"
 | 
			
		||||
                         .format(consoleport))
 | 
			
		||||
        return redirect('dcim:device', pk=consoleport.device.pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
@@ -739,14 +730,14 @@ def consoleport_edit(request, pk):
 | 
			
		||||
    consoleport = get_object_or_404(ConsolePort, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = ConsolePortForm(request.POST, instance=consoleport)
 | 
			
		||||
        form = forms.ConsolePortForm(request.POST, instance=consoleport)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            consoleport = form.save()
 | 
			
		||||
            messages.success(request, "Modified {0} {1}".format(consoleport.device.name, consoleport.name))
 | 
			
		||||
            return redirect('dcim:device', pk=consoleport.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = ConsolePortForm(instance=consoleport)
 | 
			
		||||
        form = forms.ConsolePortForm(instance=consoleport)
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/consoleport_edit.html', {
 | 
			
		||||
        'consoleport': consoleport,
 | 
			
		||||
@@ -764,7 +755,8 @@ def consoleport_delete(request, pk):
 | 
			
		||||
        form = ConfirmationForm(request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            consoleport.delete()
 | 
			
		||||
            messages.success(request, "Console port {0} has been deleted from {1}".format(consoleport, consoleport.device))
 | 
			
		||||
            messages.success(request, "Console port {0} has been deleted from {1}".format(consoleport,
 | 
			
		||||
                                                                                          consoleport.device))
 | 
			
		||||
            return redirect('dcim:device', pk=consoleport.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
@@ -779,8 +771,8 @@ def consoleport_delete(request, pk):
 | 
			
		||||
 | 
			
		||||
class ConsoleConnectionsBulkImportView(PermissionRequiredMixin, BulkImportView):
 | 
			
		||||
    permission_required = 'dcim.change_consoleport'
 | 
			
		||||
    form = ConsoleConnectionImportForm
 | 
			
		||||
    table = ConsoleConnectionTable
 | 
			
		||||
    form = forms.ConsoleConnectionImportForm
 | 
			
		||||
    table = tables.ConsoleConnectionTable
 | 
			
		||||
    template_name = 'dcim/console_connections_import.html'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -794,12 +786,12 @@ def consoleserverport_add(request, pk):
 | 
			
		||||
    device = get_object_or_404(Device, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = ConsoleServerPortCreateForm(request.POST)
 | 
			
		||||
        form = forms.ConsoleServerPortCreateForm(request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
 | 
			
		||||
            cs_ports = []
 | 
			
		||||
            for name in form.cleaned_data['name_pattern']:
 | 
			
		||||
                csp_form = ConsoleServerPortForm({
 | 
			
		||||
                csp_form = forms.ConsoleServerPortForm({
 | 
			
		||||
                    'device': device.pk,
 | 
			
		||||
                    'name': name,
 | 
			
		||||
                })
 | 
			
		||||
@@ -818,7 +810,7 @@ def consoleserverport_add(request, pk):
 | 
			
		||||
                    return redirect('dcim:device', pk=device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = ConsoleServerPortCreateForm()
 | 
			
		||||
        form = forms.ConsoleServerPortCreateForm()
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/consoleserverport_edit.html', {
 | 
			
		||||
        'device': device,
 | 
			
		||||
@@ -833,7 +825,7 @@ def consoleserverport_connect(request, pk):
 | 
			
		||||
    consoleserverport = get_object_or_404(ConsoleServerPort, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = ConsoleServerPortConnectionForm(consoleserverport, request.POST)
 | 
			
		||||
        form = forms.ConsoleServerPortConnectionForm(consoleserverport, request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            consoleport = form.cleaned_data['port']
 | 
			
		||||
            consoleport.cs_port = consoleserverport
 | 
			
		||||
@@ -848,7 +840,7 @@ def consoleserverport_connect(request, pk):
 | 
			
		||||
            return redirect('dcim:device', pk=consoleserverport.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = ConsoleServerPortConnectionForm(consoleserverport, initial={'rack': consoleserverport.device.rack})
 | 
			
		||||
        form = forms.ConsoleServerPortConnectionForm(consoleserverport, initial={'rack': consoleserverport.device.rack})
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/consoleserverport_connect.html', {
 | 
			
		||||
        'consoleserverport': consoleserverport,
 | 
			
		||||
@@ -863,7 +855,8 @@ def consoleserverport_disconnect(request, pk):
 | 
			
		||||
    consoleserverport = get_object_or_404(ConsoleServerPort, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if not hasattr(consoleserverport, 'connected_console'):
 | 
			
		||||
        messages.warning(request, "Cannot disconnect console server port {0}: Nothing is connected to it".format(consoleserverport))
 | 
			
		||||
        messages.warning(request, "Cannot disconnect console server port {0}: Nothing is connected to it"
 | 
			
		||||
                         .format(consoleserverport))
 | 
			
		||||
        return redirect('dcim:device', pk=consoleserverport.device.pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
@@ -892,14 +885,14 @@ def consoleserverport_edit(request, pk):
 | 
			
		||||
    consoleserverport = get_object_or_404(ConsoleServerPort, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = ConsoleServerPortForm(request.POST, instance=consoleserverport)
 | 
			
		||||
        form = forms.ConsoleServerPortForm(request.POST, instance=consoleserverport)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            consoleserverport = form.save()
 | 
			
		||||
            messages.success(request, "Modified {0} {1}".format(consoleserverport.device.name, consoleserverport.name))
 | 
			
		||||
            return redirect('dcim:device', pk=consoleserverport.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = ConsoleServerPortForm(instance=consoleserverport)
 | 
			
		||||
        form = forms.ConsoleServerPortForm(instance=consoleserverport)
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/consoleserverport_edit.html', {
 | 
			
		||||
        'consoleserverport': consoleserverport,
 | 
			
		||||
@@ -917,7 +910,8 @@ def consoleserverport_delete(request, pk):
 | 
			
		||||
        form = ConfirmationForm(request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            consoleserverport.delete()
 | 
			
		||||
            messages.success(request, "Console server port {0} has been deleted from {1}".format(consoleserverport, consoleserverport.device))
 | 
			
		||||
            messages.success(request, "Console server port {0} has been deleted from {1}"
 | 
			
		||||
                             .format(consoleserverport, consoleserverport.device))
 | 
			
		||||
            return redirect('dcim:device', pk=consoleserverport.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
@@ -940,12 +934,12 @@ def powerport_add(request, pk):
 | 
			
		||||
    device = get_object_or_404(Device, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = PowerPortCreateForm(request.POST)
 | 
			
		||||
        form = forms.PowerPortCreateForm(request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
 | 
			
		||||
            power_ports = []
 | 
			
		||||
            for name in form.cleaned_data['name_pattern']:
 | 
			
		||||
                pp_form = PowerPortForm({
 | 
			
		||||
                pp_form = forms.PowerPortForm({
 | 
			
		||||
                    'device': device.pk,
 | 
			
		||||
                    'name': name,
 | 
			
		||||
                })
 | 
			
		||||
@@ -963,7 +957,7 @@ def powerport_add(request, pk):
 | 
			
		||||
                    return redirect('dcim:device', pk=device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = PowerPortCreateForm()
 | 
			
		||||
        form = forms.PowerPortCreateForm()
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/powerport_edit.html', {
 | 
			
		||||
        'device': device,
 | 
			
		||||
@@ -978,7 +972,7 @@ def powerport_connect(request, pk):
 | 
			
		||||
    powerport = get_object_or_404(PowerPort, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = PowerPortConnectionForm(request.POST, instance=powerport)
 | 
			
		||||
        form = forms.PowerPortConnectionForm(request.POST, instance=powerport)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            powerport = form.save()
 | 
			
		||||
            messages.success(request, "Connected {0} {1} to {2} {3}".format(
 | 
			
		||||
@@ -990,7 +984,7 @@ def powerport_connect(request, pk):
 | 
			
		||||
            return redirect('dcim:device', pk=powerport.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = PowerPortConnectionForm(instance=powerport, initial={
 | 
			
		||||
        form = forms.PowerPortConnectionForm(instance=powerport, initial={
 | 
			
		||||
            'rack': powerport.device.rack,
 | 
			
		||||
            'connection_status': CONNECTION_STATUS_CONNECTED,
 | 
			
		||||
        })
 | 
			
		||||
@@ -1008,7 +1002,8 @@ def powerport_disconnect(request, pk):
 | 
			
		||||
    powerport = get_object_or_404(PowerPort, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if not powerport.power_outlet:
 | 
			
		||||
        messages.warning(request, "Cannot disconnect power port {0}: It is not connected to an outlet".format(powerport))
 | 
			
		||||
        messages.warning(request, "Cannot disconnect power port {0}: It is not connected to an outlet"
 | 
			
		||||
                         .format(powerport))
 | 
			
		||||
        return redirect('dcim:device', pk=powerport.device.pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
@@ -1036,14 +1031,14 @@ def powerport_edit(request, pk):
 | 
			
		||||
    powerport = get_object_or_404(PowerPort, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = PowerPortForm(request.POST, instance=powerport)
 | 
			
		||||
        form = forms.PowerPortForm(request.POST, instance=powerport)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            powerport = form.save()
 | 
			
		||||
            messages.success(request, "Modified {0} power port {1}".format(powerport.device.name, powerport.name))
 | 
			
		||||
            return redirect('dcim:device', pk=powerport.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = PowerPortForm(instance=powerport)
 | 
			
		||||
        form = forms.PowerPortForm(instance=powerport)
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/powerport_edit.html', {
 | 
			
		||||
        'powerport': powerport,
 | 
			
		||||
@@ -1076,8 +1071,8 @@ def powerport_delete(request, pk):
 | 
			
		||||
 | 
			
		||||
class PowerConnectionsBulkImportView(PermissionRequiredMixin, BulkImportView):
 | 
			
		||||
    permission_required = 'dcim.change_powerport'
 | 
			
		||||
    form = PowerConnectionImportForm
 | 
			
		||||
    table = PowerConnectionTable
 | 
			
		||||
    form = forms.PowerConnectionImportForm
 | 
			
		||||
    table = tables.PowerConnectionTable
 | 
			
		||||
    template_name = 'dcim/power_connections_import.html'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1091,12 +1086,12 @@ def poweroutlet_add(request, pk):
 | 
			
		||||
    device = get_object_or_404(Device, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = PowerOutletCreateForm(request.POST)
 | 
			
		||||
        form = forms.PowerOutletCreateForm(request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
 | 
			
		||||
            power_outlets = []
 | 
			
		||||
            for name in form.cleaned_data['name_pattern']:
 | 
			
		||||
                po_form = PowerOutletForm({
 | 
			
		||||
                po_form = forms.PowerOutletForm({
 | 
			
		||||
                    'device': device.pk,
 | 
			
		||||
                    'name': name,
 | 
			
		||||
                })
 | 
			
		||||
@@ -1114,7 +1109,7 @@ def poweroutlet_add(request, pk):
 | 
			
		||||
                    return redirect('dcim:device', pk=device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = PowerOutletCreateForm()
 | 
			
		||||
        form = forms.PowerOutletCreateForm()
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/poweroutlet_edit.html', {
 | 
			
		||||
        'device': device,
 | 
			
		||||
@@ -1129,7 +1124,7 @@ def poweroutlet_connect(request, pk):
 | 
			
		||||
    poweroutlet = get_object_or_404(PowerOutlet, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = PowerOutletConnectionForm(poweroutlet, request.POST)
 | 
			
		||||
        form = forms.PowerOutletConnectionForm(poweroutlet, request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            powerport = form.cleaned_data['port']
 | 
			
		||||
            powerport.power_outlet = poweroutlet
 | 
			
		||||
@@ -1144,7 +1139,7 @@ def poweroutlet_connect(request, pk):
 | 
			
		||||
            return redirect('dcim:device', pk=poweroutlet.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = PowerOutletConnectionForm(poweroutlet, initial={'rack': poweroutlet.device.rack})
 | 
			
		||||
        form = forms.PowerOutletConnectionForm(poweroutlet, initial={'rack': poweroutlet.device.rack})
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/poweroutlet_connect.html', {
 | 
			
		||||
        'poweroutlet': poweroutlet,
 | 
			
		||||
@@ -1188,14 +1183,14 @@ def poweroutlet_edit(request, pk):
 | 
			
		||||
    poweroutlet = get_object_or_404(PowerOutlet, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = PowerOutletForm(request.POST, instance=poweroutlet)
 | 
			
		||||
        form = forms.PowerOutletForm(request.POST, instance=poweroutlet)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            poweroutlet = form.save()
 | 
			
		||||
            messages.success(request, "Modified {0} power outlet {1}".format(poweroutlet.device.name, poweroutlet.name))
 | 
			
		||||
            return redirect('dcim:device', pk=poweroutlet.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = PowerOutletForm(instance=poweroutlet)
 | 
			
		||||
        form = forms.PowerOutletForm(instance=poweroutlet)
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/poweroutlet_edit.html', {
 | 
			
		||||
        'poweroutlet': poweroutlet,
 | 
			
		||||
@@ -1213,7 +1208,8 @@ def poweroutlet_delete(request, pk):
 | 
			
		||||
        form = ConfirmationForm(request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            poweroutlet.delete()
 | 
			
		||||
            messages.success(request, "Power outlet {0} has been deleted from {1}".format(poweroutlet, poweroutlet.device))
 | 
			
		||||
            messages.success(request, "Power outlet {0} has been deleted from {1}".format(poweroutlet,
 | 
			
		||||
                                                                                          poweroutlet.device))
 | 
			
		||||
            return redirect('dcim:device', pk=poweroutlet.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
@@ -1236,12 +1232,12 @@ def interface_add(request, pk):
 | 
			
		||||
    device = get_object_or_404(Device, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = InterfaceCreateForm(request.POST)
 | 
			
		||||
        form = forms.InterfaceCreateForm(request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
 | 
			
		||||
            interfaces = []
 | 
			
		||||
            for name in form.cleaned_data['name_pattern']:
 | 
			
		||||
                iface_form = InterfaceForm({
 | 
			
		||||
                iface_form = forms.InterfaceForm({
 | 
			
		||||
                    'device': device.pk,
 | 
			
		||||
                    'name': name,
 | 
			
		||||
                    'form_factor': form.cleaned_data['form_factor'],
 | 
			
		||||
@@ -1262,7 +1258,7 @@ def interface_add(request, pk):
 | 
			
		||||
                    return redirect('dcim:device', pk=device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = InterfaceCreateForm()
 | 
			
		||||
        form = forms.InterfaceCreateForm()
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/interface_edit.html', {
 | 
			
		||||
        'device': device,
 | 
			
		||||
@@ -1277,14 +1273,14 @@ def interface_edit(request, pk):
 | 
			
		||||
    interface = get_object_or_404(Interface, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = InterfaceForm(request.POST, instance=interface)
 | 
			
		||||
        form = forms.InterfaceForm(request.POST, instance=interface)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            interface = form.save()
 | 
			
		||||
            messages.success(request, "Modified {0} interface {1}".format(interface.device.name, interface.name))
 | 
			
		||||
            return redirect('dcim:device', pk=interface.device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = InterfaceForm(instance=interface)
 | 
			
		||||
        form = forms.InterfaceForm(instance=interface)
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/interface_edit.html', {
 | 
			
		||||
        'interface': interface,
 | 
			
		||||
@@ -1318,7 +1314,7 @@ def interface_delete(request, pk):
 | 
			
		||||
class InterfaceBulkAddView(PermissionRequiredMixin, BulkEditView):
 | 
			
		||||
    permission_required = 'dcim.add_interface'
 | 
			
		||||
    cls = Device
 | 
			
		||||
    form = InterfaceBulkCreateForm
 | 
			
		||||
    form = forms.InterfaceBulkCreateForm
 | 
			
		||||
    template_name = 'dcim/interface_bulk_add.html'
 | 
			
		||||
    default_redirect_url = 'dcim:device_list'
 | 
			
		||||
 | 
			
		||||
@@ -1329,7 +1325,7 @@ class InterfaceBulkAddView(PermissionRequiredMixin, BulkEditView):
 | 
			
		||||
 | 
			
		||||
        for device in selected_devices:
 | 
			
		||||
            for name in form.cleaned_data['name_pattern']:
 | 
			
		||||
                iface_form = InterfaceForm({
 | 
			
		||||
                iface_form = forms.InterfaceForm({
 | 
			
		||||
                    'device': device.pk,
 | 
			
		||||
                    'name': name,
 | 
			
		||||
                    'form_factor': form.cleaned_data['form_factor'],
 | 
			
		||||
@@ -1357,7 +1353,7 @@ def interfaceconnection_add(request, pk):
 | 
			
		||||
    device = get_object_or_404(Device, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = InterfaceConnectionForm(device, request.POST)
 | 
			
		||||
        form = forms.InterfaceConnectionForm(device, request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            interfaceconnection = form.save()
 | 
			
		||||
            messages.success(request, "Connected {0} {1} to {2} {3}".format(
 | 
			
		||||
@@ -1377,7 +1373,7 @@ def interfaceconnection_add(request, pk):
 | 
			
		||||
                return redirect('dcim:device', pk=device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = InterfaceConnectionForm(device, initial={
 | 
			
		||||
        form = forms.InterfaceConnectionForm(device, initial={
 | 
			
		||||
            'interface_a': request.GET.get('interface', None),
 | 
			
		||||
            'rack_b': request.GET.get('rack_b', None),
 | 
			
		||||
            'device_b': request.GET.get('device_b', None),
 | 
			
		||||
@@ -1397,7 +1393,7 @@ def interfaceconnection_delete(request, pk):
 | 
			
		||||
    device_id = request.GET.get('device', None)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = InterfaceConnectionDeletionForm(request.POST)
 | 
			
		||||
        form = forms.InterfaceConnectionDeletionForm(request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
            interfaceconnection.delete()
 | 
			
		||||
            messages.success(request, "Deleted the connection between {0} {1} and {2} {3}".format(
 | 
			
		||||
@@ -1412,7 +1408,7 @@ def interfaceconnection_delete(request, pk):
 | 
			
		||||
                return redirect('dcim:device_list')
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = InterfaceConnectionDeletionForm(initial={
 | 
			
		||||
        form = forms.InterfaceConnectionDeletionForm(initial={
 | 
			
		||||
            'device': device_id,
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
@@ -1432,8 +1428,8 @@ def interfaceconnection_delete(request, pk):
 | 
			
		||||
 | 
			
		||||
class InterfaceConnectionsBulkImportView(PermissionRequiredMixin, BulkImportView):
 | 
			
		||||
    permission_required = 'dcim.change_interface'
 | 
			
		||||
    form = InterfaceConnectionImportForm
 | 
			
		||||
    table = InterfaceConnectionTable
 | 
			
		||||
    form = forms.InterfaceConnectionImportForm
 | 
			
		||||
    table = tables.InterfaceConnectionTable
 | 
			
		||||
    template_name = 'dcim/interface_connections_import.html'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1444,27 +1440,27 @@ class InterfaceConnectionsBulkImportView(PermissionRequiredMixin, BulkImportView
 | 
			
		||||
class ConsoleConnectionsListView(ObjectListView):
 | 
			
		||||
    queryset = ConsolePort.objects.select_related('device', 'cs_port__device').filter(cs_port__isnull=False)\
 | 
			
		||||
        .order_by('cs_port__device__name', 'cs_port__name')
 | 
			
		||||
    filter = ConsoleConnectionFilter
 | 
			
		||||
    filter_form = ConsoleConnectionFilterForm
 | 
			
		||||
    table = ConsoleConnectionTable
 | 
			
		||||
    filter = filters.ConsoleConnectionFilter
 | 
			
		||||
    filter_form = forms.ConsoleConnectionFilterForm
 | 
			
		||||
    table = tables.ConsoleConnectionTable
 | 
			
		||||
    template_name = 'dcim/console_connections_list.html'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class PowerConnectionsListView(ObjectListView):
 | 
			
		||||
    queryset = PowerPort.objects.select_related('device', 'power_outlet__device').filter(power_outlet__isnull=False)\
 | 
			
		||||
        .order_by('power_outlet__device__name', 'power_outlet__name')
 | 
			
		||||
    filter = PowerConnectionFilter
 | 
			
		||||
    filter_form = PowerConnectionFilterForm
 | 
			
		||||
    table = PowerConnectionTable
 | 
			
		||||
    filter = filters.PowerConnectionFilter
 | 
			
		||||
    filter_form = forms.PowerConnectionFilterForm
 | 
			
		||||
    table = tables.PowerConnectionTable
 | 
			
		||||
    template_name = 'dcim/power_connections_list.html'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class InterfaceConnectionsListView(ObjectListView):
 | 
			
		||||
    queryset = InterfaceConnection.objects.select_related('interface_a__device', 'interface_b__device')\
 | 
			
		||||
        .order_by('interface_a__device__name', 'interface_a__name')
 | 
			
		||||
    filter = InterfaceConnectionFilter
 | 
			
		||||
    filter_form = InterfaceConnectionFilterForm
 | 
			
		||||
    table = InterfaceConnectionTable
 | 
			
		||||
    filter = filters.InterfaceConnectionFilter
 | 
			
		||||
    filter_form = forms.InterfaceConnectionFilterForm
 | 
			
		||||
    table = tables.InterfaceConnectionTable
 | 
			
		||||
    template_name = 'dcim/interface_connections_list.html'
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@@ -1478,13 +1474,14 @@ def ipaddress_assign(request, pk):
 | 
			
		||||
    device = get_object_or_404(Device, pk=pk)
 | 
			
		||||
 | 
			
		||||
    if request.method == 'POST':
 | 
			
		||||
        form = IPAddressForm(device, request.POST)
 | 
			
		||||
        form = forms.IPAddressForm(device, request.POST)
 | 
			
		||||
        if form.is_valid():
 | 
			
		||||
 | 
			
		||||
            ipaddress = form.save(commit=False)
 | 
			
		||||
            ipaddress.interface = form.cleaned_data['interface']
 | 
			
		||||
            ipaddress.save()
 | 
			
		||||
            messages.success(request, "Added new IP address {0} to interface {1}".format(ipaddress, ipaddress.interface))
 | 
			
		||||
            messages.success(request, "Added new IP address {0} to interface {1}".format(ipaddress,
 | 
			
		||||
                                                                                         ipaddress.interface))
 | 
			
		||||
 | 
			
		||||
            if form.cleaned_data['set_as_primary']:
 | 
			
		||||
                device.primary_ip = ipaddress
 | 
			
		||||
@@ -1496,7 +1493,7 @@ def ipaddress_assign(request, pk):
 | 
			
		||||
                return redirect('dcim:device', pk=device.pk)
 | 
			
		||||
 | 
			
		||||
    else:
 | 
			
		||||
        form = IPAddressForm(device)
 | 
			
		||||
        form = forms.IPAddressForm(device)
 | 
			
		||||
 | 
			
		||||
    return render(request, 'dcim/ipaddress_assign.html', {
 | 
			
		||||
        'device': device,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user