diff --git a/netbox/extras/models.py b/netbox/extras/models.py index 170035eb7..e9ca396cc 100644 --- a/netbox/extras/models.py +++ b/netbox/extras/models.py @@ -12,12 +12,11 @@ from django.db.models import F, Q from django.http import HttpResponse from django.template import Template, Context from django.urls import reverse -from jinja2 import Environment from taggit.models import TagBase, GenericTaggedItemBase from dcim.constants import CONNECTION_STATUS_CONNECTED from utilities.fields import ColorField -from utilities.utils import deepmerge, foreground_color, model_names_to_filter_dict +from utilities.utils import deepmerge, foreground_color, model_names_to_filter_dict, render_jinja2 from .constants import * from .querysets import ConfigContextQuerySet @@ -502,8 +501,7 @@ class ExportTemplate(models.Model): output = template.render(Context(context)) elif self.template_language == TEMPLATE_LANGUAGE_JINJA2: - template = Environment().from_string(source=self.template_code) - output = template.render(**context) + output = render_jinja2(self.template_code, context) else: return None diff --git a/netbox/extras/templatetags/custom_links.py b/netbox/extras/templatetags/custom_links.py index ce6cc482a..0d2239ecc 100644 --- a/netbox/extras/templatetags/custom_links.py +++ b/netbox/extras/templatetags/custom_links.py @@ -3,9 +3,9 @@ from collections import OrderedDict from django import template from django.contrib.contenttypes.models import ContentType from django.utils.safestring import mark_safe -from jinja2 import Environment from extras.models import CustomLink +from utilities.utils import render_jinja2 register = template.Library() @@ -46,7 +46,7 @@ def custom_links(obj): # Add non-grouped links else: - text_rendered = Environment().from_string(source=cl.text).render(**context) + text_rendered = render_jinja2(cl.text, context) if text_rendered: link_target = ' target="_blank"' if cl.new_window else '' template_code += LINK_BUTTON.format( @@ -59,7 +59,7 @@ def custom_links(obj): links_rendered = [] for cl in links: - text_rendered = Environment().from_string(source=cl.text).render(**context) + text_rendered = render_jinja2(cl.text, context) if text_rendered: link_target = ' target="_blank"' if cl.new_window else '' links_rendered.append( @@ -72,6 +72,6 @@ def custom_links(obj): ) # Render template - rendered = Environment().from_string(source=template_code).render(**context) + rendered = render_jinja2(template_code, context) return mark_safe(rendered) diff --git a/netbox/utilities/utils.py b/netbox/utilities/utils.py index 011d9e85f..f1d0780c4 100644 --- a/netbox/utilities/utils.py +++ b/netbox/utilities/utils.py @@ -4,6 +4,7 @@ from collections import OrderedDict from django.core.serializers import serialize from django.db.models import Count, OuterRef, Subquery +from jinja2 import Environment from dcim.constants import LENGTH_UNIT_CENTIMETER, LENGTH_UNIT_FOOT, LENGTH_UNIT_INCH, LENGTH_UNIT_METER @@ -174,3 +175,10 @@ def to_meters(length, unit): if unit == LENGTH_UNIT_INCH: return length * 0.3048 * 12 raise ValueError("Unknown unit {}. Must be 'm', 'cm', 'ft', or 'in'.".format(unit)) + + +def render_jinja2(template_code, context): + """ + Render a Jinja2 template with the provided context. Return the rendered content. + """ + return Environment().from_string(source=template_code).render(**context)