aboutsummaryrefslogtreecommitdiffstats
path: root/pysite/views/wiki/edit.py
blob: 0d70fed59b306e1f908b7c51e4559ebfdb79df51 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# coding=utf-8
from flask import request, url_for
from werkzeug.exceptions import BadRequest
from werkzeug.utils import redirect

from pysite.base_route import RouteView
from pysite.constants import EDITOR_ROLES
from pysite.decorators import csrf, require_roles
from pysite.mixins import DBMixin
from pysite.rst import render


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(*EDITOR_ROLES)
    def get(self, page):
        rst = ""
        title = ""
        preview = "<p>Preview will appear here.</p>"

        obj = self.db.get(self.table_name, page)

        if obj:
            rst = obj["rst"]
            title = obj["title"]
            preview = obj["html"]

        return self.render("wiki/page_edit.html", page=page, rst=rst, title=title, preview=preview)

    @require_roles(*EDITOR_ROLES)
    @csrf
    def post(self, page):
        rst = request.form["rst"]

        if not rst.strip():
            raise BadRequest()

        rendered = render(rst)

        obj = {
            "slug": page,
            "title": request.form["title"],
            "rst": rst,
            "html": rendered["html"],
            "headers": rendered["headers"]
        }

        self.db.insert(
            self.table_name,
            obj,
            conflict="replace"
        )

        return redirect(url_for("wiki.page", page=page), code=303)  # Redirect, ensuring a GET