mirror of
https://github.com/netbox-community/netbox.git
synced 2025-07-24 17:38:37 -06:00
commit
63c6687a87
2
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
2
.github/ISSUE_TEMPLATE/bug_report.yaml
vendored
@ -14,7 +14,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: NetBox version
|
label: NetBox version
|
||||||
description: What version of NetBox are you currently running?
|
description: What version of NetBox are you currently running?
|
||||||
placeholder: v3.2.8
|
placeholder: v3.2.9
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
|
2
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
2
.github/ISSUE_TEMPLATE/feature_request.yaml
vendored
@ -14,7 +14,7 @@ body:
|
|||||||
attributes:
|
attributes:
|
||||||
label: NetBox version
|
label: NetBox version
|
||||||
description: What version of NetBox are you currently running?
|
description: What version of NetBox are you currently running?
|
||||||
placeholder: v3.2.8
|
placeholder: v3.2.9
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: dropdown
|
- type: dropdown
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
## Front Ports
|
## Front Ports
|
||||||
|
|
||||||
Front ports are pass-through ports used to represent physical cable connections that comprise part of a longer path. For example, the ports on the front face of a UTP patch panel would be modeled in NetBox as front ports. Each port is assigned a physical type, and must be mapped to a specific rear port on the same device. A single rear port may be mapped to multiple rear ports, using numeric positions to annotate the specific alignment of each.
|
Front ports are pass-through ports used to represent physical cable connections that comprise part of a longer path. For example, the ports on the front face of a UTP patch panel would be modeled in NetBox as front ports. Each port is assigned a physical type, and must be mapped to a specific rear port on the same device. A single rear port may be mapped to multiple front ports, using numeric positions to annotate the specific alignment of each.
|
||||||
|
@ -1,5 +1,25 @@
|
|||||||
# NetBox v3.2
|
# NetBox v3.2
|
||||||
|
|
||||||
|
## v3.2.9 (2022-08-16)
|
||||||
|
|
||||||
|
### Enhancements
|
||||||
|
|
||||||
|
* [#8595](https://github.com/netbox-community/netbox/issues/8595) - Add PON interface types
|
||||||
|
* [#8723](https://github.com/netbox-community/netbox/issues/8723) - Enable bulk renaming of devices
|
||||||
|
* [#9161](https://github.com/netbox-community/netbox/issues/9161) - Pretty print JSON custom field data when editing
|
||||||
|
* [#9505](https://github.com/netbox-community/netbox/issues/9505) - Display extra addressing details for IPv4 prefixes
|
||||||
|
* [#9625](https://github.com/netbox-community/netbox/issues/9625) - Add phone & email details to contacts panel
|
||||||
|
* [#9857](https://github.com/netbox-community/netbox/issues/9857) - Add clear button to quick search fields
|
||||||
|
* [#9933](https://github.com/netbox-community/netbox/issues/9933) - Add DOCSIS interface type
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* [#9491](https://github.com/netbox-community/netbox/issues/9491) - Remove button for adding inventory item templates to module type components
|
||||||
|
* [#9979](https://github.com/netbox-community/netbox/issues/9979) - Fix Markdown rendering for custom fields in table columns
|
||||||
|
* [#9986](https://github.com/netbox-community/netbox/issues/9986) - Workaround for upstream timezone data bug
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
## v3.2.8 (2022-08-08)
|
## v3.2.8 (2022-08-08)
|
||||||
|
|
||||||
### Enhancements
|
### Enhancements
|
||||||
|
@ -814,6 +814,17 @@ class InterfaceTypeChoices(ChoiceSet):
|
|||||||
# ATM/DSL
|
# ATM/DSL
|
||||||
TYPE_XDSL = 'xdsl'
|
TYPE_XDSL = 'xdsl'
|
||||||
|
|
||||||
|
# Coaxial
|
||||||
|
TYPE_DOCSIS = 'docsis'
|
||||||
|
|
||||||
|
# PON
|
||||||
|
TYPE_GPON = 'gpon'
|
||||||
|
TYPE_XG_PON = 'xg-pon'
|
||||||
|
TYPE_XGS_PON = 'xgs-pon'
|
||||||
|
TYPE_NG_PON2 = 'ng-pon2'
|
||||||
|
TYPE_EPON = 'epon'
|
||||||
|
TYPE_10G_EPON = '10g-epon'
|
||||||
|
|
||||||
# Stacking
|
# Stacking
|
||||||
TYPE_STACKWISE = 'cisco-stackwise'
|
TYPE_STACKWISE = 'cisco-stackwise'
|
||||||
TYPE_STACKWISE_PLUS = 'cisco-stackwise-plus'
|
TYPE_STACKWISE_PLUS = 'cisco-stackwise-plus'
|
||||||
@ -950,6 +961,23 @@ class InterfaceTypeChoices(ChoiceSet):
|
|||||||
(TYPE_XDSL, 'xDSL'),
|
(TYPE_XDSL, 'xDSL'),
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
|
(
|
||||||
|
'Coaxial',
|
||||||
|
(
|
||||||
|
(TYPE_DOCSIS, 'DOCSIS'),
|
||||||
|
)
|
||||||
|
),
|
||||||
|
(
|
||||||
|
'PON',
|
||||||
|
(
|
||||||
|
(TYPE_GPON, 'GPON (2.5 Gbps / 1.25 Gps)'),
|
||||||
|
(TYPE_XG_PON, 'XG-PON (10 Gbps / 2.5 Gbps)'),
|
||||||
|
(TYPE_XGS_PON, 'XGS-PON (10 Gbps)'),
|
||||||
|
(TYPE_NG_PON2, 'NG-PON2 (TWDM-PON) (4x10 Gbps)'),
|
||||||
|
(TYPE_EPON, 'EPON (1 Gbps)'),
|
||||||
|
(TYPE_10G_EPON, '10G-EPON (10 Gbps)'),
|
||||||
|
)
|
||||||
|
),
|
||||||
(
|
(
|
||||||
'Stacking',
|
'Stacking',
|
||||||
(
|
(
|
||||||
|
@ -100,7 +100,7 @@ LOCATION_BUTTONS = """
|
|||||||
|
|
||||||
MODULAR_COMPONENT_TEMPLATE_BUTTONS = """
|
MODULAR_COMPONENT_TEMPLATE_BUTTONS = """
|
||||||
{% load helpers %}
|
{% load helpers %}
|
||||||
{% if perms.dcim.add_inventoryitemtemplate %}
|
{% if perms.dcim.add_inventoryitemtemplate and record.device_type_id %}
|
||||||
<a href="{% url 'dcim:inventoryitemtemplate_add' %}?device_type={{ record.device_type_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={{ request.path }}" title="Add inventory item" class="btn btn-primary btn-sm">
|
<a href="{% url 'dcim:inventoryitemtemplate_add' %}?device_type={{ record.device_type_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={{ request.path }}" title="Add inventory item" class="btn btn-primary btn-sm">
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i>
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i>
|
||||||
</a>
|
</a>
|
||||||
|
@ -248,6 +248,7 @@ urlpatterns = [
|
|||||||
path('devices/import/', views.DeviceBulkImportView.as_view(), name='device_import'),
|
path('devices/import/', views.DeviceBulkImportView.as_view(), name='device_import'),
|
||||||
path('devices/import/child-devices/', views.ChildDeviceBulkImportView.as_view(), name='device_import_child'),
|
path('devices/import/child-devices/', views.ChildDeviceBulkImportView.as_view(), name='device_import_child'),
|
||||||
path('devices/edit/', views.DeviceBulkEditView.as_view(), name='device_bulk_edit'),
|
path('devices/edit/', views.DeviceBulkEditView.as_view(), name='device_bulk_edit'),
|
||||||
|
path('devices/rename/', views.DeviceBulkRenameView.as_view(), name='device_bulk_rename'),
|
||||||
path('devices/delete/', views.DeviceBulkDeleteView.as_view(), name='device_bulk_delete'),
|
path('devices/delete/', views.DeviceBulkDeleteView.as_view(), name='device_bulk_delete'),
|
||||||
path('devices/<int:pk>/', views.DeviceView.as_view(), name='device'),
|
path('devices/<int:pk>/', views.DeviceView.as_view(), name='device'),
|
||||||
path('devices/<int:pk>/edit/', views.DeviceEditView.as_view(), name='device_edit'),
|
path('devices/<int:pk>/edit/', views.DeviceEditView.as_view(), name='device_edit'),
|
||||||
|
@ -1784,6 +1784,12 @@ class DeviceBulkDeleteView(generic.BulkDeleteView):
|
|||||||
table = tables.DeviceTable
|
table = tables.DeviceTable
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceBulkRenameView(generic.BulkRenameView):
|
||||||
|
queryset = Device.objects.all()
|
||||||
|
filterset = filtersets.DeviceFilterSet
|
||||||
|
table = tables.DeviceTable
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Devices
|
# Devices
|
||||||
#
|
#
|
||||||
|
@ -18,7 +18,7 @@ from netbox.models.features import ExportTemplatesMixin, WebhooksMixin
|
|||||||
from utilities import filters
|
from utilities import filters
|
||||||
from utilities.forms import (
|
from utilities.forms import (
|
||||||
CSVChoiceField, CSVMultipleChoiceField, DatePicker, DynamicModelChoiceField, DynamicModelMultipleChoiceField,
|
CSVChoiceField, CSVMultipleChoiceField, DatePicker, DynamicModelChoiceField, DynamicModelMultipleChoiceField,
|
||||||
LaxURLField, StaticSelectMultiple, StaticSelect, add_blank_choice,
|
JSONField, LaxURLField, StaticSelectMultiple, StaticSelect, add_blank_choice,
|
||||||
)
|
)
|
||||||
from utilities.querysets import RestrictedQuerySet
|
from utilities.querysets import RestrictedQuerySet
|
||||||
from utilities.validators import validate_regex
|
from utilities.validators import validate_regex
|
||||||
@ -343,7 +343,7 @@ class CustomField(ExportTemplatesMixin, WebhooksMixin, ChangeLoggedModel):
|
|||||||
|
|
||||||
# JSON
|
# JSON
|
||||||
elif self.type == CustomFieldTypeChoices.TYPE_JSON:
|
elif self.type == CustomFieldTypeChoices.TYPE_JSON:
|
||||||
field = forms.JSONField(required=required, initial=initial)
|
field = JSONField(required=required, initial=initial)
|
||||||
|
|
||||||
# Object
|
# Object
|
||||||
elif self.type == CustomFieldTypeChoices.TYPE_OBJECT:
|
elif self.type == CustomFieldTypeChoices.TYPE_OBJECT:
|
||||||
|
@ -29,7 +29,7 @@ django.utils.encoding.force_text = force_str
|
|||||||
# Environment setup
|
# Environment setup
|
||||||
#
|
#
|
||||||
|
|
||||||
VERSION = '3.2.8'
|
VERSION = '3.2.9'
|
||||||
|
|
||||||
# Hostname
|
# Hostname
|
||||||
HOSTNAME = platform.node()
|
HOSTNAME = platform.node()
|
||||||
|
@ -14,6 +14,7 @@ from django_tables2.columns import library
|
|||||||
from django_tables2.utils import Accessor
|
from django_tables2.utils import Accessor
|
||||||
|
|
||||||
from extras.choices import CustomFieldTypeChoices
|
from extras.choices import CustomFieldTypeChoices
|
||||||
|
from utilities.templatetags.builtins.filters import render_markdown
|
||||||
from utilities.utils import content_type_identifier, content_type_name, get_viewname
|
from utilities.utils import content_type_identifier, content_type_name, get_viewname
|
||||||
|
|
||||||
__all__ = (
|
__all__ = (
|
||||||
@ -427,7 +428,7 @@ class CustomFieldColumn(tables.Column):
|
|||||||
super().__init__(*args, **kwargs)
|
super().__init__(*args, **kwargs)
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _likify_item(item):
|
def _linkify_item(item):
|
||||||
if hasattr(item, 'get_absolute_url'):
|
if hasattr(item, 'get_absolute_url'):
|
||||||
return f'<a href="{item.get_absolute_url()}">{escape(item)}</a>'
|
return f'<a href="{item.get_absolute_url()}">{escape(item)}</a>'
|
||||||
return escape(item)
|
return escape(item)
|
||||||
@ -443,11 +444,13 @@ class CustomFieldColumn(tables.Column):
|
|||||||
return ', '.join(v for v in value)
|
return ', '.join(v for v in value)
|
||||||
if self.customfield.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT:
|
if self.customfield.type == CustomFieldTypeChoices.TYPE_MULTIOBJECT:
|
||||||
return mark_safe(', '.join(
|
return mark_safe(', '.join(
|
||||||
self._likify_item(obj) for obj in self.customfield.deserialize(value)
|
self._linkify_item(obj) for obj in self.customfield.deserialize(value)
|
||||||
))
|
))
|
||||||
|
if self.customfield.type == CustomFieldTypeChoices.TYPE_LONGTEXT and value:
|
||||||
|
return render_markdown(value)
|
||||||
if value is not None:
|
if value is not None:
|
||||||
obj = self.customfield.deserialize(value)
|
obj = self.customfield.deserialize(value)
|
||||||
return mark_safe(self._likify_item(obj))
|
return mark_safe(self._linkify_item(obj))
|
||||||
return self.default
|
return self.default
|
||||||
|
|
||||||
def value(self, value):
|
def value(self, value):
|
||||||
|
@ -633,7 +633,7 @@ class BulkRenameView(GetReturnURLMixin, BaseMultiObjectView):
|
|||||||
replace = form.cleaned_data['replace']
|
replace = form.cleaned_data['replace']
|
||||||
if form.cleaned_data['use_regex']:
|
if form.cleaned_data['use_regex']:
|
||||||
try:
|
try:
|
||||||
obj.new_name = re.sub(find, replace, obj.name)
|
obj.new_name = re.sub(find, replace, obj.name or '')
|
||||||
# Catch regex group reference errors
|
# Catch regex group reference errors
|
||||||
except re.error:
|
except re.error:
|
||||||
obj.new_name = obj.name
|
obj.new_name = obj.name
|
||||||
|
BIN
netbox/project-static/dist/netbox-dark.css
vendored
BIN
netbox/project-static/dist/netbox-dark.css
vendored
Binary file not shown.
BIN
netbox/project-static/dist/netbox-light.css
vendored
BIN
netbox/project-static/dist/netbox-light.css
vendored
Binary file not shown.
BIN
netbox/project-static/dist/netbox-print.css
vendored
BIN
netbox/project-static/dist/netbox-print.css
vendored
Binary file not shown.
BIN
netbox/project-static/dist/netbox.js
vendored
BIN
netbox/project-static/dist/netbox.js
vendored
Binary file not shown.
BIN
netbox/project-static/dist/netbox.js.map
vendored
BIN
netbox/project-static/dist/netbox.js.map
vendored
Binary file not shown.
@ -27,6 +27,23 @@ function handleSearchDropdownClick(event: Event, button: HTMLButtonElement): voi
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show/hide quicksearch clear button.
|
||||||
|
*
|
||||||
|
* @param event "keyup" or "search" event for the quicksearch input
|
||||||
|
*/
|
||||||
|
function quickSearchEventHandler(event: Event): void {
|
||||||
|
const quicksearch = event.currentTarget as HTMLInputElement;
|
||||||
|
const inputgroup = quicksearch.parentElement as HTMLDivElement;
|
||||||
|
if (isTruthy(inputgroup)) {
|
||||||
|
if (quicksearch.value === "") {
|
||||||
|
inputgroup.classList.add("hide-last-child");
|
||||||
|
} else {
|
||||||
|
inputgroup.classList.remove("hide-last-child");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize Search Bar Elements.
|
* Initialize Search Bar Elements.
|
||||||
*/
|
*/
|
||||||
@ -40,8 +57,35 @@ function initSearchBar(): void {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize Quicksearch Event listener/handlers.
|
||||||
|
*/
|
||||||
|
function initQuickSearch(): void {
|
||||||
|
const quicksearch = document.getElementById("quicksearch") as HTMLInputElement;
|
||||||
|
const clearbtn = document.getElementById("quicksearch_clear") as HTMLButtonElement;
|
||||||
|
if (isTruthy(quicksearch)) {
|
||||||
|
quicksearch.addEventListener("keyup", quickSearchEventHandler, {
|
||||||
|
passive: true
|
||||||
|
})
|
||||||
|
quicksearch.addEventListener("search", quickSearchEventHandler, {
|
||||||
|
passive: true
|
||||||
|
})
|
||||||
|
if (isTruthy(clearbtn)) {
|
||||||
|
clearbtn.addEventListener("click", async () => {
|
||||||
|
const search = new Event('search');
|
||||||
|
quicksearch.value = '';
|
||||||
|
await new Promise(f => setTimeout(f, 100));
|
||||||
|
quicksearch.dispatchEvent(search);
|
||||||
|
}, {
|
||||||
|
passive: true
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export function initSearch(): void {
|
export function initSearch(): void {
|
||||||
for (const func of [initSearchBar]) {
|
for (const func of [initSearchBar]) {
|
||||||
func();
|
func();
|
||||||
}
|
}
|
||||||
|
initQuickSearch();
|
||||||
}
|
}
|
||||||
|
@ -416,6 +416,27 @@ nav.search {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Styles for the quicksearch and its clear button;
|
||||||
|
// Overrides input-group styles and adds transition effects
|
||||||
|
.quicksearch {
|
||||||
|
input[type="search"] {
|
||||||
|
border-radius: $border-radius !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
margin-left: -32px !important;
|
||||||
|
z-index: 100 !important;
|
||||||
|
outline: none !important;
|
||||||
|
border-radius: $border-radius !important;
|
||||||
|
transition: visibility 0s, opacity 0.2s linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
button :hover {
|
||||||
|
opacity: 50%;
|
||||||
|
transition: visibility 0s, opacity 0.1s linear;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
main.layout {
|
main.layout {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: nowrap;
|
flex-wrap: nowrap;
|
||||||
@ -714,11 +735,8 @@ textarea.form-control[rows='10'] {
|
|||||||
height: 18rem;
|
height: 18rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
textarea#id_local_context_data,
|
|
||||||
textarea.markdown,
|
textarea.markdown,
|
||||||
textarea#id_public_key,
|
textarea.form-control[name='csv'] {
|
||||||
textarea.form-control[name='csv'],
|
|
||||||
textarea.form-control[name='data'] {
|
|
||||||
font-family: $font-family-monospace;
|
font-family: $font-family-monospace;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,3 +34,11 @@ a[type='button'] {
|
|||||||
.badge {
|
.badge {
|
||||||
font-size: $font-size-xs;
|
font-size: $font-size-xs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* clears the 'X' in search inputs from webkit browsers */
|
||||||
|
input[type='search']::-webkit-search-decoration,
|
||||||
|
input[type='search']::-webkit-search-cancel-button,
|
||||||
|
input[type='search']::-webkit-search-results-button,
|
||||||
|
input[type='search']::-webkit-search-results-decoration {
|
||||||
|
-webkit-appearance: none !important;
|
||||||
|
}
|
||||||
|
@ -92,6 +92,10 @@ $input-focus-color: $input-color;
|
|||||||
$input-placeholder-color: $gray-700;
|
$input-placeholder-color: $gray-700;
|
||||||
$input-plaintext-color: $body-color;
|
$input-plaintext-color: $body-color;
|
||||||
|
|
||||||
|
input {
|
||||||
|
color-scheme: dark;
|
||||||
|
}
|
||||||
|
|
||||||
$form-check-input-active-filter: brightness(90%);
|
$form-check-input-active-filter: brightness(90%);
|
||||||
$form-check-input-bg: $input-bg;
|
$form-check-input-bg: $input-bg;
|
||||||
$form-check-input-border: 1px solid rgba(255, 255, 255, 0.25);
|
$form-check-input-border: 1px solid rgba(255, 255, 255, 0.25);
|
||||||
|
@ -22,7 +22,6 @@ $theme-colors: (
|
|||||||
'danger': $danger,
|
'danger': $danger,
|
||||||
'light': $light,
|
'light': $light,
|
||||||
'dark': $dark,
|
'dark': $dark,
|
||||||
|
|
||||||
// General-purpose palette
|
// General-purpose palette
|
||||||
'blue': $blue-500,
|
'blue': $blue-500,
|
||||||
'indigo': $indigo-500,
|
'indigo': $indigo-500,
|
||||||
@ -36,7 +35,7 @@ $theme-colors: (
|
|||||||
'cyan': $cyan-500,
|
'cyan': $cyan-500,
|
||||||
'gray': $gray-500,
|
'gray': $gray-500,
|
||||||
'black': $black,
|
'black': $black,
|
||||||
'white': $white,
|
'white': $white
|
||||||
);
|
);
|
||||||
|
|
||||||
$light: $gray-200;
|
$light: $gray-200;
|
||||||
|
@ -42,3 +42,9 @@ table td {
|
|||||||
visibility: visible !important;
|
visibility: visible !important;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Hides the last child of an element
|
||||||
|
.hide-last-child :last-child {
|
||||||
|
visibility: hidden;
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
@ -16,31 +16,37 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="noprint bulk-buttons">
|
<div class="noprint bulk-buttons">
|
||||||
<div class="bulk-button-group">
|
<div class="bulk-button-group">
|
||||||
{% if perms.dcim.change_consoleport %}
|
{% if perms.dcim.change_consoleport %}
|
||||||
<button type="submit" name="_rename" formaction="{% url 'dcim:consoleport_bulk_rename' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
<div class="btn-group" role="group">
|
||||||
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
<button type="submit" name="_edit" formaction="{% url 'dcim:consoleport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
||||||
<button type="submit" name="_edit" formaction="{% url 'dcim:consoleport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-warning btn-sm">
|
</button>
|
||||||
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
<button type="submit" name="_rename" formaction="{% url 'dcim:consoleport_bulk_rename' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
||||||
<button type="submit" name="_disconnect" formaction="{% url 'dcim:consoleport_bulk_disconnect' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
</button>
|
||||||
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
</div>
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.delete_consoleport %}
|
|
||||||
<button type="submit" name="_delete" formaction="{% url 'dcim:consoleport_bulk_delete' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-danger btn-sm">
|
|
||||||
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% if perms.dcim.add_consoleport %}
|
|
||||||
<div class="bulk-button-group">
|
|
||||||
<a href="{% url 'dcim:consoleport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-sm btn-primary">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Console Port
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
{% if perms.dcim.delete_consoleport %}
|
||||||
|
<button type="submit" name="_delete" formaction="{% url 'dcim:consoleport_bulk_delete' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-danger btn-sm">
|
||||||
|
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.change_consoleport %}
|
||||||
|
<button type="submit" name="_disconnect" formaction="{% url 'dcim:consoleport_bulk_disconnect' %}?return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
||||||
|
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if perms.dcim.add_consoleport %}
|
||||||
|
<div class="bulk-button-group">
|
||||||
|
<a href="{% url 'dcim:consoleport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-sm btn-primary">
|
||||||
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Console Port
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -16,31 +16,37 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="noprint bulk-buttons">
|
<div class="noprint bulk-buttons">
|
||||||
<div class="bulk-button-group">
|
<div class="bulk-button-group">
|
||||||
{% if perms.dcim.change_consoleserverport %}
|
{% if perms.dcim.change_consoleserverport %}
|
||||||
<button type="submit" name="_rename" formaction="{% url 'dcim:consoleserverport_bulk_rename' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
<div class="btn-group" role="group">
|
||||||
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
<button type="submit" name="_edit" formaction="{% url 'dcim:consoleserverport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
||||||
<button type="submit" name="_edit" formaction="{% url 'dcim:consoleserverport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-warning btn-sm">
|
</button>
|
||||||
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
<button type="submit" name="_rename" formaction="{% url 'dcim:consoleserverport_bulk_rename' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
||||||
<button type="submit" name="_disconnect" formaction="{% url 'dcim:consoleserverport_bulk_disconnect' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
</button>
|
||||||
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
</div>
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.delete_consoleserverport %}
|
|
||||||
<button type="submit" formaction="{% url 'dcim:consoleserverport_bulk_delete' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-danger btn-sm">
|
|
||||||
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% if perms.dcim.add_consoleserverport %}
|
|
||||||
<div class="bulk-button-group">
|
|
||||||
<a href="{% url 'dcim:consoleserverport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-primary btn-sm">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Console Server Ports
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
{% if perms.dcim.delete_consoleserverport %}
|
||||||
|
<button type="submit" formaction="{% url 'dcim:consoleserverport_bulk_delete' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-danger btn-sm">
|
||||||
|
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.change_consoleserverport %}
|
||||||
|
<button type="submit" name="_disconnect" formaction="{% url 'dcim:consoleserverport_bulk_disconnect' %}?return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
||||||
|
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if perms.dcim.add_consoleserverport %}
|
||||||
|
<div class="bulk-button-group">
|
||||||
|
<a href="{% url 'dcim:consoleserverport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-primary btn-sm">
|
||||||
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Console Server Ports
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -16,28 +16,30 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="noprint bulk-buttons">
|
<div class="noprint bulk-buttons">
|
||||||
<div class="bulk-button-group">
|
<div class="bulk-button-group">
|
||||||
{% if perms.dcim.change_devicebay %}
|
{% if perms.dcim.change_devicebay %}
|
||||||
<button type="submit" name="_rename" formaction="{% url 'dcim:devicebay_bulk_rename' %}?return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
<div class="btn-group" role="group">
|
||||||
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
<button type="submit" name="_edit" formaction="{% url 'dcim:devicebay_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
||||||
<button type="submit" name="_edit" formaction="{% url 'dcim:devicebay_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-warning btn-sm">
|
</button>
|
||||||
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
<button type="submit" name="_rename" formaction="{% url 'dcim:devicebay_bulk_rename' %}?return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
||||||
{% endif %}
|
</button>
|
||||||
{% if perms.dcim.delete_devicebay %}
|
</div>
|
||||||
<button type="submit" formaction="{% url 'dcim:devicebay_bulk_delete' %}?return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
|
||||||
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete selected
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% if perms.dcim.add_devicebay %}
|
|
||||||
<div class="bulk-button-group">
|
|
||||||
<a href="{% url 'dcim:devicebay_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-primary btn-sm">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Device Bays
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if perms.dcim.delete_devicebay %}
|
||||||
|
<button type="submit" name="_delete" formaction="{% url 'dcim:devicebay_bulk_delete' %}?return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-danger btn-sm">
|
||||||
|
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% if perms.dcim.add_devicebay %}
|
||||||
|
<div class="bulk-button-group">
|
||||||
|
<a href="{% url 'dcim:devicebay_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_devicebays' pk=object.pk %}" class="btn btn-primary btn-sm">
|
||||||
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Device Bays
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -16,31 +16,37 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="noprint bulk-buttons">
|
<div class="noprint bulk-buttons">
|
||||||
<div class="bulk-button-group">
|
<div class="bulk-button-group">
|
||||||
{% if perms.dcim.change_frontport %}
|
{% if perms.dcim.change_frontport %}
|
||||||
<button type="submit" name="_rename" formaction="{% url 'dcim:frontport_bulk_rename' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
<div class="btn-group" role="group">
|
||||||
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
<button type="submit" name="_edit" formaction="{% url 'dcim:frontport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
||||||
<button type="submit" name="_edit" formaction="{% url 'dcim:frontport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-warning btn-sm">
|
</button>
|
||||||
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
<button type="submit" name="_rename" formaction="{% url 'dcim:frontport_bulk_rename' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
||||||
<button type="submit" name="_disconnect" formaction="{% url 'dcim:frontport_bulk_disconnect' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
</button>
|
||||||
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
</div>
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.delete_frontport %}
|
|
||||||
<button type="submit" formaction="{% url 'dcim:frontport_bulk_delete' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-danger btn-sm">
|
|
||||||
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% if perms.dcim.add_frontport %}
|
|
||||||
<div class="bulk-button-group">
|
|
||||||
<a href="{% url 'dcim:frontport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-primary btn-sm">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add front ports
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
{% if perms.dcim.delete_frontport %}
|
||||||
|
<button type="submit" formaction="{% url 'dcim:frontport_bulk_delete' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-danger btn-sm">
|
||||||
|
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.change_frontport %}
|
||||||
|
<button type="submit" name="_disconnect" formaction="{% url 'dcim:frontport_bulk_disconnect' %}?return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
||||||
|
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if perms.dcim.add_frontport %}
|
||||||
|
<div class="bulk-button-group">
|
||||||
|
<a href="{% url 'dcim:frontport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-primary btn-sm">
|
||||||
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add front ports
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -0,0 +1,11 @@
|
|||||||
|
{% extends 'inc/table_controls_htmx.html' %}
|
||||||
|
|
||||||
|
{% block extra_table_controls %}
|
||||||
|
<button class="btn btn-sm btn-outline-dark dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||||
|
<i class="mdi mdi-eye"></i>
|
||||||
|
</button>
|
||||||
|
<ul class="dropdown-menu">
|
||||||
|
<button type="button" class="dropdown-item toggle-enabled" data-state="show">Hide Enabled</button>
|
||||||
|
<button type="button" class="dropdown-item toggle-disabled" data-state="show">Hide Disabled</button>
|
||||||
|
</ul>
|
||||||
|
{% endblock extra_table_controls %}
|
@ -4,84 +4,63 @@
|
|||||||
{% load static %}
|
{% load static %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="row mb-3 justify-content-between">
|
{% include 'dcim/device/inc/interface_table_controls.html' with table_modal="DeviceInterfaceTable_config" %}
|
||||||
<div class="col col-12 col-lg-4 my-3 my-lg-0 d-flex noprint table-controls">
|
|
||||||
<div class="input-group input-group-sm">
|
<form method="post">
|
||||||
<input
|
{% csrf_token %}
|
||||||
type="text"
|
|
||||||
name="q"
|
<div class="card">
|
||||||
class="form-control"
|
<div class="card-body" id="object_list">
|
||||||
placeholder="Quick search"
|
{% include 'htmx/table.html' %}
|
||||||
hx-get="{{ request.full_path }}"
|
|
||||||
hx-target="#object_list"
|
|
||||||
hx-trigger="keyup changed delay:500ms"
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="col col-md-3 mb-0 d-flex noprint table-controls">
|
|
||||||
<div class="input-group input-group-sm justify-content-end">
|
|
||||||
{% if request.user.is_authenticated %}
|
|
||||||
<button
|
|
||||||
type="button"
|
|
||||||
class="btn btn-sm btn-outline-dark"
|
|
||||||
data-bs-toggle="modal"
|
|
||||||
data-bs-target="#DeviceInterfaceTable_config"
|
|
||||||
title="Configure Table">
|
|
||||||
<i class="mdi mdi-cog"></i> Configure Table
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
<button class="btn btn-sm btn-outline-dark dropdown-toggle" type="button" data-bs-toggle="dropdown" aria-expanded="false">
|
|
||||||
<i class="mdi mdi-eye"></i>
|
|
||||||
</button>
|
|
||||||
<ul class="dropdown-menu">
|
|
||||||
<button type="button" class="dropdown-item toggle-enabled" data-state="show">Hide Enabled</button>
|
|
||||||
<button type="button" class="dropdown-item toggle-disabled" data-state="show">Hide Disabled</button>
|
|
||||||
</ul>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<form method="post">
|
<div class="noprint bulk-buttons">
|
||||||
{% csrf_token %}
|
<div class="bulk-button-group">
|
||||||
|
{% if perms.dcim.change_interface %}
|
||||||
|
<div class="btn-group" role="group">
|
||||||
<div class="card">
|
<button type="submit" name="_edit"
|
||||||
<div class="card-body" id="object_list">
|
formaction="{% url 'dcim:interface_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}"
|
||||||
{% include 'htmx/table.html' %}
|
class="btn btn-warning btn-sm">
|
||||||
|
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
||||||
|
</button>
|
||||||
|
<button type="submit" name="_rename"
|
||||||
|
formaction="{% url 'dcim:interface_bulk_rename' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}"
|
||||||
|
class="btn btn-outline-warning btn-sm">
|
||||||
|
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
{% if perms.dcim.delete_interface %}
|
||||||
|
<button type="submit" name="_delete"
|
||||||
|
formaction="{% url 'dcim:interface_bulk_delete' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}"
|
||||||
|
class="btn btn-danger btn-sm">
|
||||||
|
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.change_interface %}
|
||||||
|
<button type="submit" name="_disconnect"
|
||||||
|
formaction="{% url 'dcim:interface_bulk_disconnect' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}"
|
||||||
|
class="btn btn-outline-danger btn-sm">
|
||||||
|
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
{% if perms.dcim.add_interface %}
|
||||||
<div class="noprint bulk-buttons">
|
<div class="bulk-button-group">
|
||||||
<div class="bulk-button-group">
|
<a href="{% url 'dcim:interface_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}"
|
||||||
{% if perms.dcim.change_interface %}
|
class="btn btn-primary btn-sm">
|
||||||
<button type="submit" name="_rename" formaction="{% url 'dcim:interface_bulk_rename' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Interfaces
|
||||||
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
</a>
|
||||||
</button>
|
|
||||||
<button type="submit" name="_edit" formaction="{% url 'dcim:interface_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-warning btn-sm">
|
|
||||||
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
|
||||||
</button>
|
|
||||||
<button type="submit" name="_disconnect" formaction="{% url 'dcim:interface_bulk_disconnect' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
|
||||||
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.delete_interface %}
|
|
||||||
<button type="submit" name="_delete" formaction="{% url 'dcim:interface_bulk_delete' %}?return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-danger btn-sm">
|
|
||||||
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% if perms.dcim.add_interface %}
|
|
||||||
<div class="bulk-button-group">
|
|
||||||
<a href="{% url 'dcim:interface_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_interfaces' pk=object.pk %}" class="btn btn-primary btn-sm">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Interfaces
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
</div>
|
||||||
</form>
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block modals %}
|
{% block modals %}
|
||||||
{{ block.super }}
|
{{ block.super }}
|
||||||
{% table_config_form table %}
|
{% table_config_form table %}
|
||||||
{% endblock modals %}
|
{% endblock modals %}
|
@ -16,28 +16,30 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="noprint bulk-buttons">
|
<div class="noprint bulk-buttons">
|
||||||
<div class="bulk-button-group">
|
<div class="bulk-button-group">
|
||||||
{% if perms.dcim.change_inventoryitem %}
|
{% if perms.dcim.change_inventoryitem %}
|
||||||
<button type="submit" name="_rename" formaction="{% url 'dcim:inventoryitem_bulk_rename' %}?return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-warning btn-sm">
|
<div class="btn-group" role="group">
|
||||||
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
<button type="submit" name="_edit" formaction="{% url 'dcim:inventoryitem_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
||||||
<button type="submit" name="_edit" formaction="{% url 'dcim:inventoryitem_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-warning btn-sm">
|
</button>
|
||||||
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
<button type="submit" name="_rename" formaction="{% url 'dcim:inventoryitem_bulk_rename' %}?return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
||||||
{% endif %}
|
</button>
|
||||||
{% if perms.dcim.delete_inventoryitem %}
|
</div>
|
||||||
<button type="submit" name="_delete" formaction="{% url 'dcim:inventoryitem_bulk_delete' %}?return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-danger btn-sm">
|
|
||||||
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% if perms.dcim.add_inventoryitem %}
|
|
||||||
<div class="bulk-button-group">
|
|
||||||
<a href="{% url 'dcim:inventoryitem_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-primary btn-sm">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Inventory Item
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if perms.dcim.delete_inventoryitem %}
|
||||||
|
<button type="submit" name="_delete" formaction="{% url 'dcim:inventoryitem_bulk_delete' %}?return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-danger btn-sm">
|
||||||
|
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% if perms.dcim.add_inventoryitem %}
|
||||||
|
<div class="bulk-button-group">
|
||||||
|
<a href="{% url 'dcim:inventoryitem_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_inventory' pk=object.pk %}" class="btn btn-primary btn-sm">
|
||||||
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Inventory Item
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -16,28 +16,30 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="noprint bulk-buttons">
|
<div class="noprint bulk-buttons">
|
||||||
<div class="bulk-button-group">
|
<div class="bulk-button-group">
|
||||||
{% if perms.dcim.change_modulebay %}
|
{% if perms.dcim.change_modulebay %}
|
||||||
<button type="submit" name="_rename" formaction="{% url 'dcim:modulebay_bulk_rename' %}?return_url={% url 'dcim:device_modulebays' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
<div class="btn-group" role="group">
|
||||||
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
<button type="submit" name="_edit" formaction="{% url 'dcim:modulebay_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_modulebays' pk=object.pk %}" class="btn btn-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
||||||
<button type="submit" name="_edit" formaction="{% url 'dcim:modulebay_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_modulebays' pk=object.pk %}" class="btn btn-warning btn-sm">
|
</button>
|
||||||
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
<button type="submit" name="_rename" formaction="{% url 'dcim:modulebay_bulk_rename' %}?return_url={% url 'dcim:device_modulebays' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
||||||
{% endif %}
|
</button>
|
||||||
{% if perms.dcim.delete_modulebay %}
|
</div>
|
||||||
<button type="submit" formaction="{% url 'dcim:modulebay_bulk_delete' %}?return_url={% url 'dcim:device_modulebays' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
|
||||||
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete selected
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% if perms.dcim.add_modulebay %}
|
|
||||||
<div class="bulk-button-group">
|
|
||||||
<a href="{% url 'dcim:modulebay_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_modulebays' pk=object.pk %}" class="btn btn-primary btn-sm">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Module Bays
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% if perms.dcim.delete_modulebay %}
|
||||||
|
<button type="submit" formaction="{% url 'dcim:modulebay_bulk_delete' %}?return_url={% url 'dcim:device_modulebays' pk=object.pk %}" class="btn btn-danger btn-sm">
|
||||||
|
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
{% if perms.dcim.add_modulebay %}
|
||||||
|
<div class="bulk-button-group">
|
||||||
|
<a href="{% url 'dcim:modulebay_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_modulebays' pk=object.pk %}" class="btn btn-primary btn-sm">
|
||||||
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Module Bays
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% table_config_form table %}
|
{% table_config_form table %}
|
||||||
|
@ -16,31 +16,37 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="noprint bulk-buttons">
|
<div class="noprint bulk-buttons">
|
||||||
<div class="bulk-button-group">
|
<div class="bulk-button-group">
|
||||||
{% if perms.dcim.change_powerport %}
|
{% if perms.dcim.change_powerport %}
|
||||||
<button type="submit" name="_rename" formaction="{% url 'dcim:poweroutlet_bulk_rename' %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
<div class="btn-group" role="group">
|
||||||
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
<button type="submit" name="_edit" formaction="{% url 'dcim:poweroutlet_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
||||||
<button type="submit" name="_edit" formaction="{% url 'dcim:poweroutlet_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-warning btn-sm">
|
</button>
|
||||||
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
<button type="submit" name="_rename" formaction="{% url 'dcim:poweroutlet_bulk_rename' %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
||||||
<button type="submit" name="_disconnect" formaction="{% url 'dcim:poweroutlet_bulk_disconnect' %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
</button>
|
||||||
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
</div>
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.delete_poweroutlet %}
|
|
||||||
<button type="submit" formaction="{% url 'dcim:poweroutlet_bulk_delete' %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-danger btn-sm">
|
|
||||||
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% if perms.dcim.add_poweroutlet %}
|
|
||||||
<div class="bulk-button-group">
|
|
||||||
<a href="{% url 'dcim:poweroutlet_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-primary btn-sm">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Power Outlets
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
{% if perms.dcim.delete_poweroutlet %}
|
||||||
|
<button type="submit" formaction="{% url 'dcim:poweroutlet_bulk_delete' %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-danger btn-sm">
|
||||||
|
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.change_powerport %}
|
||||||
|
<button type="submit" name="_disconnect" formaction="{% url 'dcim:poweroutlet_bulk_disconnect' %}?return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
||||||
|
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if perms.dcim.add_poweroutlet %}
|
||||||
|
<div class="bulk-button-group">
|
||||||
|
<a href="{% url 'dcim:poweroutlet_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-primary btn-sm">
|
||||||
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Power Outlets
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -16,31 +16,37 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="noprint bulk-buttons">
|
<div class="noprint bulk-buttons">
|
||||||
<div class="bulk-button-group">
|
<div class="bulk-button-group">
|
||||||
{% if perms.dcim.change_powerport %}
|
{% if perms.dcim.change_powerport %}
|
||||||
<button type="submit" name="_rename" formaction="{% url 'dcim:powerport_bulk_rename' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
<div class="btn-group" role="group">
|
||||||
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
<button type="submit" name="_edit" formaction="{% url 'dcim:powerport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
||||||
<button type="submit" name="_edit" formaction="{% url 'dcim:powerport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-warning btn-sm">
|
</button>
|
||||||
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
<button type="submit" name="_rename" formaction="{% url 'dcim:powerport_bulk_rename' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
||||||
<button type="submit" name="_disconnect" formaction="{% url 'dcim:powerport_bulk_disconnect' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
</button>
|
||||||
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
</div>
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.delete_powerport %}
|
|
||||||
<button type="submit" name="_delete" formaction="{% url 'dcim:powerport_bulk_delete' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-danger btn-sm">
|
|
||||||
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% if perms.dcim.add_powerport %}
|
|
||||||
<div class="bulk-button-group">
|
|
||||||
<a href="{% url 'dcim:powerport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-sm btn-primary">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Power Port
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
{% if perms.dcim.delete_powerport %}
|
||||||
|
<button type="submit" name="_delete" formaction="{% url 'dcim:powerport_bulk_delete' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-danger btn-sm">
|
||||||
|
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.change_powerport %}
|
||||||
|
<button type="submit" name="_disconnect" formaction="{% url 'dcim:powerport_bulk_disconnect' %}?return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
||||||
|
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if perms.dcim.add_powerport %}
|
||||||
|
<div class="bulk-button-group">
|
||||||
|
<a href="{% url 'dcim:powerport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-sm btn-primary">
|
||||||
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add Power Port
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -16,31 +16,37 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="noprint bulk-buttons">
|
<div class="noprint bulk-buttons">
|
||||||
<div class="bulk-button-group">
|
<div class="bulk-button-group">
|
||||||
{% if perms.dcim.change_rearport %}
|
{% if perms.dcim.change_rearport %}
|
||||||
<button type="submit" name="_rename" formaction="{% url 'dcim:rearport_bulk_rename' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
<div class="btn-group" role="group">
|
||||||
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
<button type="submit" name="_edit" formaction="{% url 'dcim:rearport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
||||||
<button type="submit" name="_edit" formaction="{% url 'dcim:rearport_bulk_edit' %}?device={{ object.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-warning btn-sm">
|
</button>
|
||||||
<i class="mdi mdi-pencil" aria-hidden="true"></i> Edit
|
<button type="submit" name="_rename" formaction="{% url 'dcim:rearport_bulk_rename' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
||||||
</button>
|
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
||||||
<button type="submit" name="_disconnect" formaction="{% url 'dcim:rearport_bulk_disconnect' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
</button>
|
||||||
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
</div>
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
{% if perms.dcim.delete_rearport %}
|
|
||||||
<button type="submit" formaction="{% url 'dcim:rearport_bulk_delete' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-danger btn-sm">
|
|
||||||
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
|
||||||
</button>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% if perms.dcim.add_rearport %}
|
|
||||||
<div class="bulk-button-group">
|
|
||||||
<a href="{% url 'dcim:rearport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-primary btn-sm">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add rear ports
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
{% if perms.dcim.delete_rearport %}
|
||||||
|
<button type="submit" formaction="{% url 'dcim:rearport_bulk_delete' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-danger btn-sm">
|
||||||
|
<i class="mdi mdi-trash-can-outline" aria-hidden="true"></i> Delete
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
{% if perms.dcim.change_rearport %}
|
||||||
|
<button type="submit" name="_disconnect" formaction="{% url 'dcim:rearport_bulk_disconnect' %}?return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-outline-danger btn-sm">
|
||||||
|
<span class="mdi mdi-ethernet-cable-off" aria-hidden="true"></span> Disconnect
|
||||||
|
</button>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% if perms.dcim.add_rearport %}
|
||||||
|
<div class="bulk-button-group">
|
||||||
|
<a href="{% url 'dcim:rearport_add' %}?device={{ object.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-primary btn-sm">
|
||||||
|
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> Add rear ports
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -1,4 +1,5 @@
|
|||||||
{% extends 'generic/object_list.html' %}
|
{% extends 'generic/object_list.html' %}
|
||||||
|
{% load buttons %}
|
||||||
|
|
||||||
{% block bulk_buttons %}
|
{% block bulk_buttons %}
|
||||||
{% if perms.dcim.change_device %}
|
{% if perms.dcim.change_device %}
|
||||||
@ -73,5 +74,15 @@
|
|||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{{ block.super }}
|
{% if 'bulk_edit' in actions %}
|
||||||
|
<div class="btn-group" role="group">
|
||||||
|
{% bulk_edit_button model query_params=request.GET %}
|
||||||
|
<button type="submit" name="_rename" formaction="{% url 'dcim:device_bulk_rename' %}?return_url={% url 'dcim:device_list' %}{% if request.GET %}?{{ request.GET.urlencode }}{% endif %}" class="btn btn-outline-warning btn-sm">
|
||||||
|
<i class="mdi mdi-pencil-outline" aria-hidden="true"></i> Rename
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% if 'bulk_delete' in actions %}
|
||||||
|
{% bulk_delete_button model query_params=request.GET %}
|
||||||
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
@ -10,6 +10,8 @@
|
|||||||
<th>Name</th>
|
<th>Name</th>
|
||||||
<th>Role</th>
|
<th>Role</th>
|
||||||
<th>Priority</th>
|
<th>Priority</th>
|
||||||
|
<th>Phone</th>
|
||||||
|
<th>Email</th>
|
||||||
<th></th>
|
<th></th>
|
||||||
</tr>
|
</tr>
|
||||||
{% for contact in contacts %}
|
{% for contact in contacts %}
|
||||||
@ -17,6 +19,20 @@
|
|||||||
<td>{{ contact.contact|linkify }}</td>
|
<td>{{ contact.contact|linkify }}</td>
|
||||||
<td>{{ contact.role|placeholder }}</td>
|
<td>{{ contact.role|placeholder }}</td>
|
||||||
<td>{{ contact.get_priority_display|placeholder }}</td>
|
<td>{{ contact.get_priority_display|placeholder }}</td>
|
||||||
|
<td>
|
||||||
|
{% if contact.contact.phone %}
|
||||||
|
<a href="tel:{{ contact.contact.phone }}">{{ contact.contact.phone }}</a>
|
||||||
|
{% else %}
|
||||||
|
{{ ''|placeholder }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% if contact.contact.email %}
|
||||||
|
<a href="mailto:{{ contact.contact.email }}">{{ contact.contact.email }}</a>
|
||||||
|
{% else %}
|
||||||
|
{{ ''|placeholder }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
<td class="text-end noprint">
|
<td class="text-end noprint">
|
||||||
{% if perms.tenancy.change_contactassignment %}
|
{% if perms.tenancy.change_contactassignment %}
|
||||||
<a href="{% url 'tenancy:contactassignment_edit' pk=contact.pk %}?return_url={{ object.get_absolute_url }}" class="btn btn-warning btn-sm lh-1" title="Edit">
|
<a href="{% url 'tenancy:contactassignment_edit' pk=contact.pk %}?return_url={{ object.get_absolute_url }}" class="btn btn-warning btn-sm lh-1" title="Edit">
|
||||||
|
@ -1,29 +1,19 @@
|
|||||||
{% load helpers %}
|
{% load helpers %}
|
||||||
|
|
||||||
<div class="row mb-3 justify-content-between">
|
<div class="row mb-3">
|
||||||
<div class="table-controls noprint col col-12 col-md-8 col-lg-4">
|
<div class="col-auto table-controls noprint">
|
||||||
<div class="input-group input-group-sm">
|
<div class="input-group input-group-sm me-2 quicksearch hide-last-child">
|
||||||
<input
|
<input type="search" results=5 name="q" id="quicksearch" class="form-control" placeholder="Quick search"
|
||||||
type="text"
|
hx-get="{{ request.full_path }}" hx-target="#object_list" hx-trigger="keyup changed delay:500ms, search" />
|
||||||
name="q"
|
<button class="btn bg-transparent" type="button" id="quicksearch_clear"><i class="mdi mdi-close-circle"></i></button>
|
||||||
class="form-control"
|
|
||||||
placeholder="Quick search"
|
|
||||||
hx-get="{{ request.full_path }}"
|
|
||||||
hx-target="#object_list"
|
|
||||||
hx-trigger="keyup changed delay:500ms"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
{% block extra_table_controls %}{% endblock %}
|
||||||
</div>
|
</div>
|
||||||
<div class="table-controls noprint col col-md-3 mb-0">
|
<div class="col-auto ms-auto table-controls noprint">
|
||||||
{% if request.user.is_authenticated and table_modal %}
|
{% if request.user.is_authenticated and table_modal %}
|
||||||
<div class="table-configure input-group input-group-sm">
|
<div class="table-configure input-group input-group-sm">
|
||||||
<button
|
<button type="button" data-bs-toggle="modal" title="Configure Table" data-bs-target="#{{ table_modal }}"
|
||||||
type="button"
|
class="btn btn-sm btn-outline-dark">
|
||||||
data-bs-toggle="modal"
|
|
||||||
title="Configure Table"
|
|
||||||
data-bs-target="#{{ table_modal }}"
|
|
||||||
class="btn btn-sm btn-outline-dark"
|
|
||||||
>
|
|
||||||
<i class="mdi mdi-cog"></i> Configure Table
|
<i class="mdi mdi-cog"></i> Configure Table
|
||||||
</button>
|
</button>
|
||||||
</div>
|
</div>
|
||||||
|
@ -144,6 +144,13 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</table>
|
</table>
|
||||||
|
{% if object.prefix.version == 4 %}
|
||||||
|
<div class="float-end">
|
||||||
|
<a class="btn btn-primary btn-sm" data-bs-toggle="modal" data-bs-target="#prefix-modal">
|
||||||
|
<i class="mdi mdi-information-outline" aria-hidden="true"></i> Addressing Details
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% include 'inc/panels/custom_fields.html' %}
|
{% include 'inc/panels/custom_fields.html' %}
|
||||||
@ -161,3 +168,39 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block modals %}
|
||||||
|
{{ block.super }}
|
||||||
|
{% if object.prefix.version == 4 %}
|
||||||
|
<div class="modal fade" id="prefix-modal" tabindex="-1" aria-hidden="true">
|
||||||
|
<div class="modal-dialog modal-dialog-centered">
|
||||||
|
<div class="modal-content">
|
||||||
|
<div class="modal-header">
|
||||||
|
<h5 class="modal-title">Prefix Details</h5>
|
||||||
|
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
|
||||||
|
</div>
|
||||||
|
<div class="modal-body">
|
||||||
|
<table class="table table-hover attr-table">
|
||||||
|
<tr>
|
||||||
|
<td>Network Address</td>
|
||||||
|
<td>{{ object.prefix.network }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Network Mask</td>
|
||||||
|
<td>{{ object.prefix.netmask }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Wildcard Mask</td>
|
||||||
|
<td>{{ object.prefix.hostmask }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>Broadcast Address</td>
|
||||||
|
<td>{{ object.prefix.broadcast }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock %}
|
||||||
|
@ -15,27 +15,28 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="noprint">
|
<div class="noprint">
|
||||||
{% if perms.virtualization.change_vminterface %}
|
{% if perms.virtualization.change_vminterface %}
|
||||||
<button type="submit" name="_rename" formaction="{% url 'virtualization:vminterface_bulk_rename' %}?return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-warning btn-sm">
|
<div class="btn-group" role="group">
|
||||||
<span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
|
<button type="submit" name="_edit" formaction="{% url 'virtualization:vminterface_bulk_edit' %}?virtual_machine={{ object.pk }}&return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-warning btn-sm">
|
||||||
</button>
|
<span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
|
||||||
<button type="submit" name="_edit" formaction="{% url 'virtualization:vminterface_bulk_edit' %}?virtual_machine={{ object.pk }}&return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-warning btn-sm">
|
</button>
|
||||||
<span class="mdi mdi-pencil" aria-hidden="true"></span> Edit
|
<button type="submit" name="_rename" formaction="{% url 'virtualization:vminterface_bulk_rename' %}?return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-outline-warning btn-sm">
|
||||||
</button>
|
<span class="mdi mdi-pencil" aria-hidden="true"></span> Rename
|
||||||
{% endif %}
|
</button>
|
||||||
{% if perms.virtualization.delete_vminterface %}
|
</div>
|
||||||
<button type="submit" name="_delete" formaction="{% url 'virtualization:vminterface_bulk_delete' %}?return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-danger btn-sm">
|
{% endif %}
|
||||||
<span class="mdi mdi-trash-can-outline" aria-hidden="true"></span> Delete
|
{% if perms.virtualization.delete_vminterface %}
|
||||||
</button>
|
<button type="submit" name="_delete" formaction="{% url 'virtualization:vminterface_bulk_delete' %}?return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-danger btn-sm">
|
||||||
{% endif %}
|
<span class="mdi mdi-trash-can-outline" aria-hidden="true"></span> Delete
|
||||||
{% if perms.virtualization.add_vminterface %}
|
</button>
|
||||||
<div class="float-end">
|
{% endif %}
|
||||||
<a href="{% url 'virtualization:vminterface_add' %}?virtual_machine={{ object.pk }}&return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-primary btn-sm">
|
{% if perms.virtualization.add_vminterface %}
|
||||||
<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add interfaces
|
<div class="float-end">
|
||||||
</a>
|
<a href="{% url 'virtualization:vminterface_add' %}?virtual_machine={{ object.pk }}&return_url={% url 'virtualization:virtualmachine_interfaces' pk=object.pk %}" class="btn btn-primary btn-sm">
|
||||||
</div>
|
<span class="mdi mdi-plus-thick" aria-hidden="true"></span> Add interfaces
|
||||||
{% endif %}
|
</a>
|
||||||
<div class="clearfix"></div>
|
</div>
|
||||||
|
{% endif %}
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% endblock content %}
|
{% endblock content %}
|
||||||
|
@ -99,6 +99,7 @@ class JSONField(_JSONField):
|
|||||||
if not self.help_text:
|
if not self.help_text:
|
||||||
self.help_text = 'Enter context data in <a href="https://json.org/">JSON</a> format.'
|
self.help_text = 'Enter context data in <a href="https://json.org/">JSON</a> format.'
|
||||||
self.widget.attrs['placeholder'] = ''
|
self.widget.attrs['placeholder'] = ''
|
||||||
|
self.widget.attrs['class'] = 'font-monospace'
|
||||||
|
|
||||||
def prepare_value(self, value):
|
def prepare_value(self, value):
|
||||||
if isinstance(value, InvalidJSONInput):
|
if isinstance(value, InvalidJSONInput):
|
||||||
|
@ -136,7 +136,7 @@ class ImportForm(BootstrapMixin, forms.Form):
|
|||||||
Generic form for creating an object from JSON/YAML data
|
Generic form for creating an object from JSON/YAML data
|
||||||
"""
|
"""
|
||||||
data = forms.CharField(
|
data = forms.CharField(
|
||||||
widget=forms.Textarea,
|
widget=forms.Textarea(attrs={'class': 'font-monospace'}),
|
||||||
help_text="Enter object data in JSON or YAML format. Note: Only a single object/document is supported."
|
help_text="Enter object data in JSON or YAML format. Note: Only a single object/document is supported."
|
||||||
)
|
)
|
||||||
format = forms.ChoiceField(
|
format = forms.ChoiceField(
|
||||||
|
@ -89,7 +89,7 @@ class VirtualMachineFilterForm(
|
|||||||
(None, ('q', 'tag')),
|
(None, ('q', 'tag')),
|
||||||
('Cluster', ('cluster_group_id', 'cluster_type_id', 'cluster_id')),
|
('Cluster', ('cluster_group_id', 'cluster_type_id', 'cluster_id')),
|
||||||
('Location', ('region_id', 'site_group_id', 'site_id')),
|
('Location', ('region_id', 'site_group_id', 'site_id')),
|
||||||
('Attriubtes', ('status', 'role_id', 'platform_id', 'mac_address', 'has_primary_ip', 'local_context_data')),
|
('Attributes', ('status', 'role_id', 'platform_id', 'mac_address', 'has_primary_ip', 'local_context_data')),
|
||||||
('Tenant', ('tenant_group_id', 'tenant_id')),
|
('Tenant', ('tenant_group_id', 'tenant_id')),
|
||||||
('Contacts', ('contact', 'contact_role', 'contact_group')),
|
('Contacts', ('contact', 'contact_role', 'contact_group')),
|
||||||
)
|
)
|
||||||
|
@ -19,13 +19,13 @@ gunicorn==20.1.0
|
|||||||
Jinja2==3.1.2
|
Jinja2==3.1.2
|
||||||
Markdown==3.4.1
|
Markdown==3.4.1
|
||||||
markdown-include==0.7.0
|
markdown-include==0.7.0
|
||||||
mkdocs-material==8.3.9
|
mkdocs-material==8.4.0
|
||||||
mkdocstrings[python-legacy]==0.19.0
|
mkdocstrings[python-legacy]==0.19.0
|
||||||
netaddr==0.8.0
|
netaddr==0.8.0
|
||||||
Pillow==9.2.0
|
Pillow==9.2.0
|
||||||
psycopg2-binary==2.9.3
|
psycopg2-binary==2.9.3
|
||||||
PyYAML==6.0
|
PyYAML==6.0
|
||||||
sentry-sdk==1.9.2
|
sentry-sdk==1.9.5
|
||||||
social-auth-app-django==5.0.0
|
social-auth-app-django==5.0.0
|
||||||
social-auth-core==4.3.0
|
social-auth-core==4.3.0
|
||||||
svgwrite==1.4.3
|
svgwrite==1.4.3
|
||||||
@ -34,3 +34,6 @@ tzdata==2022.1
|
|||||||
|
|
||||||
# Workaround for #7401
|
# Workaround for #7401
|
||||||
jsonschema==3.2.0
|
jsonschema==3.2.0
|
||||||
|
|
||||||
|
# Workaround for #9986
|
||||||
|
pytz==2022.1
|
||||||
|
Loading…
Reference in New Issue
Block a user