mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-16 04:02:52 -06:00
Create object actions for adding device/VM components
This commit is contained in:
parent
2b68841f31
commit
702b08e6b8
@ -3,10 +3,30 @@ from django.utils.translation import gettext as _
|
|||||||
from netbox.object_actions import ObjectAction
|
from netbox.object_actions import ObjectAction
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
|
'BulkAddComponents',
|
||||||
'BulkDisconnect',
|
'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):
|
class BulkDisconnect(ObjectAction):
|
||||||
"""
|
"""
|
||||||
Disconnect each of a set of objects to which a cable is connected.
|
Disconnect each of a set of objects to which a cable is connected.
|
||||||
@ -15,4 +35,4 @@ class BulkDisconnect(ObjectAction):
|
|||||||
label = _('Disconnect Selected')
|
label = _('Disconnect Selected')
|
||||||
multi = True
|
multi = True
|
||||||
permissions_required = {'change'}
|
permissions_required = {'change'}
|
||||||
template_name = 'buttons/bulk_disconnect.html'
|
template_name = 'dcim/buttons/bulk_disconnect.html'
|
||||||
|
@ -34,7 +34,7 @@ from wireless.models import WirelessLAN
|
|||||||
from . import filtersets, forms, tables
|
from . import filtersets, forms, tables
|
||||||
from .choices import DeviceFaceChoices, InterfaceModeChoices
|
from .choices import DeviceFaceChoices, InterfaceModeChoices
|
||||||
from .models import *
|
from .models import *
|
||||||
from .object_actions import BulkDisconnect
|
from .object_actions import BulkAddComponents, BulkDisconnect
|
||||||
|
|
||||||
CABLE_TERMINATION_TYPES = {
|
CABLE_TERMINATION_TYPES = {
|
||||||
'dcim.consoleport': ConsolePort,
|
'dcim.consoleport': ConsolePort,
|
||||||
@ -2108,8 +2108,7 @@ class DeviceListView(generic.ObjectListView):
|
|||||||
filterset = filtersets.DeviceFilterSet
|
filterset = filtersets.DeviceFilterSet
|
||||||
filterset_form = forms.DeviceFilterForm
|
filterset_form = forms.DeviceFilterForm
|
||||||
table = tables.DeviceTable
|
table = tables.DeviceTable
|
||||||
actions = (AddObject, BulkImport, BulkExport, BulkEdit, BulkRename, BulkDelete)
|
actions = (AddObject, BulkImport, BulkExport, BulkAddComponents, BulkEdit, BulkRename, BulkDelete)
|
||||||
template_name = 'dcim/device_list.html'
|
|
||||||
|
|
||||||
|
|
||||||
@register_model_view(Device)
|
@register_model_view(Device)
|
||||||
@ -2150,7 +2149,7 @@ class DeviceConsolePortsView(DeviceComponentsView):
|
|||||||
table = tables.DeviceConsolePortTable
|
table = tables.DeviceConsolePortTable
|
||||||
filterset = filtersets.ConsolePortFilterSet
|
filterset = filtersets.ConsolePortFilterSet
|
||||||
filterset_form = forms.ConsolePortFilterForm
|
filterset_form = forms.ConsolePortFilterForm
|
||||||
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect)
|
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete)
|
||||||
tab = ViewTab(
|
tab = ViewTab(
|
||||||
label=_('Console Ports'),
|
label=_('Console Ports'),
|
||||||
badge=lambda obj: obj.console_port_count,
|
badge=lambda obj: obj.console_port_count,
|
||||||
@ -2166,7 +2165,7 @@ class DeviceConsoleServerPortsView(DeviceComponentsView):
|
|||||||
table = tables.DeviceConsoleServerPortTable
|
table = tables.DeviceConsoleServerPortTable
|
||||||
filterset = filtersets.ConsoleServerPortFilterSet
|
filterset = filtersets.ConsoleServerPortFilterSet
|
||||||
filterset_form = forms.ConsoleServerPortFilterForm
|
filterset_form = forms.ConsoleServerPortFilterForm
|
||||||
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect)
|
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete)
|
||||||
tab = ViewTab(
|
tab = ViewTab(
|
||||||
label=_('Console Server Ports'),
|
label=_('Console Server Ports'),
|
||||||
badge=lambda obj: obj.console_server_port_count,
|
badge=lambda obj: obj.console_server_port_count,
|
||||||
@ -2182,7 +2181,7 @@ class DevicePowerPortsView(DeviceComponentsView):
|
|||||||
table = tables.DevicePowerPortTable
|
table = tables.DevicePowerPortTable
|
||||||
filterset = filtersets.PowerPortFilterSet
|
filterset = filtersets.PowerPortFilterSet
|
||||||
filterset_form = forms.PowerPortFilterForm
|
filterset_form = forms.PowerPortFilterForm
|
||||||
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect)
|
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete)
|
||||||
tab = ViewTab(
|
tab = ViewTab(
|
||||||
label=_('Power Ports'),
|
label=_('Power Ports'),
|
||||||
badge=lambda obj: obj.power_port_count,
|
badge=lambda obj: obj.power_port_count,
|
||||||
@ -2198,7 +2197,7 @@ class DevicePowerOutletsView(DeviceComponentsView):
|
|||||||
table = tables.DevicePowerOutletTable
|
table = tables.DevicePowerOutletTable
|
||||||
filterset = filtersets.PowerOutletFilterSet
|
filterset = filtersets.PowerOutletFilterSet
|
||||||
filterset_form = forms.PowerOutletFilterForm
|
filterset_form = forms.PowerOutletFilterForm
|
||||||
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect)
|
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete)
|
||||||
tab = ViewTab(
|
tab = ViewTab(
|
||||||
label=_('Power Outlets'),
|
label=_('Power Outlets'),
|
||||||
badge=lambda obj: obj.power_outlet_count,
|
badge=lambda obj: obj.power_outlet_count,
|
||||||
@ -2214,7 +2213,7 @@ class DeviceInterfacesView(DeviceComponentsView):
|
|||||||
table = tables.DeviceInterfaceTable
|
table = tables.DeviceInterfaceTable
|
||||||
filterset = filtersets.InterfaceFilterSet
|
filterset = filtersets.InterfaceFilterSet
|
||||||
filterset_form = forms.InterfaceFilterForm
|
filterset_form = forms.InterfaceFilterForm
|
||||||
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect)
|
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete)
|
||||||
template_name = 'dcim/device/interfaces.html'
|
template_name = 'dcim/device/interfaces.html'
|
||||||
tab = ViewTab(
|
tab = ViewTab(
|
||||||
label=_('Interfaces'),
|
label=_('Interfaces'),
|
||||||
@ -2237,7 +2236,7 @@ class DeviceFrontPortsView(DeviceComponentsView):
|
|||||||
table = tables.DeviceFrontPortTable
|
table = tables.DeviceFrontPortTable
|
||||||
filterset = filtersets.FrontPortFilterSet
|
filterset = filtersets.FrontPortFilterSet
|
||||||
filterset_form = forms.FrontPortFilterForm
|
filterset_form = forms.FrontPortFilterForm
|
||||||
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect)
|
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete)
|
||||||
tab = ViewTab(
|
tab = ViewTab(
|
||||||
label=_('Front Ports'),
|
label=_('Front Ports'),
|
||||||
badge=lambda obj: obj.front_port_count,
|
badge=lambda obj: obj.front_port_count,
|
||||||
@ -2253,7 +2252,7 @@ class DeviceRearPortsView(DeviceComponentsView):
|
|||||||
table = tables.DeviceRearPortTable
|
table = tables.DeviceRearPortTable
|
||||||
filterset = filtersets.RearPortFilterSet
|
filterset = filtersets.RearPortFilterSet
|
||||||
filterset_form = forms.RearPortFilterForm
|
filterset_form = forms.RearPortFilterForm
|
||||||
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDelete, BulkDisconnect)
|
actions = (EditObject, DeleteObject, BulkEdit, BulkRename, BulkDisconnect, BulkDelete)
|
||||||
tab = ViewTab(
|
tab = ViewTab(
|
||||||
label=_('Rear Ports'),
|
label=_('Rear Ports'),
|
||||||
badge=lambda obj: obj.rear_port_count,
|
badge=lambda obj: obj.rear_port_count,
|
||||||
|
71
netbox/templates/dcim/buttons/bulk_add_components.html
Normal file
71
netbox/templates/dcim/buttons/bulk_add_components.html
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
{% load i18n %}
|
||||||
|
<div class="btn-group">
|
||||||
|
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> {{ label }}
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
{% if perms.dcim.add_consoleport %}
|
||||||
|
<li>
|
||||||
|
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_consoleport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
||||||
|
{% trans "Console Ports" %}
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.add_consoleserverport %}
|
||||||
|
<li>
|
||||||
|
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_consoleserverport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item ">
|
||||||
|
{% trans "Console Server Ports" %}
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.add_powerport %}
|
||||||
|
<li>
|
||||||
|
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_powerport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
||||||
|
{% trans "Power Ports" %}
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.add_poweroutlet %}
|
||||||
|
<li>
|
||||||
|
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_poweroutlet' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
||||||
|
{% trans "Power Outlets" %}
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.add_interface %}
|
||||||
|
<li>
|
||||||
|
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_interface' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
||||||
|
{% trans "Interfaces" %}
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.add_rearport %}
|
||||||
|
<li>
|
||||||
|
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_rearport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
||||||
|
{% trans "Rear Ports" %}
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.add_devicebay %}
|
||||||
|
<li>
|
||||||
|
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_devicebay' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
||||||
|
{% trans "Device Bays" %}
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.add_modulebay %}
|
||||||
|
<li>
|
||||||
|
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_modulebay' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
||||||
|
{% trans "Module Bays" %}
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.add_inventoryitem %}
|
||||||
|
<li>
|
||||||
|
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_inventoryitem' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
||||||
|
{% trans "Inventory Items" %}
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
@ -1,77 +0,0 @@
|
|||||||
{% extends 'generic/object_list.html' %}
|
|
||||||
{% load i18n %}
|
|
||||||
|
|
||||||
{% block extra_bulk_buttons %}
|
|
||||||
{% if perms.dcim.change_device %}
|
|
||||||
<div class="btn-group">
|
|
||||||
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add Components" %}
|
|
||||||
</button>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
{% if perms.dcim.add_consoleport %}
|
|
||||||
<li>
|
|
||||||
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_consoleport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
|
||||||
{% trans "Console Ports" %}
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.add_consoleserverport %}
|
|
||||||
<li>
|
|
||||||
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_consoleserverport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item ">
|
|
||||||
{% trans "Console Server Ports" %}
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.add_powerport %}
|
|
||||||
<li>
|
|
||||||
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_powerport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
|
||||||
{% trans "Power Ports" %}
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.add_poweroutlet %}
|
|
||||||
<li>
|
|
||||||
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_poweroutlet' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
|
||||||
{% trans "Power Outlets" %}
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.add_interface %}
|
|
||||||
<li>
|
|
||||||
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_interface' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
|
||||||
{% trans "Interfaces" %}
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.add_rearport %}
|
|
||||||
<li>
|
|
||||||
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_rearport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
|
||||||
{% trans "Rear Ports" %}
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.add_devicebay %}
|
|
||||||
<li>
|
|
||||||
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_devicebay' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
|
||||||
{% trans "Device Bays" %}
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.add_modulebay %}
|
|
||||||
<li>
|
|
||||||
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_modulebay' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
|
||||||
{% trans "Module Bays" %}
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.add_inventoryitem %}
|
|
||||||
<li>
|
|
||||||
<button type="submit" {% formaction %}="{% url 'dcim:device_bulk_add_inventoryitem' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
|
||||||
{% trans "Inventory Items" %}
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock extra_bulk_buttons %}
|
|
@ -112,7 +112,6 @@ Context:
|
|||||||
<div class="btn-list d-print-none">
|
<div class="btn-list d-print-none">
|
||||||
{% block bulk_buttons %}
|
{% block bulk_buttons %}
|
||||||
<div class="bulk-action-buttons">
|
<div class="bulk-action-buttons">
|
||||||
{% block extra_bulk_buttons %}{% endblock %}
|
|
||||||
{% action_buttons actions model multi=True %}
|
{% action_buttons actions model multi=True %}
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -0,0 +1,22 @@
|
|||||||
|
{% load i18n %}
|
||||||
|
<div class="btn-group">
|
||||||
|
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
||||||
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add Components" %}
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
{% if perms.virtualization.add_vminterface %}
|
||||||
|
<li>
|
||||||
|
<button type="submit" {% formaction %}="{% url 'virtualization:virtualmachine_bulk_add_vminterface' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
||||||
|
{% trans "Interfaces" %}
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.virtualization.add_virtualdisk %}
|
||||||
|
<li>
|
||||||
|
<button type="submit" {% formaction %}="{% url 'virtualization:virtualmachine_bulk_add_virtualdisk' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
||||||
|
{% trans "Virtual Disks" %}
|
||||||
|
</button>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
|
</ul>
|
||||||
|
</div>
|
@ -1,28 +0,0 @@
|
|||||||
{% extends 'generic/object_list.html' %}
|
|
||||||
{% load i18n %}
|
|
||||||
|
|
||||||
{% block extra_bulk_buttons %}
|
|
||||||
{% if perms.virtualization.change_virtualmachine %}
|
|
||||||
<div class="btn-group">
|
|
||||||
<button type="button" class="btn btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add Components" %}
|
|
||||||
</button>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
{% if perms.virtualization.add_vminterface %}
|
|
||||||
<li>
|
|
||||||
<button type="submit" {% formaction %}="{% url 'virtualization:virtualmachine_bulk_add_vminterface' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
|
||||||
{% trans "Interfaces" %}
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.virtualization.add_virtualdisk %}
|
|
||||||
<li>
|
|
||||||
<button type="submit" {% formaction %}="{% url 'virtualization:virtualmachine_bulk_add_virtualdisk' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
|
|
||||||
{% trans "Virtual Disks" %}
|
|
||||||
</button>
|
|
||||||
</li>
|
|
||||||
{% endif %}
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
{% endblock extra_bulk_buttons %}
|
|
26
netbox/virtualization/object_actions.py
Normal file
26
netbox/virtualization/object_actions.py
Normal file
@ -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,
|
||||||
|
}
|
@ -20,6 +20,7 @@ from utilities.query_functions import CollateAsChar
|
|||||||
from utilities.views import GetRelatedModelsMixin, ViewTab, register_model_view
|
from utilities.views import GetRelatedModelsMixin, ViewTab, register_model_view
|
||||||
from . import filtersets, forms, tables
|
from . import filtersets, forms, tables
|
||||||
from .models import *
|
from .models import *
|
||||||
|
from .object_actions import BulkAddComponents
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
@ -321,7 +322,7 @@ class VirtualMachineListView(generic.ObjectListView):
|
|||||||
filterset = filtersets.VirtualMachineFilterSet
|
filterset = filtersets.VirtualMachineFilterSet
|
||||||
filterset_form = forms.VirtualMachineFilterForm
|
filterset_form = forms.VirtualMachineFilterForm
|
||||||
table = tables.VirtualMachineTable
|
table = tables.VirtualMachineTable
|
||||||
template_name = 'virtualization/virtualmachine_list.html'
|
actions = (AddObject, BulkImport, BulkExport, BulkAddComponents, BulkEdit, BulkDelete)
|
||||||
|
|
||||||
|
|
||||||
@register_model_view(VirtualMachine)
|
@register_model_view(VirtualMachine)
|
||||||
|
Loading…
Reference in New Issue
Block a user