diff --git a/netbox/dcim/object_actions.py b/netbox/dcim/object_actions.py index 2b924e869..00a409274 100644 --- a/netbox/dcim/object_actions.py +++ b/netbox/dcim/object_actions.py @@ -3,10 +3,30 @@ from django.utils.translation import gettext as _ from netbox.object_actions import ObjectAction __all__ = ( + 'BulkAddComponents', 'BulkDisconnect', ) +class BulkAddComponents(ObjectAction): + """ + Add components to the selected devices. + """ + label = _('Add Components') + multi = True + permissions_required = {'change'} + template_name = 'dcim/buttons/bulk_add_components.html' + + @classmethod + def get_context(cls, context, obj): + return { + 'perms': context.get('perms'), + 'request': context.get('request'), + 'formaction': context.get('formaction'), + 'label': cls.label, + } + + class BulkDisconnect(ObjectAction): """ Disconnect each of a set of objects to which a cable is connected. @@ -15,4 +35,4 @@ class BulkDisconnect(ObjectAction): label = _('Disconnect Selected') multi = True permissions_required = {'change'} - template_name = 'buttons/bulk_disconnect.html' + template_name = 'dcim/buttons/bulk_disconnect.html' diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index fe2d73c95..6d72f5c43 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -34,7 +34,7 @@ from wireless.models import WirelessLAN from . import filtersets, forms, tables from .choices import DeviceFaceChoices, InterfaceModeChoices from .models import * -from .object_actions import BulkDisconnect +from .object_actions import BulkAddComponents, BulkDisconnect CABLE_TERMINATION_TYPES = { 'dcim.consoleport': ConsolePort, @@ -2108,8 +2108,7 @@ class DeviceListView(generic.ObjectListView): filterset = filtersets.DeviceFilterSet filterset_form = forms.DeviceFilterForm table = tables.DeviceTable - actions = (AddObject, BulkImport, BulkExport, BulkEdit, BulkRename, BulkDelete) - template_name = 'dcim/device_list.html' + actions = (AddObject, BulkImport, BulkExport, BulkAddComponents, BulkEdit, BulkRename, BulkDelete) @register_model_view(Device) @@ -2150,7 +2149,7 @@ class DeviceConsolePortsView(DeviceComponentsView): table = tables.DeviceConsolePortTable filterset = filtersets.ConsolePortFilterSet filterset_form = forms.ConsolePortFilterForm - actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect) + actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete) tab = ViewTab( label=_('Console Ports'), badge=lambda obj: obj.console_port_count, @@ -2166,7 +2165,7 @@ class DeviceConsoleServerPortsView(DeviceComponentsView): table = tables.DeviceConsoleServerPortTable filterset = filtersets.ConsoleServerPortFilterSet filterset_form = forms.ConsoleServerPortFilterForm - actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect) + actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete) tab = ViewTab( label=_('Console Server Ports'), badge=lambda obj: obj.console_server_port_count, @@ -2182,7 +2181,7 @@ class DevicePowerPortsView(DeviceComponentsView): table = tables.DevicePowerPortTable filterset = filtersets.PowerPortFilterSet filterset_form = forms.PowerPortFilterForm - actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect) + actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete) tab = ViewTab( label=_('Power Ports'), badge=lambda obj: obj.power_port_count, @@ -2198,7 +2197,7 @@ class DevicePowerOutletsView(DeviceComponentsView): table = tables.DevicePowerOutletTable filterset = filtersets.PowerOutletFilterSet filterset_form = forms.PowerOutletFilterForm - actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect) + actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete) tab = ViewTab( label=_('Power Outlets'), badge=lambda obj: obj.power_outlet_count, @@ -2214,7 +2213,7 @@ class DeviceInterfacesView(DeviceComponentsView): table = tables.DeviceInterfaceTable filterset = filtersets.InterfaceFilterSet filterset_form = forms.InterfaceFilterForm - actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect) + actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete) template_name = 'dcim/device/interfaces.html' tab = ViewTab( label=_('Interfaces'), @@ -2237,7 +2236,7 @@ class DeviceFrontPortsView(DeviceComponentsView): table = tables.DeviceFrontPortTable filterset = filtersets.FrontPortFilterSet filterset_form = forms.FrontPortFilterForm - actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect) + actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete) tab = ViewTab( label=_('Front Ports'), badge=lambda obj: obj.front_port_count, @@ -2253,7 +2252,7 @@ class DeviceRearPortsView(DeviceComponentsView): table = tables.DeviceRearPortTable filterset = filtersets.RearPortFilterSet filterset_form = forms.RearPortFilterForm - actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect) + actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete) tab = ViewTab( label=_('Rear Ports'), badge=lambda obj: obj.rear_port_count, diff --git a/netbox/templates/dcim/buttons/bulk_add_components.html b/netbox/templates/dcim/buttons/bulk_add_components.html new file mode 100644 index 000000000..b5eadeeac --- /dev/null +++ b/netbox/templates/dcim/buttons/bulk_add_components.html @@ -0,0 +1,71 @@ +{% load i18n %} +
+ + +
diff --git a/netbox/utilities/templates/buttons/bulk_disconnect.html b/netbox/templates/dcim/buttons/bulk_disconnect.html similarity index 100% rename from netbox/utilities/templates/buttons/bulk_disconnect.html rename to netbox/templates/dcim/buttons/bulk_disconnect.html diff --git a/netbox/templates/dcim/device_list.html b/netbox/templates/dcim/device_list.html deleted file mode 100644 index ca4511058..000000000 --- a/netbox/templates/dcim/device_list.html +++ /dev/null @@ -1,77 +0,0 @@ -{% extends 'generic/object_list.html' %} -{% load i18n %} - -{% block extra_bulk_buttons %} - {% if perms.dcim.change_device %} -
- - -
- {% endif %} -{% endblock extra_bulk_buttons %} diff --git a/netbox/templates/generic/object_list.html b/netbox/templates/generic/object_list.html index 8bce75340..70d9e858d 100644 --- a/netbox/templates/generic/object_list.html +++ b/netbox/templates/generic/object_list.html @@ -112,7 +112,6 @@ Context:
{% block bulk_buttons %}
- {% block extra_bulk_buttons %}{% endblock %} {% action_buttons actions model multi=True %}
{% endblock %} diff --git a/netbox/templates/virtualization/buttons/bulk_add_components.html b/netbox/templates/virtualization/buttons/bulk_add_components.html new file mode 100644 index 000000000..8b0500862 --- /dev/null +++ b/netbox/templates/virtualization/buttons/bulk_add_components.html @@ -0,0 +1,22 @@ +{% load i18n %} +
+ + +
diff --git a/netbox/templates/virtualization/virtualmachine_list.html b/netbox/templates/virtualization/virtualmachine_list.html deleted file mode 100644 index b126f0c0b..000000000 --- a/netbox/templates/virtualization/virtualmachine_list.html +++ /dev/null @@ -1,28 +0,0 @@ -{% extends 'generic/object_list.html' %} -{% load i18n %} - -{% block extra_bulk_buttons %} - {% if perms.virtualization.change_virtualmachine %} -
- - -
- {% endif %} -{% endblock extra_bulk_buttons %} diff --git a/netbox/virtualization/object_actions.py b/netbox/virtualization/object_actions.py new file mode 100644 index 000000000..0f248b4e4 --- /dev/null +++ b/netbox/virtualization/object_actions.py @@ -0,0 +1,26 @@ +from django.utils.translation import gettext as _ + +from netbox.object_actions import ObjectAction + +__all__ = ( + 'BulkAddComponents', +) + + +class BulkAddComponents(ObjectAction): + """ + Add components to the selected virtual machines. + """ + label = _('Add Components') + multi = True + permissions_required = {'change'} + template_name = 'virtualization/buttons/bulk_add_components.html' + + @classmethod + def get_context(cls, context, obj): + return { + 'perms': context.get('perms'), + 'request': context.get('request'), + 'formaction': context.get('formaction'), + 'label': cls.label, + } diff --git a/netbox/virtualization/views.py b/netbox/virtualization/views.py index 0bfe2c9a4..e6ab07571 100644 --- a/netbox/virtualization/views.py +++ b/netbox/virtualization/views.py @@ -20,6 +20,7 @@ from utilities.query_functions import CollateAsChar from utilities.views import GetRelatedModelsMixin, ViewTab, register_model_view from . import filtersets, forms, tables from .models import * +from .object_actions import BulkAddComponents # @@ -321,7 +322,7 @@ class VirtualMachineListView(generic.ObjectListView): filterset = filtersets.VirtualMachineFilterSet filterset_form = forms.VirtualMachineFilterForm table = tables.VirtualMachineTable - template_name = 'virtualization/virtualmachine_list.html' + actions = (AddObject, BulkImport, BulkExport, BulkAddComponents, BulkEdit, BulkDelete) @register_model_view(VirtualMachine)