# HG changeset patch # User ymh # Date 1469625983 -7200 # Node ID 2ec47574a371e46856090e97ade593d6125a861a # Parent 7e5704d95f41fcef36024b08ee57c5b80879e749 improve tracking informations on id and add tracking for search diff -r 7e5704d95f41 -r 2ec47574a371 server/src/assets/js/mtdc-tracking-worker.js --- a/server/src/assets/js/mtdc-tracking-worker.js Mon Jul 25 18:24:58 2016 +0200 +++ b/server/src/assets/js/mtdc-tracking-worker.js Wed Jul 27 15:26:23 2016 +0200 @@ -12,7 +12,17 @@ var Mtdc = root.Mtdc; - Mtdc.TrackingWorker = function(renkan, trackingUrl, trackingCloseUrl, registration, debounceDelay = 1000) { + Mtdc.TrackingWorker = function(renkan, opts){ + + var options = _.defaults(opts, { + debounceDelay: 1000, + trackingUriTemplates: { + 'renkan': 'urn:mtdc:renkan:renkan:${renkan_id}', + 'node': 'urn:mtdc:renkan:node:${renkan_id}:${node_id}', + 'edge': 'urn:mtdc:renkan:edge:${renkan_id}:${edge_id}', + 'view': 'urn:mtdc:renkan:view:${renkan_id}:${view_id}' + } + }); function _sendTrackingInfo() { var trackingMessages = this.trackingMessages; @@ -37,8 +47,8 @@ trackingMessages: [], currentUser: renkan.current_user, renkan: renkan, - trackingUrl: trackingUrl, - trackingCloseUrl: trackingCloseUrl, + trackingUrl: options.trackingUrl, + trackingCloseUrl: options.trackingCloseUrl, getUUID4 : function() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random() * 16 | 0, @@ -47,9 +57,10 @@ }); }, _init: function() { - this.sendTrackingInfo = _.debounce(_.bind(_sendTrackingInfo, this), debounceDelay); + this.sendTrackingInfo = _.debounce(_.bind(_sendTrackingInfo, this), options.debounceDelay); this.csrftoken = Cookies.get('csrftoken'); - this.registration = registration ? registration : this.getUUID4(); + this.registration = options.registration ? options.registration : this.getUUID4(); + this.trackingUriTemplates = _.mapValues(options.trackingUriTemplates, _.template); return this; }, _pushTrackingMessage: function(msg) { @@ -81,7 +92,12 @@ close: { id: 'http://activitystrea.ms/schema/1.0/close', display: { 'fr-FR': 'a fermé'} + }, + search: { + id: 'http://activitystrea.ms/schema/1.0/search', + display: { 'fr-FR': 'a cherché'} } + }[verb]; return { actor: { @@ -105,8 +121,11 @@ timestamp: timestamp.toISOString() }; }, - _getObjectUrn: function(objectType, objectId) { - return 'urn:mtdc:renkan:'+ objectType + ':' + objectId; + _getObjectUri: function(objectType, objectId) { + var template = this.trackingUriTemplates[objectType]; + var templateParams = {'renkan_id': this.renkan.project.get('id')}; + templateParams[objectType+'_id'] = objectId; + return template(templateParams); }, _sendNodeMsg: function(verb, nodeData, changedData, previousData) { this._sendObjectMsg('node', 'http://www.w3.org/ns/activitystreams#Node', verb, nodeData, changedData, previousData); @@ -122,7 +141,7 @@ var msg = this._getBaseMsg(verb); msg.object = _.merge(msg.object, { - id: this._getObjectUrn(objectType, objData._id), //TODO full url ??? + id: this._getObjectUri(objectType, objData._id), //TODO full url ??? definition: { name: { 'fr-FR': objData.title @@ -182,6 +201,23 @@ updateView: function(viewData, changedData, previousData) { this._sendViewMsg('update', viewData, changedData, previousData); }, + searchProject: function(searchData) { + var msg = this._getBaseMsg('search'); + + msg.object = _.merge(msg.object, { + id: this._getObjectUri('renkan', this.renkan.project.get('id')), + definition: { + name: { + 'fr-FR': this.renkan.project.get('title') + }, + type: 'http://www.w3.org/ns/activitystreams#Renkan', + extensions: { + 'http://www.w3.org/ns/activitystreams#Data': searchData + } + } + }); + this._pushTrackingMessage(msg); + }, closeProject: function() { this.flushTrackingInfo(); $.ajax({ diff -r 7e5704d95f41 -r 2ec47574a371 server/src/assets/js/mtdc-tracking.js --- a/server/src/assets/js/mtdc-tracking.js Mon Jul 25 18:24:58 2016 +0200 +++ b/server/src/assets/js/mtdc-tracking.js Wed Jul 27 15:26:23 2016 +0200 @@ -92,4 +92,15 @@ }); + Rkns.$('.Rk-GraphSearch-Field').on('input', Rkns._.debounce(function() { + var val = Rkns.$('.Rk-GraphSearch-Field').val(); + if(val && val.length >= 2) { + _trackingWorker.searchProject(); + } + }, 1000)); + + Rkns.$(window).on('beforeunload', function() { + _trackingWorker.closeProject(); + }); + }; diff -r 7e5704d95f41 -r 2ec47574a371 server/src/metaeducation/__init__.py --- a/server/src/metaeducation/__init__.py Mon Jul 25 18:24:58 2016 +0200 +++ b/server/src/metaeducation/__init__.py Wed Jul 27 15:26:23 2016 +0200 @@ -1,4 +1,4 @@ -VERSION = (0, 0, 17, "final", 0) +VERSION = (0, 0, 18, "final", 0) VERSION_STR = ".".join(map(lambda i:"%02d" % (i,), VERSION[:2])) diff -r 7e5704d95f41 -r 2ec47574a371 server/src/metaeducation/settings/__init__.py --- a/server/src/metaeducation/settings/__init__.py Mon Jul 25 18:24:58 2016 +0200 +++ b/server/src/metaeducation/settings/__init__.py Wed Jul 27 15:26:23 2016 +0200 @@ -168,3 +168,10 @@ LRS_TRACKING_SERVICE_URL = "" # URL of the LRS to which we send tracking data LRS_MTDC_RENKAN_USERNAME = "" # Username of Renkan app for LRS auth LRS_MTDC_RENKAN_PASSWORD = "" # Password of Renkan app for LRS auth + +TRACKING_URI_TEMPLATES = { + 'renkan': 'urn:mtdc:renkan:renkan:${renkan_id}', + 'node': 'urn:mtdc:renkan:node:${renkan_id}:${node_id}', + 'edge': 'urn:mtdc:renkan:edge:${renkan_id}:${edge_id}', + 'view': 'urn:mtdc:renkan:view:${renkan_id}:${view_id}' +} diff -r 7e5704d95f41 -r 2ec47574a371 server/src/metaeducation/static/metaeducation/js/mtdc-tracking-worker.js --- a/server/src/metaeducation/static/metaeducation/js/mtdc-tracking-worker.js Mon Jul 25 18:24:58 2016 +0200 +++ b/server/src/metaeducation/static/metaeducation/js/mtdc-tracking-worker.js Wed Jul 27 15:26:23 2016 +0200 @@ -10,8 +10,17 @@ var Mtdc = root.Mtdc; - Mtdc.TrackingWorker = function (renkan, trackingUrl, trackingCloseUrl, registration) { - var debounceDelay = arguments.length <= 4 || arguments[4] === undefined ? 1000 : arguments[4]; + Mtdc.TrackingWorker = function (renkan, opts) { + + var options = _.defaults(opts, { + debounceDelay: 1000, + trackingUriTemplates: { + 'renkan': 'urn:mtdc:renkan:renkan:${renkan_id}', + 'node': 'urn:mtdc:renkan:node:${renkan_id}:${node_id}', + 'edge': 'urn:mtdc:renkan:edge:${renkan_id}:${edge_id}', + 'view': 'urn:mtdc:renkan:view:${renkan_id}:${view_id}' + } + }); function _sendTrackingInfo() { var trackingMessages = this.trackingMessages; @@ -36,8 +45,8 @@ trackingMessages: [], currentUser: renkan.current_user, renkan: renkan, - trackingUrl: trackingUrl, - trackingCloseUrl: trackingCloseUrl, + trackingUrl: options.trackingUrl, + trackingCloseUrl: options.trackingCloseUrl, getUUID4: function getUUID4() { return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) { var r = Math.random() * 16 | 0, @@ -46,9 +55,10 @@ }); }, _init: function _init() { - this.sendTrackingInfo = _.debounce(_.bind(_sendTrackingInfo, this), debounceDelay); + this.sendTrackingInfo = _.debounce(_.bind(_sendTrackingInfo, this), options.debounceDelay); this.csrftoken = Cookies.get('csrftoken'); - this.registration = registration ? registration : this.getUUID4(); + this.registration = options.registration ? options.registration : this.getUUID4(); + this.trackingUriTemplates = _.mapValues(options.trackingUriTemplates, _.template); return this; }, _pushTrackingMessage: function _pushTrackingMessage(msg) { @@ -80,7 +90,12 @@ close: { id: 'http://activitystrea.ms/schema/1.0/close', display: { 'fr-FR': 'a fermé' } + }, + search: { + id: 'http://activitystrea.ms/schema/1.0/search', + display: { 'fr-FR': 'a cherché' } } + })[verb]; return { actor: { @@ -104,8 +119,11 @@ timestamp: timestamp.toISOString() }; }, - _getObjectUrn: function _getObjectUrn(objectType, objectId) { - return 'urn:mtdc:renkan:' + objectType + ':' + objectId; + _getObjectUri: function _getObjectUri(objectType, objectId) { + var template = this.trackingUriTemplates[objectType]; + var templateParams = { 'renkan_id': this.renkan.project.get('id') }; + templateParams[objectType + '_id'] = objectId; + return template(templateParams); }, _sendNodeMsg: function _sendNodeMsg(verb, nodeData, changedData, previousData) { this._sendObjectMsg('node', 'http://www.w3.org/ns/activitystreams#Node', verb, nodeData, changedData, previousData); @@ -121,7 +139,7 @@ var msg = this._getBaseMsg(verb); msg.object = _.merge(msg.object, { - id: this._getObjectUrn(objectType, objData._id), //TODO full url ??? + id: this._getObjectUri(objectType, objData._id), //TODO full url ??? definition: { name: { 'fr-FR': objData.title @@ -180,6 +198,23 @@ updateView: function updateView(viewData, changedData, previousData) { this._sendViewMsg('update', viewData, changedData, previousData); }, + searchProject: function searchProject(searchData) { + var msg = this._getBaseMsg('search'); + + msg.object = _.merge(msg.object, { + id: this._getObjectUri('renkan', this.renkan.project.get('id')), + definition: { + name: { + 'fr-FR': this.renkan.project.get('title') + }, + type: 'http://www.w3.org/ns/activitystreams#Renkan', + extensions: { + 'http://www.w3.org/ns/activitystreams#Data': searchData + } + } + }); + this._pushTrackingMessage(msg); + }, closeProject: function closeProject() { this.flushTrackingInfo(); $.ajax({ diff -r 7e5704d95f41 -r 2ec47574a371 server/src/metaeducation/static/metaeducation/js/mtdc-tracking.js --- a/server/src/metaeducation/static/metaeducation/js/mtdc-tracking.js Mon Jul 25 18:24:58 2016 +0200 +++ b/server/src/metaeducation/static/metaeducation/js/mtdc-tracking.js Wed Jul 27 15:26:23 2016 +0200 @@ -97,4 +97,15 @@ registerView(_view); }); }); + + Rkns.$('.Rk-GraphSearch-Field').on('input', Rkns._.debounce(function () { + var val = Rkns.$('.Rk-GraphSearch-Field').val(); + if (val && val.length >= 2) { + _trackingWorker.searchProject(); + } + }, 1000)); + + Rkns.$(window).on('beforeunload', function () { + _trackingWorker.closeProject(); + }); }; \ No newline at end of file diff -r 7e5704d95f41 -r 2ec47574a371 server/src/metaeducation/templates/renkan_edit.html --- a/server/src/metaeducation/templates/renkan_edit.html Mon Jul 25 18:24:58 2016 +0200 +++ b/server/src/metaeducation/templates/renkan_edit.html Wed Jul 27 15:26:23 2016 +0200 @@ -50,7 +50,7 @@ }); _renkan.setCurrentUser('{{ user.external_id }}', '{{ user.username }}'); - var trackingWorker = Mtdc.TrackingWorker(_renkan, "{% url 'tracking_view' %}", "{% url 'tracking_view_close' %}", "{{ registration }}"); + var trackingWorker = Mtdc.TrackingWorker(_renkan, {trackingUrl: "{% url 'tracking_view' %}", trackingCloseUrl: "{% url 'tracking_view_close' %}", registration: "{{ registration }}", trackingUriTemplates: {{ tracking_uri_templates|safe }}}); Rkns.mtdcTracking(_renkan, trackingWorker); Rkns.mtdcJsonIO(_renkan, { @@ -58,9 +58,6 @@ user_id: '{{ user.external_id }}', user_name: '{{ user.username }}' }); - $(window).on('beforeunload', function(e) { - trackingWorker.closeProject(); - }); }; {% endblock js_import %} diff -r 7e5704d95f41 -r 2ec47574a371 server/src/metaeducation/templates/renkan_view.html --- a/server/src/metaeducation/templates/renkan_view.html Mon Jul 25 18:24:58 2016 +0200 +++ b/server/src/metaeducation/templates/renkan_view.html Wed Jul 27 15:26:23 2016 +0200 @@ -17,6 +17,7 @@ + diff -r 7e5704d95f41 -r 2ec47574a371 server/src/metaeducation/tracking/messages.py --- a/server/src/metaeducation/tracking/messages.py Mon Jul 25 18:24:58 2016 +0200 +++ b/server/src/metaeducation/tracking/messages.py Wed Jul 27 15:26:23 2016 +0200 @@ -2,7 +2,9 @@ import json import logging import pytz +import string +from django.conf import settings from django.utils import six from .tasks import send_tracking_data @@ -70,7 +72,7 @@ 'verb': verbNode, 'object': { 'objectType': 'Activity', - 'id': get_renkan_urn(renkan_id) + 'id': get_renkan_uri(renkan_id) }, 'context': { 'extensions': { @@ -84,8 +86,9 @@ return msg -def get_renkan_urn(renkan_id): - return 'urn:mtdc:renkan:renkan:%s' % renkan_id; +def get_renkan_uri(renkan_id): + template = string.Template(settings.TRACKING_URI_TEMPLATES.get('renkan', 'urn:mtdc:renkan:renkan:${renkan_id}')) + return template.safe_substitute({'renkan_id': renkan_id}) def send_close_renkan(renkan, current_user, registration): diff -r 7e5704d95f41 -r 2ec47574a371 server/src/metaeducation/views/renkan.py --- a/server/src/metaeducation/views/renkan.py Mon Jul 25 18:24:58 2016 +0200 +++ b/server/src/metaeducation/views/renkan.py Wed Jul 27 15:26:23 2016 +0200 @@ -50,6 +50,7 @@ def get_context_data(self, **kwargs): context = super(ViewRenkanView, self).get_context_data(**kwargs) context['registration'] = str(uuid.uuid4()) + context['tracking_uri_templates'] = json.dumps(settings.TRACKING_URI_TEMPLATES) return context def get(self, request, *args, **kwargs): @@ -65,6 +66,7 @@ def get_context_data(self, **kwargs): context = super(EditRenkanView, self).get_context_data(**kwargs) context['registration'] = str(uuid.uuid4()) + context['tracking_uri_templates'] = json.dumps(settings.TRACKING_URI_TEMPLATES) return context def get(self, request, *args, **kwargs): diff -r 7e5704d95f41 -r 2ec47574a371 server/src/requirement_iri.txt --- a/server/src/requirement_iri.txt Mon Jul 25 18:24:58 2016 +0200 +++ b/server/src/requirement_iri.txt Wed Jul 27 15:26:23 2016 +0200 @@ -1,1 +1,1 @@ -renkanmanager (==0.12.20) +renkanmanager (==0.12.22)