From ca1f861e016bd6cadc4e8ad54fbb9b375649827f Mon Sep 17 00:00:00 2001
From: Martijn Vermaat <martijn@vermaat.name>
Date: Fri, 4 Jul 2014 14:09:01 +0200
Subject: [PATCH] Add 404 not found page

---
 mutalyzer/website/templates/not-found.html | 23 ++++++++++
 mutalyzer/website/views.py                 | 49 ++++++++++++++++------
 2 files changed, 60 insertions(+), 12 deletions(-)
 create mode 100644 mutalyzer/website/templates/not-found.html

diff --git a/mutalyzer/website/templates/not-found.html b/mutalyzer/website/templates/not-found.html
new file mode 100644
index 00000000..75af36c0
--- /dev/null
+++ b/mutalyzer/website/templates/not-found.html
@@ -0,0 +1,23 @@
+{% extends "base.html" %}
+
+{% set active_page = "not-found" %}
+{% set page_title = "Page Not Found" %}
+
+{% block content %}
+
+<p>
+Uh oh! Page not found!
+</p>
+
+<p>
+The page you are looking for is not here. Let's try one of the following
+remedies to get you back on track...
+</p>
+
+<ul>
+  <li>Go to the <a href="{{ url_for('website.homepage') }}">Mutalyzer homepage</a>.</li>
+  <li>Search Google for <a href="https://www.google.com/search?q={{ (['mutalyzer'] + terms)|join(' ')|urlencode }}">{{ (['mutalyzer'] + terms)|join(' ') }}</a>.</li>
+  <li>Notify us if you think <a href="mailto:{{ contact_email }}">this is an error</a>.</li>
+</ul>
+
+{% endblock content %}
diff --git a/mutalyzer/website/views.py b/mutalyzer/website/views.py
index 9bc65ccb..238a0c09 100644
--- a/mutalyzer/website/views.py
+++ b/mutalyzer/website/views.py
@@ -34,20 +34,45 @@ from mutalyzer.services import soap
 website = Blueprint('website', __name__)
 
 
+global_context = {
+    'mutalyzer_version'   : mutalyzer.__version__,
+    'nomenclature_version': mutalyzer.NOMENCLATURE_VERSION,
+    'release_date'        : mutalyzer.__date__,
+    'release'             : mutalyzer.__version_info__[-1] != 'dev',
+    'copyright_years'     : mutalyzer.COPYRIGHT_YEARS,
+    'contact_email'       : settings.EMAIL,
+    'soap_wsdl_url'       : settings.SOAP_WSDL_URL,
+    'json_root_url'       : settings.JSON_ROOT_URL,
+    'piwik'               : settings.PIWIK,
+    'piwik_base_url'      : settings.PIWIK_BASE_URL,
+    'piwik_site_id'       : settings.PIWIK_SITE_ID,
+    'announcement'        : announce.get_announcement()}
+
+
 @website.context_processor
 def add_globals():
-    return {'mutalyzer_version'   : mutalyzer.__version__,
-            'nomenclature_version': mutalyzer.NOMENCLATURE_VERSION,
-            'release_date'        : mutalyzer.__date__,
-            'release'             : mutalyzer.__version_info__[-1] != 'dev',
-            'copyright_years'     : mutalyzer.COPYRIGHT_YEARS,
-            'contact_email'       : settings.EMAIL,
-            'soap_wsdl_url'       : settings.SOAP_WSDL_URL,
-            'json_root_url'       : settings.JSON_ROOT_URL,
-            'piwik'               : settings.PIWIK,
-            'piwik_base_url'      : settings.PIWIK_BASE_URL,
-            'piwik_site_id'       : settings.PIWIK_SITE_ID,
-            'announcement'        : announce.get_announcement()}
+    return global_context
+
+
+def request_terms():
+    """
+    List of terms associated with the request (i.e., from the request path and
+    query string).
+    """
+    terms = request.path.lstrip('/').split('/')
+    terms += [s for item in request.args.iteritems() for s in item]
+    return terms
+
+
+@website.errorhandler(404)
+def error_not_found(error):
+    return render_template('not-found.html', terms=request_terms()), 404
+
+
+@website.app_errorhandler(404)
+def app_error_not_found(error):
+    return render_template('not-found.html', terms=request_terms(),
+                           **global_context), 404
 
 
 @website.route('/')
-- 
GitLab