|
@@ -1,3 +1,4 @@
|
|
|
|
|
+from copy import deepcopy
|
|
|
import re
|
|
import re
|
|
|
from natsort import natsorted
|
|
from natsort import natsorted
|
|
|
from operator import attrgetter
|
|
from operator import attrgetter
|
|
@@ -7,8 +8,8 @@ from django.contrib.auth.decorators import permission_required
|
|
|
from django.contrib.auth.mixins import PermissionRequiredMixin
|
|
from django.contrib.auth.mixins import PermissionRequiredMixin
|
|
|
from django.core.exceptions import ValidationError
|
|
from django.core.exceptions import ValidationError
|
|
|
from django.core.urlresolvers import reverse
|
|
from django.core.urlresolvers import reverse
|
|
|
-from django.db.models import Count, Sum
|
|
|
|
|
-from django.db.models.functions import Coalesce
|
|
|
|
|
|
|
+from django.db import transaction
|
|
|
|
|
+from django.db.models import Count
|
|
|
from django.http import HttpResponseRedirect
|
|
from django.http import HttpResponseRedirect
|
|
|
from django.shortcuts import get_object_or_404, redirect, render
|
|
from django.shortcuts import get_object_or_404, redirect, render
|
|
|
from django.utils.http import urlencode
|
|
from django.utils.http import urlencode
|
|
@@ -181,8 +182,7 @@ class RackRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
|
|
|
class RackListView(ObjectListView):
|
|
class RackListView(ObjectListView):
|
|
|
queryset = Rack.objects.select_related('site', 'group', 'tenant', 'role').prefetch_related('devices__device_type')\
|
|
queryset = Rack.objects.select_related('site', 'group', 'tenant', 'role').prefetch_related('devices__device_type')\
|
|
|
- .annotate(device_count=Count('devices', distinct=True),
|
|
|
|
|
- u_consumed=Coalesce(Sum('devices__device_type__u_height'), 0))
|
|
|
|
|
|
|
+ .annotate(device_count=Count('devices', distinct=True))
|
|
|
filter = filters.RackFilter
|
|
filter = filters.RackFilter
|
|
|
filter_form = forms.RackFilterForm
|
|
filter_form = forms.RackFilterForm
|
|
|
table = tables.RackTable
|
|
table = tables.RackTable
|
|
@@ -275,7 +275,7 @@ class ManufacturerBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
#
|
|
#
|
|
|
|
|
|
|
|
class DeviceTypeListView(ObjectListView):
|
|
class DeviceTypeListView(ObjectListView):
|
|
|
- queryset = DeviceType.objects.select_related('manufacturer')
|
|
|
|
|
|
|
+ queryset = DeviceType.objects.select_related('manufacturer').annotate(instance_count=Count('instances'))
|
|
|
filter = filters.DeviceTypeFilter
|
|
filter = filters.DeviceTypeFilter
|
|
|
filter_form = forms.DeviceTypeFilterForm
|
|
filter_form = forms.DeviceTypeFilterForm
|
|
|
table = tables.DeviceTypeTable
|
|
table = tables.DeviceTypeTable
|
|
@@ -394,7 +394,7 @@ class ComponentTemplateCreateView(View):
|
|
|
|
|
|
|
|
if not form.errors:
|
|
if not form.errors:
|
|
|
self.model.objects.bulk_create(component_templates)
|
|
self.model.objects.bulk_create(component_templates)
|
|
|
- messages.success(request, "Added {} component(s) to {}".format(len(component_templates), devicetype))
|
|
|
|
|
|
|
+ messages.success(request, u"Added {} component(s) to {}.".format(len(component_templates), devicetype))
|
|
|
if '_addanother' in request.POST:
|
|
if '_addanother' in request.POST:
|
|
|
return redirect(request.path)
|
|
return redirect(request.path)
|
|
|
else:
|
|
else:
|
|
@@ -574,7 +574,8 @@ def device(request, pk):
|
|
|
secrets = device.secrets.all()
|
|
secrets = device.secrets.all()
|
|
|
|
|
|
|
|
# Find all IP addresses assigned to this device
|
|
# Find all IP addresses assigned to this device
|
|
|
- ip_addresses = IPAddress.objects.filter(interface__device=device).select_related('interface').order_by('address')
|
|
|
|
|
|
|
+ ip_addresses = IPAddress.objects.filter(interface__device=device).select_related('interface', 'vrf')\
|
|
|
|
|
+ .order_by('address')
|
|
|
|
|
|
|
|
# Find any related devices for convenient linking in the UI
|
|
# Find any related devices for convenient linking in the UI
|
|
|
related_devices = []
|
|
related_devices = []
|
|
@@ -687,6 +688,80 @@ def device_lldp_neighbors(request, pk):
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class DeviceBulkAddComponentView(View):
|
|
|
|
|
+ """
|
|
|
|
|
+ Add one or more components (e.g. interfaces) to a selected set of Devices.
|
|
|
|
|
+ """
|
|
|
|
|
+ form = None
|
|
|
|
|
+ component_cls = None
|
|
|
|
|
+ component_form = None
|
|
|
|
|
+
|
|
|
|
|
+ def get(self):
|
|
|
|
|
+ return redirect('dcim:device_list')
|
|
|
|
|
+
|
|
|
|
|
+ def post(self, request):
|
|
|
|
|
+
|
|
|
|
|
+ # Are we editing *all* objects in the queryset or just a selected subset?
|
|
|
|
|
+ if request.POST.get('_all'):
|
|
|
|
|
+ pk_list = [int(pk) for pk in request.POST.get('pk_all').split(',') if pk]
|
|
|
|
|
+ else:
|
|
|
|
|
+ pk_list = [int(pk) for pk in request.POST.getlist('pk')]
|
|
|
|
|
+
|
|
|
|
|
+ if '_create' in request.POST:
|
|
|
|
|
+ form = self.form(request.POST)
|
|
|
|
|
+ if form.is_valid():
|
|
|
|
|
+
|
|
|
|
|
+ new_components = []
|
|
|
|
|
+ data = deepcopy(form.cleaned_data)
|
|
|
|
|
+ for device in data['pk']:
|
|
|
|
|
+
|
|
|
|
|
+ names = data['name_pattern']
|
|
|
|
|
+ for name in names:
|
|
|
|
|
+ component_data = {
|
|
|
|
|
+ 'device': device.pk,
|
|
|
|
|
+ 'name': name,
|
|
|
|
|
+ }
|
|
|
|
|
+ component_data.update(data)
|
|
|
|
|
+ component_form = self.component_form(component_data)
|
|
|
|
|
+ if component_form.is_valid():
|
|
|
|
|
+ new_components.append(component_form.save(commit=False))
|
|
|
|
|
+ else:
|
|
|
|
|
+ form.add_error('name_pattern', "Duplicate {} name for {}: {}".format(
|
|
|
|
|
+ self.component_cls._meta.verbose_name, device, name
|
|
|
|
|
+ ))
|
|
|
|
|
+
|
|
|
|
|
+ if not form.errors:
|
|
|
|
|
+ self.component_cls.objects.bulk_create(new_components)
|
|
|
|
|
+ messages.success(request, u"Added {} {} to {} devices.".format(
|
|
|
|
|
+ len(new_components), self.component_cls._meta.verbose_name_plural, len(form.cleaned_data['pk'])
|
|
|
|
|
+ ))
|
|
|
|
|
+ return redirect('dcim:device_list')
|
|
|
|
|
+
|
|
|
|
|
+ else:
|
|
|
|
|
+ form = self.form(initial={'pk': pk_list})
|
|
|
|
|
+
|
|
|
|
|
+ selected_devices = Device.objects.filter(pk__in=pk_list)
|
|
|
|
|
+ if not selected_devices:
|
|
|
|
|
+ messages.warning(request, u"No devices were selected.")
|
|
|
|
|
+ return redirect('dcim:device_list')
|
|
|
|
|
+
|
|
|
|
|
+ return render(request, 'dcim/device_bulk_add_component.html', {
|
|
|
|
|
+ 'form': form,
|
|
|
|
|
+ 'component_name': self.component_cls._meta.verbose_name_plural,
|
|
|
|
|
+ 'selected_devices': selected_devices,
|
|
|
|
|
+ 'cancel_url': reverse('dcim:device_list'),
|
|
|
|
|
+ })
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+class DeviceBulkAddInterfaceView(DeviceBulkAddComponentView):
|
|
|
|
|
+ """
|
|
|
|
|
+ Add one or more components (e.g. interfaces) to a selected set of Devices.
|
|
|
|
|
+ """
|
|
|
|
|
+ form = forms.DeviceBulkAddInterfaceForm
|
|
|
|
|
+ component_cls = Interface
|
|
|
|
|
+ component_form = forms.InterfaceForm
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
#
|
|
#
|
|
|
# Console ports
|
|
# Console ports
|
|
|
#
|
|
#
|
|
@@ -713,7 +788,7 @@ def consoleport_add(request, pk):
|
|
|
|
|
|
|
|
if not form.errors:
|
|
if not form.errors:
|
|
|
ConsolePort.objects.bulk_create(console_ports)
|
|
ConsolePort.objects.bulk_create(console_ports)
|
|
|
- messages.success(request, "Added {} console port(s) to {}".format(len(console_ports), device))
|
|
|
|
|
|
|
+ messages.success(request, u"Added {} console port(s) to {}.".format(len(console_ports), device))
|
|
|
if '_addanother' in request.POST:
|
|
if '_addanother' in request.POST:
|
|
|
return redirect('dcim:consoleport_add', pk=device.pk)
|
|
return redirect('dcim:consoleport_add', pk=device.pk)
|
|
|
else:
|
|
else:
|
|
@@ -722,8 +797,9 @@ def consoleport_add(request, pk):
|
|
|
else:
|
|
else:
|
|
|
form = forms.ConsolePortCreateForm()
|
|
form = forms.ConsolePortCreateForm()
|
|
|
|
|
|
|
|
- return render(request, 'dcim/consoleport_edit.html', {
|
|
|
|
|
|
|
+ return render(request, 'dcim/device_component_add.html', {
|
|
|
'device': device,
|
|
'device': device,
|
|
|
|
|
+ 'component_type': 'Console Port',
|
|
|
'form': form,
|
|
'form': form,
|
|
|
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}),
|
|
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}),
|
|
|
})
|
|
})
|
|
@@ -738,7 +814,7 @@ def consoleport_connect(request, pk):
|
|
|
form = forms.ConsolePortConnectionForm(request.POST, instance=consoleport)
|
|
form = forms.ConsolePortConnectionForm(request.POST, instance=consoleport)
|
|
|
if form.is_valid():
|
|
if form.is_valid():
|
|
|
consoleport = form.save()
|
|
consoleport = form.save()
|
|
|
- messages.success(request, "Connected {0} {1} to {2} {3}".format(
|
|
|
|
|
|
|
+ messages.success(request, u"Connected {} {} to {} {}.".format(
|
|
|
consoleport.device,
|
|
consoleport.device,
|
|
|
consoleport.name,
|
|
consoleport.name,
|
|
|
consoleport.cs_port.device,
|
|
consoleport.cs_port.device,
|
|
@@ -765,7 +841,7 @@ def consoleport_disconnect(request, pk):
|
|
|
consoleport = get_object_or_404(ConsolePort, pk=pk)
|
|
consoleport = get_object_or_404(ConsolePort, pk=pk)
|
|
|
|
|
|
|
|
if not consoleport.cs_port:
|
|
if not consoleport.cs_port:
|
|
|
- messages.warning(request, "Cannot disconnect console port {0}: It is not connected to anything"
|
|
|
|
|
|
|
+ messages.warning(request, u"Cannot disconnect console port {}: It is not connected to anything."
|
|
|
.format(consoleport))
|
|
.format(consoleport))
|
|
|
return redirect('dcim:device', pk=consoleport.device.pk)
|
|
return redirect('dcim:device', pk=consoleport.device.pk)
|
|
|
|
|
|
|
@@ -775,7 +851,7 @@ def consoleport_disconnect(request, pk):
|
|
|
consoleport.cs_port = None
|
|
consoleport.cs_port = None
|
|
|
consoleport.connection_status = None
|
|
consoleport.connection_status = None
|
|
|
consoleport.save()
|
|
consoleport.save()
|
|
|
- messages.success(request, "Console port {0} has been disconnected".format(consoleport))
|
|
|
|
|
|
|
+ messages.success(request, u"Console port {} has been disconnected.".format(consoleport))
|
|
|
return redirect('dcim:device', pk=consoleport.device.pk)
|
|
return redirect('dcim:device', pk=consoleport.device.pk)
|
|
|
|
|
|
|
|
else:
|
|
else:
|
|
@@ -788,49 +864,15 @@ def consoleport_disconnect(request, pk):
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
-@permission_required('dcim.change_consoleport')
|
|
|
|
|
-def consoleport_edit(request, pk):
|
|
|
|
|
-
|
|
|
|
|
- consoleport = get_object_or_404(ConsolePort, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- 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 = forms.ConsolePortForm(instance=consoleport)
|
|
|
|
|
-
|
|
|
|
|
- return render(request, 'dcim/consoleport_edit.html', {
|
|
|
|
|
- 'consoleport': consoleport,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device', kwargs={'pk': consoleport.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-@permission_required('dcim.delete_consoleport')
|
|
|
|
|
-def consoleport_delete(request, pk):
|
|
|
|
|
-
|
|
|
|
|
- consoleport = get_object_or_404(ConsolePort, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- 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))
|
|
|
|
|
- return redirect('dcim:device', pk=consoleport.device.pk)
|
|
|
|
|
|
|
+class ConsolePortEditView(PermissionRequiredMixin, ObjectEditView):
|
|
|
|
|
+ permission_required = 'dcim.change_consoleport'
|
|
|
|
|
+ model = ConsolePort
|
|
|
|
|
+ form_class = forms.ConsolePortForm
|
|
|
|
|
|
|
|
- else:
|
|
|
|
|
- form = ConfirmationForm()
|
|
|
|
|
|
|
|
|
|
- return render(request, 'dcim/consoleport_delete.html', {
|
|
|
|
|
- 'consoleport': consoleport,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device', kwargs={'pk': consoleport.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
|
|
+class ConsolePortDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_consoleport'
|
|
|
|
|
+ model = ConsolePort
|
|
|
|
|
|
|
|
|
|
|
|
|
class ConsolePortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
class ConsolePortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
@@ -873,7 +915,7 @@ def consoleserverport_add(request, pk):
|
|
|
|
|
|
|
|
if not form.errors:
|
|
if not form.errors:
|
|
|
ConsoleServerPort.objects.bulk_create(cs_ports)
|
|
ConsoleServerPort.objects.bulk_create(cs_ports)
|
|
|
- messages.success(request, "Added {} console server port(s) to {}".format(len(cs_ports), device))
|
|
|
|
|
|
|
+ messages.success(request, u"Added {} console server port(s) to {}.".format(len(cs_ports), device))
|
|
|
if '_addanother' in request.POST:
|
|
if '_addanother' in request.POST:
|
|
|
return redirect('dcim:consoleserverport_add', pk=device.pk)
|
|
return redirect('dcim:consoleserverport_add', pk=device.pk)
|
|
|
else:
|
|
else:
|
|
@@ -882,8 +924,9 @@ def consoleserverport_add(request, pk):
|
|
|
else:
|
|
else:
|
|
|
form = forms.ConsoleServerPortCreateForm()
|
|
form = forms.ConsoleServerPortCreateForm()
|
|
|
|
|
|
|
|
- return render(request, 'dcim/consoleserverport_edit.html', {
|
|
|
|
|
|
|
+ return render(request, 'dcim/device_component_add.html', {
|
|
|
'device': device,
|
|
'device': device,
|
|
|
|
|
+ 'component_type': 'Console Server Port',
|
|
|
'form': form,
|
|
'form': form,
|
|
|
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}),
|
|
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}),
|
|
|
})
|
|
})
|
|
@@ -901,7 +944,7 @@ def consoleserverport_connect(request, pk):
|
|
|
consoleport.cs_port = consoleserverport
|
|
consoleport.cs_port = consoleserverport
|
|
|
consoleport.connection_status = form.cleaned_data['connection_status']
|
|
consoleport.connection_status = form.cleaned_data['connection_status']
|
|
|
consoleport.save()
|
|
consoleport.save()
|
|
|
- messages.success(request, "Connected {0} {1} to {2} {3}".format(
|
|
|
|
|
|
|
+ messages.success(request, u"Connected {} {} to {} {}.".format(
|
|
|
consoleport.device,
|
|
consoleport.device,
|
|
|
consoleport.name,
|
|
consoleport.name,
|
|
|
consoleserverport.device,
|
|
consoleserverport.device,
|
|
@@ -925,7 +968,7 @@ def consoleserverport_disconnect(request, pk):
|
|
|
consoleserverport = get_object_or_404(ConsoleServerPort, pk=pk)
|
|
consoleserverport = get_object_or_404(ConsoleServerPort, pk=pk)
|
|
|
|
|
|
|
|
if not hasattr(consoleserverport, 'connected_console'):
|
|
if not hasattr(consoleserverport, 'connected_console'):
|
|
|
- messages.warning(request, "Cannot disconnect console server port {0}: Nothing is connected to it"
|
|
|
|
|
|
|
+ messages.warning(request, u"Cannot disconnect console server port {}: Nothing is connected to it."
|
|
|
.format(consoleserverport))
|
|
.format(consoleserverport))
|
|
|
return redirect('dcim:device', pk=consoleserverport.device.pk)
|
|
return redirect('dcim:device', pk=consoleserverport.device.pk)
|
|
|
|
|
|
|
@@ -936,7 +979,7 @@ def consoleserverport_disconnect(request, pk):
|
|
|
consoleport.cs_port = None
|
|
consoleport.cs_port = None
|
|
|
consoleport.connection_status = None
|
|
consoleport.connection_status = None
|
|
|
consoleport.save()
|
|
consoleport.save()
|
|
|
- messages.success(request, "Console server port {0} has been disconnected".format(consoleserverport))
|
|
|
|
|
|
|
+ messages.success(request, u"Console server port {} has been disconnected.".format(consoleserverport))
|
|
|
return redirect('dcim:device', pk=consoleserverport.device.pk)
|
|
return redirect('dcim:device', pk=consoleserverport.device.pk)
|
|
|
|
|
|
|
|
else:
|
|
else:
|
|
@@ -949,49 +992,15 @@ def consoleserverport_disconnect(request, pk):
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
-@permission_required('dcim.change_consoleserverport')
|
|
|
|
|
-def consoleserverport_edit(request, pk):
|
|
|
|
|
-
|
|
|
|
|
- consoleserverport = get_object_or_404(ConsoleServerPort, pk=pk)
|
|
|
|
|
|
|
+class ConsoleServerPortEditView(PermissionRequiredMixin, ObjectEditView):
|
|
|
|
|
+ permission_required = 'dcim.change_consoleserverport'
|
|
|
|
|
+ model = ConsoleServerPort
|
|
|
|
|
+ form_class = forms.ConsoleServerPortForm
|
|
|
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- 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 = forms.ConsoleServerPortForm(instance=consoleserverport)
|
|
|
|
|
-
|
|
|
|
|
- return render(request, 'dcim/consoleserverport_edit.html', {
|
|
|
|
|
- 'consoleserverport': consoleserverport,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device', kwargs={'pk': consoleserverport.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-@permission_required('dcim.delete_consoleserverport')
|
|
|
|
|
-def consoleserverport_delete(request, pk):
|
|
|
|
|
-
|
|
|
|
|
- consoleserverport = get_object_or_404(ConsoleServerPort, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- 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))
|
|
|
|
|
- return redirect('dcim:device', pk=consoleserverport.device.pk)
|
|
|
|
|
-
|
|
|
|
|
- else:
|
|
|
|
|
- form = ConfirmationForm()
|
|
|
|
|
-
|
|
|
|
|
- return render(request, 'dcim/consoleserverport_delete.html', {
|
|
|
|
|
- 'consoleserverport': consoleserverport,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device', kwargs={'pk': consoleserverport.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
|
|
+class ConsoleServerPortDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_consoleserverport'
|
|
|
|
|
+ model = ConsoleServerPort
|
|
|
|
|
|
|
|
|
|
|
|
|
class ConsoleServerPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
class ConsoleServerPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
@@ -1026,7 +1035,7 @@ def powerport_add(request, pk):
|
|
|
|
|
|
|
|
if not form.errors:
|
|
if not form.errors:
|
|
|
PowerPort.objects.bulk_create(power_ports)
|
|
PowerPort.objects.bulk_create(power_ports)
|
|
|
- messages.success(request, "Added {} power port(s) to {}".format(len(power_ports), device))
|
|
|
|
|
|
|
+ messages.success(request, u"Added {} power port(s) to {}.".format(len(power_ports), device))
|
|
|
if '_addanother' in request.POST:
|
|
if '_addanother' in request.POST:
|
|
|
return redirect('dcim:powerport_add', pk=device.pk)
|
|
return redirect('dcim:powerport_add', pk=device.pk)
|
|
|
else:
|
|
else:
|
|
@@ -1035,8 +1044,9 @@ def powerport_add(request, pk):
|
|
|
else:
|
|
else:
|
|
|
form = forms.PowerPortCreateForm()
|
|
form = forms.PowerPortCreateForm()
|
|
|
|
|
|
|
|
- return render(request, 'dcim/powerport_edit.html', {
|
|
|
|
|
|
|
+ return render(request, 'dcim/device_component_add.html', {
|
|
|
'device': device,
|
|
'device': device,
|
|
|
|
|
+ 'component_type': 'Power Port',
|
|
|
'form': form,
|
|
'form': form,
|
|
|
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}),
|
|
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}),
|
|
|
})
|
|
})
|
|
@@ -1051,7 +1061,7 @@ def powerport_connect(request, pk):
|
|
|
form = forms.PowerPortConnectionForm(request.POST, instance=powerport)
|
|
form = forms.PowerPortConnectionForm(request.POST, instance=powerport)
|
|
|
if form.is_valid():
|
|
if form.is_valid():
|
|
|
powerport = form.save()
|
|
powerport = form.save()
|
|
|
- messages.success(request, "Connected {0} {1} to {2} {3}".format(
|
|
|
|
|
|
|
+ messages.success(request, u"Connected {} {} to {} {}.".format(
|
|
|
powerport.device,
|
|
powerport.device,
|
|
|
powerport.name,
|
|
powerport.name,
|
|
|
powerport.power_outlet.device,
|
|
powerport.power_outlet.device,
|
|
@@ -1078,7 +1088,7 @@ def powerport_disconnect(request, pk):
|
|
|
powerport = get_object_or_404(PowerPort, pk=pk)
|
|
powerport = get_object_or_404(PowerPort, pk=pk)
|
|
|
|
|
|
|
|
if not powerport.power_outlet:
|
|
if not powerport.power_outlet:
|
|
|
- messages.warning(request, "Cannot disconnect power port {0}: It is not connected to an outlet"
|
|
|
|
|
|
|
+ messages.warning(request, u"Cannot disconnect power port {}: It is not connected to an outlet."
|
|
|
.format(powerport))
|
|
.format(powerport))
|
|
|
return redirect('dcim:device', pk=powerport.device.pk)
|
|
return redirect('dcim:device', pk=powerport.device.pk)
|
|
|
|
|
|
|
@@ -1088,7 +1098,7 @@ def powerport_disconnect(request, pk):
|
|
|
powerport.power_outlet = None
|
|
powerport.power_outlet = None
|
|
|
powerport.connection_status = None
|
|
powerport.connection_status = None
|
|
|
powerport.save()
|
|
powerport.save()
|
|
|
- messages.success(request, "Power port {0} has been disconnected".format(powerport))
|
|
|
|
|
|
|
+ messages.success(request, u"Power port {} has been disconnected.".format(powerport))
|
|
|
return redirect('dcim:device', pk=powerport.device.pk)
|
|
return redirect('dcim:device', pk=powerport.device.pk)
|
|
|
|
|
|
|
|
else:
|
|
else:
|
|
@@ -1101,48 +1111,15 @@ def powerport_disconnect(request, pk):
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
-@permission_required('dcim.change_powerport')
|
|
|
|
|
-def powerport_edit(request, pk):
|
|
|
|
|
-
|
|
|
|
|
- powerport = get_object_or_404(PowerPort, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- 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 = forms.PowerPortForm(instance=powerport)
|
|
|
|
|
-
|
|
|
|
|
- return render(request, 'dcim/powerport_edit.html', {
|
|
|
|
|
- 'powerport': powerport,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device', kwargs={'pk': powerport.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-@permission_required('dcim.delete_powerport')
|
|
|
|
|
-def powerport_delete(request, pk):
|
|
|
|
|
-
|
|
|
|
|
- powerport = get_object_or_404(PowerPort, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- form = ConfirmationForm(request.POST)
|
|
|
|
|
- if form.is_valid():
|
|
|
|
|
- powerport.delete()
|
|
|
|
|
- messages.success(request, "Power port {0} has been deleted from {1}".format(powerport, powerport.device))
|
|
|
|
|
- return redirect('dcim:device', pk=powerport.device.pk)
|
|
|
|
|
|
|
+class PowerPortEditView(PermissionRequiredMixin, ObjectEditView):
|
|
|
|
|
+ permission_required = 'dcim.change_powerport'
|
|
|
|
|
+ model = PowerPort
|
|
|
|
|
+ form_class = forms.PowerPortForm
|
|
|
|
|
|
|
|
- else:
|
|
|
|
|
- form = ConfirmationForm()
|
|
|
|
|
|
|
|
|
|
- return render(request, 'dcim/powerport_delete.html', {
|
|
|
|
|
- 'powerport': powerport,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device', kwargs={'pk': powerport.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
|
|
+class PowerPortDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_powerport'
|
|
|
|
|
+ model = PowerPort
|
|
|
|
|
|
|
|
|
|
|
|
|
class PowerPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
class PowerPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
@@ -1184,7 +1161,7 @@ def poweroutlet_add(request, pk):
|
|
|
|
|
|
|
|
if not form.errors:
|
|
if not form.errors:
|
|
|
PowerOutlet.objects.bulk_create(power_outlets)
|
|
PowerOutlet.objects.bulk_create(power_outlets)
|
|
|
- messages.success(request, "Added {} power outlet(s) to {}".format(len(power_outlets), device))
|
|
|
|
|
|
|
+ messages.success(request, u"Added {} power outlet(s) to {}.".format(len(power_outlets), device))
|
|
|
if '_addanother' in request.POST:
|
|
if '_addanother' in request.POST:
|
|
|
return redirect('dcim:poweroutlet_add', pk=device.pk)
|
|
return redirect('dcim:poweroutlet_add', pk=device.pk)
|
|
|
else:
|
|
else:
|
|
@@ -1193,8 +1170,9 @@ def poweroutlet_add(request, pk):
|
|
|
else:
|
|
else:
|
|
|
form = forms.PowerOutletCreateForm()
|
|
form = forms.PowerOutletCreateForm()
|
|
|
|
|
|
|
|
- return render(request, 'dcim/poweroutlet_edit.html', {
|
|
|
|
|
|
|
+ return render(request, 'dcim/device_component_add.html', {
|
|
|
'device': device,
|
|
'device': device,
|
|
|
|
|
+ 'component_type': 'Power Outlet',
|
|
|
'form': form,
|
|
'form': form,
|
|
|
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}),
|
|
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}),
|
|
|
})
|
|
})
|
|
@@ -1212,7 +1190,7 @@ def poweroutlet_connect(request, pk):
|
|
|
powerport.power_outlet = poweroutlet
|
|
powerport.power_outlet = poweroutlet
|
|
|
powerport.connection_status = form.cleaned_data['connection_status']
|
|
powerport.connection_status = form.cleaned_data['connection_status']
|
|
|
powerport.save()
|
|
powerport.save()
|
|
|
- messages.success(request, "Connected {0} {1} to {2} {3}".format(
|
|
|
|
|
|
|
+ messages.success(request, u"Connected {} {} to {} {}.".format(
|
|
|
powerport.device,
|
|
powerport.device,
|
|
|
powerport.name,
|
|
powerport.name,
|
|
|
poweroutlet.device,
|
|
poweroutlet.device,
|
|
@@ -1236,7 +1214,7 @@ def poweroutlet_disconnect(request, pk):
|
|
|
poweroutlet = get_object_or_404(PowerOutlet, pk=pk)
|
|
poweroutlet = get_object_or_404(PowerOutlet, pk=pk)
|
|
|
|
|
|
|
|
if not hasattr(poweroutlet, 'connected_port'):
|
|
if not hasattr(poweroutlet, 'connected_port'):
|
|
|
- messages.warning(request, "Cannot disconnect power outlet {0}: Nothing is connected to it".format(poweroutlet))
|
|
|
|
|
|
|
+ messages.warning(request, u"Cannot disconnect power outlet {}: Nothing is connected to it.".format(poweroutlet))
|
|
|
return redirect('dcim:device', pk=poweroutlet.device.pk)
|
|
return redirect('dcim:device', pk=poweroutlet.device.pk)
|
|
|
|
|
|
|
|
if request.method == 'POST':
|
|
if request.method == 'POST':
|
|
@@ -1246,7 +1224,7 @@ def poweroutlet_disconnect(request, pk):
|
|
|
powerport.power_outlet = None
|
|
powerport.power_outlet = None
|
|
|
powerport.connection_status = None
|
|
powerport.connection_status = None
|
|
|
powerport.save()
|
|
powerport.save()
|
|
|
- messages.success(request, "Power outlet {0} has been disconnected".format(poweroutlet))
|
|
|
|
|
|
|
+ messages.success(request, u"Power outlet {} has been disconnected.".format(poweroutlet))
|
|
|
return redirect('dcim:device', pk=poweroutlet.device.pk)
|
|
return redirect('dcim:device', pk=poweroutlet.device.pk)
|
|
|
|
|
|
|
|
else:
|
|
else:
|
|
@@ -1259,49 +1237,15 @@ def poweroutlet_disconnect(request, pk):
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
-@permission_required('dcim.change_poweroutlet')
|
|
|
|
|
-def poweroutlet_edit(request, pk):
|
|
|
|
|
|
|
+class PowerOutletEditView(PermissionRequiredMixin, ObjectEditView):
|
|
|
|
|
+ permission_required = 'dcim.change_poweroutlet'
|
|
|
|
|
+ model = PowerOutlet
|
|
|
|
|
+ form_class = forms.PowerOutletForm
|
|
|
|
|
|
|
|
- poweroutlet = get_object_or_404(PowerOutlet, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- 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 = forms.PowerOutletForm(instance=poweroutlet)
|
|
|
|
|
|
|
|
|
|
- return render(request, 'dcim/poweroutlet_edit.html', {
|
|
|
|
|
- 'poweroutlet': poweroutlet,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device', kwargs={'pk': poweroutlet.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-@permission_required('dcim.delete_poweroutlet')
|
|
|
|
|
-def poweroutlet_delete(request, pk):
|
|
|
|
|
-
|
|
|
|
|
- poweroutlet = get_object_or_404(PowerOutlet, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- 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))
|
|
|
|
|
- return redirect('dcim:device', pk=poweroutlet.device.pk)
|
|
|
|
|
-
|
|
|
|
|
- else:
|
|
|
|
|
- form = ConfirmationForm()
|
|
|
|
|
-
|
|
|
|
|
- return render(request, 'dcim/poweroutlet_delete.html', {
|
|
|
|
|
- 'poweroutlet': poweroutlet,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device', kwargs={'pk': poweroutlet.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
|
|
+class PowerOutletDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_poweroutlet'
|
|
|
|
|
+ model = PowerOutlet
|
|
|
|
|
|
|
|
|
|
|
|
|
class PowerOutletBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
class PowerOutletBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
@@ -1340,97 +1284,32 @@ def interface_add(request, pk):
|
|
|
|
|
|
|
|
if not form.errors:
|
|
if not form.errors:
|
|
|
Interface.objects.bulk_create(interfaces)
|
|
Interface.objects.bulk_create(interfaces)
|
|
|
- messages.success(request, "Added {} interface(s) to {}".format(len(interfaces), device))
|
|
|
|
|
|
|
+ messages.success(request, u"Added {} interface(s) to {}.".format(len(interfaces), device))
|
|
|
if '_addanother' in request.POST:
|
|
if '_addanother' in request.POST:
|
|
|
return redirect('dcim:interface_add', pk=device.pk)
|
|
return redirect('dcim:interface_add', pk=device.pk)
|
|
|
else:
|
|
else:
|
|
|
return redirect('dcim:device', pk=device.pk)
|
|
return redirect('dcim:device', pk=device.pk)
|
|
|
|
|
|
|
|
else:
|
|
else:
|
|
|
- form = forms.InterfaceCreateForm()
|
|
|
|
|
|
|
+ form = forms.InterfaceCreateForm(initial={'mgmt_only': request.GET.get('mgmt_only')})
|
|
|
|
|
|
|
|
- return render(request, 'dcim/interface_edit.html', {
|
|
|
|
|
|
|
+ return render(request, 'dcim/device_component_add.html', {
|
|
|
'device': device,
|
|
'device': device,
|
|
|
|
|
+ 'component_type': 'Interface',
|
|
|
'form': form,
|
|
'form': form,
|
|
|
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}),
|
|
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}),
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
-@permission_required('dcim.change_interface')
|
|
|
|
|
-def interface_edit(request, pk):
|
|
|
|
|
-
|
|
|
|
|
- interface = get_object_or_404(Interface, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- 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 = forms.InterfaceForm(instance=interface)
|
|
|
|
|
-
|
|
|
|
|
- return render(request, 'dcim/interface_edit.html', {
|
|
|
|
|
- 'interface': interface,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device', kwargs={'pk': interface.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-@permission_required('dcim.delete_interface')
|
|
|
|
|
-def interface_delete(request, pk):
|
|
|
|
|
-
|
|
|
|
|
- interface = get_object_or_404(Interface, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- form = ConfirmationForm(request.POST)
|
|
|
|
|
- if form.is_valid():
|
|
|
|
|
- interface.delete()
|
|
|
|
|
- messages.success(request, "Interface {0} has been deleted from {1}".format(interface, interface.device))
|
|
|
|
|
- return redirect('dcim:device', pk=interface.device.pk)
|
|
|
|
|
-
|
|
|
|
|
- else:
|
|
|
|
|
- form = ConfirmationForm()
|
|
|
|
|
-
|
|
|
|
|
- return render(request, 'dcim/interface_delete.html', {
|
|
|
|
|
- 'interface': interface,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device', kwargs={'pk': interface.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-class InterfaceBulkAddView(PermissionRequiredMixin, BulkEditView):
|
|
|
|
|
- permission_required = 'dcim.add_interface'
|
|
|
|
|
- cls = Device
|
|
|
|
|
- form = forms.InterfaceBulkCreateForm
|
|
|
|
|
- template_name = 'dcim/interface_add_multi.html'
|
|
|
|
|
- default_redirect_url = 'dcim:device_list'
|
|
|
|
|
-
|
|
|
|
|
- def update_objects(self, pk_list, form, fields):
|
|
|
|
|
-
|
|
|
|
|
- selected_devices = Device.objects.filter(pk__in=pk_list)
|
|
|
|
|
- interfaces = []
|
|
|
|
|
|
|
+class InterfaceEditView(PermissionRequiredMixin, ObjectEditView):
|
|
|
|
|
+ permission_required = 'dcim.change_interface'
|
|
|
|
|
+ model = Interface
|
|
|
|
|
+ form_class = forms.InterfaceForm
|
|
|
|
|
|
|
|
- for device in selected_devices:
|
|
|
|
|
- for name in form.cleaned_data['name_pattern']:
|
|
|
|
|
- iface_form = forms.InterfaceForm({
|
|
|
|
|
- 'device': device.pk,
|
|
|
|
|
- 'name': name,
|
|
|
|
|
- 'mac_address': form.cleaned_data['mac_address'],
|
|
|
|
|
- 'form_factor': form.cleaned_data['form_factor'],
|
|
|
|
|
- 'mgmt_only': form.cleaned_data['mgmt_only'],
|
|
|
|
|
- 'description': form.cleaned_data['description'],
|
|
|
|
|
- })
|
|
|
|
|
- if iface_form.is_valid():
|
|
|
|
|
- interfaces.append(iface_form.save(commit=False))
|
|
|
|
|
- else:
|
|
|
|
|
- form.add_error(None, "Duplicate interface {} found for device {}".format(name, device))
|
|
|
|
|
|
|
|
|
|
- if not form.errors:
|
|
|
|
|
- Interface.objects.bulk_create(interfaces)
|
|
|
|
|
- messages.success(self.request, "Added {} interfaces to {} devices".format(len(interfaces),
|
|
|
|
|
- len(selected_devices)))
|
|
|
|
|
|
|
+class InterfaceDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_interface'
|
|
|
|
|
+ model = Interface
|
|
|
|
|
|
|
|
|
|
|
|
|
class InterfaceBulkEditView(PermissionRequiredMixin, BulkEditView):
|
|
class InterfaceBulkEditView(PermissionRequiredMixin, BulkEditView):
|
|
@@ -1474,7 +1353,7 @@ def devicebay_add(request, pk):
|
|
|
|
|
|
|
|
if not form.errors:
|
|
if not form.errors:
|
|
|
DeviceBay.objects.bulk_create(device_bays)
|
|
DeviceBay.objects.bulk_create(device_bays)
|
|
|
- messages.success(request, "Added {} device bay(s) to {}".format(len(device_bays), device))
|
|
|
|
|
|
|
+ messages.success(request, u"Added {} device bay(s) to {}.".format(len(device_bays), device))
|
|
|
if '_addanother' in request.POST:
|
|
if '_addanother' in request.POST:
|
|
|
return redirect('dcim:devicebay_add', pk=device.pk)
|
|
return redirect('dcim:devicebay_add', pk=device.pk)
|
|
|
else:
|
|
else:
|
|
@@ -1483,55 +1362,23 @@ def devicebay_add(request, pk):
|
|
|
else:
|
|
else:
|
|
|
form = forms.DeviceBayCreateForm()
|
|
form = forms.DeviceBayCreateForm()
|
|
|
|
|
|
|
|
- return render(request, 'dcim/devicebay_edit.html', {
|
|
|
|
|
|
|
+ return render(request, 'dcim/device_component_add.html', {
|
|
|
'device': device,
|
|
'device': device,
|
|
|
|
|
+ 'component_type': 'Device Bay',
|
|
|
'form': form,
|
|
'form': form,
|
|
|
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}),
|
|
'cancel_url': reverse('dcim:device', kwargs={'pk': device.pk}),
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
-@permission_required('dcim.change_devicebay')
|
|
|
|
|
-def devicebay_edit(request, pk):
|
|
|
|
|
-
|
|
|
|
|
- devicebay = get_object_or_404(DeviceBay, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- form = forms.DeviceBayForm(request.POST, instance=devicebay)
|
|
|
|
|
- if form.is_valid():
|
|
|
|
|
- devicebay = form.save()
|
|
|
|
|
- messages.success(request, "Modified {} bay {}".format(devicebay.device.name, devicebay.name))
|
|
|
|
|
- return redirect('dcim:device', pk=devicebay.device.pk)
|
|
|
|
|
-
|
|
|
|
|
- else:
|
|
|
|
|
- form = forms.DeviceBayForm(instance=devicebay)
|
|
|
|
|
|
|
+class DeviceBayEditView(PermissionRequiredMixin, ObjectEditView):
|
|
|
|
|
+ permission_required = 'dcim.change_devicebay'
|
|
|
|
|
+ model = DeviceBay
|
|
|
|
|
+ form_class = forms.DeviceBayForm
|
|
|
|
|
|
|
|
- return render(request, 'dcim/devicebay_edit.html', {
|
|
|
|
|
- 'devicebay': devicebay,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device', kwargs={'pk': devicebay.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-@permission_required('dcim.delete_devicebay')
|
|
|
|
|
-def devicebay_delete(request, pk):
|
|
|
|
|
|
|
|
|
|
- devicebay = get_object_or_404(DeviceBay, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- form = ConfirmationForm(request.POST)
|
|
|
|
|
- if form.is_valid():
|
|
|
|
|
- devicebay.delete()
|
|
|
|
|
- messages.success(request, "Device bay {} has been deleted from {}".format(devicebay, devicebay.device))
|
|
|
|
|
- return redirect('dcim:device', pk=devicebay.device.pk)
|
|
|
|
|
-
|
|
|
|
|
- else:
|
|
|
|
|
- form = ConfirmationForm()
|
|
|
|
|
-
|
|
|
|
|
- return render(request, 'dcim/devicebay_delete.html', {
|
|
|
|
|
- 'devicebay': devicebay,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device', kwargs={'pk': devicebay.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
|
|
+class DeviceBayDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_devicebay'
|
|
|
|
|
+ model = DeviceBay
|
|
|
|
|
|
|
|
|
|
|
|
|
@permission_required('dcim.change_devicebay')
|
|
@permission_required('dcim.change_devicebay')
|
|
@@ -1547,7 +1394,7 @@ def devicebay_populate(request, pk):
|
|
|
device_bay.save()
|
|
device_bay.save()
|
|
|
|
|
|
|
|
if not form.errors:
|
|
if not form.errors:
|
|
|
- messages.success(request, "Added {} to {}".format(device_bay.installed_device, device_bay))
|
|
|
|
|
|
|
+ messages.success(request, u"Added {} to {}.".format(device_bay.installed_device, device_bay))
|
|
|
return redirect('dcim:device', pk=device_bay.device.pk)
|
|
return redirect('dcim:device', pk=device_bay.device.pk)
|
|
|
|
|
|
|
|
else:
|
|
else:
|
|
@@ -1571,7 +1418,7 @@ def devicebay_depopulate(request, pk):
|
|
|
removed_device = device_bay.installed_device
|
|
removed_device = device_bay.installed_device
|
|
|
device_bay.installed_device = None
|
|
device_bay.installed_device = None
|
|
|
device_bay.save()
|
|
device_bay.save()
|
|
|
- messages.success(request, "{} has been removed from {}".format(removed_device, device_bay))
|
|
|
|
|
|
|
+ messages.success(request, u"{} has been removed from {}.".format(removed_device, device_bay))
|
|
|
return redirect('dcim:device', pk=device_bay.device.pk)
|
|
return redirect('dcim:device', pk=device_bay.device.pk)
|
|
|
|
|
|
|
|
else:
|
|
else:
|
|
@@ -1603,7 +1450,7 @@ def interfaceconnection_add(request, pk):
|
|
|
form = forms.InterfaceConnectionForm(device, request.POST)
|
|
form = forms.InterfaceConnectionForm(device, request.POST)
|
|
|
if form.is_valid():
|
|
if form.is_valid():
|
|
|
interfaceconnection = form.save()
|
|
interfaceconnection = form.save()
|
|
|
- messages.success(request, "Connected {0} {1} to {2} {3}".format(
|
|
|
|
|
|
|
+ messages.success(request, u"Connected {} {} to {} {}.".format(
|
|
|
interfaceconnection.interface_a.device,
|
|
interfaceconnection.interface_a.device,
|
|
|
interfaceconnection.interface_a,
|
|
interfaceconnection.interface_a,
|
|
|
interfaceconnection.interface_b.device,
|
|
interfaceconnection.interface_b.device,
|
|
@@ -1643,7 +1490,7 @@ def interfaceconnection_delete(request, pk):
|
|
|
form = forms.InterfaceConnectionDeletionForm(request.POST)
|
|
form = forms.InterfaceConnectionDeletionForm(request.POST)
|
|
|
if form.is_valid():
|
|
if form.is_valid():
|
|
|
interfaceconnection.delete()
|
|
interfaceconnection.delete()
|
|
|
- messages.success(request, "Deleted the connection between {0} {1} and {2} {3}".format(
|
|
|
|
|
|
|
+ messages.success(request, u"Deleted the connection between {} {} and {} {}.".format(
|
|
|
interfaceconnection.interface_a.device,
|
|
interfaceconnection.interface_a.device,
|
|
|
interfaceconnection.interface_a,
|
|
interfaceconnection.interface_a,
|
|
|
interfaceconnection.interface_b.device,
|
|
interfaceconnection.interface_b.device,
|
|
@@ -1715,7 +1562,7 @@ class InterfaceConnectionsListView(ObjectListView):
|
|
|
# IP addresses
|
|
# IP addresses
|
|
|
#
|
|
#
|
|
|
|
|
|
|
|
-@permission_required('ipam.add_ipaddress')
|
|
|
|
|
|
|
+@permission_required(['dcim.change_device', 'ipam.add_ipaddress'])
|
|
|
def ipaddress_assign(request, pk):
|
|
def ipaddress_assign(request, pk):
|
|
|
|
|
|
|
|
device = get_object_or_404(Device, pk=pk)
|
|
device = get_object_or_404(Device, pk=pk)
|
|
@@ -1727,8 +1574,8 @@ def ipaddress_assign(request, pk):
|
|
|
ipaddress = form.save(commit=False)
|
|
ipaddress = form.save(commit=False)
|
|
|
ipaddress.interface = form.cleaned_data['interface']
|
|
ipaddress.interface = form.cleaned_data['interface']
|
|
|
ipaddress.save()
|
|
ipaddress.save()
|
|
|
- messages.success(request, "Added new IP address {0} to interface {1}".format(ipaddress,
|
|
|
|
|
- ipaddress.interface))
|
|
|
|
|
|
|
+ form.save_custom_fields()
|
|
|
|
|
+ messages.success(request, u"Added new IP address {} to interface {}.".format(ipaddress, ipaddress.interface))
|
|
|
|
|
|
|
|
if form.cleaned_data['set_as_primary']:
|
|
if form.cleaned_data['set_as_primary']:
|
|
|
if ipaddress.family == 4:
|
|
if ipaddress.family == 4:
|
|
@@ -1767,7 +1614,7 @@ def module_add(request, pk):
|
|
|
module = form.save(commit=False)
|
|
module = form.save(commit=False)
|
|
|
module.device = device
|
|
module.device = device
|
|
|
module.save()
|
|
module.save()
|
|
|
- messages.success(request, "Added module {} to {}".format(module.name, module.device.name))
|
|
|
|
|
|
|
+ messages.success(request, u"Added module {} to {}".format(module.name, module.device.name))
|
|
|
if '_addanother' in request.POST:
|
|
if '_addanother' in request.POST:
|
|
|
return redirect('dcim:module_add', pk=module.device.pk)
|
|
return redirect('dcim:module_add', pk=module.device.pk)
|
|
|
else:
|
|
else:
|
|
@@ -1776,52 +1623,20 @@ def module_add(request, pk):
|
|
|
else:
|
|
else:
|
|
|
form = forms.ModuleForm()
|
|
form = forms.ModuleForm()
|
|
|
|
|
|
|
|
- return render(request, 'dcim/module_edit.html', {
|
|
|
|
|
|
|
+ return render(request, 'dcim/device_component_add.html', {
|
|
|
'device': device,
|
|
'device': device,
|
|
|
|
|
+ 'component_type': 'Module',
|
|
|
'form': form,
|
|
'form': form,
|
|
|
'cancel_url': reverse('dcim:device_inventory', kwargs={'pk': device.pk}),
|
|
'cancel_url': reverse('dcim:device_inventory', kwargs={'pk': device.pk}),
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
-@permission_required('dcim.change_module')
|
|
|
|
|
-def module_edit(request, pk):
|
|
|
|
|
-
|
|
|
|
|
- module = get_object_or_404(Module, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- form = forms.ModuleForm(request.POST, instance=module)
|
|
|
|
|
- if form.is_valid():
|
|
|
|
|
- module = form.save()
|
|
|
|
|
- messages.success(request, "Modified {} module {}".format(module.device.name, module.name))
|
|
|
|
|
- return redirect('dcim:device_inventory', pk=module.device.pk)
|
|
|
|
|
-
|
|
|
|
|
- else:
|
|
|
|
|
- form = forms.ModuleForm(instance=module)
|
|
|
|
|
-
|
|
|
|
|
- return render(request, 'dcim/module_edit.html', {
|
|
|
|
|
- 'module': module,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device_inventory', kwargs={'pk': module.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
-
|
|
|
|
|
-
|
|
|
|
|
-@permission_required('dcim.delete_module')
|
|
|
|
|
-def module_delete(request, pk):
|
|
|
|
|
-
|
|
|
|
|
- module = get_object_or_404(Module, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- if request.method == 'POST':
|
|
|
|
|
- form = ConfirmationForm(request.POST)
|
|
|
|
|
- if form.is_valid():
|
|
|
|
|
- module.delete()
|
|
|
|
|
- messages.success(request, "Module {} has been deleted from {}".format(module, module.device))
|
|
|
|
|
- return redirect('dcim:device_inventory', pk=module.device.pk)
|
|
|
|
|
|
|
+class ModuleEditView(PermissionRequiredMixin, ObjectEditView):
|
|
|
|
|
+ permission_required = 'dcim.change_module'
|
|
|
|
|
+ model = Module
|
|
|
|
|
+ form_class = forms.ModuleForm
|
|
|
|
|
|
|
|
- else:
|
|
|
|
|
- form = ConfirmationForm()
|
|
|
|
|
|
|
|
|
|
- return render(request, 'dcim/module_delete.html', {
|
|
|
|
|
- 'module': module,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'cancel_url': reverse('dcim:device_inventory', kwargs={'pk': module.device.pk}),
|
|
|
|
|
- })
|
|
|
|
|
|
|
+class ModuleDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_module'
|
|
|
|
|
+ model = Module
|