From b59fcb5cba1a1b7091332e9aa7a12deed34ce519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sybren=20A=2E=20St=C3=BCvel?= Date: Fri, 21 Oct 2016 16:00:03 +0200 Subject: [PATCH] Prevent {{ url_for_node(...) }} crashing the planet when node doesn't exist. Now None is returned as URL, and a warning is logged, rather than crashing with a 500. A situation like this occurs when an activity refers to a no longer existing node. --- pillar/web/jinja.py | 17 ++++++++++++++++- pillar/web/nodes/routes.py | 2 +- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/pillar/web/jinja.py b/pillar/web/jinja.py index 520ae373..c64920ac 100644 --- a/pillar/web/jinja.py +++ b/pillar/web/jinja.py @@ -2,14 +2,20 @@ from __future__ import absolute_import +import logging + +import flask import jinja2.filters import jinja2.utils +import werkzeug.exceptions as wz_exceptions import pillar.api.utils from pillar.web.utils import pretty_date from pillar.web.nodes.routes import url_for_node import pillar.markdown +log = logging.getLogger(__name__) + def format_pretty_date(d): return pretty_date(d) @@ -92,6 +98,15 @@ def do_markdown(s): return jinja2.utils.Markup(safe_html) +def do_url_for_node(node_id=None, node=None): + try: + return url_for_node(node_id=node_id, node=node) + except wz_exceptions.NotFound: + log.info('%s: do_url_for_node(node_id=%r, ...) called for non-existing node.', + flask.request.url, node_id) + return None + + def setup_jinja_env(jinja_env): jinja_env.filters['pretty_date'] = format_pretty_date jinja_env.filters['pretty_date_time'] = format_pretty_date_time @@ -100,4 +115,4 @@ def setup_jinja_env(jinja_env): jinja_env.filters['pluralize'] = do_pluralize jinja_env.filters['gravatar'] = pillar.api.utils.gravatar jinja_env.filters['markdown'] = do_markdown - jinja_env.globals['url_for_node'] = url_for_node + jinja_env.globals['url_for_node'] = do_url_for_node diff --git a/pillar/web/nodes/routes.py b/pillar/web/nodes/routes.py index 35f27d1c..998618f9 100644 --- a/pillar/web/nodes/routes.py +++ b/pillar/web/nodes/routes.py @@ -593,7 +593,7 @@ def url_for_node(node_id=None, node=None): log.warning( 'url_for_node(node_id=%r, node=None): Unable to find node.', node_id) - raise ValueError('Unable to find node %r' % node_id) + raise NotFound('Unable to find node %r' % node_id) return finders.find_url_for_node(node)