1
0
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:
Jeremy Stretch
2020-05-21 16:28:11 -04:00
parent 49b780358e
commit f36c797e98
3 changed files with 72 additions and 72 deletions

View File

@ -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'

View File

@ -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),
}) })

View File

@ -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'