aboutsummaryrefslogtreecommitdiffstats
path: root/pysite
diff options
context:
space:
mode:
Diffstat (limited to 'pysite')
-rw-r--r--pysite/views/wiki/source.py45
1 files changed, 45 insertions, 0 deletions
diff --git a/pysite/views/wiki/source.py b/pysite/views/wiki/source.py
new file mode 100644
index 00000000..7038dad9
--- /dev/null
+++ b/pysite/views/wiki/source.py
@@ -0,0 +1,45 @@
+# coding=utf-8
+from flask import redirect, url_for
+from pygments import highlight
+from pygments.formatters.html import HtmlFormatter
+from pygments.lexers import get_lexer_by_name
+from werkzeug.exceptions import NotFound
+
+from pysite.base_route import RouteView
+from pysite.constants import DEBUG_MODE, EDITOR_ROLES
+from pysite.mixins import DBMixin
+
+
+class PageView(RouteView, DBMixin):
+ path = "/source/<path:page>" # "path" means that it accepts slashes
+ name = "source"
+
+ table_name = "wiki"
+ table_primary_key = "slug"
+
+ def get(self, page):
+ obj = self.db.get(self.table_name, page)
+
+ if obj is None:
+ if self.is_staff():
+ return redirect(url_for("wiki.edit", page=page, can_edit=False))
+
+ raise NotFound()
+
+ rst = obj["rst"]
+ rst = highlight(rst, get_lexer_by_name("rst"), HtmlFormatter(preclass="code", linenos="inline"))
+ return self.render("wiki/page_source.html", page=page, data=obj, rst=rst, can_edit=self.is_staff())
+
+ def is_staff(self):
+ if DEBUG_MODE:
+ return True
+ if not self.logged_in:
+ return False
+
+ roles = self.user_data.get("roles", [])
+
+ for role in roles:
+ if role in EDITOR_ROLES:
+ return True
+
+ return False