qmsk_www_pages: page_error
authorTero Marttila <terom@paivola.fi>
Sun, 14 Sep 2014 14:27:27 +0300
changeset 229 3d483fa09c8d
parent 228 5b43febfe484
child 230 4439815ab108
qmsk_www_pages: page_error
qmsk_www_pages/templates/pages/error.html
qmsk_www_pages/views.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/qmsk_www_pages/templates/pages/error.html	Sun Sep 14 14:27:27 2014 +0300
@@ -0,0 +1,41 @@
+{% extends "site.html" %}
+
+{% block title %}{{ site_name }} :: {{ error_title }}{%endblock %}
+
+{% block header %}
+    <h1 class="page-header-title">
+        <a href="{% url 'page' '' %}">{{ site_name }}</a>
+    </h1>
+{% endblock %}
+
+{% block nav %}
+{% for tree, tree_name in page_hierarchy %}
+    {% if not forloop.first %}
+    <hr />
+    {% endif %}
+    <ul class="nav">
+    {% for name, page, type, title in tree.list_sorted %}
+        <li class="page-tree-item{% if type %} page-tree-{{type}}{% else %} page-tree-tree{% endif %}{% if name == tree_name %} page-tree-active{% endif %}">
+            <a href="{% url 'page' page %}">
+            {% if not type %}
+                <i class="glyphicon glyphicon-chevron-right"></i>
+            {% endif %}
+                {{ title }}
+            </a>
+        </li>
+    {% endfor %}
+    </ul>
+{% endfor %}
+{% endblock %}
+
+{% block content %}
+    <h1>{{ error_title }}</h1>
+    <div class="alert alert-warning" role="alert">
+    {% if error_message %}
+        {{ error_message }}
+    {% endif %}
+    {% if error_output %}
+        <pre>{{ error_output }}</pre>
+    {% endif %}
+    </div>
+{% endblock %}
--- a/qmsk_www_pages/views.py	Sun Sep 14 14:27:08 2014 +0300
+++ b/qmsk_www_pages/views.py	Sun Sep 14 14:27:27 2014 +0300
@@ -1,26 +1,55 @@
-from django.http import Http404
+from django import http
 from django.shortcuts import render, redirect
 
 from qmsk_www_pages import pages
 
+def page_error (request, page, status, title, error_message=None, error_exception=None):
+    site = pages.SITE
+
+    if page:
+        page_hierarchy = list(page.hierarchy())
+    else:
+        tree = site.tree()
+        page_hierarchy = [(tree, None)]
+
+    return render(request, 'pages/error.html', dict(
+        site_name       = site.name,
+        page_hierarchy  = page_hierarchy,
+        error_page      = page,
+        error_title     = title,
+        error_message   = error_message,
+        error_output    = str(error_exception) if error_exception else None,
+    ), status=status)
+
 # Create your views here.
 def page (request, page):
     try:
         page = pages.page(page)
-    except pages.NotFound:
-        raise Http404
+    except pages.NotFound as error:
+        return page_error(request, None,
+                status  = 404,
+                title   = u"Not Found",
+                error_message   = page,
+        )
 
     redirect_page = page.redirect_page(request)
 
     if redirect_page:
         return redirect('page', redirect_page)
-
-    return render(request, 'pages/page.html', dict(
-            site_name       = page.tree.site.name,
-            page_name       = page.name,
-            page_title      = page.title,
-            page_breadcrumb = page.breadcrumb(),
-            page_hierarchy  = list(page.hierarchy()),
-            page_html       = page.render_html(request),
-            page_modified   = page.modified(),
-    ))
+    
+    try:
+        return render(request, 'pages/page.html', dict(
+                site_name       = page.tree.site.name,
+                page_name       = page.name,
+                page_title      = page.title,
+                page_breadcrumb = page.breadcrumb(),
+                page_hierarchy  = list(page.hierarchy()),
+                page_html       = page.render_html(request),
+                page_modified   = page.modified(),
+        ))
+    except pages.RenderError as error:
+        return page_error(request, page,
+                status  = 500,
+                title   = u"Server Error: {page}".format(page=page.url()),
+                error_exception     = error,
+        )