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
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:
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
def get_latest_revision(self):
return self.backend.wiki.get_page(self.page)
+ @property
+ def changes(self):
+ return self.data.changes
+
# Sidebar
@lazy_property
--- /dev/null
+{% 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 %}
{{ _("by") }}
<a href="/users/{{ page.author.uid }}">{{ page.author }}</a>
{% end %}
+
+ {% if show_changes and page.changes %}
+ • {{ page.changes }}
+ {% end %}
</p>
{% end %}
<div class="card">
<div class="card-body">
- {% module WikiList(recent_changes) %}
+ {% module WikiList(recent_changes, show_changes=True) %}
</div>
</div>
{% end block %}
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:
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)
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)
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):