Fixes #7353: Fix bulk creation of device/VM components via list view

This commit is contained in:
jeremystretch 2021-09-27 10:36:01 -04:00
parent 8fda08a1b5
commit 68b1234388
4 changed files with 81 additions and 74 deletions

View File

@ -15,6 +15,7 @@
* [#7324](https://github.com/netbox-community/netbox/issues/7324) - Fix TypeError exception in web UI when filtering objects using single-choice filters * [#7324](https://github.com/netbox-community/netbox/issues/7324) - Fix TypeError exception in web UI when filtering objects using single-choice filters
* [#7333](https://github.com/netbox-community/netbox/issues/7333) - Prevent inadvertent deletion of prior change records when deleting objects * [#7333](https://github.com/netbox-community/netbox/issues/7333) - Prevent inadvertent deletion of prior change records when deleting objects
* [#7341](https://github.com/netbox-community/netbox/issues/7341) - Fix incorrect URL in circuit breadcrumbs * [#7341](https://github.com/netbox-community/netbox/issues/7341) - Fix incorrect URL in circuit breadcrumbs
* [#7353](https://github.com/netbox-community/netbox/issues/7353) - Fix bulk creation of device/VM components via list view
* [#7356](https://github.com/netbox-community/netbox/issues/7356) - Fix display of model documentation when adding device components * [#7356](https://github.com/netbox-community/netbox/issues/7356) - Fix display of model documentation when adding device components
* [#7360](https://github.com/netbox-community/netbox/issues/7360) - Correct redirection URL after removing child device from device bay * [#7360](https://github.com/netbox-community/netbox/issues/7360) - Correct redirection URL after removing child device from device bay

View File

@ -1,70 +1,69 @@
{% extends 'generic/object_list.html' %} {% extends 'generic/object_list.html' %}
{% block bulk_buttons %} {% block bulk_buttons %}
{% if perms.dcim.change_device %} {% if perms.dcim.change_device %}
<div class="dropdown"> <div class="dropdown">
<button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Components <i class="mdi mdi-plus-thick" aria-hidden="true"></i> 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">
Console Ports
</button> </button>
<ul class="dropdown-menu"> </li>
{% if perms.dcim.add_consoleport %} {% endif %}
<li> {% if perms.dcim.add_consoleserverport %}
<a href="{% url 'dcim:device_bulk_add_consoleport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" <li>
class="dropdown-item formaction"> <button type="submit" formaction="{% url 'dcim:device_bulk_add_consoleserverport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item ">
Console Ports Console Server Ports
</a> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_consoleserverport %} {% if perms.dcim.add_powerport %}
<li> <li>
<a href="{% url 'dcim:device_bulk_add_consoleserverport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" <button type="submit" formaction="{% url 'dcim:device_bulk_add_powerport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
class="dropdown-item formaction">Console Server Ports Power Ports
</a> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_powerport %} {% if perms.dcim.add_poweroutlet %}
<li> <li>
<a href="{% url 'dcim:device_bulk_add_powerport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" <button type="submit" formaction="{% url 'dcim:device_bulk_add_poweroutlet' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
class="dropdown-item formaction">Power Ports Power Outlets
</a> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_poweroutlet %} {% if perms.dcim.add_interface %}
<li> <li>
<a href="{% url 'dcim:device_bulk_add_poweroutlet' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" <button type="submit" formaction="{% url 'dcim:device_bulk_add_interface' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}"
class="dropdown-item formaction">Power Outlets class="dropdown-item">Interfaces
</a> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_interface %} {% if perms.dcim.add_rearport %}
<li> <li>
<a href="{% url 'dcim:device_bulk_add_interface' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" <button type="submit" formaction="{% url 'dcim:device_bulk_add_rearport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
class="dropdown-item formaction">Interfaces Rear Ports
</a> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_rearport %} {% if perms.dcim.add_devicebay %}
<li> <li>
<a href="{% url 'dcim:device_bulk_add_rearport' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" <button type="submit" formaction="{% url 'dcim:device_bulk_add_devicebay' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
class="dropdown-item formaction">Rear Ports Device Bays
</a> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_devicebay %} {% if perms.dcim.add_inventoryitem %}
<li> <li>
<a href="{% url 'dcim:device_bulk_add_devicebay' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" <button type="submit" formaction="{% url 'dcim:device_bulk_add_inventoryitem' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="dropdown-item">
class="dropdown-item formaction">Device Bays Inventory Items
</a> </button>
</li> </li>
{% endif %} {% endif %}
{% if perms.dcim.add_inventoryitem %} </ul>
<li> </div>
<a href="{% url 'dcim:device_bulk_add_inventoryitem' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" {% endif %}
class="dropdown-item formaction">Inventory Items
</a>
</li>
{% endif %}
</ul>
</div>
{% endif %}
{% endblock %} {% endblock %}

View File

@ -1,14 +1,20 @@
{% extends 'generic/object_list.html' %} {% extends 'generic/object_list.html' %}
{% block bulk_buttons %} {% block bulk_buttons %}
{% if perms.virtualization.change_virtualmachine %} {% if perms.virtualization.change_virtualmachine %}
<div class="btn-group"> <div class="dropdown">
<button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <button type="button" class="btn btn-sm btn-primary dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add Components <span class="caret"></span> <i class="mdi mdi-plus-thick" aria-hidden="true"></i> 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">
Interfaces
</button> </button>
<ul class="dropdown-menu"> </li>
{% if perms.virtualization.add_vminterface %}<li><a href="{% url 'virtualization:virtualmachine_bulk_add_vminterface' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="formaction">Interfaces</a></li>{% endif %} {% endif %}
</ul> </ul>
</div> </div>
{% endif %} {% endif %}
{% endblock %} {% endblock %}

View File

@ -506,6 +506,7 @@ class VirtualMachineBulkAddInterfaceView(generic.BulkComponentCreateView):
model_form = forms.VMInterfaceForm model_form = forms.VMInterfaceForm
filterset = filtersets.VirtualMachineFilterSet filterset = filtersets.VirtualMachineFilterSet
table = tables.VirtualMachineTable table = tables.VirtualMachineTable
default_return_url = 'virtualization:virtualmachine_list'
def get_required_permission(self): def get_required_permission(self):
return f'virtualization.add_vminterface' return f'virtualization.add_vminterface'