aboutsummaryrefslogtreecommitdiffstats
path: root/pysite
diff options
context:
space:
mode:
authorGravatar Gareth Coles <[email protected]>2018-05-02 14:50:09 +0100
committerGravatar Gareth Coles <[email protected]>2018-05-02 14:50:09 +0100
commit9dc05b5324b478ab84276f6f0ac993c56cc13c3a (patch)
tree8fdeb978e5529d4f631e72bf6e752e594762b6bb /pysite
parent[All Pages] Fix links (diff)
[Wiki] Implement page deletions and improve sidebar construction
Diffstat (limited to 'pysite')
-rw-r--r--pysite/views/wiki/delete.py67
1 files changed, 67 insertions, 0 deletions
diff --git a/pysite/views/wiki/delete.py b/pysite/views/wiki/delete.py
new file mode 100644
index 00000000..0e3bcbbf
--- /dev/null
+++ b/pysite/views/wiki/delete.py
@@ -0,0 +1,67 @@
+import datetime
+
+import requests
+from flask import redirect, url_for
+from werkzeug.exceptions import NotFound
+
+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 EditView(RouteView, DBMixin):
+ path = "/delete/<path:page>" # "path" means that it accepts slashes
+ name = "delete"
+ 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_delete.html", page=page, title=title)
+ else:
+ raise NotFound()
+
+ @require_roles(*EDITOR_ROLES)
+ @csrf
+ def post(self, page):
+ obj = self.db.get(self.table_name, page)
+
+ if not obj:
+ raise NotFound()
+
+ self.db.delete(self.table_name, page)
+ self.db.delete(self.revision_table_name, page)
+
+ self.audit_log(obj)
+
+ return redirect(url_for("wiki.page", page="home"), 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 Deletion",
+ "description": f"**{obj['title']}** was deleted by **{self.user_data.get('username')}**",
+ "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)