Przeglądaj źródła

Misc cleanup for layouts

Jeremy Stretch 1 dzień temu
rodzic
commit
68bc97c24c

+ 6 - 0
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'),
+            )
+        ),
     )
 
 

+ 15 - 0
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'),
+            ),
+        ),
     )
 
 

+ 20 - 2
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

+ 3 - 3
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 %}
     <div class="row">
-      {% for column in row.columns %}
+      {% for column in row %}
         <div class="col">
-          {% for panel in column.panels %}
+          {% for panel in column %}
             {% render panel %}
           {% endfor %}
         </div>