mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-11 06:12:16 -06:00
Compare commits
5 Commits
fix_module
...
20923-dcim
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
c5471a1f6e | ||
|
|
976b76dcb2 | ||
|
|
06d53ef10b | ||
|
|
eb01f6fde8 | ||
|
|
fba40ddf72 |
@@ -129,6 +129,12 @@ class DeviceDimensionsPanel(panels.ObjectAttributesPanel):
|
|||||||
total_weight = attrs.TemplatedAttr('total_weight', template_name='dcim/device/attrs/total_weight.html')
|
total_weight = attrs.TemplatedAttr('total_weight', template_name='dcim/device/attrs/total_weight.html')
|
||||||
|
|
||||||
|
|
||||||
|
class DeviceRolePanel(panels.NestedGroupObjectPanel):
|
||||||
|
color = attrs.ColorAttr('color')
|
||||||
|
vm_role = attrs.BooleanAttr('vm_role', label=_('VM role'))
|
||||||
|
config_template = attrs.RelatedObjectAttr('config_template', linkify=True)
|
||||||
|
|
||||||
|
|
||||||
class DeviceTypePanel(panels.ObjectAttributesPanel):
|
class DeviceTypePanel(panels.ObjectAttributesPanel):
|
||||||
manufacturer = attrs.RelatedObjectAttr('manufacturer', linkify=True)
|
manufacturer = attrs.RelatedObjectAttr('manufacturer', linkify=True)
|
||||||
model = attrs.TextAttr('model')
|
model = attrs.TextAttr('model')
|
||||||
@@ -145,11 +151,36 @@ class DeviceTypePanel(panels.ObjectAttributesPanel):
|
|||||||
rear_image = attrs.ImageAttr('rear_image')
|
rear_image = attrs.ImageAttr('rear_image')
|
||||||
|
|
||||||
|
|
||||||
|
class ModulePanel(panels.ObjectAttributesPanel):
|
||||||
|
device = attrs.RelatedObjectAttr('device', linkify=True)
|
||||||
|
device_type = attrs.RelatedObjectAttr('device.device_type', linkify=True, grouped_by='manufacturer')
|
||||||
|
module_bay = attrs.NestedObjectAttr('module_bay')
|
||||||
|
status = attrs.ChoiceAttr('status')
|
||||||
|
description = attrs.TextAttr('description')
|
||||||
|
serial = attrs.TextAttr('serial', label=_('Serial number'), style='font-monospace', copy_button=True)
|
||||||
|
asset_tag = attrs.TextAttr('asset_tag', style='font-monospace', copy_button=True)
|
||||||
|
|
||||||
|
|
||||||
class ModuleTypeProfilePanel(panels.ObjectAttributesPanel):
|
class ModuleTypeProfilePanel(panels.ObjectAttributesPanel):
|
||||||
name = attrs.TextAttr('name')
|
name = attrs.TextAttr('name')
|
||||||
description = attrs.TextAttr('description')
|
description = attrs.TextAttr('description')
|
||||||
|
|
||||||
|
|
||||||
|
class ModuleTypePanel(panels.ObjectAttributesPanel):
|
||||||
|
profile = attrs.RelatedObjectAttr('profile', linkify=True)
|
||||||
|
manufacturer = attrs.RelatedObjectAttr('manufacturer', linkify=True)
|
||||||
|
model = attrs.TextAttr('name')
|
||||||
|
part_number = attrs.TextAttr('part_number')
|
||||||
|
description = attrs.TextAttr('description')
|
||||||
|
airflow = attrs.ChoiceAttr('airflow')
|
||||||
|
weight = attrs.NumericAttr('weight', unit_accessor='get_weight_unit_display')
|
||||||
|
|
||||||
|
|
||||||
|
class PlatformPanel(panels.NestedGroupObjectPanel):
|
||||||
|
manufacturer = attrs.RelatedObjectAttr('manufacturer', linkify=True)
|
||||||
|
config_template = attrs.RelatedObjectAttr('config_template', linkify=True)
|
||||||
|
|
||||||
|
|
||||||
class VirtualChassisMembersPanel(panels.ObjectPanel):
|
class VirtualChassisMembersPanel(panels.ObjectPanel):
|
||||||
"""
|
"""
|
||||||
A panel which lists all members of a virtual chassis.
|
A panel which lists all members of a virtual chassis.
|
||||||
|
|||||||
@@ -21,8 +21,8 @@ from ipam.tables import InterfaceVLANTable, VLANTranslationRuleTable
|
|||||||
from netbox.object_actions import *
|
from netbox.object_actions import *
|
||||||
from netbox.ui import actions, layout
|
from netbox.ui import actions, layout
|
||||||
from netbox.ui.panels import (
|
from netbox.ui.panels import (
|
||||||
CommentsPanel, JSONPanel, NestedGroupObjectPanel, ObjectsTablePanel, OrganizationalObjectPanel, RelatedObjectsPanel,
|
CommentsPanel, JSONPanel, NestedGroupObjectPanel, ObjectsTablePanel, OrganizationalObjectPanel, Panel,
|
||||||
TemplatePanel,
|
RelatedObjectsPanel, TemplatePanel,
|
||||||
)
|
)
|
||||||
from netbox.views import generic
|
from netbox.views import generic
|
||||||
from utilities.forms import ConfirmationForm
|
from utilities.forms import ConfirmationForm
|
||||||
@@ -1656,6 +1656,22 @@ class ModuleTypeListView(generic.ObjectListView):
|
|||||||
@register_model_view(ModuleType)
|
@register_model_view(ModuleType)
|
||||||
class ModuleTypeView(GetRelatedModelsMixin, generic.ObjectView):
|
class ModuleTypeView(GetRelatedModelsMixin, generic.ObjectView):
|
||||||
queryset = ModuleType.objects.all()
|
queryset = ModuleType.objects.all()
|
||||||
|
layout = layout.SimpleLayout(
|
||||||
|
left_panels=[
|
||||||
|
panels.ModuleTypePanel(),
|
||||||
|
TagsPanel(),
|
||||||
|
CommentsPanel(),
|
||||||
|
],
|
||||||
|
right_panels=[
|
||||||
|
Panel(
|
||||||
|
title=_('Attributes'),
|
||||||
|
template_name='dcim/panels/module_type_attributes.html',
|
||||||
|
),
|
||||||
|
RelatedObjectsPanel(),
|
||||||
|
CustomFieldsPanel(),
|
||||||
|
ImageAttachmentsPanel(),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
def get_extra_context(self, request, instance):
|
def get_extra_context(self, request, instance):
|
||||||
return {
|
return {
|
||||||
@@ -2294,6 +2310,27 @@ class DeviceRoleListView(generic.ObjectListView):
|
|||||||
@register_model_view(DeviceRole)
|
@register_model_view(DeviceRole)
|
||||||
class DeviceRoleView(GetRelatedModelsMixin, generic.ObjectView):
|
class DeviceRoleView(GetRelatedModelsMixin, generic.ObjectView):
|
||||||
queryset = DeviceRole.objects.all()
|
queryset = DeviceRole.objects.all()
|
||||||
|
layout = layout.SimpleLayout(
|
||||||
|
left_panels=[
|
||||||
|
panels.DeviceRolePanel(),
|
||||||
|
TagsPanel(),
|
||||||
|
],
|
||||||
|
right_panels=[
|
||||||
|
RelatedObjectsPanel(),
|
||||||
|
CustomFieldsPanel(),
|
||||||
|
CommentsPanel(),
|
||||||
|
],
|
||||||
|
bottom_panels=[
|
||||||
|
ObjectsTablePanel(
|
||||||
|
model='dcim.DeviceRole',
|
||||||
|
title=_('Child Device Roles'),
|
||||||
|
filters={'parent_id': lambda ctx: ctx['object'].pk},
|
||||||
|
actions=[
|
||||||
|
actions.AddObject('dcim.DeviceRole', url_params={'parent': lambda ctx: ctx['object'].pk}),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
def get_extra_context(self, request, instance):
|
def get_extra_context(self, request, instance):
|
||||||
return {
|
return {
|
||||||
@@ -2373,6 +2410,27 @@ class PlatformListView(generic.ObjectListView):
|
|||||||
@register_model_view(Platform)
|
@register_model_view(Platform)
|
||||||
class PlatformView(GetRelatedModelsMixin, generic.ObjectView):
|
class PlatformView(GetRelatedModelsMixin, generic.ObjectView):
|
||||||
queryset = Platform.objects.all()
|
queryset = Platform.objects.all()
|
||||||
|
layout = layout.SimpleLayout(
|
||||||
|
left_panels=[
|
||||||
|
panels.PlatformPanel(),
|
||||||
|
TagsPanel(),
|
||||||
|
],
|
||||||
|
right_panels=[
|
||||||
|
RelatedObjectsPanel(),
|
||||||
|
CustomFieldsPanel(),
|
||||||
|
CommentsPanel(),
|
||||||
|
],
|
||||||
|
bottom_panels=[
|
||||||
|
ObjectsTablePanel(
|
||||||
|
model='dcim.Platform',
|
||||||
|
title=_('Child Platforms'),
|
||||||
|
filters={'parent_id': lambda ctx: ctx['object'].pk},
|
||||||
|
actions=[
|
||||||
|
actions.AddObject('dcim.Platform', url_params={'parent': lambda ctx: ctx['object'].pk}),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
def get_extra_context(self, request, instance):
|
def get_extra_context(self, request, instance):
|
||||||
return {
|
return {
|
||||||
@@ -2763,6 +2821,21 @@ class ModuleListView(generic.ObjectListView):
|
|||||||
@register_model_view(Module)
|
@register_model_view(Module)
|
||||||
class ModuleView(GetRelatedModelsMixin, generic.ObjectView):
|
class ModuleView(GetRelatedModelsMixin, generic.ObjectView):
|
||||||
queryset = Module.objects.all()
|
queryset = Module.objects.all()
|
||||||
|
layout = layout.SimpleLayout(
|
||||||
|
left_panels=[
|
||||||
|
panels.ModulePanel(),
|
||||||
|
TagsPanel(),
|
||||||
|
CommentsPanel(),
|
||||||
|
],
|
||||||
|
right_panels=[
|
||||||
|
Panel(
|
||||||
|
title=_('Module Type'),
|
||||||
|
template_name='dcim/panels/module_type.html',
|
||||||
|
),
|
||||||
|
RelatedObjectsPanel(),
|
||||||
|
CustomFieldsPanel(),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
|
||||||
def get_extra_context(self, request, instance):
|
def get_extra_context(self, request, instance):
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -43,15 +43,18 @@ class Panel:
|
|||||||
Parameters:
|
Parameters:
|
||||||
title (str): The human-friendly title of the panel
|
title (str): The human-friendly title of the panel
|
||||||
actions (list): An iterable of PanelActions to include in the panel header
|
actions (list): An iterable of PanelActions to include in the panel header
|
||||||
|
template_name (str): Overrides the default template name, if defined
|
||||||
"""
|
"""
|
||||||
template_name = None
|
template_name = None
|
||||||
title = None
|
title = None
|
||||||
actions = None
|
actions = None
|
||||||
|
|
||||||
def __init__(self, title=None, actions=None):
|
def __init__(self, title=None, actions=None, template_name=None):
|
||||||
if title is not None:
|
if title is not None:
|
||||||
self.title = title
|
self.title = title
|
||||||
self.actions = actions or self.actions or []
|
self.actions = actions or self.actions or []
|
||||||
|
if template_name is not None:
|
||||||
|
self.template_name = template_name
|
||||||
|
|
||||||
def get_context(self, context):
|
def get_context(self, context):
|
||||||
"""
|
"""
|
||||||
@@ -316,9 +319,8 @@ class TemplatePanel(Panel):
|
|||||||
Parameters:
|
Parameters:
|
||||||
template_name (str): The name of the template to render
|
template_name (str): The name of the template to render
|
||||||
"""
|
"""
|
||||||
def __init__(self, template_name, **kwargs):
|
def __init__(self, template_name):
|
||||||
super().__init__(**kwargs)
|
super().__init__(template_name=template_name)
|
||||||
self.template_name = template_name
|
|
||||||
|
|
||||||
def render(self, context):
|
def render(self, context):
|
||||||
# Pass the entire context to the template
|
# Pass the entire context to the template
|
||||||
|
|||||||
@@ -15,67 +15,3 @@
|
|||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endblock extra_controls %}
|
{% endblock extra_controls %}
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="row mb-3">
|
|
||||||
<div class="col col-12 col-md-6">
|
|
||||||
<div class="card">
|
|
||||||
<h2 class="card-header">{% trans "Device Role" %}</h2>
|
|
||||||
<table class="table table-hover attr-table">
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Name" %}</th>
|
|
||||||
<td>{{ object.name }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Description" %}</th>
|
|
||||||
<td>{{ object.description|placeholder }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Parent" %}</th>
|
|
||||||
<td>{{ object.parent|linkify|placeholder }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Color" %}</th>
|
|
||||||
<td>
|
|
||||||
<span class="badge color-label" style="background-color: #{{ object.color }}"> </span>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "VM Role" %}</th>
|
|
||||||
<td>{% checkmark object.vm_role %}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Config Template" %}</th>
|
|
||||||
<td>{{ object.config_template|linkify|placeholder }}</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
{% include 'inc/panels/tags.html' %}
|
|
||||||
{% plugin_left_page object %}
|
|
||||||
</div>
|
|
||||||
<div class="col col-12 col-md-6">
|
|
||||||
{% include 'inc/panels/related_objects.html' %}
|
|
||||||
{% include 'inc/panels/custom_fields.html' %}
|
|
||||||
{% include 'inc/panels/comments.html' %}
|
|
||||||
{% plugin_right_page object %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mb-3">
|
|
||||||
<div class="col col-md-12">
|
|
||||||
<div class="card">
|
|
||||||
<h2 class="card-header">
|
|
||||||
{% trans "Child Device Roles" %}
|
|
||||||
{% if perms.dcim.add_devicerole %}
|
|
||||||
<div class="card-actions">
|
|
||||||
<a href="{% url 'dcim:devicerole_add' %}?parent={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Device Role" %}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</h2>
|
|
||||||
{% htmx_table 'dcim:devicerole_list' parent_id=object.pk %}
|
|
||||||
</div>
|
|
||||||
{% plugin_full_width_page object %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
|
|||||||
@@ -47,7 +47,7 @@
|
|||||||
{% endif %}
|
{% endif %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block contentx %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col col-12 col-md-6">
|
<div class="col col-12 col-md-6">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
|
|||||||
@@ -1,7 +1,4 @@
|
|||||||
{% extends 'generic/object.html' %}
|
{% extends 'generic/object.html' %}
|
||||||
{% load buttons %}
|
|
||||||
{% load helpers %}
|
|
||||||
{% load plugins %}
|
|
||||||
{% load i18n %}
|
{% load i18n %}
|
||||||
|
|
||||||
{% block title %}{{ object.manufacturer }} {{ object.model }}{% endblock %}
|
{% block title %}{{ object.manufacturer }} {{ object.model }}{% endblock %}
|
||||||
@@ -14,92 +11,5 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block extra_controls %}
|
{% block extra_controls %}
|
||||||
{% include 'dcim/inc/moduletype_buttons.html' %}
|
{% include 'dcim/inc/moduletype_buttons.html' %}
|
||||||
{% endblock %}
|
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="row">
|
|
||||||
<div class="col col-12 col-md-6">
|
|
||||||
<div class="card">
|
|
||||||
<h2 class="card-header">{% trans "Module Type" %}</h2>
|
|
||||||
<table class="table table-hover attr-table">
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Profile" %}</th>
|
|
||||||
<td>{{ object.profile|linkify|placeholder }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Manufacturer" %}</th>
|
|
||||||
<td>{{ object.manufacturer|linkify }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Model Name" %}</th>
|
|
||||||
<td>{{ object.model }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Part Number" %}</th>
|
|
||||||
<td>{{ object.part_number|placeholder }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Description" %}</th>
|
|
||||||
<td>{{ object.description|placeholder }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Airflow" %}</th>
|
|
||||||
<td>{{ object.get_airflow_display|placeholder }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Weight" %}</th>
|
|
||||||
<td>
|
|
||||||
{% if object.weight %}
|
|
||||||
{{ object.weight|floatformat }} {{ object.get_weight_unit_display }}
|
|
||||||
{% else %}
|
|
||||||
{{ ''|placeholder }}
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
{% include 'inc/panels/tags.html' %}
|
|
||||||
{% include 'inc/panels/comments.html' %}
|
|
||||||
{% plugin_left_page object %}
|
|
||||||
</div>
|
|
||||||
<div class="col col-12 col-md-6">
|
|
||||||
<div class="card">
|
|
||||||
<h2 class="card-header">{% trans "Attributes" %}</h2>
|
|
||||||
{% if not object.profile %}
|
|
||||||
<div class="card-body text-muted">
|
|
||||||
{% trans "No profile assigned" %}
|
|
||||||
</div>
|
|
||||||
{% elif object.attributes %}
|
|
||||||
<table class="table table-hover attr-table">
|
|
||||||
{% for k, v in object.attributes.items %}
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{{ k }}</th>
|
|
||||||
<td>
|
|
||||||
{% if v is True or v is False %}
|
|
||||||
{% checkmark v %}
|
|
||||||
{% else %}
|
|
||||||
{{ v|placeholder }}
|
|
||||||
{% endif %}
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
{% endfor %}
|
|
||||||
</table>
|
|
||||||
{% else %}
|
|
||||||
<div class="card-body text-muted">
|
|
||||||
{% trans "None" %}
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</div>
|
|
||||||
{% include 'inc/panels/related_objects.html' %}
|
|
||||||
{% include 'inc/panels/custom_fields.html' %}
|
|
||||||
{% include 'inc/panels/image_attachments.html' %}
|
|
||||||
{% plugin_right_page object %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row">
|
|
||||||
<div class="col col-md-12">
|
|
||||||
{% plugin_full_width_page object %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
27
netbox/templates/dcim/panels/module_type.html
Normal file
27
netbox/templates/dcim/panels/module_type.html
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
{% extends "ui/panels/_base.html" %}
|
||||||
|
{% load helpers i18n %}
|
||||||
|
|
||||||
|
{% block panel_content %}
|
||||||
|
<table class="table table-hover attr-table">
|
||||||
|
<tr>
|
||||||
|
<th scope="row">{% trans "Manufacturer" %}</th>
|
||||||
|
<td>{{ object.module_type.manufacturer|linkify }}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<th scope="row">{% trans "Model" %}</th>
|
||||||
|
<td>{{ object.module_type|linkify }}</td>
|
||||||
|
</tr>
|
||||||
|
{% for k, v in object.module_type.attributes.items %}
|
||||||
|
<tr>
|
||||||
|
<th scope="row">{{ k }}</th>
|
||||||
|
<td>
|
||||||
|
{% if v is True or v is False %}
|
||||||
|
{% checkmark v %}
|
||||||
|
{% else %}
|
||||||
|
{{ v|placeholder }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
{% endblock panel_content %}
|
||||||
29
netbox/templates/dcim/panels/module_type_attributes.html
Normal file
29
netbox/templates/dcim/panels/module_type_attributes.html
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
{% extends "ui/panels/_base.html" %}
|
||||||
|
{% load helpers i18n %}
|
||||||
|
|
||||||
|
{% block panel_content %}
|
||||||
|
{% if not object.profile %}
|
||||||
|
<div class="card-body text-muted">
|
||||||
|
{% trans "No profile assigned" %}
|
||||||
|
</div>
|
||||||
|
{% elif object.attributes %}
|
||||||
|
<table class="table table-hover attr-table">
|
||||||
|
{% for k, v in object.attributes.items %}
|
||||||
|
<tr>
|
||||||
|
<th scope="row">{{ k }}</th>
|
||||||
|
<td>
|
||||||
|
{% if v is True or v is False %}
|
||||||
|
{% checkmark v %}
|
||||||
|
{% else %}
|
||||||
|
{{ v|placeholder }}
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</table>
|
||||||
|
{% else %}
|
||||||
|
<div class="card-body text-muted">
|
||||||
|
{% trans "None" %}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
{% endblock panel_content %}
|
||||||
@@ -18,61 +18,3 @@
|
|||||||
</a>
|
</a>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endblock extra_controls %}
|
{% endblock extra_controls %}
|
||||||
|
|
||||||
{% block content %}
|
|
||||||
<div class="row mb-3">
|
|
||||||
<div class="col col-12 col-md-6">
|
|
||||||
<div class="card">
|
|
||||||
<h2 class="card-header">{% trans "Platform" %}</h2>
|
|
||||||
<table class="table table-hover attr-table">
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Name" %}</th>
|
|
||||||
<td>{{ object.name }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Description" %}</th>
|
|
||||||
<td>{{ object.description|placeholder }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Parent" %}</th>
|
|
||||||
<td>{{ object.parent|linkify|placeholder }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Manufacturer" %}</th>
|
|
||||||
<td>{{ object.manufacturer|linkify|placeholder }}</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th scope="row">{% trans "Config Template" %}</th>
|
|
||||||
<td>{{ object.config_template|linkify|placeholder }}</td>
|
|
||||||
</tr>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
{% include 'inc/panels/tags.html' %}
|
|
||||||
{% plugin_left_page object %}
|
|
||||||
</div>
|
|
||||||
<div class="col col-12 col-md-6">
|
|
||||||
{% include 'inc/panels/related_objects.html' %}
|
|
||||||
{% include 'inc/panels/custom_fields.html' %}
|
|
||||||
{% include 'inc/panels/comments.html' %}
|
|
||||||
{% plugin_right_page object %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<div class="row mb-3">
|
|
||||||
<div class="col col-md-12">
|
|
||||||
<div class="card">
|
|
||||||
<h2 class="card-header">
|
|
||||||
{% trans "Child Platforms" %}
|
|
||||||
{% if perms.dcim.add_platform %}
|
|
||||||
<div class="card-actions">
|
|
||||||
<a href="{% url 'dcim:platform_add' %}?parent={{ object.pk }}&return_url={{ object.get_absolute_url }}" class="btn btn-ghost-primary btn-sm">
|
|
||||||
<i class="mdi mdi-plus-thick" aria-hidden="true"></i> {% trans "Add a Platform" %}
|
|
||||||
</a>
|
|
||||||
</div>
|
|
||||||
{% endif %}
|
|
||||||
</h2>
|
|
||||||
{% htmx_table 'dcim:platform_list' parent_id=object.pk %}
|
|
||||||
</div>
|
|
||||||
{% plugin_full_width_page object %}
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
{% endblock %}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user