aboutsummaryrefslogtreecommitdiffstats
path: root/pysite/views/wiki/history/compare.py
diff options
context:
space:
mode:
authorGravatar Joseph <[email protected]>2018-04-17 23:12:35 +0100
committerGravatar GitHub <[email protected]>2018-04-17 23:12:35 +0100
commitc99f816e71d28dfaf3bd44d27d211f2b44778f48 (patch)
tree297747765dfcd5163839333c0879e04e2e4b565b /pysite/views/wiki/history/compare.py
parentJSON file had the wrong name. I should be incarcerated. (diff)
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
Diffstat (limited to 'pysite/views/wiki/history/compare.py')
-rw-r--r--pysite/views/wiki/history/compare.py51
1 files changed, 51 insertions, 0 deletions
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/<string:first_rev>/<string:second_rev>"
+ 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)