From d398ca084336b143e0a0a4f8d0dbb512050c74d0 Mon Sep 17 00:00:00 2001
From: Michael Tremer
Date: Mon, 12 Nov 2018 20:01:29 +0000
Subject: [PATCH] wiki: Add ability to edit pages
Signed-off-by: Michael Tremer
---
Makefile.am | 1 +
src/backend/wiki.py | 26 +++++++++++--------
src/templates/wiki/edit.html | 35 ++++++++++++++++++++++++++
src/templates/wiki/modules/list.html | 4 +++
src/templates/wiki/recent-changes.html | 2 +-
src/web/wiki.py | 33 ++++++++++++++++++++----
6 files changed, 84 insertions(+), 17 deletions(-)
create mode 100644 src/templates/wiki/edit.html
diff --git a/Makefile.am b/Makefile.am
index bb8f9f8d..244722a9 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -256,6 +256,7 @@ templates_staticdir = $(templatesdir)/static
templates_wiki_DATA = \
src/templates/wiki/404.html \
src/templates/wiki/base.html \
+ src/templates/wiki/edit.html \
src/templates/wiki/page.html \
src/templates/wiki/recent-changes.html
diff --git a/src/backend/wiki.py b/src/backend/wiki.py
index e6044d53..00dd64be 100644
--- a/src/backend/wiki.py
+++ b/src/backend/wiki.py
@@ -27,6 +27,12 @@ class Wiki(misc.Object):
for row in res:
yield Page(self.backend, row.id, data=row)
+ def _get_page(self, query, *args):
+ res = self.db.get(query, *args)
+
+ if res:
+ return Page(self.backend, res.id, data=res)
+
def get_page_title(self, page, default=None):
doc = self.get_page(page)
if doc:
@@ -39,28 +45,22 @@ class Wiki(misc.Object):
assert page
if revision:
- res = self.db.get("SELECT * FROM wiki WHERE page = %s \
+ return self._get_page("SELECT * FROM wiki WHERE page = %s \
AND timestamp = %s", page, revision)
else:
- res = self.db.get("SELECT * FROM wiki WHERE page = %s \
+ return self._get_page("SELECT * FROM wiki WHERE page = %s \
ORDER BY timestamp DESC LIMIT 1", page)
- if res:
- return Page(self.backend, res.id, data=res)
-
def get_recent_changes(self, limit=None):
return self._get_pages("SELECT * FROM wiki \
WHERE timestamp >= NOW() - INTERVAL '4 weeks' \
ORDER BY timestamp DESC LIMIT %s", limit)
- def create_page(self, page, author, markdown):
+ def create_page(self, page, author, content, changes=None):
page = Page.sanitise_page_name(page)
- res = self.db.get("INSERT INTO wiki(page, author_id, markdown) \
- VALUES(%s, %s, %s) RETURNING id", page, author.id, markdown)
-
- if res:
- return self.get_page_by_id(res.id)
+ return self._get_page("INSERT INTO wiki(page, author_uid, markdown, changes) \
+ VALUES(%s, %s, %s, %s) RETURNING *", page, author.uid, content, changes)
def delete_page(self, page, author):
# Do nothing if the page does not exist
@@ -172,6 +172,10 @@ class Page(misc.Object):
def get_latest_revision(self):
return self.backend.wiki.get_page(self.page)
+ @property
+ def changes(self):
+ return self.data.changes
+
# Sidebar
@lazy_property
diff --git a/src/templates/wiki/edit.html b/src/templates/wiki/edit.html
new file mode 100644
index 00000000..34a71e4f
--- /dev/null
+++ b/src/templates/wiki/edit.html
@@ -0,0 +1,35 @@
+{% extends "base.html" %}
+
+{% block title %}{% if page %}{{ _("Edit %s") % page.title }}{% else %}{{ _("Create A New Page") }}{% end %}{% end block %}
+
+{% block main %}
+
+
+
+ {% if page %}{{ _("Edit %s") % page.title }}{% else %}{{ _("Create A New Page") }}{% end %}
+
+
+
+
+
+{% end block %}
diff --git a/src/templates/wiki/modules/list.html b/src/templates/wiki/modules/list.html
index 7e0a3a34..1c8f0956 100644
--- a/src/templates/wiki/modules/list.html
+++ b/src/templates/wiki/modules/list.html
@@ -10,5 +10,9 @@
{{ _("by") }}
{{ page.author }}
{% end %}
+
+ {% if show_changes and page.changes %}
+ • {{ page.changes }}
+ {% end %}
{% end %}
diff --git a/src/templates/wiki/recent-changes.html b/src/templates/wiki/recent-changes.html
index b333f4a6..9cb939b1 100644
--- a/src/templates/wiki/recent-changes.html
+++ b/src/templates/wiki/recent-changes.html
@@ -15,7 +15,7 @@
- {% module WikiList(recent_changes) %}
+ {% module WikiList(recent_changes, show_changes=True) %}
{% end block %}
diff --git a/src/web/wiki.py b/src/web/wiki.py
index de81880d..c6244b55 100644
--- a/src/web/wiki.py
+++ b/src/web/wiki.py
@@ -7,6 +7,10 @@ from . import base
from . import ui_modules
class PageHandler(auth.CacheMixin, base.BaseHandler):
+ @property
+ def action(self):
+ return self.get_argument("action", None)
+
def write_error(self, status_code, **kwargs):
# Render a custom page for 404
if status_code == 404:
@@ -20,6 +24,18 @@ class PageHandler(auth.CacheMixin, base.BaseHandler):
def get(self, page):
page = self.backend.wiki.get_page(page)
+ # Edit
+ if self.action == "edit":
+ if not self.current_user:
+ raise tornado.web.HTTPError(401)
+
+ # Empty page if it was deleted
+ if page.was_deleted():
+ page = None
+
+ # Render login
+ return self.render("wiki/edit.html", page=page)
+
# If the page does not exist, we send 404
if not page or page.was_deleted():
raise tornado.web.HTTPError(404)
@@ -31,18 +47,24 @@ class PageHandler(auth.CacheMixin, base.BaseHandler):
self.render("wiki/page.html", page=page, latest_revision=latest_revision)
@tornado.web.authenticated
- def post(self, page):
+ def post(self):
+ page = self.get_argument("page")
+
content = self.get_argument("content", None)
+ changes = self.get_argument("changes")
# Delete the page if content is empty
if not content:
with self.db.transaction():
self.backend.wiki.delete_page(page, self.current_user)
- return self.redirect("/")
+ self.redirect("/")
+ return
# Create a new page in the database
- page = self.backend.wiki.create_page(page, self.current_user, content)
+ with self.db.transaction():
+ page = self.backend.wiki.create_page(page,
+ self.current_user, content, changes=changes)
# Redirect
self.redirect(page.url)
@@ -68,8 +90,9 @@ class RecentChangesHandler(auth.CacheMixin, base.BaseHandler):
class WikiListModule(ui_modules.UIModule):
- def render(self, pages):
- return self.render_string("wiki/modules/list.html", pages=pages)
+ def render(self, pages, show_changes=False):
+ return self.render_string("wiki/modules/list.html",
+ pages=pages, show_changes=show_changes)
class WikiNavbarModule(ui_modules.UIModule):
--
2.39.2