diff options
Diffstat (limited to 'pysite/views/wiki/source.py')
-rw-r--r-- | pysite/views/wiki/source.py | 45 |
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 |