diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index acf335b69..90ca44a3d 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -27,7 +27,6 @@ from netbox.ui.panels import ( NestedGroupObjectPanel, ObjectsTablePanel, OrganizationalObjectPanel, - Panel, RelatedObjectsPanel, TemplatePanel, ) @@ -1764,7 +1763,7 @@ class ModuleTypeView(GetRelatedModelsMixin, generic.ObjectView): CommentsPanel(), ], right_panels=[ - Panel( + TemplatePanel( title=_('Attributes'), template_name='dcim/panels/module_type_attributes.html', ), @@ -2934,7 +2933,7 @@ class ModuleView(GetRelatedModelsMixin, generic.ObjectView): CommentsPanel(), ], right_panels=[ - Panel( + TemplatePanel( title=_('Module Type'), template_name='dcim/panels/module_type.html', ), @@ -3740,7 +3739,7 @@ class ModuleBayView(generic.ObjectView): ], right_panels=[ CustomFieldsPanel(), - Panel( + TemplatePanel( title=_('Installed Module'), template_name='dcim/panels/installed_module.html', ), @@ -3815,7 +3814,7 @@ class DeviceBayView(generic.ObjectView): TagsPanel(), ], right_panels=[ - Panel( + TemplatePanel( title=_('Installed Device'), template_name='dcim/panels/installed_device.html', ), @@ -4310,11 +4309,11 @@ class CableView(generic.ObjectView): CommentsPanel(), ], right_panels=[ - Panel( + TemplatePanel( title=_('Termination A'), template_name='dcim/panels/cable_termination_a.html', ), - Panel( + TemplatePanel( title=_('Termination B'), template_name='dcim/panels/cable_termination_b.html', ), diff --git a/netbox/netbox/ui/panels.py b/netbox/netbox/ui/panels.py index 222addd80..632b9253b 100644 --- a/netbox/netbox/ui/panels.py +++ b/netbox/netbox/ui/panels.py @@ -45,18 +45,15 @@ class Panel: Parameters: title (str): The human-friendly title of the panel 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 title = None actions = None - def __init__(self, title=None, actions=None, template_name=None): + def __init__(self, title=None, actions=None): if title is not None: self.title = title self.actions = actions or self.actions or [] - if template_name is not None: - self.template_name = template_name def get_context(self, context): """ @@ -324,12 +321,17 @@ class TemplatePanel(Panel): Parameters: template_name (str): The name of the template to render """ - def __init__(self, template_name): - super().__init__(template_name=template_name) + def __init__(self, template_name, **kwargs): + self.template_name = template_name + super().__init__(**kwargs) def render(self, context): - # Pass the entire context to the template - return render_to_string(self.template_name, context.flatten()) + # Pass the entire context to the template, but let the panel's own context take precedence + # for panel-specific variables (title, actions, panel_class) + return render_to_string(self.template_name, { + **context.flatten(), + **self.get_context(context), + }) class TextCodePanel(ObjectPanel):