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 %} +

+ +
+ {% raw xsrf_form_html() %} + + + +
+ +
+ +
+ +
+ +
+
+ + +
+
+
+{% 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