mirror of
https://github.com/netbox-community/netbox.git
synced 2024-05-10 07:54:54 +00:00
Transition ComponentCreateView to use ObjectPermissionRequiredMixin
This commit is contained in:
@ -671,9 +671,8 @@ class DeviceTypeBulkDeleteView(BulkDeleteView):
|
|||||||
# Console port templates
|
# Console port templates
|
||||||
#
|
#
|
||||||
|
|
||||||
class ConsolePortTemplateCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class ConsolePortTemplateCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_consoleporttemplate'
|
queryset = ConsolePortTemplate.objects.all()
|
||||||
model = ConsolePortTemplate
|
|
||||||
form = forms.ConsolePortTemplateCreateForm
|
form = forms.ConsolePortTemplateCreateForm
|
||||||
model_form = forms.ConsolePortTemplateForm
|
model_form = forms.ConsolePortTemplateForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -703,9 +702,8 @@ class ConsolePortTemplateBulkDeleteView(BulkDeleteView):
|
|||||||
# Console server port templates
|
# Console server port templates
|
||||||
#
|
#
|
||||||
|
|
||||||
class ConsoleServerPortTemplateCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class ConsoleServerPortTemplateCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_consoleserverporttemplate'
|
queryset = ConsoleServerPortTemplate.objects.all()
|
||||||
model = ConsoleServerPortTemplate
|
|
||||||
form = forms.ConsoleServerPortTemplateCreateForm
|
form = forms.ConsoleServerPortTemplateCreateForm
|
||||||
model_form = forms.ConsoleServerPortTemplateForm
|
model_form = forms.ConsoleServerPortTemplateForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -735,9 +733,8 @@ class ConsoleServerPortTemplateBulkDeleteView(BulkDeleteView):
|
|||||||
# Power port templates
|
# Power port templates
|
||||||
#
|
#
|
||||||
|
|
||||||
class PowerPortTemplateCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class PowerPortTemplateCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_powerporttemplate'
|
queryset = PowerPortTemplate.objects.all()
|
||||||
model = PowerPortTemplate
|
|
||||||
form = forms.PowerPortTemplateCreateForm
|
form = forms.PowerPortTemplateCreateForm
|
||||||
model_form = forms.PowerPortTemplateForm
|
model_form = forms.PowerPortTemplateForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -767,9 +764,8 @@ class PowerPortTemplateBulkDeleteView(BulkDeleteView):
|
|||||||
# Power outlet templates
|
# Power outlet templates
|
||||||
#
|
#
|
||||||
|
|
||||||
class PowerOutletTemplateCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class PowerOutletTemplateCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_poweroutlettemplate'
|
queryset = PowerOutletTemplate.objects.all()
|
||||||
model = PowerOutletTemplate
|
|
||||||
form = forms.PowerOutletTemplateCreateForm
|
form = forms.PowerOutletTemplateCreateForm
|
||||||
model_form = forms.PowerOutletTemplateForm
|
model_form = forms.PowerOutletTemplateForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -799,9 +795,8 @@ class PowerOutletTemplateBulkDeleteView(BulkDeleteView):
|
|||||||
# Interface templates
|
# Interface templates
|
||||||
#
|
#
|
||||||
|
|
||||||
class InterfaceTemplateCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class InterfaceTemplateCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_interfacetemplate'
|
queryset = InterfaceTemplate.objects.all()
|
||||||
model = InterfaceTemplate
|
|
||||||
form = forms.InterfaceTemplateCreateForm
|
form = forms.InterfaceTemplateCreateForm
|
||||||
model_form = forms.InterfaceTemplateForm
|
model_form = forms.InterfaceTemplateForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -831,9 +826,8 @@ class InterfaceTemplateBulkDeleteView(BulkDeleteView):
|
|||||||
# Front port templates
|
# Front port templates
|
||||||
#
|
#
|
||||||
|
|
||||||
class FrontPortTemplateCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class FrontPortTemplateCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_frontporttemplate'
|
queryset = FrontPortTemplate.objects.all()
|
||||||
model = FrontPortTemplate
|
|
||||||
form = forms.FrontPortTemplateCreateForm
|
form = forms.FrontPortTemplateCreateForm
|
||||||
model_form = forms.FrontPortTemplateForm
|
model_form = forms.FrontPortTemplateForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -863,9 +857,8 @@ class FrontPortTemplateBulkDeleteView(BulkDeleteView):
|
|||||||
# Rear port templates
|
# Rear port templates
|
||||||
#
|
#
|
||||||
|
|
||||||
class RearPortTemplateCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class RearPortTemplateCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_rearporttemplate'
|
queryset = RearPortTemplate.objects.all()
|
||||||
model = RearPortTemplate
|
|
||||||
form = forms.RearPortTemplateCreateForm
|
form = forms.RearPortTemplateCreateForm
|
||||||
model_form = forms.RearPortTemplateForm
|
model_form = forms.RearPortTemplateForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -895,9 +888,8 @@ class RearPortTemplateBulkDeleteView(BulkDeleteView):
|
|||||||
# Device bay templates
|
# Device bay templates
|
||||||
#
|
#
|
||||||
|
|
||||||
class DeviceBayTemplateCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class DeviceBayTemplateCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_devicebaytemplate'
|
queryset = DeviceBayTemplate.objects.all()
|
||||||
model = DeviceBayTemplate
|
|
||||||
form = forms.DeviceBayTemplateCreateForm
|
form = forms.DeviceBayTemplateCreateForm
|
||||||
model_form = forms.DeviceBayTemplateForm
|
model_form = forms.DeviceBayTemplateForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -913,7 +905,6 @@ class DeviceBayTemplateDeleteView(ObjectDeleteView):
|
|||||||
|
|
||||||
|
|
||||||
# class DeviceBayTemplateBulkEditView(BulkEditView):
|
# class DeviceBayTemplateBulkEditView(BulkEditView):
|
||||||
# permission_required = 'dcim.change_devicebaytemplate'
|
|
||||||
# queryset = DeviceBayTemplate.objects.all()
|
# queryset = DeviceBayTemplate.objects.all()
|
||||||
# table = tables.DeviceBayTemplateTable
|
# table = tables.DeviceBayTemplateTable
|
||||||
# form = forms.DeviceBayTemplateBulkEditForm
|
# form = forms.DeviceBayTemplateBulkEditForm
|
||||||
@ -1105,7 +1096,7 @@ class DeviceStatusView(ObjectView):
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
class DeviceLLDPNeighborsView(PermissionRequiredMixin, View):
|
class DeviceLLDPNeighborsView(ObjectView):
|
||||||
permission_required = ('dcim.view_device', 'dcim.napalm_read')
|
permission_required = ('dcim.view_device', 'dcim.napalm_read')
|
||||||
queryset = Device.objects.all()
|
queryset = Device.objects.all()
|
||||||
|
|
||||||
@ -1123,7 +1114,7 @@ class DeviceLLDPNeighborsView(PermissionRequiredMixin, View):
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
class DeviceConfigView(PermissionRequiredMixin, View):
|
class DeviceConfigView(ObjectView):
|
||||||
permission_required = ('dcim.view_device', 'dcim.napalm_read')
|
permission_required = ('dcim.view_device', 'dcim.napalm_read')
|
||||||
queryset = Device.objects.all()
|
queryset = Device.objects.all()
|
||||||
|
|
||||||
@ -1209,9 +1200,8 @@ class ConsolePortListView(ObjectListView):
|
|||||||
action_buttons = ('import', 'export')
|
action_buttons = ('import', 'export')
|
||||||
|
|
||||||
|
|
||||||
class ConsolePortCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class ConsolePortCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_consoleport'
|
queryset = ConsolePort.objects.all()
|
||||||
model = ConsolePort
|
|
||||||
form = forms.ConsolePortCreateForm
|
form = forms.ConsolePortCreateForm
|
||||||
model_form = forms.ConsolePortForm
|
model_form = forms.ConsolePortForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -1259,9 +1249,8 @@ class ConsoleServerPortListView(ObjectListView):
|
|||||||
action_buttons = ('import', 'export')
|
action_buttons = ('import', 'export')
|
||||||
|
|
||||||
|
|
||||||
class ConsoleServerPortCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class ConsoleServerPortCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_consoleserverport'
|
queryset = ConsoleServerPort.objects.all()
|
||||||
model = ConsoleServerPort
|
|
||||||
form = forms.ConsoleServerPortCreateForm
|
form = forms.ConsoleServerPortCreateForm
|
||||||
model_form = forms.ConsoleServerPortForm
|
model_form = forms.ConsoleServerPortForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -1319,9 +1308,8 @@ class PowerPortListView(ObjectListView):
|
|||||||
action_buttons = ('import', 'export')
|
action_buttons = ('import', 'export')
|
||||||
|
|
||||||
|
|
||||||
class PowerPortCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class PowerPortCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_powerport'
|
queryset = PowerPort.objects.all()
|
||||||
model = PowerPort
|
|
||||||
form = forms.PowerPortCreateForm
|
form = forms.PowerPortCreateForm
|
||||||
model_form = forms.PowerPortForm
|
model_form = forms.PowerPortForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -1369,9 +1357,8 @@ class PowerOutletListView(ObjectListView):
|
|||||||
action_buttons = ('import', 'export')
|
action_buttons = ('import', 'export')
|
||||||
|
|
||||||
|
|
||||||
class PowerOutletCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class PowerOutletCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_poweroutlet'
|
queryset = PowerOutlet.objects.all()
|
||||||
model = PowerOutlet
|
|
||||||
form = forms.PowerOutletCreateForm
|
form = forms.PowerOutletCreateForm
|
||||||
model_form = forms.PowerOutletForm
|
model_form = forms.PowerOutletForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -1465,9 +1452,8 @@ class InterfaceView(ObjectView):
|
|||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
class InterfaceCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class InterfaceCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_interface'
|
queryset = Interface.objects.all()
|
||||||
model = Interface
|
|
||||||
form = forms.InterfaceCreateForm
|
form = forms.InterfaceCreateForm
|
||||||
model_form = forms.InterfaceForm
|
model_form = forms.InterfaceForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -1526,9 +1512,8 @@ class FrontPortListView(ObjectListView):
|
|||||||
action_buttons = ('import', 'export')
|
action_buttons = ('import', 'export')
|
||||||
|
|
||||||
|
|
||||||
class FrontPortCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class FrontPortCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_frontport'
|
queryset = FrontPort.objects.all()
|
||||||
model = FrontPort
|
|
||||||
form = forms.FrontPortCreateForm
|
form = forms.FrontPortCreateForm
|
||||||
model_form = forms.FrontPortForm
|
model_form = forms.FrontPortForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -1586,9 +1571,8 @@ class RearPortListView(ObjectListView):
|
|||||||
action_buttons = ('import', 'export')
|
action_buttons = ('import', 'export')
|
||||||
|
|
||||||
|
|
||||||
class RearPortCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class RearPortCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_rearport'
|
queryset = RearPort.objects.all()
|
||||||
model = RearPort
|
|
||||||
form = forms.RearPortCreateForm
|
form = forms.RearPortCreateForm
|
||||||
model_form = forms.RearPortForm
|
model_form = forms.RearPortForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -1648,9 +1632,8 @@ class DeviceBayListView(ObjectListView):
|
|||||||
action_buttons = ('import', 'export')
|
action_buttons = ('import', 'export')
|
||||||
|
|
||||||
|
|
||||||
class DeviceBayCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class DeviceBayCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_devicebay'
|
queryset = DeviceBay.objects.all()
|
||||||
model = DeviceBay
|
|
||||||
form = forms.DeviceBayCreateForm
|
form = forms.DeviceBayCreateForm
|
||||||
model_form = forms.DeviceBayForm
|
model_form = forms.DeviceBayForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
@ -2144,9 +2127,8 @@ class InventoryItemEditView(ObjectEditView):
|
|||||||
model_form = forms.InventoryItemForm
|
model_form = forms.InventoryItemForm
|
||||||
|
|
||||||
|
|
||||||
class InventoryItemCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class InventoryItemCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_inventoryitem'
|
queryset = InventoryItem.objects.all()
|
||||||
model = InventoryItem
|
|
||||||
form = forms.InventoryItemCreateForm
|
form = forms.InventoryItemCreateForm
|
||||||
model_form = forms.InventoryItemForm
|
model_form = forms.InventoryItemForm
|
||||||
template_name = 'dcim/device_component_add.html'
|
template_name = 'dcim/device_component_add.html'
|
||||||
|
@ -1033,28 +1033,32 @@ class BulkDeleteView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
|
|||||||
#
|
#
|
||||||
|
|
||||||
# TODO: Replace with BulkCreateView
|
# TODO: Replace with BulkCreateView
|
||||||
class ComponentCreateView(GetReturnURLMixin, View):
|
class ComponentCreateView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
|
||||||
"""
|
"""
|
||||||
Add one or more components (e.g. interfaces, console ports, etc.) to a Device or VirtualMachine.
|
Add one or more components (e.g. interfaces, console ports, etc.) to a Device or VirtualMachine.
|
||||||
"""
|
"""
|
||||||
model = None
|
queryset = None
|
||||||
form = None
|
form = None
|
||||||
model_form = None
|
model_form = None
|
||||||
template_name = None
|
template_name = None
|
||||||
|
|
||||||
|
def get_required_permission(self):
|
||||||
|
return get_permission_for_model(self.queryset.model, 'add')
|
||||||
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
|
|
||||||
form = self.form(initial=request.GET)
|
form = self.form(initial=request.GET)
|
||||||
|
|
||||||
return render(request, self.template_name, {
|
return render(request, self.template_name, {
|
||||||
'component_type': self.model._meta.verbose_name,
|
'component_type': self.queryset.model._meta.verbose_name,
|
||||||
'form': form,
|
'form': form,
|
||||||
'return_url': self.get_return_url(request),
|
'return_url': self.get_return_url(request),
|
||||||
})
|
})
|
||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
|
logger = logging.getLogger('netbox.views.ComponentCreateView')
|
||||||
form = self.form(request.POST, initial=request.GET)
|
form = self.form(request.POST, initial=request.GET)
|
||||||
|
|
||||||
if form.is_valid():
|
if form.is_valid():
|
||||||
|
|
||||||
new_components = []
|
new_components = []
|
||||||
@ -1080,20 +1084,35 @@ class ComponentCreateView(GetReturnURLMixin, View):
|
|||||||
|
|
||||||
if not form.errors:
|
if not form.errors:
|
||||||
|
|
||||||
# Create the new components
|
try:
|
||||||
for component_form in new_components:
|
|
||||||
component_form.save()
|
|
||||||
|
|
||||||
messages.success(request, "Added {} {}".format(
|
with transaction.atomic():
|
||||||
len(new_components), self.model._meta.verbose_name_plural
|
|
||||||
))
|
# Create the new components
|
||||||
if '_addanother' in request.POST:
|
new_objs = []
|
||||||
return redirect(request.get_full_path())
|
for component_form in new_components:
|
||||||
else:
|
obj = component_form.save()
|
||||||
return redirect(self.get_return_url(request))
|
new_objs.append(obj)
|
||||||
|
|
||||||
|
# Enforce object-level permissions
|
||||||
|
if self.queryset.filter(pk__in=[obj.pk for obj in new_objs]).count() != len(new_objs):
|
||||||
|
raise ObjectDoesNotExist
|
||||||
|
|
||||||
|
messages.success(request, "Added {} {}".format(
|
||||||
|
len(new_components), self.queryset.model._meta.verbose_name_plural
|
||||||
|
))
|
||||||
|
if '_addanother' in request.POST:
|
||||||
|
return redirect(request.get_full_path())
|
||||||
|
else:
|
||||||
|
return redirect(self.get_return_url(request))
|
||||||
|
|
||||||
|
except ObjectDoesNotExist:
|
||||||
|
msg = "Component creation failed due to object-level permissions violation"
|
||||||
|
logger.debug(msg)
|
||||||
|
form.add_error(None, msg)
|
||||||
|
|
||||||
return render(request, self.template_name, {
|
return render(request, self.template_name, {
|
||||||
'component_type': self.model._meta.verbose_name,
|
'component_type': self.queryset.model._meta.verbose_name,
|
||||||
'form': form,
|
'form': form,
|
||||||
'return_url': self.get_return_url(request),
|
'return_url': self.get_return_url(request),
|
||||||
})
|
})
|
||||||
|
@ -293,9 +293,8 @@ class VirtualMachineBulkDeleteView(BulkDeleteView):
|
|||||||
# VM interfaces
|
# VM interfaces
|
||||||
#
|
#
|
||||||
|
|
||||||
class InterfaceCreateView(PermissionRequiredMixin, ComponentCreateView):
|
class InterfaceCreateView(ComponentCreateView):
|
||||||
permission_required = 'dcim.add_interface'
|
queryset = Interface.objects.all()
|
||||||
model = Interface
|
|
||||||
form = forms.InterfaceCreateForm
|
form = forms.InterfaceCreateForm
|
||||||
model_form = forms.InterfaceForm
|
model_form = forms.InterfaceForm
|
||||||
template_name = 'virtualization/virtualmachine_component_add.html'
|
template_name = 'virtualization/virtualmachine_component_add.html'
|
||||||
|
Reference in New Issue
Block a user