diff options
author | 2018-05-06 15:28:17 +0100 | |
---|---|---|
committer | 2018-05-06 15:28:17 +0100 | |
commit | ce4da82f9b32524874ca208915f3b35813c2c672 (patch) | |
tree | e180bd1d3e0478452791a26456651d8856c765ae /pysite | |
parent | Merge remote-tracking branch 'origin/master' (diff) |
[Wiki] Move page function
Diffstat (limited to 'pysite')
-rw-r--r-- | pysite/views/wiki/delete.py | 2 | ||||
-rw-r--r-- | pysite/views/wiki/move.py | 86 |
2 files changed, 87 insertions, 1 deletions
diff --git a/pysite/views/wiki/delete.py b/pysite/views/wiki/delete.py index 0e3bcbbf..47759a87 100644 --- a/pysite/views/wiki/delete.py +++ b/pysite/views/wiki/delete.py @@ -10,7 +10,7 @@ from pysite.decorators import csrf, require_roles from pysite.mixins import DBMixin -class EditView(RouteView, DBMixin): +class DeleteView(RouteView, DBMixin): path = "/delete/<path:page>" # "path" means that it accepts slashes name = "delete" table_name = "wiki" diff --git a/pysite/views/wiki/move.py b/pysite/views/wiki/move.py new file mode 100644 index 00000000..081ae56a --- /dev/null +++ b/pysite/views/wiki/move.py @@ -0,0 +1,86 @@ +import datetime + +import requests +from flask import redirect, url_for, request +from werkzeug.exceptions import NotFound, BadRequest + +from pysite.base_route import RouteView +from pysite.constants import EDITOR_ROLES, WIKI_AUDIT_WEBHOOK +from pysite.decorators import csrf, require_roles +from pysite.mixins import DBMixin + + +class MoveView(RouteView, DBMixin): + path = "/move/<path:page>" # "path" means that it accepts slashes + name = "move" + table_name = "wiki" + revision_table_name = "wiki_revisions" + + @require_roles(*EDITOR_ROLES) + def get(self, page): + obj = self.db.get(self.table_name, page) + + if obj: + title = obj.get("title", "") + + if obj.get("lock_expiry") and obj.get("lock_user") != self.user_data.get("user_id"): + lock_time = datetime.datetime.fromtimestamp(obj["lock_expiry"]) + if datetime.datetime.utcnow() < lock_time: + return self.render("wiki/page_in_use.html", page=page) + + return self.render("wiki/page_move.html", page=page, title=title) + else: + raise NotFound() + + @require_roles(*EDITOR_ROLES) + @csrf + def post(self, page): + location = request.form.get("location") + + if not location or not location.strip(): + raise BadRequest() + + obj = self.db.get(self.table_name, page) + + if not obj: + raise NotFound() + + title = obj.get("title", "") + other_obj = self.db.get(self.table_name, location) + + if other_obj: + return self.render( + "wiki/page_move.html", page=page, title=title, + message=f"There's already a page at {location} - please pick a different location" + ) + + self.db.delete(self.table_name, page) + + obj["slug"] = location + + self.db.insert(self.table_name, obj, conflict="update") + + self.audit_log(obj) + + return redirect(url_for("wiki.page", page=location), code=303) # Redirect, ensuring a GET + + def audit_log(self, obj): + if WIKI_AUDIT_WEBHOOK: # If the audit webhook is not configured there is no point processing it + audit_payload = { + "username": "Wiki Updates", + "embeds": [ + { + "title": "Page Move", + "description": f"**{obj['title']}** was moved by " + f"**{self.user_data.get('username')}** to " + f"**{obj['slug']}**", + "color": 4165079, + "timestamp": datetime.datetime.utcnow().isoformat(), + "thumbnail": { + "url": "https://pythondiscord.com/static/logos/logo_discord.png" + } + } + ] + } + + requests.post(WIKI_AUDIT_WEBHOOK, json=audit_payload) |