From 68bc97c24c50d8a2c285e6668266b2b8de7b3b16 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Thu, 2 Apr 2026 10:01:05 -0400 Subject: [PATCH] Misc cleanup for layouts --- netbox/core/views.py | 6 ++++++ netbox/ipam/views.py | 15 +++++++++++++++ netbox/netbox/ui/layout.py | 22 ++++++++++++++++++++-- netbox/templates/generic/object.html | 6 +++--- 4 files changed, 44 insertions(+), 5 deletions(-) diff --git a/netbox/core/views.py b/netbox/core/views.py index 6531fb7b2..62a907818 100644 --- a/netbox/core/views.py +++ b/netbox/core/views.py @@ -192,8 +192,14 @@ class DataFileView(generic.ObjectView): layout.Column( panels.DataFilePanel(), panels.DataFileContentPanel(), + PluginContentPanel('left_page'), ), ), + layout.Row( + layout.Column( + PluginContentPanel('full_width_page'), + ) + ), ) diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index 3f8f9eba2..08400aec6 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -16,6 +16,7 @@ from netbox.ui.panels import ( CommentsPanel, ContextTablePanel, ObjectsTablePanel, + PluginContentPanel, RelatedObjectsPanel, TemplatePanel, ) @@ -55,11 +56,13 @@ class VRFView(GetRelatedModelsMixin, generic.ObjectView): layout.Column( panels.VRFPanel(), TagsPanel(), + PluginContentPanel('left_page'), ), layout.Column( RelatedObjectsPanel(), CustomFieldsPanel(), CommentsPanel(), + PluginContentPanel('right_page'), ), ), layout.Row( @@ -70,6 +73,11 @@ class VRFView(GetRelatedModelsMixin, generic.ObjectView): ContextTablePanel('export_targets_table', title=_('Export route targets')), ), ), + layout.Row( + layout.Column( + PluginContentPanel('full_width_page'), + ), + ), ) def get_extra_context(self, request, instance): @@ -169,10 +177,12 @@ class RouteTargetView(generic.ObjectView): layout.Column( panels.RouteTargetPanel(), TagsPanel(), + PluginContentPanel('left_page'), ), layout.Column( CustomFieldsPanel(), CommentsPanel(), + PluginContentPanel('right_page'), ), ), layout.Row( @@ -207,6 +217,11 @@ class RouteTargetView(generic.ObjectView): ), ), ), + layout.Row( + layout.Column( + PluginContentPanel('full_width_page'), + ), + ), ) diff --git a/netbox/netbox/ui/layout.py b/netbox/netbox/ui/layout.py index 9ac58d697..603df2f86 100644 --- a/netbox/netbox/ui/layout.py +++ b/netbox/netbox/ui/layout.py @@ -21,10 +21,16 @@ class Layout: """ def __init__(self, *rows): for i, row in enumerate(rows): - if type(row) is not Row: + if not isinstance(row, Row): raise TypeError(f"Row {i} must be a Row instance, not {type(row)}.") self.rows = rows + def __iter__(self): + return iter(self.rows) + + def __repr__(self): + return f"Layout({len(self.rows)} rows)" + class Row: """ @@ -35,10 +41,16 @@ class Row: """ def __init__(self, *columns): for i, column in enumerate(columns): - if type(column) is not Column: + if not isinstance(column, Column): raise TypeError(f"Column {i} must be a Column instance, not {type(column)}.") self.columns = columns + def __iter__(self): + return iter(self.columns) + + def __repr__(self): + return f"Row({len(self.columns)} columns)" + class Column: """ @@ -53,6 +65,12 @@ class Column: raise TypeError(f"Panel {i} must be an instance of a Panel, not {type(panel)}.") self.panels = panels + def __iter__(self): + return iter(self.panels) + + def __repr__(self): + return f"Column({len(self.panels)} panels)" + # # Common layouts diff --git a/netbox/templates/generic/object.html b/netbox/templates/generic/object.html index 100d5bde7..c227772cc 100644 --- a/netbox/templates/generic/object.html +++ b/netbox/templates/generic/object.html @@ -124,11 +124,11 @@ Context: {% block content %} {# Render panel layout declared on view class #} - {% for row in layout.rows %} + {% for row in layout %}
- {% for column in row.columns %} + {% for column in row %}
- {% for panel in column.panels %} + {% for panel in column %} {% render panel %} {% endfor %}