|
@@ -7,8 +7,7 @@ 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, ProtectedError, Sum
|
|
|
|
|
-from django.forms import ModelMultipleChoiceField, MultipleHiddenInput
|
|
|
|
|
|
|
+from django.db.models import Count, Sum
|
|
|
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
|
|
@@ -17,7 +16,6 @@ from django.views.generic import View
|
|
|
from ipam.models import Prefix, IPAddress, VLAN
|
|
from ipam.models import Prefix, IPAddress, VLAN
|
|
|
from circuits.models import Circuit
|
|
from circuits.models import Circuit
|
|
|
from extras.models import TopologyMap
|
|
from extras.models import TopologyMap
|
|
|
-from utilities.error_handlers import handle_protectederror
|
|
|
|
|
from utilities.forms import ConfirmationForm
|
|
from utilities.forms import ConfirmationForm
|
|
|
from utilities.views import (
|
|
from utilities.views import (
|
|
|
BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
|
|
BulkDeleteView, BulkEditView, BulkImportView, ObjectDeleteView, ObjectEditView, ObjectListView,
|
|
@@ -135,7 +133,6 @@ class RackGroupEditView(PermissionRequiredMixin, ObjectEditView):
|
|
|
class RackGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
class RackGroupBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
permission_required = 'dcim.delete_rackgroup'
|
|
permission_required = 'dcim.delete_rackgroup'
|
|
|
cls = RackGroup
|
|
cls = RackGroup
|
|
|
- form = forms.RackGroupBulkDeleteForm
|
|
|
|
|
default_redirect_url = 'dcim:rackgroup_list'
|
|
default_redirect_url = 'dcim:rackgroup_list'
|
|
|
|
|
|
|
|
|
|
|
|
@@ -188,7 +185,7 @@ class RackDeleteView(PermissionRequiredMixin, ObjectDeleteView):
|
|
|
class RackBulkImportView(PermissionRequiredMixin, BulkImportView):
|
|
class RackBulkImportView(PermissionRequiredMixin, BulkImportView):
|
|
|
permission_required = 'dcim.add_rack'
|
|
permission_required = 'dcim.add_rack'
|
|
|
form = forms.RackImportForm
|
|
form = forms.RackImportForm
|
|
|
- table = tables.RackTable
|
|
|
|
|
|
|
+ table = tables.RackImportTable
|
|
|
template_name = 'dcim/rack_import.html'
|
|
template_name = 'dcim/rack_import.html'
|
|
|
obj_list_url = 'dcim:rack_list'
|
|
obj_list_url = 'dcim:rack_list'
|
|
|
|
|
|
|
@@ -213,7 +210,6 @@ class RackBulkEditView(PermissionRequiredMixin, BulkEditView):
|
|
|
class RackBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
class RackBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
permission_required = 'dcim.delete_rack'
|
|
permission_required = 'dcim.delete_rack'
|
|
|
cls = Rack
|
|
cls = Rack
|
|
|
- form = forms.RackBulkDeleteForm
|
|
|
|
|
default_redirect_url = 'dcim:rack_list'
|
|
default_redirect_url = 'dcim:rack_list'
|
|
|
|
|
|
|
|
|
|
|
|
@@ -239,7 +235,6 @@ class ManufacturerEditView(PermissionRequiredMixin, ObjectEditView):
|
|
|
class ManufacturerBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
class ManufacturerBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
permission_required = 'dcim.delete_manufacturer'
|
|
permission_required = 'dcim.delete_manufacturer'
|
|
|
cls = Manufacturer
|
|
cls = Manufacturer
|
|
|
- form = forms.ManufacturerBulkDeleteForm
|
|
|
|
|
default_redirect_url = 'dcim:manufacturer_list'
|
|
default_redirect_url = 'dcim:manufacturer_list'
|
|
|
|
|
|
|
|
|
|
|
|
@@ -334,7 +329,6 @@ class DeviceTypeBulkEditView(PermissionRequiredMixin, BulkEditView):
|
|
|
class DeviceTypeBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
class DeviceTypeBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
permission_required = 'dcim.delete_devicetype'
|
|
permission_required = 'dcim.delete_devicetype'
|
|
|
cls = DeviceType
|
|
cls = DeviceType
|
|
|
- form = forms.DeviceTypeBulkDeleteForm
|
|
|
|
|
default_redirect_url = 'dcim:devicetype_list'
|
|
default_redirect_url = 'dcim:devicetype_list'
|
|
|
|
|
|
|
|
|
|
|
|
@@ -396,68 +390,65 @@ class ConsolePortTemplateAddView(ComponentTemplateCreateView):
|
|
|
form = forms.ConsolePortTemplateForm
|
|
form = forms.ConsolePortTemplateForm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class ConsolePortTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_consoleporttemplate'
|
|
|
|
|
+ cls = ConsolePortTemplate
|
|
|
|
|
+ parent_cls = DeviceType
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
class ConsoleServerPortTemplateAddView(ComponentTemplateCreateView):
|
|
class ConsoleServerPortTemplateAddView(ComponentTemplateCreateView):
|
|
|
model = ConsoleServerPortTemplate
|
|
model = ConsoleServerPortTemplate
|
|
|
form = forms.ConsoleServerPortTemplateForm
|
|
form = forms.ConsoleServerPortTemplateForm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class ConsoleServerPortTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_consoleserverporttemplate'
|
|
|
|
|
+ cls = ConsoleServerPortTemplate
|
|
|
|
|
+ parent_cls = DeviceType
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
class PowerPortTemplateAddView(ComponentTemplateCreateView):
|
|
class PowerPortTemplateAddView(ComponentTemplateCreateView):
|
|
|
model = PowerPortTemplate
|
|
model = PowerPortTemplate
|
|
|
form = forms.PowerPortTemplateForm
|
|
form = forms.PowerPortTemplateForm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class PowerPortTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_powerporttemplate'
|
|
|
|
|
+ cls = PowerPortTemplate
|
|
|
|
|
+ parent_cls = DeviceType
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
class PowerOutletTemplateAddView(ComponentTemplateCreateView):
|
|
class PowerOutletTemplateAddView(ComponentTemplateCreateView):
|
|
|
model = PowerOutletTemplate
|
|
model = PowerOutletTemplate
|
|
|
form = forms.PowerOutletTemplateForm
|
|
form = forms.PowerOutletTemplateForm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class PowerOutletTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_poweroutlettemplate'
|
|
|
|
|
+ cls = PowerOutletTemplate
|
|
|
|
|
+ parent_cls = DeviceType
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
class InterfaceTemplateAddView(ComponentTemplateCreateView):
|
|
class InterfaceTemplateAddView(ComponentTemplateCreateView):
|
|
|
model = InterfaceTemplate
|
|
model = InterfaceTemplate
|
|
|
form = forms.InterfaceTemplateForm
|
|
form = forms.InterfaceTemplateForm
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class InterfaceTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_interfacetemplate'
|
|
|
|
|
+ cls = InterfaceTemplate
|
|
|
|
|
+ parent_cls = DeviceType
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
class DeviceBayTemplateAddView(ComponentTemplateCreateView):
|
|
class DeviceBayTemplateAddView(ComponentTemplateCreateView):
|
|
|
model = DeviceBayTemplate
|
|
model = DeviceBayTemplate
|
|
|
form = forms.DeviceBayTemplateForm
|
|
form = forms.DeviceBayTemplateForm
|
|
|
|
|
|
|
|
|
|
|
|
|
-def component_template_delete(request, pk, model):
|
|
|
|
|
-
|
|
|
|
|
- devicetype = get_object_or_404(DeviceType, pk=pk)
|
|
|
|
|
-
|
|
|
|
|
- class ComponentTemplateBulkDeleteForm(ConfirmationForm):
|
|
|
|
|
- pk = ModelMultipleChoiceField(queryset=model.objects.all(), widget=MultipleHiddenInput)
|
|
|
|
|
-
|
|
|
|
|
- if '_confirm' in request.POST:
|
|
|
|
|
- form = ComponentTemplateBulkDeleteForm(request.POST)
|
|
|
|
|
- if form.is_valid():
|
|
|
|
|
-
|
|
|
|
|
- # Delete component templates
|
|
|
|
|
- objects_to_delete = model.objects.filter(pk__in=[v.id for v in form.cleaned_data['pk']])
|
|
|
|
|
- try:
|
|
|
|
|
- deleted_count = objects_to_delete.count()
|
|
|
|
|
- objects_to_delete.delete()
|
|
|
|
|
- except ProtectedError, e:
|
|
|
|
|
- handle_protectederror(list(objects_to_delete), request, e)
|
|
|
|
|
- return redirect('dcim:devicetype', {'pk': devicetype.pk})
|
|
|
|
|
-
|
|
|
|
|
- messages.success(request, "Deleted {} {}".format(deleted_count, model._meta.verbose_name_plural))
|
|
|
|
|
- return redirect('dcim:devicetype', pk=devicetype.pk)
|
|
|
|
|
-
|
|
|
|
|
- else:
|
|
|
|
|
- form = ComponentTemplateBulkDeleteForm(initial={'pk': request.POST.getlist('pk')})
|
|
|
|
|
-
|
|
|
|
|
- selected_objects = model.objects.filter(pk__in=request.POST.getlist('pk'))
|
|
|
|
|
- if not selected_objects:
|
|
|
|
|
- messages.warning(request, "No {} were selected for deletion.".format(model._meta.verbose_name_plural))
|
|
|
|
|
- return redirect('dcim:devicetype', pk=devicetype.pk)
|
|
|
|
|
-
|
|
|
|
|
- return render(request, 'dcim/component_template_delete.html', {
|
|
|
|
|
- 'devicetype': devicetype,
|
|
|
|
|
- 'form': form,
|
|
|
|
|
- 'selected_objects': selected_objects,
|
|
|
|
|
- 'cancel_url': reverse('dcim:devicetype', kwargs={'pk': devicetype.pk}),
|
|
|
|
|
- })
|
|
|
|
|
|
|
+class DeviceBayTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_devicebaytemplate'
|
|
|
|
|
+ cls = DeviceBayTemplate
|
|
|
|
|
+ parent_cls = DeviceType
|
|
|
|
|
|
|
|
|
|
|
|
|
#
|
|
#
|
|
@@ -482,7 +473,6 @@ class DeviceRoleEditView(PermissionRequiredMixin, ObjectEditView):
|
|
|
class DeviceRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
class DeviceRoleBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
permission_required = 'dcim.delete_devicerole'
|
|
permission_required = 'dcim.delete_devicerole'
|
|
|
cls = DeviceRole
|
|
cls = DeviceRole
|
|
|
- form = forms.DeviceRoleBulkDeleteForm
|
|
|
|
|
default_redirect_url = 'dcim:devicerole_list'
|
|
default_redirect_url = 'dcim:devicerole_list'
|
|
|
|
|
|
|
|
|
|
|
|
@@ -508,7 +498,6 @@ class PlatformEditView(PermissionRequiredMixin, ObjectEditView):
|
|
|
class PlatformBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
class PlatformBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
permission_required = 'dcim.delete_platform'
|
|
permission_required = 'dcim.delete_platform'
|
|
|
cls = Platform
|
|
cls = Platform
|
|
|
- form = forms.PlatformBulkDeleteForm
|
|
|
|
|
default_redirect_url = 'dcim:platform_list'
|
|
default_redirect_url = 'dcim:platform_list'
|
|
|
|
|
|
|
|
|
|
|
|
@@ -653,7 +642,6 @@ class DeviceBulkEditView(PermissionRequiredMixin, BulkEditView):
|
|
|
class DeviceBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
class DeviceBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
permission_required = 'dcim.delete_device'
|
|
permission_required = 'dcim.delete_device'
|
|
|
cls = Device
|
|
cls = Device
|
|
|
- form = forms.DeviceBulkDeleteForm
|
|
|
|
|
default_redirect_url = 'dcim:device_list'
|
|
default_redirect_url = 'dcim:device_list'
|
|
|
|
|
|
|
|
|
|
|
|
@@ -825,6 +813,12 @@ def consoleport_delete(request, pk):
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class ConsolePortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_consoleport'
|
|
|
|
|
+ cls = ConsolePort
|
|
|
|
|
+ parent_cls = Device
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
class ConsoleConnectionsBulkImportView(PermissionRequiredMixin, BulkImportView):
|
|
class ConsoleConnectionsBulkImportView(PermissionRequiredMixin, BulkImportView):
|
|
|
permission_required = 'dcim.change_consoleport'
|
|
permission_required = 'dcim.change_consoleport'
|
|
|
form = forms.ConsoleConnectionImportForm
|
|
form = forms.ConsoleConnectionImportForm
|
|
@@ -980,6 +974,12 @@ def consoleserverport_delete(request, pk):
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class ConsoleServerPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_consoleserverport'
|
|
|
|
|
+ cls = ConsoleServerPort
|
|
|
|
|
+ parent_cls = Device
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
#
|
|
#
|
|
|
# Power ports
|
|
# Power ports
|
|
|
#
|
|
#
|
|
@@ -1125,6 +1125,12 @@ def powerport_delete(request, pk):
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class PowerPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_powerport'
|
|
|
|
|
+ cls = PowerPort
|
|
|
|
|
+ parent_cls = Device
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
class PowerConnectionsBulkImportView(PermissionRequiredMixin, BulkImportView):
|
|
class PowerConnectionsBulkImportView(PermissionRequiredMixin, BulkImportView):
|
|
|
permission_required = 'dcim.change_powerport'
|
|
permission_required = 'dcim.change_powerport'
|
|
|
form = forms.PowerConnectionImportForm
|
|
form = forms.PowerConnectionImportForm
|
|
@@ -1278,6 +1284,12 @@ def poweroutlet_delete(request, pk):
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class PowerOutletBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_poweroutlet'
|
|
|
|
|
+ cls = PowerOutlet
|
|
|
|
|
+ parent_cls = Device
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
#
|
|
#
|
|
|
# Interfaces
|
|
# Interfaces
|
|
|
#
|
|
#
|
|
@@ -1372,7 +1384,7 @@ class InterfaceBulkAddView(PermissionRequiredMixin, BulkEditView):
|
|
|
permission_required = 'dcim.add_interface'
|
|
permission_required = 'dcim.add_interface'
|
|
|
cls = Device
|
|
cls = Device
|
|
|
form = forms.InterfaceBulkCreateForm
|
|
form = forms.InterfaceBulkCreateForm
|
|
|
- template_name = 'dcim/interface_bulk_add.html'
|
|
|
|
|
|
|
+ template_name = 'dcim/interface_add_multi.html'
|
|
|
default_redirect_url = 'dcim:device_list'
|
|
default_redirect_url = 'dcim:device_list'
|
|
|
|
|
|
|
|
def update_objects(self, pk_list, form):
|
|
def update_objects(self, pk_list, form):
|
|
@@ -1401,6 +1413,12 @@ class InterfaceBulkAddView(PermissionRequiredMixin, BulkEditView):
|
|
|
len(selected_devices)))
|
|
len(selected_devices)))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class InterfaceBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_interface'
|
|
|
|
|
+ cls = Interface
|
|
|
|
|
+ parent_cls = Device
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
#
|
|
#
|
|
|
# Device bays
|
|
# Device bays
|
|
|
#
|
|
#
|
|
@@ -1538,6 +1556,12 @@ def devicebay_depopulate(request, pk):
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+class DeviceBayBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
|
|
|
|
|
+ permission_required = 'dcim.delete_devicebay'
|
|
|
|
|
+ cls = DeviceBay
|
|
|
|
|
+ parent_cls = Device
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
#
|
|
#
|
|
|
# Interface connections
|
|
# Interface connections
|
|
|
#
|
|
#
|