diff --git a/docs/models/extras/customlink.md b/docs/models/extras/customlink.md index 3b502cab2..7fd510841 100644 --- a/docs/models/extras/customlink.md +++ b/docs/models/extras/customlink.md @@ -55,3 +55,7 @@ The link will only appear when viewing a device with a manufacturer name of "Cis ## Link Groups Group names can be specified to organize links into groups. Links with the same group name will render as a dropdown menu beneath a single button bearing the name of the group. + +## Table Columns + +Custom links can also be included in object tables by selecting the desired links from the table configuration form. When displayed, each link will render as a hyperlink for its corresponding object. When exported (e.g. as CSV data), each link render only its URL. diff --git a/docs/release-notes/version-3.1.md b/docs/release-notes/version-3.1.md index c748bff14..d50404261 100644 --- a/docs/release-notes/version-3.1.md +++ b/docs/release-notes/version-3.1.md @@ -4,6 +4,7 @@ ### Enhancements +* [#6782](https://github.com/netbox-community/netbox/issues/6782) - Enable the inclusion of custom links in tables * [#8100](https://github.com/netbox-community/netbox/issues/8100) - Add "other" choice for FHRP group protocol ### Bug Fixes diff --git a/netbox/extras/models/models.py b/netbox/extras/models/models.py index 47da21e19..36457efae 100644 --- a/netbox/extras/models/models.py +++ b/netbox/extras/models/models.py @@ -229,6 +229,24 @@ class CustomLink(ChangeLoggedModel): def get_absolute_url(self): return reverse('extras:customlink', args=[self.pk]) + def render(self, context): + """ + Render the CustomLink given the provided context, and return the text, link, and link_target. + + :param context: The context passed to Jinja2 + """ + text = render_jinja2(self.link_text, context) + if not text: + return {} + link = render_jinja2(self.link_url, context) + link_target = ' target="_blank"' if self.new_window else '' + + return { + 'text': text, + 'link': link, + 'link_target': link_target, + } + @extras_features('webhooks', 'export_templates') class ExportTemplate(ChangeLoggedModel): diff --git a/netbox/extras/templatetags/custom_links.py b/netbox/extras/templatetags/custom_links.py index fec5cf65a..32ec966b3 100644 --- a/netbox/extras/templatetags/custom_links.py +++ b/netbox/extras/templatetags/custom_links.py @@ -62,16 +62,14 @@ def custom_links(context, obj): # Add non-grouped links else: try: - text_rendered = render_jinja2(cl.link_text, link_context) - if text_rendered: - link_rendered = render_jinja2(cl.link_url, link_context) - link_target = ' target="_blank"' if cl.new_window else '' + rendered = cl.render(link_context) + if rendered: template_code += LINK_BUTTON.format( - link_rendered, link_target, cl.button_class, text_rendered + rendered['link'], rendered['link_target'], cl.button_class, rendered['text'] ) except Exception as e: - template_code += '' \ - ' {}\n'.format(e, cl.name) + template_code += f'' \ + f' {cl.name}\n' # Add grouped links to template for group, links in group_names.items(): @@ -80,17 +78,15 @@ def custom_links(context, obj): for cl in links: try: - text_rendered = render_jinja2(cl.link_text, link_context) - if text_rendered: - link_target = ' target="_blank"' if cl.new_window else '' - link_rendered = render_jinja2(cl.link_url, link_context) + rendered = cl.render(link_context) + if rendered: links_rendered.append( - GROUP_LINK.format(link_rendered, link_target, text_rendered) + GROUP_LINK.format(rendered['link'], rendered['link_target'], rendered['text']) ) except Exception as e: links_rendered.append( - '