From c99f816e71d28dfaf3bd44d27d211f2b44778f48 Mon Sep 17 00:00:00 2001 From: Joseph Date: Tue, 17 Apr 2018 23:12:35 +0100 Subject: Add wiki audit logs (#52) * Add wiki audit logs * Flake8 issues * Forgot to remove debug prints * Removed print but forgot to remove `.text` * Futile attempt to increase coverage * Reading up on API docs asks us to send User-Agent with our info in it * Add tests for wiki * Well played, Travis * Nothing in my local env is working on travis lol * Why does it appear it can't decide between 200 & 302 :thinking: * Flake8 * Post route * Same issue with local env working differently from Travis env * Add page to show page is being edited * Lock page when it is being edited * Add JS to keep refreshing lock on article * Add compare route to render diff * Add revision table to database * Add revision storage * Add revision list route * JS for Revision list radio buttons * Add revision comparison template * Add revision list template * flak8 my ass * [Unit Tests] New unit tests for history routes :sparkles: * Does this fix things? * Address gdude's reviews * Noticed a bug in the diff generation route which meant that empty posts could potentially error * Flake 8 * Audit logs were logging after change, meaning it was comparing after & after, which didn't work * Change table name * Remove whitespace from line to fix flake8 issue * Address reviews * Git hook made me do something wrong, apologies * Switch from werkzeug redirect to flask one * Address Apertures reviews --- pysite/views/wiki/history/compare.py | 51 ++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 pysite/views/wiki/history/compare.py (limited to 'pysite/views/wiki/history/compare.py') diff --git a/pysite/views/wiki/history/compare.py b/pysite/views/wiki/history/compare.py new file mode 100644 index 00000000..46dad8e9 --- /dev/null +++ b/pysite/views/wiki/history/compare.py @@ -0,0 +1,51 @@ +# coding=utf-8 +import difflib + +from pygments import highlight +from pygments.formatters import HtmlFormatter +from pygments.lexers import DiffLexer +from werkzeug.exceptions import BadRequest, NotFound + +from pysite.base_route import RouteView +from pysite.mixins import DBMixin + + +class CompareView(RouteView, DBMixin): + path = "/history/compare//" + name = "history.compare" + + table_name = "wiki_revisions" + table_primary_key = "id" + + def get(self, first_rev, second_rev): + before = self.db.get(self.table_name, first_rev) + after = self.db.get(self.table_name, second_rev) + + if not (before and after): + raise NotFound() + + if before["date"] > after["date"]: # Check whether the before was created after the after + raise BadRequest() + + if before["id"] == after["id"]: # The same revision has been requested + raise BadRequest() + + before_text = before["post"]["rst"] + after_text = after["post"]["rst"] + + if not before_text.endswith("\n"): + before_text += "\n" + + if not after_text.endswith("\n"): + after_text += "\n" + + before_text = before_text.splitlines(keepends=True) + after_text = after_text.splitlines(keepends=True) + + if not before["slug"] == after["slug"]: + raise BadRequest() # The revisions are not from the same post + + diff = difflib.unified_diff(before_text, after_text, fromfile=f"{first_rev}.rst", tofile=f"{second_rev}.rst") + diff = "".join(diff) + diff = highlight(diff, DiffLexer(), HtmlFormatter()) + return self.render("wiki/compare_revision.html", title=after["post"]["title"], diff=diff) -- cgit v1.2.3