Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
ICS Control System Infrastructure
Netbox
Commits
f1877c0c
Unverified
Commit
f1877c0c
authored
Aug 08, 2022
by
Jeremy Stretch
Committed by
GitHub
Aug 08, 2022
Browse files
Merge pull request #9955 from netbox-community/develop
Release v3.2.8
parents
f8cbd322
ce7fb8ab
Changes
37
Hide whitespace changes
Inline
Side-by-side
.github/ISSUE_TEMPLATE/bug_report.yaml
View file @
f1877c0c
...
...
@@ -14,7 +14,7 @@ body:
attributes
:
label
:
NetBox version
description
:
What version of NetBox are you currently running?
placeholder
:
v3.2.
7
placeholder
:
v3.2.
8
validations
:
required
:
true
-
type
:
dropdown
...
...
.github/ISSUE_TEMPLATE/feature_request.yaml
View file @
f1877c0c
...
...
@@ -14,7 +14,7 @@ body:
attributes
:
label
:
NetBox version
description
:
What version of NetBox are you currently running?
placeholder
:
v3.2.
7
placeholder
:
v3.2.
8
validations
:
required
:
true
-
type
:
dropdown
...
...
base_requirements.txt
View file @
f1877c0c
...
...
@@ -4,7 +4,7 @@ bleach
# The Python web framework on which NetBox is built
# https://github.com/django/django
Django
Django
<4.1
# Django middleware which permits cross-domain API requests
# https://github.com/OttoYiu/django-cors-headers
...
...
docs/release-notes/version-3.2.md
View file @
f1877c0c
# NetBox v3.2
## v3.2.8 (2022-08-08)
### Enhancements
*
[
#9062
](
https://github.com/netbox-community/netbox/issues/9062
)
- Add/edit {module} substitution to help text for component template name
*
[
#9637
](
https://github.com/netbox-community/netbox/issues/9637
)
- Add site group field to rack reservation form
*
[
#9762
](
https://github.com/netbox-community/netbox/issues/9762
)
- Add
`nat_outside`
column to the IPAddress table
*
[
#9825
](
https://github.com/netbox-community/netbox/issues/9825
)
- Add contacts column to virtual machines table
*
[
#9881
](
https://github.com/netbox-community/netbox/issues/9881
)
- Increase granularity in utilization graph values
*
[
#9882
](
https://github.com/netbox-community/netbox/issues/9882
)
- Add manufacturer column to modules table
*
[
#9883
](
https://github.com/netbox-community/netbox/issues/9883
)
- Linkify location column in power panels table
*
[
#9906
](
https://github.com/netbox-community/netbox/issues/9906
)
- Include
`color`
attribute in front & rear port YAML import/export
### Bug Fixes
*
[
#9827
](
https://github.com/netbox-community/netbox/issues/9827
)
- Fix assignment of module bay position during bulk creation
*
[
#9871
](
https://github.com/netbox-community/netbox/issues/9871
)
- Fix utilization graph value alignments
*
[
#9884
](
https://github.com/netbox-community/netbox/issues/9884
)
- Prevent querying assigned VRF on prefix object init
*
[
#9885
](
https://github.com/netbox-community/netbox/issues/9885
)
- Fix child prefix counts when editing/deleting aggregates in bulk
*
[
#9891
](
https://github.com/netbox-community/netbox/issues/9891
)
- Ensure consistent ordering for tags during object serialization
*
[
#9919
](
https://github.com/netbox-community/netbox/issues/9919
)
- Fix potential XSS avenue via linked objects in tables
*
[
#9948
](
https://github.com/netbox-community/netbox/issues/9948
)
- Fix TypeError exception when requesting API tokens list as non-authenticated user
*
[
#9949
](
https://github.com/netbox-community/netbox/issues/9949
)
- Fix KeyError exception resulting from invalid API token provisioning request
*
[
#9950
](
https://github.com/netbox-community/netbox/issues/9950
)
- Prevent redirection to arbitrary URLs via
`next`
parameter on login URL
*
[
#9952
](
https://github.com/netbox-community/netbox/issues/9952
)
- Prevent InvalidMove when attempting to assign a nested child object as parent
---
## v3.2.7 (2022-07-20)
### Enhancements
...
...
netbox/dcim/forms/filtersets.py
View file @
f1877c0c
...
...
@@ -287,7 +287,7 @@ class RackReservationFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
fieldsets
=
(
(
None
,
(
'q'
,
'tag'
)),
(
'User'
,
(
'user_id'
,)),
(
'Rack'
,
(
'region_id'
,
'site_group_id'
,
'site_id'
,
'location_id'
)),
(
'Rack'
,
(
'region_id'
,
'site_group_id'
,
'site_id'
,
'location_id'
,
'rack_id'
)),
(
'Tenant'
,
(
'tenant_group_id'
,
'tenant_id'
)),
)
region_id
=
DynamicModelMultipleChoiceField
(
...
...
@@ -295,25 +295,38 @@ class RackReservationFilterForm(TenancyFilterForm, NetBoxModelFilterSetForm):
required
=
False
,
label
=
_
(
'Region'
)
)
site_group_id
=
DynamicModelMultipleChoiceField
(
queryset
=
SiteGroup
.
objects
.
all
(),
required
=
False
,
label
=
_
(
'Site group'
)
)
site_id
=
DynamicModelMultipleChoiceField
(
queryset
=
Site
.
objects
.
all
(),
required
=
False
,
query_params
=
{
'region_id'
:
'$region_id'
'region_id'
:
'$region_id'
,
'group_id'
:
'$site_group_id'
,
},
label
=
_
(
'Site'
)
)
site_group_id
=
DynamicModelMultipleChoiceField
(
queryset
=
SiteGroup
.
objects
.
all
(),
required
=
False
,
label
=
_
(
'Site group'
)
)
location_id
=
DynamicModelMultipleChoiceField
(
queryset
=
Location
.
objects
.
prefetch_related
(
'site'
),
queryset
=
Location
.
objects
.
all
(
),
required
=
False
,
query_params
=
{
'site_id'
:
'$site_id'
,
},
label
=
_
(
'Location'
),
null_option
=
'None'
)
rack_id
=
DynamicModelMultipleChoiceField
(
queryset
=
Rack
.
objects
.
all
(),
required
=
False
,
query_params
=
{
'site_id'
:
'$site_id'
,
'location_id'
:
'$location_id'
,
},
label
=
_
(
'Rack'
)
)
user_id
=
DynamicModelMultipleChoiceField
(
queryset
=
User
.
objects
.
all
(),
required
=
False
,
...
...
netbox/dcim/forms/models.py
View file @
f1877c0c
...
...
@@ -321,7 +321,7 @@ class RackReservationForm(TenancyForm, NetBoxModelForm):
)
fieldsets
=
(
(
'Reservation'
,
(
'region'
,
'site'
,
'location'
,
'rack'
,
'units'
,
'user'
,
'description'
,
'tags'
)),
(
'Reservation'
,
(
'region'
,
'site_group'
,
'site'
,
'location'
,
'rack'
,
'units'
,
'user'
,
'description'
,
'tags'
)),
(
'Tenancy'
,
(
'tenant_group'
,
'tenant'
)),
)
...
...
netbox/dcim/forms/object_create.py
View file @
f1877c0c
...
...
@@ -64,6 +64,14 @@ class ModularComponentTemplateCreateForm(ComponentCreateForm):
"""
Creation form for component templates that can be assigned to either a DeviceType *or* a ModuleType.
"""
name_pattern
=
ExpandableNameField
(
label
=
'Name'
,
help_text
=
"""
Alphanumeric ranges are supported for bulk creation. Mixed cases and types within a single range
are not supported. Example: <code>[ge,xe]-0/0/[0-9]</code>. {module} is accepted as a substitution for
the module bay position.
"""
)
device_type
=
DynamicModelChoiceField
(
queryset
=
DeviceType
.
objects
.
all
(),
required
=
False
...
...
netbox/dcim/forms/object_import.py
View file @
f1877c0c
...
...
@@ -146,7 +146,7 @@ class FrontPortTemplateImportForm(ComponentTemplateImportForm):
class
Meta
:
model
=
FrontPortTemplate
fields
=
[
'device_type'
,
'module_type'
,
'name'
,
'type'
,
'rear_port'
,
'rear_port_position'
,
'label'
,
'description'
,
'device_type'
,
'module_type'
,
'name'
,
'type'
,
'color'
,
'rear_port'
,
'rear_port_position'
,
'label'
,
'description'
,
]
...
...
@@ -158,7 +158,7 @@ class RearPortTemplateImportForm(ComponentTemplateImportForm):
class
Meta
:
model
=
RearPortTemplate
fields
=
[
'device_type'
,
'module_type'
,
'name'
,
'type'
,
'positions'
,
'label'
,
'description'
,
'device_type'
,
'module_type'
,
'name'
,
'type'
,
'color'
,
'positions'
,
'label'
,
'description'
,
]
...
...
netbox/dcim/models/device_component_templates.py
View file @
f1877c0c
...
...
@@ -39,7 +39,10 @@ class ComponentTemplateModel(WebhooksMixin, ChangeLoggedModel):
related_name
=
'%(class)ss'
)
name
=
models
.
CharField
(
max_length
=
64
max_length
=
64
,
help_text
=
"""
{module} is accepted as a substitution for the module bay position when attached to a module type.
"""
)
_name
=
NaturalOrderingField
(
target_field
=
'name'
,
...
...
@@ -157,6 +160,14 @@ class ConsolePortTemplate(ModularComponentTemplateModel):
**
kwargs
)
def
to_yaml
(
self
):
return
{
'name'
:
self
.
name
,
'type'
:
self
.
type
,
'label'
:
self
.
label
,
'description'
:
self
.
description
,
}
class
ConsoleServerPortTemplate
(
ModularComponentTemplateModel
):
"""
...
...
@@ -185,6 +196,14 @@ class ConsoleServerPortTemplate(ModularComponentTemplateModel):
**
kwargs
)
def
to_yaml
(
self
):
return
{
'name'
:
self
.
name
,
'type'
:
self
.
type
,
'label'
:
self
.
label
,
'description'
:
self
.
description
,
}
class
PowerPortTemplate
(
ModularComponentTemplateModel
):
"""
...
...
@@ -236,6 +255,16 @@ class PowerPortTemplate(ModularComponentTemplateModel):
'allocated_draw'
:
f
"Allocated draw cannot exceed the maximum draw (
{
self
.
maximum_draw
}
W)."
})
def
to_yaml
(
self
):
return
{
'name'
:
self
.
name
,
'type'
:
self
.
type
,
'maximum_draw'
:
self
.
maximum_draw
,
'allocated_draw'
:
self
.
allocated_draw
,
'label'
:
self
.
label
,
'description'
:
self
.
description
,
}
class
PowerOutletTemplate
(
ModularComponentTemplateModel
):
"""
...
...
@@ -298,6 +327,16 @@ class PowerOutletTemplate(ModularComponentTemplateModel):
**
kwargs
)
def
to_yaml
(
self
):
return
{
'name'
:
self
.
name
,
'type'
:
self
.
type
,
'power_port'
:
self
.
power_port
.
name
if
self
.
power_port
else
None
,
'feed_leg'
:
self
.
feed_leg
,
'label'
:
self
.
label
,
'description'
:
self
.
description
,
}
class
InterfaceTemplate
(
ModularComponentTemplateModel
):
"""
...
...
@@ -337,6 +376,15 @@ class InterfaceTemplate(ModularComponentTemplateModel):
**
kwargs
)
def
to_yaml
(
self
):
return
{
'name'
:
self
.
name
,
'type'
:
self
.
type
,
'mgmt_only'
:
self
.
mgmt_only
,
'label'
:
self
.
label
,
'description'
:
self
.
description
,
}
class
FrontPortTemplate
(
ModularComponentTemplateModel
):
"""
...
...
@@ -410,6 +458,17 @@ class FrontPortTemplate(ModularComponentTemplateModel):
**
kwargs
)
def
to_yaml
(
self
):
return
{
'name'
:
self
.
name
,
'type'
:
self
.
type
,
'color'
:
self
.
color
,
'rear_port'
:
self
.
rear_port
.
name
,
'rear_port_position'
:
self
.
rear_port_position
,
'label'
:
self
.
label
,
'description'
:
self
.
description
,
}
class
RearPortTemplate
(
ModularComponentTemplateModel
):
"""
...
...
@@ -449,6 +508,16 @@ class RearPortTemplate(ModularComponentTemplateModel):
**
kwargs
)
def
to_yaml
(
self
):
return
{
'name'
:
self
.
name
,
'type'
:
self
.
type
,
'color'
:
self
.
color
,
'positions'
:
self
.
positions
,
'label'
:
self
.
label
,
'description'
:
self
.
description
,
}
class
ModuleBayTemplate
(
ComponentTemplateModel
):
"""
...
...
@@ -474,6 +543,14 @@ class ModuleBayTemplate(ComponentTemplateModel):
position
=
self
.
position
)
def
to_yaml
(
self
):
return
{
'name'
:
self
.
name
,
'label'
:
self
.
label
,
'position'
:
self
.
position
,
'description'
:
self
.
description
,
}
class
DeviceBayTemplate
(
ComponentTemplateModel
):
"""
...
...
@@ -498,6 +575,13 @@ class DeviceBayTemplate(ComponentTemplateModel):
f
"Subdevice role of device type (
{
self
.
device_type
}
) must be set to
\"
parent
\"
to allow device bays."
)
def
to_yaml
(
self
):
return
{
'name'
:
self
.
name
,
'label'
:
self
.
label
,
'description'
:
self
.
description
,
}
class
InventoryItemTemplate
(
MPTTModel
,
ComponentTemplateModel
):
"""
...
...
netbox/dcim/models/devices.py
View file @
f1877c0c
from
collections
import
OrderedDict
import
yaml
from
django.contrib.contenttypes.fields
import
GenericRelation
from
django.core.exceptions
import
ValidationError
...
...
@@ -161,115 +159,54 @@ class DeviceType(NetBoxModel):
return
reverse
(
'dcim:devicetype'
,
args
=
[
self
.
pk
])
def
to_yaml
(
self
):
data
=
OrderedDict
((
(
'manufacturer'
,
self
.
manufacturer
.
name
)
,
(
'model'
,
self
.
model
)
,
(
'slug'
,
self
.
slug
)
,
(
'part_number'
,
self
.
part_number
)
,
(
'u_height'
,
self
.
u_height
)
,
(
'is_full_depth'
,
self
.
is_full_depth
)
,
(
'subdevice_role'
,
self
.
subdevice_role
)
,
(
'airflow'
,
self
.
airflow
)
,
(
'comments'
,
self
.
comments
)
,
))
data
=
{
'manufacturer'
:
self
.
manufacturer
.
name
,
'model'
:
self
.
model
,
'slug'
:
self
.
slug
,
'part_number'
:
self
.
part_number
,
'u_height'
:
self
.
u_height
,
'is_full_depth'
:
self
.
is_full_depth
,
'subdevice_role'
:
self
.
subdevice_role
,
'airflow'
:
self
.
airflow
,
'comments'
:
self
.
comments
,
}
# Component templates
if
self
.
consoleporttemplates
.
exists
():
data
[
'console-ports'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
consoleporttemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
consoleporttemplates
.
all
()
]
if
self
.
consoleserverporttemplates
.
exists
():
data
[
'console-server-ports'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
consoleserverporttemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
consoleserverporttemplates
.
all
()
]
if
self
.
powerporttemplates
.
exists
():
data
[
'power-ports'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'maximum_draw'
:
c
.
maximum_draw
,
'allocated_draw'
:
c
.
allocated_draw
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
powerporttemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
powerporttemplates
.
all
()
]
if
self
.
poweroutlettemplates
.
exists
():
data
[
'power-outlets'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'power_port'
:
c
.
power_port
.
name
if
c
.
power_port
else
None
,
'feed_leg'
:
c
.
feed_leg
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
poweroutlettemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
poweroutlettemplates
.
all
()
]
if
self
.
interfacetemplates
.
exists
():
data
[
'interfaces'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'mgmt_only'
:
c
.
mgmt_only
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
interfacetemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
interfacetemplates
.
all
()
]
if
self
.
frontporttemplates
.
exists
():
data
[
'front-ports'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'rear_port'
:
c
.
rear_port
.
name
,
'rear_port_position'
:
c
.
rear_port_position
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
frontporttemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
frontporttemplates
.
all
()
]
if
self
.
rearporttemplates
.
exists
():
data
[
'rear-ports'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'positions'
:
c
.
positions
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
rearporttemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
rearporttemplates
.
all
()
]
if
self
.
modulebaytemplates
.
exists
():
data
[
'module-bays'
]
=
[
{
'name'
:
c
.
name
,
'label'
:
c
.
label
,
'position'
:
c
.
position
,
'description'
:
c
.
description
,
}
for
c
in
self
.
modulebaytemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
modulebaytemplates
.
all
()
]
if
self
.
devicebaytemplates
.
exists
():
data
[
'device-bays'
]
=
[
{
'name'
:
c
.
name
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
devicebaytemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
devicebaytemplates
.
all
()
]
return
yaml
.
dump
(
dict
(
data
),
sort_keys
=
False
)
...
...
@@ -395,91 +332,41 @@ class ModuleType(NetBoxModel):
return
reverse
(
'dcim:moduletype'
,
args
=
[
self
.
pk
])
def
to_yaml
(
self
):
data
=
OrderedDict
((
(
'manufacturer'
,
self
.
manufacturer
.
name
)
,
(
'model'
,
self
.
model
)
,
(
'part_number'
,
self
.
part_number
)
,
(
'comments'
,
self
.
comments
)
,
))
data
=
{
'manufacturer'
:
self
.
manufacturer
.
name
,
'model'
:
self
.
model
,
'part_number'
:
self
.
part_number
,
'comments'
:
self
.
comments
,
}
# Component templates
if
self
.
consoleporttemplates
.
exists
():
data
[
'console-ports'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
consoleporttemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
consoleporttemplates
.
all
()
]
if
self
.
consoleserverporttemplates
.
exists
():
data
[
'console-server-ports'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
consoleserverporttemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
consoleserverporttemplates
.
all
()
]
if
self
.
powerporttemplates
.
exists
():
data
[
'power-ports'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'maximum_draw'
:
c
.
maximum_draw
,
'allocated_draw'
:
c
.
allocated_draw
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
powerporttemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
powerporttemplates
.
all
()
]
if
self
.
poweroutlettemplates
.
exists
():
data
[
'power-outlets'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'power_port'
:
c
.
power_port
.
name
if
c
.
power_port
else
None
,
'feed_leg'
:
c
.
feed_leg
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
poweroutlettemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
poweroutlettemplates
.
all
()
]
if
self
.
interfacetemplates
.
exists
():
data
[
'interfaces'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'mgmt_only'
:
c
.
mgmt_only
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
interfacetemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
interfacetemplates
.
all
()
]
if
self
.
frontporttemplates
.
exists
():
data
[
'front-ports'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'rear_port'
:
c
.
rear_port
.
name
,
'rear_port_position'
:
c
.
rear_port_position
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
frontporttemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
frontporttemplates
.
all
()
]
if
self
.
rearporttemplates
.
exists
():
data
[
'rear-ports'
]
=
[
{
'name'
:
c
.
name
,
'type'
:
c
.
type
,
'positions'
:
c
.
positions
,
'label'
:
c
.
label
,
'description'
:
c
.
description
,
}
for
c
in
self
.
rearporttemplates
.
all
()
c
.
to_yaml
()
for
c
in
self
.
rearporttemplates
.
all
()
]
return
yaml
.
dump
(
dict
(
data
),
sort_keys
=
False
)
...
...
netbox/dcim/tables/modules.py
View file @
f1877c0c
...
...
@@ -14,6 +14,9 @@ class ModuleTypeTable(NetBoxTable):
linkify
=
True
,
verbose_name
=
'Module Type'
)
manufacturer
=
tables
.
Column
(
linkify
=
True
)
instance_count
=
columns
.
LinkedCountColumn
(
viewname
=
'dcim:module_list'
,
url_params
=
{
'module_type_id'
:
'pk'
},
...
...
@@ -41,6 +44,10 @@ class ModuleTable(NetBoxTable):
module_bay
=
tables
.
Column
(
linkify
=
True
)
manufacturer
=
tables
.
Column
(
accessor
=
tables
.
A
(
'module_type__manufacturer'
),
linkify
=
True
)
module_type
=
tables
.
Column
(
linkify
=
True
)
...
...
@@ -52,8 +59,9 @@ class ModuleTable(NetBoxTable):
class
Meta
(
NetBoxTable
.
Meta
):
model
=
Module
fields
=
(
'pk'
,
'id'
,
'device'
,
'module_bay'
,
'module_type'
,
'serial'
,
'asset_tag'
,
'comments'
,
'tags'
,
'pk'
,
'id'
,
'device'
,
'module_bay'
,
'manufacturer'
,
'module_type'
,
'serial'
,
'asset_tag'
,
'comments'
,
'tags'
,
)
default_columns
=
(
'pk'
,
'id'
,
'device'
,
'module_bay'
,
'module_type'
,
'serial'
,
'asset_tag'
,
'pk'
,
'id'
,
'device'
,
'module_bay'
,
'manufacturer'
,
'module_type'
,
'serial'
,
'asset_tag'
,
)
netbox/dcim/tables/power.py
View file @
f1877c0c
...
...
@@ -21,6 +21,9 @@ class PowerPanelTable(NetBoxTable):
site
=
tables
.
Column
(
linkify
=
True