Catch exceptions when rendering device templates in UI

This commit is contained in:
jeremystretch 2023-02-16 16:12:05 -05:00
parent f92e39b2c9
commit aa6440014a
3 changed files with 11 additions and 4 deletions

View File

@ -1,3 +1,5 @@
import traceback
from django.contrib import messages from django.contrib import messages
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.core.paginator import EmptyPage, PageNotAnInteger from django.core.paginator import EmptyPage, PageNotAnInteger
@ -10,6 +12,7 @@ from django.utils.html import escape
from django.utils.safestring import mark_safe from django.utils.safestring import mark_safe
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from django.views.generic import View from django.views.generic import View
from jinja2.exceptions import TemplateError
from circuits.models import Circuit, CircuitTermination from circuits.models import Circuit, CircuitTermination
from extras.views import ObjectConfigContextView from extras.views import ObjectConfigContextView
@ -2015,10 +2018,13 @@ class DeviceRenderConfigView(generic.ObjectView):
context_data.update(**instance.get_config_context()) context_data.update(**instance.get_config_context())
# Render the config template # Render the config template
rendered_config = None
if config_template := instance.get_config_template(): if config_template := instance.get_config_template():
rendered_config = config_template.render(context=context_data) try:
else: rendered_config = config_template.render(context=context_data)
rendered_config = None except TemplateError as e:
messages.error(request, f"An error occurred while rendering the template: {e}")
rendered_config = traceback.format_exc()
return { return {
'config_template': config_template, 'config_template': config_template,

View File

@ -4,6 +4,7 @@ from django.db import models
from django.urls import reverse from django.urls import reverse
from django.utils import timezone from django.utils import timezone
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from jinja2.exceptions import TemplateError
from jinja2.sandbox import SandboxedEnvironment from jinja2.sandbox import SandboxedEnvironment
from extras.querysets import ConfigContextQuerySet from extras.querysets import ConfigContextQuerySet

View File

@ -36,7 +36,7 @@
<div class="row"> <div class="row">
<div class="col"> <div class="col">
<div class="card"> <div class="card">
{% if rendered_config %} {% if config_template %}
<pre class="card-body">{{ rendered_config }}</pre> <pre class="card-body">{{ rendered_config }}</pre>
{% else %} {% else %}
<div class="card-body text-muted">No configuration template found</div> <div class="card-body text-muted">No configuration template found</div>