]> git.ipfire.org Git - ipfire.org.git/commitdiff
wiki: Add ability to edit pages
authorMichael Tremer <michael.tremer@ipfire.org>
Mon, 12 Nov 2018 20:01:29 +0000 (20:01 +0000)
committerMichael Tremer <michael.tremer@ipfire.org>
Mon, 12 Nov 2018 20:01:29 +0000 (20:01 +0000)
Signed-off-by: Michael Tremer <michael.tremer@ipfire.org>
Makefile.am
src/backend/wiki.py
src/templates/wiki/edit.html [new file with mode: 0644]
src/templates/wiki/modules/list.html
src/templates/wiki/recent-changes.html
src/web/wiki.py

index bb8f9f8d1249e8608cf339d6b952a8be68ba438b..244722a938e77aa26e5e59a302ee840987ea2c17 100644 (file)
@@ -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
 
index e6044d532b37ec80e2ff0e8b2c0faa2372740494..00dd64be5fb559dc5de9e3e83e10b800ce58c369 100644 (file)
@@ -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 (file)
index 0000000..34a71e4
--- /dev/null
@@ -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 %}
+       <div class="card">
+               <div class="card-body">
+                       <h4 class="card-title">
+                               {% if page %}{{ _("Edit %s") % page.title }}{% else %}{{ _("Create A New Page") }}{% end %}
+                       </h4>
+
+                       <form action="" method="POST">
+                               {% raw xsrf_form_html() %}
+
+                               <input type="hidden" name="page" value="{{ request.path }}">
+
+                               <div class="form-group">
+                                       <textarea class="form-control" rows="16" name="content" placeholder="{{ _("Text") }}"
+                                               >{% if page and page.markdown %}{{ page.markdown }}{% end %}</textarea>
+                               </div>
+
+                               <div class="form-group row">
+                                       <label class="col-sm-3 col-form-label">{{ _("What has changed?") }}</label>
+                                       <div class="col-sm-9">
+                                               <input type="text" class="form-control" name="changes" required>
+                                       </div>
+                               </div>
+
+                               <button type="submit" class="btn btn-primary btn-block">
+                                       {% if page %}{{ _("Save Page") }}{% else %}{{ _("Create Page") }}{% end %}
+                               </button>
+                       </form>
+               </div>
+       </div>
+{% end block %}
index 7e0a3a348f3a765985388a4d9495c131888582f6..1c8f095663c7ce8a0bd894b2d76c6fe1d2ab723d 100644 (file)
@@ -10,5 +10,9 @@
                        {{ _("by") }}
                        <a href="/users/{{ page.author.uid }}">{{ page.author }}</a>
                {% end %}
+
+               {% if show_changes and page.changes %}
+                       &bull; {{ page.changes }}
+               {% end %}
        </p>
 {% end %}
index b333f4a694b884f20764d9adcaa3648422a97f06..9cb939b112e4d116ca889199ef4292d400a9b18e 100644 (file)
@@ -15,7 +15,7 @@
 
        <div class="card">
                <div class="card-body">
-                       {% module WikiList(recent_changes) %}
+                       {% module WikiList(recent_changes, show_changes=True) %}
                </div>
        </div>
 {% end block %}
index de81880dad76885074db5913d8a0e6e987ab06aa..c6244b55b19e19c5fcd0b7fde746ab0d5a6d9f87 100644 (file)
@@ -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):