diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 59cdac930..7016a5b9d 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -3,7 +3,7 @@ from django.contrib import messages from django.contrib.auth.decorators import permission_required from django.contrib.auth.mixins import PermissionRequiredMixin from django.db import transaction -from django.db.models import Count, OuterRef, Subquery +from django.db.models import Count, OuterRef from django.shortcuts import get_object_or_404, redirect, render from django.views.generic import View from django_tables2 import RequestConfig @@ -66,8 +66,7 @@ class ProviderEditView(ObjectEditView): default_return_url = 'circuits:provider_list' -class ProviderDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'circuits.delete_provider' +class ProviderDeleteView(ObjectDeleteView): queryset = Provider.objects.all() default_return_url = 'circuits:provider_list' @@ -172,8 +171,7 @@ class CircuitEditView(ObjectEditView): default_return_url = 'circuits:circuit_list' -class CircuitDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'circuits.delete_circuit' +class CircuitDeleteView(ObjectDeleteView): queryset = Circuit.objects.all() default_return_url = 'circuits:circuit_list' @@ -270,6 +268,5 @@ class CircuitTerminationEditView(ObjectEditView): return obj.circuit.get_absolute_url() -class CircuitTerminationDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'circuits.delete_circuittermination' +class CircuitTerminationDeleteView(ObjectDeleteView): queryset = CircuitTermination.objects.all() diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index e33f3bd04..d61d0f82f 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -220,8 +220,7 @@ class SiteEditView(ObjectEditView): default_return_url = 'dcim:site_list' -class SiteDeleteView(ObjectPermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_site' +class SiteDeleteView(ObjectDeleteView): queryset = Site.objects.all() default_return_url = 'dcim:site_list' @@ -411,8 +410,7 @@ class RackEditView(ObjectEditView): default_return_url = 'dcim:rack_list' -class RackDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_rack' +class RackDeleteView(ObjectDeleteView): queryset = Rack.objects.all() default_return_url = 'dcim:rack_list' @@ -480,8 +478,7 @@ class RackReservationEditView(ObjectEditView): return obj -class RackReservationDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_rackreservation' +class RackReservationDeleteView(ObjectDeleteView): queryset = RackReservation.objects.all() default_return_url = 'dcim:rackreservation_list' @@ -636,8 +633,7 @@ class DeviceTypeEditView(ObjectEditView): default_return_url = 'dcim:devicetype_list' -class DeviceTypeDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_devicetype' +class DeviceTypeDeleteView(ObjectDeleteView): queryset = DeviceType.objects.all() default_return_url = 'dcim:devicetype_list' @@ -703,8 +699,7 @@ class ConsolePortTemplateEditView(ObjectEditView): model_form = forms.ConsolePortTemplateForm -class ConsolePortTemplateDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_consoleporttemplate' +class ConsolePortTemplateDeleteView(ObjectDeleteView): queryset = ConsolePortTemplate.objects.all() @@ -738,8 +733,7 @@ class ConsoleServerPortTemplateEditView(ObjectEditView): model_form = forms.ConsoleServerPortTemplateForm -class ConsoleServerPortTemplateDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_consoleserverporttemplate' +class ConsoleServerPortTemplateDeleteView(ObjectDeleteView): queryset = ConsoleServerPortTemplate.objects.all() @@ -773,8 +767,7 @@ class PowerPortTemplateEditView(ObjectEditView): model_form = forms.PowerPortTemplateForm -class PowerPortTemplateDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_powerporttemplate' +class PowerPortTemplateDeleteView(ObjectDeleteView): queryset = PowerPortTemplate.objects.all() @@ -808,8 +801,7 @@ class PowerOutletTemplateEditView(ObjectEditView): model_form = forms.PowerOutletTemplateForm -class PowerOutletTemplateDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_poweroutlettemplate' +class PowerOutletTemplateDeleteView(ObjectDeleteView): queryset = PowerOutletTemplate.objects.all() @@ -843,8 +835,7 @@ class InterfaceTemplateEditView(ObjectEditView): model_form = forms.InterfaceTemplateForm -class InterfaceTemplateDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_interfacetemplate' +class InterfaceTemplateDeleteView(ObjectDeleteView): queryset = InterfaceTemplate.objects.all() @@ -878,8 +869,7 @@ class FrontPortTemplateEditView(ObjectEditView): model_form = forms.FrontPortTemplateForm -class FrontPortTemplateDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_frontporttemplate' +class FrontPortTemplateDeleteView(ObjectDeleteView): queryset = FrontPortTemplate.objects.all() @@ -913,8 +903,7 @@ class RearPortTemplateEditView(ObjectEditView): model_form = forms.RearPortTemplateForm -class RearPortTemplateDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_rearporttemplate' +class RearPortTemplateDeleteView(ObjectDeleteView): queryset = RearPortTemplate.objects.all() @@ -948,8 +937,7 @@ class DeviceBayTemplateEditView(ObjectEditView): model_form = forms.DeviceBayTemplateForm -class DeviceBayTemplateDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_devicebaytemplate' +class DeviceBayTemplateDeleteView(ObjectDeleteView): queryset = DeviceBayTemplate.objects.all() @@ -1193,8 +1181,7 @@ class DeviceEditView(ObjectEditView): default_return_url = 'dcim:device_list' -class DeviceDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_device' +class DeviceDeleteView(ObjectDeleteView): queryset = Device.objects.all() default_return_url = 'dcim:device_list' @@ -1270,8 +1257,7 @@ class ConsolePortEditView(ObjectEditView): model_form = forms.ConsolePortForm -class ConsolePortDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_consoleport' +class ConsolePortDeleteView(ObjectDeleteView): queryset = ConsolePort.objects.all() @@ -1324,8 +1310,7 @@ class ConsoleServerPortEditView(ObjectEditView): model_form = forms.ConsoleServerPortForm -class ConsoleServerPortDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_consoleserverport' +class ConsoleServerPortDeleteView(ObjectDeleteView): queryset = ConsoleServerPort.objects.all() @@ -1390,8 +1375,7 @@ class PowerPortEditView(ObjectEditView): model_form = forms.PowerPortForm -class PowerPortDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_powerport' +class PowerPortDeleteView(ObjectDeleteView): queryset = PowerPort.objects.all() @@ -1444,8 +1428,7 @@ class PowerOutletEditView(ObjectEditView): model_form = forms.PowerOutletForm -class PowerOutletDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_poweroutlet' +class PowerOutletDeleteView(ObjectDeleteView): queryset = PowerOutlet.objects.all() @@ -1547,8 +1530,7 @@ class InterfaceEditView(ObjectEditView): template_name = 'dcim/interface_edit.html' -class InterfaceDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_interface' +class InterfaceDeleteView(ObjectDeleteView): queryset = Interface.objects.all() @@ -1613,8 +1595,7 @@ class FrontPortEditView(ObjectEditView): model_form = forms.FrontPortForm -class FrontPortDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_frontport' +class FrontPortDeleteView(ObjectDeleteView): queryset = FrontPort.objects.all() @@ -1679,8 +1660,7 @@ class RearPortEditView(ObjectEditView): model_form = forms.RearPortForm -class RearPortDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_rearport' +class RearPortDeleteView(ObjectDeleteView): queryset = RearPort.objects.all() @@ -1747,8 +1727,7 @@ class DeviceBayEditView(ObjectEditView): model_form = forms.DeviceBayForm -class DeviceBayDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_devicebay' +class DeviceBayDeleteView(ObjectDeleteView): queryset = DeviceBay.objects.all() @@ -2088,8 +2067,7 @@ class CableEditView(ObjectEditView): default_return_url = 'dcim:cable_list' -class CableDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_cable' +class CableDeleteView(ObjectDeleteView): queryset = Cable.objects.all() default_return_url = 'dcim:cable_list' @@ -2247,8 +2225,7 @@ class InventoryItemCreateView(PermissionRequiredMixin, ComponentCreateView): template_name = 'dcim/device_component_add.html' -class InventoryItemDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_inventoryitem' +class InventoryItemDeleteView(ObjectDeleteView): queryset = InventoryItem.objects.all() @@ -2420,8 +2397,7 @@ class VirtualChassisEditView(PermissionRequiredMixin, GetReturnURLMixin, View): }) -class VirtualChassisDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_virtualchassis' +class VirtualChassisDeleteView(ObjectDeleteView): queryset = VirtualChassis.objects.all() default_return_url = 'dcim:device_list' @@ -2583,8 +2559,7 @@ class PowerPanelEditView(ObjectEditView): default_return_url = 'dcim:powerpanel_list' -class PowerPanelDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_powerpanel' +class PowerPanelDeleteView(ObjectDeleteView): queryset = PowerPanel.objects.all() default_return_url = 'dcim:powerpanel_list' @@ -2650,8 +2625,7 @@ class PowerFeedEditView(ObjectEditView): default_return_url = 'dcim:powerfeed_list' -class PowerFeedDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_powerfeed' +class PowerFeedDeleteView(ObjectDeleteView): queryset = PowerFeed.objects.all() default_return_url = 'dcim:powerfeed_list' diff --git a/netbox/extras/views.py b/netbox/extras/views.py index b5d9306f8..63764b683 100644 --- a/netbox/extras/views.py +++ b/netbox/extras/views.py @@ -71,8 +71,7 @@ class TagEditView(ObjectEditView): template_name = 'extras/tag_edit.html' -class TagDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'extras.delete_tag' +class TagDeleteView(ObjectDeleteView): queryset = Tag.objects.all() default_return_url = 'extras:tag_list' @@ -147,8 +146,7 @@ class ConfigContextBulkEditView(PermissionRequiredMixin, BulkEditView): default_return_url = 'extras:configcontext_list' -class ConfigContextDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'extras.delete_configcontext' +class ConfigContextDeleteView(ObjectDeleteView): queryset = ConfigContext.objects.all() default_return_url = 'extras:configcontext_list' @@ -310,8 +308,7 @@ class ImageAttachmentEditView(ObjectEditView): return imageattachment.parent.get_absolute_url() -class ImageAttachmentDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'extras.delete_imageattachment' +class ImageAttachmentDeleteView(ObjectDeleteView): queryset = ImageAttachment.objects.all() def get_return_url(self, request, imageattachment): diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 220205c19..176321982 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -141,8 +141,7 @@ class VRFEditView(ObjectEditView): default_return_url = 'ipam:vrf_list' -class VRFDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'ipam.delete_vrf' +class VRFDeleteView(ObjectDeleteView): queryset = VRF.objects.all() default_return_url = 'ipam:vrf_list' @@ -356,8 +355,7 @@ class AggregateEditView(ObjectEditView): default_return_url = 'ipam:aggregate_list' -class AggregateDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'ipam.delete_aggregate' +class AggregateDeleteView(ObjectDeleteView): queryset = Aggregate.objects.all() default_return_url = 'ipam:aggregate_list' @@ -572,8 +570,7 @@ class PrefixEditView(ObjectEditView): default_return_url = 'ipam:prefix_list' -class PrefixDeleteView(ObjectPermissionRequiredMixin, ObjectDeleteView): - permission_required = 'ipam.delete_prefix' +class PrefixDeleteView(ObjectDeleteView): queryset = Prefix.objects.all() template_name = 'ipam/prefix_delete.html' default_return_url = 'ipam:prefix_list' @@ -733,8 +730,7 @@ class IPAddressAssignView(PermissionRequiredMixin, View): }) -class IPAddressDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'ipam.delete_ipaddress' +class IPAddressDeleteView(ObjectDeleteView): queryset = IPAddress.objects.all() default_return_url = 'ipam:ipaddress_list' @@ -903,8 +899,7 @@ class VLANEditView(ObjectEditView): default_return_url = 'ipam:vlan_list' -class VLANDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'ipam.delete_vlan' +class VLANDeleteView(ObjectDeleteView): queryset = VLAN.objects.all() default_return_url = 'ipam:vlan_list' @@ -982,8 +977,7 @@ class ServiceBulkImportView(PermissionRequiredMixin, BulkImportView): default_return_url = 'ipam:service_list' -class ServiceDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'ipam.delete_service' +class ServiceDeleteView(ObjectDeleteView): queryset = Service.objects.all() diff --git a/netbox/secrets/views.py b/netbox/secrets/views.py index be0c87cee..7c69d0ac4 100644 --- a/netbox/secrets/views.py +++ b/netbox/secrets/views.py @@ -183,8 +183,7 @@ def secret_edit(request, pk): }) -class SecretDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'secrets.delete_secret' +class SecretDeleteView(ObjectDeleteView): queryset = Secret.objects.all() default_return_url = 'secrets:secret_list' diff --git a/netbox/tenancy/views.py b/netbox/tenancy/views.py index 4dbc99815..97480bb6a 100644 --- a/netbox/tenancy/views.py +++ b/netbox/tenancy/views.py @@ -94,8 +94,7 @@ class TenantEditView(ObjectEditView): default_return_url = 'tenancy:tenant_list' -class TenantDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'tenancy.delete_tenant' +class TenantDeleteView(ObjectDeleteView): queryset = Tenant.objects.all() default_return_url = 'tenancy:tenant_list' diff --git a/netbox/utilities/views.py b/netbox/utilities/views.py index 9815018b7..f4267748f 100644 --- a/netbox/utilities/views.py +++ b/netbox/utilities/views.py @@ -282,9 +282,9 @@ class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): """ Create or edit a single object. - queryset: The base queryset for the object being modified - model_form: The form used to create or edit the object - template_name: The name of the template + :param queryset: The base queryset for the object being modified + :param model_form: The form used to create or edit the object + :param template_name: The name of the template """ queryset = None model_form = None @@ -389,16 +389,19 @@ class ObjectEditView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): }) -class ObjectDeleteView(GetReturnURLMixin, View): +class ObjectDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View): """ Delete a single object. - queryset: The base queryset for the object being deleted - template_name: The name of the template + :param queryset: The base queryset for the object being deleted + :param template_name: The name of the template """ queryset = None template_name = 'utilities/obj_delete.html' + def get_required_permission(self): + return get_permission_for_model(self.queryset.model, 'delete') + def get_object(self, kwargs): # Look up object by slug if one has been provided. Otherwise, use PK. if 'slug' in kwargs: diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 11090def8..8bc3876ca 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -114,8 +114,7 @@ class ClusterEditView(ObjectEditView): model_form = forms.ClusterForm -class ClusterDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'virtualization.delete_cluster' +class ClusterDeleteView(ObjectDeleteView): queryset = Cluster.objects.all() default_return_url = 'virtualization:cluster_list' @@ -270,8 +269,7 @@ class VirtualMachineEditView(ObjectEditView): default_return_url = 'virtualization:virtualmachine_list' -class VirtualMachineDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'virtualization.delete_virtualmachine' +class VirtualMachineDeleteView(ObjectDeleteView): queryset = VirtualMachine.objects.all() default_return_url = 'virtualization:virtualmachine_list' @@ -319,8 +317,7 @@ class InterfaceEditView(ObjectEditView): template_name = 'virtualization/interface_edit.html' -class InterfaceDeleteView(PermissionRequiredMixin, ObjectDeleteView): - permission_required = 'dcim.delete_interface' +class InterfaceDeleteView(ObjectDeleteView): queryset = Interface.objects.all()