diff options
author | 2018-04-05 14:14:05 +0100 | |
---|---|---|
committer | 2018-04-05 14:14:05 +0100 | |
commit | 6a5de7cfdf5b419acd8258d5dbbd0b164662c140 (patch) | |
tree | 6a15fb90025330f615c954cb3a3aa7119410061e /pysite | |
parent | That was a little dumb. (diff) |
More work towards the wiki
Diffstat (limited to 'pysite')
-rw-r--r-- | pysite/decorators.py | 2 | ||||
-rw-r--r-- | pysite/views/wiki/edit.py | 14 | ||||
-rw-r--r-- | pysite/views/wiki/page.py | 2 | ||||
-rw-r--r-- | pysite/views/wiki/render.py | 34 |
4 files changed, 48 insertions, 4 deletions
diff --git a/pysite/decorators.py b/pysite/decorators.py index 653489b4..426d4846 100644 --- a/pysite/decorators.py +++ b/pysite/decorators.py @@ -34,7 +34,7 @@ def require_roles(*roles: int): if data: for role in roles: - if role in data["roles"]: + if role in data.get("roles", []): return f(self, *args, **kwargs) if isinstance(self, APIView): diff --git a/pysite/views/wiki/edit.py b/pysite/views/wiki/edit.py index 8f6c22e3..23a281dc 100644 --- a/pysite/views/wiki/edit.py +++ b/pysite/views/wiki/edit.py @@ -1,5 +1,5 @@ # coding=utf-8 -from flask import url_for +from flask import url_for, request from werkzeug.utils import redirect from pysite.base_route import RouteView @@ -17,9 +17,19 @@ class EditView(RouteView, DBMixin): @require_roles(*ALL_STAFF_ROLES) def get(self, page): - return self.render("wiki/page_edit.html", page=page) + rst = "" + title = "" + + obj = self.db.get(self.table_name, page) + + if obj: + rst = obj["rst"] + title = obj["title"] + + return self.render("wiki/page_edit.html", page=page, rst=rst, title=title) @require_roles(*ALL_STAFF_ROLES) @csrf def post(self, page): + rst = request.form["rst"] return redirect(url_for("wiki.page", page=page), code=303) # Redirect, ensuring a GET diff --git a/pysite/views/wiki/page.py b/pysite/views/wiki/page.py index eb4c2429..01c8fa8a 100644 --- a/pysite/views/wiki/page.py +++ b/pysite/views/wiki/page.py @@ -27,7 +27,7 @@ class PageView(RouteView, DBMixin): if not self.logged_in: return False - roles = self.user_data["roles"] + roles = self.user_data.get("roles", []) for role in roles: if role in ALL_STAFF_ROLES: diff --git a/pysite/views/wiki/render.py b/pysite/views/wiki/render.py new file mode 100644 index 00000000..01b5e6fa --- /dev/null +++ b/pysite/views/wiki/render.py @@ -0,0 +1,34 @@ +# coding=utf-8 +from docutils.core import publish_parts +from flask import jsonify +from schema import Schema + +from pysite.base_route import APIView +from pysite.constants import ALL_STAFF_ROLES, ValidationTypes +from pysite.decorators import csrf, require_roles, api_params + +SCHEMA = Schema([{ + "data": str +}]) + + +class RenderView(APIView): + path = "/render" # "path" means that it accepts slashes + name = "render" + + @csrf + @require_roles(*ALL_STAFF_ROLES) + @api_params(schema=SCHEMA, validation_type=ValidationTypes.json) + def post(self, data): + if not len(data): + return jsonify({"error": "No data!"}) + + data = data[0]["data"] + try: + html = publish_parts( + source=data, writer_name="html5", settings_overrides={"traceback": True, "halt_level": 2} + )["html_body"] + + return jsonify({"data": html}) + except Exception as e: + return jsonify({"error": str(e)}) |