mirror of
https://github.com/netbox-community/netbox.git
synced 2026-01-14 15:52:18 -06:00
Define UI layout for ModuleType view
This commit is contained in:
@@ -150,6 +150,16 @@ class ModuleTypeProfilePanel(panels.ObjectAttributesPanel):
|
|||||||
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 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 {
|
||||||
|
|||||||
@@ -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 %}
|
||||||
|
|||||||
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 %}
|
||||||
Reference in New Issue
Block a user