From 79afb0175bee4b363644518a920c258921b6196e Mon Sep 17 00:00:00 2001
From: miigotu <miigotu@gmail.com>
Date: Tue, 12 Jan 2016 12:55:06 -0800
Subject: [PATCH] Add a custom error page when mako render fails

---
 gui/slick/views/500.mako | 25 +++++++++++++++++++++++++
 sickbeard/webserve.py    | 17 +++++++++++++----
 2 files changed, 38 insertions(+), 4 deletions(-)
 create mode 100644 gui/slick/views/500.mako

diff --git a/gui/slick/views/500.mako b/gui/slick/views/500.mako
new file mode 100644
index 000000000..4a8547d4a
--- /dev/null
+++ b/gui/slick/views/500.mako
@@ -0,0 +1,25 @@
+<%inherit file="/layouts/main.mako"/>
+
+<%block name="content">
+<h1 class="header">${header}</h1>
+<p>
+A mako error has occured.<br>
+If this happened during an update a simple page refresh may be the solution.<br>
+Mako errors that happen during updates may be a one time error if there were significant ui changes.<br>
+</p>
+<hr>
+<a href="#mako-error" class="btn btn-default" data-toggle="collapse">Show/Hide Error</a>
+<div id="mako-error" class="collapse">
+<br>
+<div class="align-center">
+<pre>
+<% filename, lineno, function, line = backtrace.traceback[-1] %>
+File ${filename}:${lineno}, in ${function}:
+% if line:
+${line}
+% endif
+${str(backtrace.error.__class__.__name__)}: ${backtrace.error}
+</pre>
+</div>
+</div>
+</%block>
diff --git a/sickbeard/webserve.py b/sickbeard/webserve.py
index 3dc61b4a1..986e7b2a8 100644
--- a/sickbeard/webserve.py
+++ b/sickbeard/webserve.py
@@ -81,6 +81,7 @@ except ImportError:
 
 from mako.template import Template as MakoTemplate
 from mako.lookup import TemplateLookup
+from mako.exceptions import RichTraceback
 
 from tornado.routes import route
 from tornado.web import RequestHandler, HTTPError, authenticated
@@ -106,7 +107,11 @@ def get_lookup():
         mako_cache = ek(os.path.join, sickbeard.CACHE_DIR, 'mako')
     if mako_lookup is None:
         use_strict = sickbeard.BRANCH and sickbeard.BRANCH != 'master'
-        mako_lookup = TemplateLookup(directories=[mako_path], module_directory=mako_cache, format_exceptions=True, strict_undefined=use_strict)
+        mako_lookup = TemplateLookup(directories=[mako_path],
+                                     module_directory=mako_cache,
+                                    #  format_exceptions=True,
+                                     strict_undefined=use_strict,
+                                     filesystem_checks=True)
     return mako_lookup
 
 
@@ -158,9 +163,13 @@ class PageTemplate(MakoTemplate):
                 kwargs[key] = self.arguments[key]
 
         kwargs['makoStartTime'] = time.time()
-
-        return self.template.render_unicode(*args, **kwargs)
-
+        try:
+            return self.template.render_unicode(*args, **kwargs)
+        except Exception:
+            kwargs['title'] = '500'
+            kwargs['header'] = 'Mako Error'
+            kwargs['backtrace'] = RichTraceback()
+            return get_lookup().get_template('500.mako').render_unicode(*args, **kwargs)
 
 class BaseHandler(RequestHandler):
     startTime = 0.
-- 
GitLab