diff options
author | 2018-04-04 16:09:05 +0100 | |
---|---|---|
committer | 2018-04-04 16:09:05 +0100 | |
commit | 1d1e17f7f19203d449c8641794cd2c61705fdcd2 (patch) | |
tree | 63640306e93059a181b2af04952b0403c38ef8ee /pysite | |
parent | CSRF error route doesn't do shit, sadly (diff) |
Early wiki work including a WS test route for RST parsing
Diffstat (limited to 'pysite')
-rw-r--r-- | pysite/views/main/ws_test_rst.py | 15 | ||||
-rw-r--r-- | pysite/views/wiki/edit.py | 18 | ||||
-rw-r--r-- | pysite/views/wiki/page.py | 30 | ||||
-rw-r--r-- | pysite/views/ws/rst.py | 27 |
4 files changed, 85 insertions, 5 deletions
diff --git a/pysite/views/main/ws_test_rst.py b/pysite/views/main/ws_test_rst.py new file mode 100644 index 00000000..9c2ee805 --- /dev/null +++ b/pysite/views/main/ws_test_rst.py @@ -0,0 +1,15 @@ +# coding=utf-8 +import os + +from pysite.base_route import RouteView + + +class WSTest(RouteView): + path = "/ws_test_rst" + name = "ws_test_rst" + + def get(self): + return self.render( + "main/ws_test_rst.html", + server_name=os.environ.get("SERVER_NAME", "localhost") + ) diff --git a/pysite/views/wiki/edit.py b/pysite/views/wiki/edit.py index 5c914c16..fac5532e 100644 --- a/pysite/views/wiki/edit.py +++ b/pysite/views/wiki/edit.py @@ -1,13 +1,25 @@ # coding=utf-8 +from flask import url_for +from werkzeug.utils import redirect + from pysite.base_route import RouteView from pysite.constants import ALL_STAFF_ROLES -from pysite.decorators import require_roles +from pysite.decorators import require_roles, csrf +from pysite.mixins import DBMixin -class EditView(RouteView): +class EditView(RouteView, DBMixin): path = "/edit/<path:page>" # "path" means that it accepts slashes name = "edit" + table_name = "wiki" + table_primary_key = "slug" + @require_roles(*ALL_STAFF_ROLES) def get(self, page): - return self.render("staff/staff.html") + return self.render("wiki/page_edit.html", page=page) + + @require_roles(*ALL_STAFF_ROLES) + @csrf + def post(self, page): + 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 6f9f15c1..70cec002 100644 --- a/pysite/views/wiki/page.py +++ b/pysite/views/wiki/page.py @@ -1,10 +1,36 @@ # coding=utf-8 +from flask import url_for, redirect + from pysite.base_route import RouteView +from pysite.constants import ALL_STAFF_ROLES +from pysite.mixins import DBMixin -class PageView(RouteView): +class PageView(RouteView, DBMixin): path = "/wiki/<path:page>" # "path" means that it accepts slashes name = "page" + table_name = "wiki" + table_primary_key = "slug" + def get(self, page): - return self.render("wiki/index.html") + obj = self.db.get(self.table_name, page) + + if obj is None: + if self.is_staff(): + return redirect(url_for("wiki.edit", page=page)) + + return self.render("wiki/page_missing.html", page=page) + return self.render("wiki/page_view.html", page=page, data=obj) + + def is_staff(self): + if not self.logged_in: + return False + + roles = self.user_data["roles"] + + for role in roles: + if role in ALL_STAFF_ROLES: + return True + + return False diff --git a/pysite/views/ws/rst.py b/pysite/views/ws/rst.py new file mode 100644 index 00000000..c85c10a0 --- /dev/null +++ b/pysite/views/ws/rst.py @@ -0,0 +1,27 @@ +# coding=utf-8 +import logging + +from docutils.core import publish_parts +from geventwebsocket.websocket import WebSocket + +from pysite.websockets import WS + + +class RSTWebsocket(WS): + path = "/rst" + name = "ws.rst" + + def __init__(self, socket: WebSocket): + super().__init__(socket) + self.log = logging.getLogger() + + def on_open(self): + self.log.debug("RST | WS opened.") + self.send("Hey, welcome!") + + def on_message(self, message): + self.log.debug(f"RST | Message: {message}") + self.send(publish_parts(source=message, writer_name="html5")["html_body"]) + + def on_close(self): + self.log.debug("RST | WS closed.") |