Sitic has uploaded a new change for review.
https://gerrit.wikimedia.org/r/223798
Change subject: Show a edit diff when the user requests it
......................................................................
Show a edit diff when the user requests it
Show a diff for a watchlist edit event when clicking on it.
Bug: T103679
Change-Id: I8a25627b68813b3f0d3e77c53f066dc21ce2b9f6
---
M backend/celery/tasks.py
M backend/server/__init__.py
M frontend/src/app/index.css
M frontend/src/app/runBlock.js
M frontend/src/app/services.js
M frontend/src/components/watchlist/entry.directive.html
M frontend/src/components/watchlist/watchlist.controller.js
M frontend/src/components/watchlist/watchlist.html
8 files changed, 199 insertions(+), 3 deletions(-)
git pull ssh://gerrit.wikimedia.org:29418/labs/tools/crosswatch
refs/changes/98/223798/1
diff --git a/backend/celery/tasks.py b/backend/celery/tasks.py
index c49e1d2..c9e91c2 100644
--- a/backend/celery/tasks.py
+++ b/backend/celery/tasks.py
@@ -219,5 +219,32 @@
mw.post(params, payload)
[email protected]
+def get_diff(obj):
+ """
+ Get a diff for a wiki page
+ """
+ mw = MediaWiki(host=obj['projecturl'],
+ access_token=obj['access_token'],
+ redis_channel=obj['redis_channel'])
+ params = {
+ 'action': "query",
+ 'prop': "revisions",
+ 'rvstartid': obj['old_revid'],
+ 'rvendid': obj['old_revid'],
+ 'rvdiffto': obj['revid'],
+ 'pageids': obj['pageid'],
+ 'formatversion': 2
+ }
+ response = mw.query(params)
+ diff = response['query']['pages'][0]['revisions'][0]['diff']['body']
+
+ mw.publish({
+ 'msgtype': 'diff_response',
+ 'request_id': obj['request_id'],
+ 'diff': diff
+ })
+
+
if __name__ == '__main__':
app.start()
diff --git a/backend/server/__init__.py b/backend/server/__init__.py
index 29979d9..f4c1f0d 100644
--- a/backend/server/__init__.py
+++ b/backend/server/__init__.py
@@ -59,6 +59,13 @@
elif data[u'action'] == u'notifications_mark_read':
celery_app.send_task('backend.celery.tasks.notifications_mark_read',
(data, ), expires=60)
+ elif data[u'action'] == u'diff':
+ redis_channel = str(uuid4())
+ self.channels.append(redis_channel)
+ subscriber.subscribe(redis_channel, self)
+
+ data['redis_channel'] = redis_channel
+ celery_app.send_task('backend.celery.tasks.get_diff', (data, ))
class NoChacheStaticFileHandler(StaticFileHandler):
diff --git a/frontend/src/app/index.css b/frontend/src/app/index.css
index 3ec86fa..7d7131a 100644
--- a/frontend/src/app/index.css
+++ b/frontend/src/app/index.css
@@ -207,6 +207,101 @@
overflow: hidden;
}
+/*!
+ * Diff rendering
+ */
+table.diff {
+ border: none;
+ border-spacing: 4px;
+ margin: 0;
+ width: 100%;
+ /* Ensure that colums are of equal width */
+ table-layout: fixed;
+}
+
+table.diff td {
+ padding: 0.33em 0.5em;
+}
+
+table.diff td.diff-marker {
+ /* Compensate padding for increased font-size */
+ padding: 0.25em;
+}
+
+table.diff col.diff-marker {
+ width: 2%;
+}
+
+table.diff col.diff-content {
+ width: 48%;
+}
+
+table.diff td div {
+ /* Force-wrap very long lines such as URLs or page-widening char strings */
+ word-wrap: break-word;
+}
+
+td.diff-otitle,
+td.diff-ntitle {
+ text-align: center;
+}
+
+td.diff-lineno {
+ font-weight: bold;
+}
+
+td.diff-marker {
+ text-align: right;
+ font-weight: bold;
+ font-size: 1.25em;
+ line-height: 1.2;
+}
+
+td.diff-addedline,
+td.diff-deletedline,
+td.diff-context {
+ font-size: 88%;
+ line-height: 1.6;
+ vertical-align: top;
+ white-space: -moz-pre-wrap;
+ white-space: pre-wrap;
+ border-style: solid;
+ border-width: 1px 1px 1px 4px;
+ border-radius: 0.33em;
+}
+
+td.diff-addedline {
+ border-color: #a3d3ff;
+}
+
+td.diff-deletedline {
+ border-color: #ffe49c;
+}
+
+td.diff-context {
+ background: #f9f9f9;
+ border-color: #e6e6e6;
+ color: #333333;
+}
+
+.diffchange {
+ font-weight: bold;
+ text-decoration: none;
+}
+
+td.diff-addedline .diffchange,
+td.diff-deletedline .diffchange {
+ border-radius: 0.33em;
+ padding: 0.25em 0;
+}
+
+td.diff-addedline .diffchange {
+ background: #d8ecff;
+}
+
+td.diff-deletedline .diffchange {
+ background: #feeec8;
+}
/** material design icons **/
@font-face {
diff --git a/frontend/src/app/runBlock.js b/frontend/src/app/runBlock.js
index f52f1de..835a949 100644
--- a/frontend/src/app/runBlock.js
+++ b/frontend/src/app/runBlock.js
@@ -58,6 +58,8 @@
dataService.addWatchlistEntries(data.entires);
} else if (data.msgtype === 'notification') {
dataService.addNotificationEntries(data)
+ } else if (data.msgtype === 'diff_response') {
+ dataService.diffResponseHandler(data)
} else if (data.msgtype === 'loginerror') {
$log.error('login failed!');
@@ -75,7 +77,7 @@
});
});
} else {
- $log.error(data);
+ $log.error("Unhandled message: %o", data);
}
if (connectionError) {
diff --git a/frontend/src/app/services.js b/frontend/src/app/services.js
index 8fcd7eb..f08e222 100644
--- a/frontend/src/app/services.js
+++ b/frontend/src/app/services.js
@@ -28,7 +28,7 @@
}
-function dataService (socket, authService, localStorageService, $log, $filter,
debounce) {
+function dataService (socket, authService, localStorageService, $log, $filter,
debounce, $q) {
var vm = this;
vm.watchlist = {};
@@ -229,6 +229,53 @@
}
};
+ /**
+ * callbacks with associated request ids
+ */
+ var callbacks = {};
+ var requestId = 0;
+ vm.getRequestId = function() {
+ return requestId++;
+ };
+
+ /**
+ * Get diff for a watchlist edit event
+ */
+ vm.getDiff = function (event) {
+ var request = {
+ action: 'diff',
+ access_token: authService.tokens(),
+ request_id: vm.getRequestId(),
+ projecturl: event.projecturl,
+ old_revid: event.old_revid,
+ revid: event.revid,
+ pageid: event.pageid
+ };
+ var deferred = $q.defer();
+ callbacks[request.request_id] = deferred;
+ socket.send(angular.toJson(request));
+ return deferred.promise.then(function(response) {
+ request.response = response;
+ return response;
+ });
+ };
+
+ /**
+ * Handle diff response from sockjs
+ */
+ vm.diffResponseHandler = function (data) {
+ if (angular.isDefined(callbacks[data.request_id])) {
+ var callback = callbacks[data.request_id];
+ delete callbacks[data.request_id];
+ callback.resolve(data.diff);
+ } else {
+ $log.error("No callback for diff: %o", data);
+ }
+ };
+
+ /**
+ * General data storage
+ */
vm.icons = {};
vm.icons['wikibooks'] =
"//upload.wikimedia.org/wikipedia/commons/f/fa/Wikibooks-logo.svg";
vm.icons['wiktionary'] =
"//upload.wikimedia.org/wikipedia/commons/e/ef/Wikitionary.svg";
diff --git a/frontend/src/components/watchlist/entry.directive.html
b/frontend/src/components/watchlist/entry.directive.html
index abd5d41..c31c419 100644
--- a/frontend/src/components/watchlist/entry.directive.html
+++ b/frontend/src/components/watchlist/entry.directive.html
@@ -38,3 +38,13 @@
</div>
</div>
+<table ng-if="event.clicked && event.diff" class="diff diff-contentalign-left">
+ <colgroup><col class="diff-marker">
+ <col class="diff-content">
+ <col class="diff-marker">
+ <col class="diff-content">
+ </colgroup>
+ <tbody ng-bind-html="::event.diff">
+ </tbody>
+</table>
+
diff --git a/frontend/src/components/watchlist/watchlist.controller.js
b/frontend/src/components/watchlist/watchlist.controller.js
index 0e967de..990d430 100644
--- a/frontend/src/components/watchlist/watchlist.controller.js
+++ b/frontend/src/components/watchlist/watchlist.controller.js
@@ -12,4 +12,12 @@
vm.search = function (text) {
dataService.filterWatchlist(text);
};
+
+ vm.clicked = function (event) {
+ if ((event.type === 'edit') && !event.diff) {
+ dataService.getDiff(event).then(function (diff) {
+ event.diff = diff;
+ })
+ }
+ }
});
diff --git a/frontend/src/components/watchlist/watchlist.html
b/frontend/src/components/watchlist/watchlist.html
index 0380ad8..3b683a0 100644
--- a/frontend/src/components/watchlist/watchlist.html
+++ b/frontend/src/components/watchlist/watchlist.html
@@ -27,7 +27,7 @@
<md-list-item layout="row" id="watchlist" class="watchlist"
ng-class="(ctrl.config.oneline) ?
'watchlist-list-item-oneline' : ''"
ng-repeat="event in ctrl.watchlist.active track by
event.id">
- <watchlist-entry ng-click="event.clicked = !event.clicked"
md-ink-ripple></watchlist-entry>
+ <watchlist-entry ng-click="event.clicked = !event.clicked;
ctrl.clicked(event)" md-ink-ripple></watchlist-entry>
<md-divider></md-divider>
</md-list-item>
</md-list>
--
To view, visit https://gerrit.wikimedia.org/r/223798
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings
Gerrit-MessageType: newchange
Gerrit-Change-Id: I8a25627b68813b3f0d3e77c53f066dc21ce2b9f6
Gerrit-PatchSet: 1
Gerrit-Project: labs/tools/crosswatch
Gerrit-Branch: master
Gerrit-Owner: Sitic <[email protected]>
_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits