upgrade renkan, correct tagcloud, migrate to lodash
authorymh <ymh.work@gmail.com>
Mon, 27 Apr 2015 17:29:51 +0200
changeset 620 f45d7494332e
parent 619 2695537badbe
child 621 fe9c9b495ead
upgrade renkan, correct tagcloud, migrate to lodash
src/hdalab/settings.py
src/hdalab/static/hdalab/js/gomina.js
src/hdalab/static/hdalab/js/hdalab-renkan-bins.js
src/hdalab/static/hdalab/js/trees.js
src/hdalab/static/hdalab/lib/lodash.min.js
src/hdalab/static/hdalab/lib/underscore-min.js
src/hdalab/templates/categories.html
src/hdalab/templates/editorial/manage_renkans.html
src/hdalab/templates/facettes.html
src/hdalab/templates/notice.html
src/hdalab/templates/renkan_edit.html
src/hdalab/templates/renkan_view.html
src/hdalab/templates/renkan_view_full.html
src/hdalab/templates/thesaurus.html
src/hdalab/views/ajax.py
src/requirement.txt
--- a/src/hdalab/settings.py	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/hdalab/settings.py	Mon Apr 27 17:29:51 2015 +0200
@@ -203,7 +203,7 @@
 SECURE_BROWSER_XSS_FILTER=True
 CSRF_COOKIE_SECURE=False
 
-SILENCED_SYSTEM_CHECKS = ['fields.W342'] # to silence a problem in registration module
+#SILENCED_SYSTEM_CHECKS = ['fields.W342'] # to silence a problem in registration module
 
 from hdalab.config import * #@UnusedWildImport
 
--- a/src/hdalab/static/hdalab/js/gomina.js	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/hdalab/static/hdalab/js/gomina.js	Mon Apr 27 17:29:51 2015 +0200
@@ -4,11 +4,11 @@
 
 str_format = function() {
 	var s = arguments[0];
-	for (var i = 0; i < arguments.length - 1; i++) {       
-		var reg = new RegExp("\\{" + i + "\\}", "gm");             
+	for (var i = 0; i < arguments.length - 1; i++) {
+		var reg = new RegExp("\\{" + i + "\\}", "gm");
 		s = s.replace(reg, arguments[i + 1]);
 	}
-	
+
 	return s;
 }
 
@@ -69,7 +69,7 @@
 
 function showCountriesGmap(geoJson) {
     gomNs.countries = {};
-    _(geoJson.features).each(function(feature) {
+    _.each(geoJson.features, function(feature) {
         var _el = { "properties" : feature.properties };
         if (feature.id == 'ATA') {
             _el.gPolygons = [];
@@ -245,9 +245,9 @@
                 + country_label
                 + '<a href="#" class="remfil" onclick="removeFilter(\'country\','
                 + _i
-                + '); return false;">[x]</a></li>'; 
+                + '); return false;">[x]</a></li>';
         }).join("");
-        
+
     }
     if (_fl) {
         url_renkan += "&label=";
@@ -257,7 +257,7 @@
                 + '<span class="filtag_label">'+_t+'</span>'
                 + '<a href="#" class="remfil" onclick="removeFilter(\'tag\','
                 + _i
-                + '); return false;">[x]</a></li>'; 
+                + '); return false;">[x]</a></li>';
         }).join("");
     }
     $("#renkan-link").attr("href",url_renkan);
@@ -266,7 +266,7 @@
     }
     $("#filters").html(_htmFilters).hide();
     debouncedGetUpdates();
-    
+
 }
 
 function displayContents(contentdata) {
@@ -325,8 +325,8 @@
 
 function updateMap() {
     if (gomNs.countries && gomNs.filterCountries) {
-        var _max = Math.max(1, _(gomNs.filterCountries).max());
-        _(gomNs.countries).each(function(_country, _k) {
+        var _max = Math.max(1, _(gomNs.filterCountries).max().value());
+        _.each(gomNs.countries, function(_country, _k) {
             _k = decodeURIComponent(_k);
             var _val = gomNs.filterCountries[_k] || 0,
                 _fill = getGradient(_val/_max);
@@ -353,7 +353,7 @@
 
 function updateDisplay(data) {
     animStop();
-    
+
     // translate filters
     $('.filtag_label').each(function(index, elt) {
     	txt = $(this).text();
@@ -362,8 +362,8 @@
     	}
     });
     $("#filters").show();
-    
-    
+
+
     if (gomNs.dhmPaper) {
         gomNs.dhmPaper.clear();
     } else {
@@ -373,8 +373,8 @@
     if (!data.sparkline.length || data.sparkline[0].year != gomNs.minYear) {
         data.sparkline.splice(0,0,{"year": gomNs.minYear, "score": 0});
     }
-    var _maxheat = _(data.sparkline).max(function(_d) { return parseInt(_d.score); }).score;
-    _(data.sparkline).each(function(_d, _i) {
+    var _maxheat = _(data.sparkline).max(function(_d) { return parseInt(_d.score); }).value().score;
+    _.each(data.sparkline, function(_d, _i) {
         var _nxt = (_i == data.sparkline.length - 1) ? (gomNs.maxYear + 1) : data.sparkline[_i + 1].year,
             _x1 = yearToPx(_d.year),
             _x2 = yearToPx(_nxt),
@@ -393,8 +393,8 @@
         });
     }
     if (data.tags.length) {
-        var _scores = _(data.tags).map(function(_d) { return parseInt(_d.score)}),
-            _maxTag = _(_scores).max(),
+        var _scores = _.map(data.tags, function(_d) { return parseInt(_d.score)}),
+            _maxTag = _(_scores).max().value(),
             _minTag = Math.min(_(_scores).min(), _maxTag - 1),
             _scale = 10 / Math.sqrt(_maxTag - _minTag),
             _htmlTc = '<ul id="tclist">'
@@ -443,7 +443,7 @@
             }).join("")
             + '</ul>'
         )
-        
+
     }
 }
 
@@ -459,7 +459,7 @@
     $("#bloc_gestvue h2").html(gettext('Gerer la vue')+' "' + _.escape(_curView.name) + '"');
     $("div.bloc").show();
     $("#widgetlist input").prop("checked",true);
-    _(_curView.hiddenWidgets).each(function(_w) {
+    _.each(_curView.hiddenWidgets, function(_w) {
         $("#chbx_" + _w).prop("checked",false);
         $("#" + _w).hide();
     });
@@ -536,7 +536,7 @@
             ]
         }
     };
-    
+
     gomNs.sessiondata = typeof data.data == "string" ? JSON.parse(data.data) : (typeof data.data == "object" ? data.data : {});
 
     if (!gomNs.sessiondata.views) {
@@ -623,7 +623,7 @@
         showMethod(geoJson);
         $("#map").trigger('mapUpdate.gomina');
     });
-    
+
     var _html = gomNs.displayedDates.map(function(_v) {
         return '<li style="left: '
             + parseInt(yearToPx(_v))
@@ -659,7 +659,7 @@
 
     getInitialView();
     $(".barrebloc").click(function() {
-        $(this).next().slideToggle(); 
+        $(this).next().slideToggle();
     });
     gomNs.widgetList = [];
     var _html = '<ul id="widgetlist">';
--- a/src/hdalab/static/hdalab/js/hdalab-renkan-bins.js	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/hdalab/static/hdalab/js/hdalab-renkan-bins.js	Mon Apr 27 17:29:51 2015 +0200
@@ -82,7 +82,7 @@
     var _html = "",
         _this = this,
         count = 0;
-    Rkns._(this.data.results).each(function(_result) {
+    Rkns._.each(this.data.results, function(_result) {
         var title = _result.title,
             url = _result.url,
             full_description = _result.description,
@@ -188,7 +188,7 @@
     var _html = "",
         _this = this,
         count = 0;
-    Rkns._(this.data).each(function(_result) {
+    Rkns._.each(this.data, function(_result) {
         var title = _result.value,
             url = _result.url,
             full_description = _result.abstract ? _result.abstract : "",
@@ -216,7 +216,7 @@
     }
     if  (!search.isempty && !count) {
         this.$.hide();
-    } else {    
+    } else {
         this.$.show();
     }
     this.renkan.resizeBins();
@@ -231,4 +231,4 @@
             _this.render();
         }
     });
-};
\ No newline at end of file
+};
--- a/src/hdalab/static/hdalab/js/trees.js	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/hdalab/static/hdalab/js/trees.js	Mon Apr 27 17:29:51 2015 +0200
@@ -29,14 +29,14 @@
 
 function renderTemplate(_data, _level, _scale, _maxlevel) {
     _data.isfolded = _level >= _maxlevel;
-    _(_data.tags).each(function(_tag) {
-        _(_tag.contents).each(function(_content, _key) {
+    _.each(_data.tags, function(_tag) {
+        _.each(_tag.contents, function(_content, _key) {
             _content.trimmed_description = _content.description.trim().replace(/(\n|\r|\r\n)/mg,' ').replace(/(^.{150,200})[\s].+$/m,'$1&hellip;');
             _content.hidden = (_key >= 5);
         });
         _tag.show_more = _tag.contents && _tag.contents.length > 5 ? _tag.contents.length - 5 : 0;
     });
-    _(_data.contents).each(function(_content, _key) {
+    _.each(_data.contents, function(_content, _key) {
         _content.trimmed_description = _content.description.trim().replace(/(\n|\r|\r\n)/mg,' ').replace(/(^.{150,200})[\s].+$/m,'$1&hellip;');
         _content.hidden = (_key >= 5);
     });
@@ -90,6 +90,6 @@
         $(this).find(".show_more_count").html(_l);
         if (!_l) {
             $(this).detach();
-        } 
+        }
     });
-}
\ No newline at end of file
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/hdalab/static/hdalab/lib/lodash.min.js	Mon Apr 27 17:29:51 2015 +0200
@@ -0,0 +1,56 @@
+/**
+ * @license
+ * Lo-Dash 2.4.1 (Custom Build) lodash.com/license | Underscore.js 1.5.2 underscorejs.org/LICENSE
+ * Build: `lodash modern -o ./dist/lodash.js`
+ */
+;(function(){function n(n,t,e){e=(e||0)-1;for(var r=n?n.length:0;++e<r;)if(n[e]===t)return e;return-1}function t(t,e){var r=typeof e;if(t=t.l,"boolean"==r||null==e)return t[e]?0:-1;"number"!=r&&"string"!=r&&(r="object");var u="number"==r?e:m+e;return t=(t=t[r])&&t[u],"object"==r?t&&-1<n(t,e)?0:-1:t?0:-1}function e(n){var t=this.l,e=typeof n;if("boolean"==e||null==n)t[n]=true;else{"number"!=e&&"string"!=e&&(e="object");var r="number"==e?n:m+n,t=t[e]||(t[e]={});"object"==e?(t[r]||(t[r]=[])).push(n):t[r]=true
+}}function r(n){return n.charCodeAt(0)}function u(n,t){for(var e=n.m,r=t.m,u=-1,o=e.length;++u<o;){var i=e[u],a=r[u];if(i!==a){if(i>a||typeof i=="undefined")return 1;if(i<a||typeof a=="undefined")return-1}}return n.n-t.n}function o(n){var t=-1,r=n.length,u=n[0],o=n[r/2|0],i=n[r-1];if(u&&typeof u=="object"&&o&&typeof o=="object"&&i&&typeof i=="object")return false;for(u=f(),u["false"]=u["null"]=u["true"]=u.undefined=false,o=f(),o.k=n,o.l=u,o.push=e;++t<r;)o.push(n[t]);return o}function i(n){return"\\"+U[n]
+}function a(){return h.pop()||[]}function f(){return g.pop()||{k:null,l:null,m:null,"false":false,n:0,"null":false,number:null,object:null,push:null,string:null,"true":false,undefined:false,o:null}}function l(n){n.length=0,h.length<_&&h.push(n)}function c(n){var t=n.l;t&&c(t),n.k=n.l=n.m=n.object=n.number=n.string=n.o=null,g.length<_&&g.push(n)}function p(n,t,e){t||(t=0),typeof e=="undefined"&&(e=n?n.length:0);var r=-1;e=e-t||0;for(var u=Array(0>e?0:e);++r<e;)u[r]=n[t+r];return u}function s(e){function h(n,t,e){if(!n||!V[typeof n])return n;
+t=t&&typeof e=="undefined"?t:tt(t,e,3);for(var r=-1,u=V[typeof n]&&Fe(n),o=u?u.length:0;++r<o&&(e=u[r],false!==t(n[e],e,n)););return n}function g(n,t,e){var r;if(!n||!V[typeof n])return n;t=t&&typeof e=="undefined"?t:tt(t,e,3);for(r in n)if(false===t(n[r],r,n))break;return n}function _(n,t,e){var r,u=n,o=u;if(!u)return o;for(var i=arguments,a=0,f=typeof e=="number"?2:i.length;++a<f;)if((u=i[a])&&V[typeof u])for(var l=-1,c=V[typeof u]&&Fe(u),p=c?c.length:0;++l<p;)r=c[l],"undefined"==typeof o[r]&&(o[r]=u[r]);
+return o}function U(n,t,e){var r,u=n,o=u;if(!u)return o;var i=arguments,a=0,f=typeof e=="number"?2:i.length;if(3<f&&"function"==typeof i[f-2])var l=tt(i[--f-1],i[f--],2);else 2<f&&"function"==typeof i[f-1]&&(l=i[--f]);for(;++a<f;)if((u=i[a])&&V[typeof u])for(var c=-1,p=V[typeof u]&&Fe(u),s=p?p.length:0;++c<s;)r=p[c],o[r]=l?l(o[r],u[r]):u[r];return o}function H(n){var t,e=[];if(!n||!V[typeof n])return e;for(t in n)me.call(n,t)&&e.push(t);return e}function J(n){return n&&typeof n=="object"&&!Te(n)&&me.call(n,"__wrapped__")?n:new Q(n)
+}function Q(n,t){this.__chain__=!!t,this.__wrapped__=n}function X(n){function t(){if(r){var n=p(r);be.apply(n,arguments)}if(this instanceof t){var o=nt(e.prototype),n=e.apply(o,n||arguments);return wt(n)?n:o}return e.apply(u,n||arguments)}var e=n[0],r=n[2],u=n[4];return $e(t,n),t}function Z(n,t,e,r,u){if(e){var o=e(n);if(typeof o!="undefined")return o}if(!wt(n))return n;var i=ce.call(n);if(!K[i])return n;var f=Ae[i];switch(i){case T:case F:return new f(+n);case W:case P:return new f(n);case z:return o=f(n.source,C.exec(n)),o.lastIndex=n.lastIndex,o
+}if(i=Te(n),t){var c=!r;r||(r=a()),u||(u=a());for(var s=r.length;s--;)if(r[s]==n)return u[s];o=i?f(n.length):{}}else o=i?p(n):U({},n);return i&&(me.call(n,"index")&&(o.index=n.index),me.call(n,"input")&&(o.input=n.input)),t?(r.push(n),u.push(o),(i?St:h)(n,function(n,i){o[i]=Z(n,t,e,r,u)}),c&&(l(r),l(u)),o):o}function nt(n){return wt(n)?ke(n):{}}function tt(n,t,e){if(typeof n!="function")return Ut;if(typeof t=="undefined"||!("prototype"in n))return n;var r=n.__bindData__;if(typeof r=="undefined"&&(De.funcNames&&(r=!n.name),r=r||!De.funcDecomp,!r)){var u=ge.call(n);
+De.funcNames||(r=!O.test(u)),r||(r=E.test(u),$e(n,r))}if(false===r||true!==r&&1&r[1])return n;switch(e){case 1:return function(e){return n.call(t,e)};case 2:return function(e,r){return n.call(t,e,r)};case 3:return function(e,r,u){return n.call(t,e,r,u)};case 4:return function(e,r,u,o){return n.call(t,e,r,u,o)}}return Mt(n,t)}function et(n){function t(){var n=f?i:this;if(u){var h=p(u);be.apply(h,arguments)}return(o||c)&&(h||(h=p(arguments)),o&&be.apply(h,o),c&&h.length<a)?(r|=16,et([e,s?r:-4&r,h,null,i,a])):(h||(h=arguments),l&&(e=n[v]),this instanceof t?(n=nt(e.prototype),h=e.apply(n,h),wt(h)?h:n):e.apply(n,h))
+}var e=n[0],r=n[1],u=n[2],o=n[3],i=n[4],a=n[5],f=1&r,l=2&r,c=4&r,s=8&r,v=e;return $e(t,n),t}function rt(e,r){var u=-1,i=st(),a=e?e.length:0,f=a>=b&&i===n,l=[];if(f){var p=o(r);p?(i=t,r=p):f=false}for(;++u<a;)p=e[u],0>i(r,p)&&l.push(p);return f&&c(r),l}function ut(n,t,e,r){r=(r||0)-1;for(var u=n?n.length:0,o=[];++r<u;){var i=n[r];if(i&&typeof i=="object"&&typeof i.length=="number"&&(Te(i)||yt(i))){t||(i=ut(i,t,e));var a=-1,f=i.length,l=o.length;for(o.length+=f;++a<f;)o[l++]=i[a]}else e||o.push(i)}return o
+}function ot(n,t,e,r,u,o){if(e){var i=e(n,t);if(typeof i!="undefined")return!!i}if(n===t)return 0!==n||1/n==1/t;if(n===n&&!(n&&V[typeof n]||t&&V[typeof t]))return false;if(null==n||null==t)return n===t;var f=ce.call(n),c=ce.call(t);if(f==D&&(f=q),c==D&&(c=q),f!=c)return false;switch(f){case T:case F:return+n==+t;case W:return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case z:case P:return n==oe(t)}if(c=f==$,!c){var p=me.call(n,"__wrapped__"),s=me.call(t,"__wrapped__");if(p||s)return ot(p?n.__wrapped__:n,s?t.__wrapped__:t,e,r,u,o);
+if(f!=q)return false;if(f=n.constructor,p=t.constructor,f!=p&&!(dt(f)&&f instanceof f&&dt(p)&&p instanceof p)&&"constructor"in n&&"constructor"in t)return false}for(f=!u,u||(u=a()),o||(o=a()),p=u.length;p--;)if(u[p]==n)return o[p]==t;var v=0,i=true;if(u.push(n),o.push(t),c){if(p=n.length,v=t.length,(i=v==p)||r)for(;v--;)if(c=p,s=t[v],r)for(;c--&&!(i=ot(n[c],s,e,r,u,o)););else if(!(i=ot(n[v],s,e,r,u,o)))break}else g(t,function(t,a,f){return me.call(f,a)?(v++,i=me.call(n,a)&&ot(n[a],t,e,r,u,o)):void 0}),i&&!r&&g(n,function(n,t,e){return me.call(e,t)?i=-1<--v:void 0
+});return u.pop(),o.pop(),f&&(l(u),l(o)),i}function it(n,t,e,r,u){(Te(t)?St:h)(t,function(t,o){var i,a,f=t,l=n[o];if(t&&((a=Te(t))||Pe(t))){for(f=r.length;f--;)if(i=r[f]==t){l=u[f];break}if(!i){var c;e&&(f=e(l,t),c=typeof f!="undefined")&&(l=f),c||(l=a?Te(l)?l:[]:Pe(l)?l:{}),r.push(t),u.push(l),c||it(l,t,e,r,u)}}else e&&(f=e(l,t),typeof f=="undefined"&&(f=t)),typeof f!="undefined"&&(l=f);n[o]=l})}function at(n,t){return n+he(Re()*(t-n+1))}function ft(e,r,u){var i=-1,f=st(),p=e?e.length:0,s=[],v=!r&&p>=b&&f===n,h=u||v?a():s;
+for(v&&(h=o(h),f=t);++i<p;){var g=e[i],y=u?u(g,i,e):g;(r?!i||h[h.length-1]!==y:0>f(h,y))&&((u||v)&&h.push(y),s.push(g))}return v?(l(h.k),c(h)):u&&l(h),s}function lt(n){return function(t,e,r){var u={};e=J.createCallback(e,r,3),r=-1;var o=t?t.length:0;if(typeof o=="number")for(;++r<o;){var i=t[r];n(u,i,e(i,r,t),t)}else h(t,function(t,r,o){n(u,t,e(t,r,o),o)});return u}}function ct(n,t,e,r,u,o){var i=1&t,a=4&t,f=16&t,l=32&t;if(!(2&t||dt(n)))throw new ie;f&&!e.length&&(t&=-17,f=e=false),l&&!r.length&&(t&=-33,l=r=false);
+var c=n&&n.__bindData__;return c&&true!==c?(c=p(c),c[2]&&(c[2]=p(c[2])),c[3]&&(c[3]=p(c[3])),!i||1&c[1]||(c[4]=u),!i&&1&c[1]&&(t|=8),!a||4&c[1]||(c[5]=o),f&&be.apply(c[2]||(c[2]=[]),e),l&&we.apply(c[3]||(c[3]=[]),r),c[1]|=t,ct.apply(null,c)):(1==t||17===t?X:et)([n,t,e,r,u,o])}function pt(n){return Be[n]}function st(){var t=(t=J.indexOf)===Wt?n:t;return t}function vt(n){return typeof n=="function"&&pe.test(n)}function ht(n){var t,e;return n&&ce.call(n)==q&&(t=n.constructor,!dt(t)||t instanceof t)?(g(n,function(n,t){e=t
+}),typeof e=="undefined"||me.call(n,e)):false}function gt(n){return We[n]}function yt(n){return n&&typeof n=="object"&&typeof n.length=="number"&&ce.call(n)==D||false}function mt(n,t,e){var r=Fe(n),u=r.length;for(t=tt(t,e,3);u--&&(e=r[u],false!==t(n[e],e,n)););return n}function bt(n){var t=[];return g(n,function(n,e){dt(n)&&t.push(e)}),t.sort()}function _t(n){for(var t=-1,e=Fe(n),r=e.length,u={};++t<r;){var o=e[t];u[n[o]]=o}return u}function dt(n){return typeof n=="function"}function wt(n){return!(!n||!V[typeof n])
+}function jt(n){return typeof n=="number"||n&&typeof n=="object"&&ce.call(n)==W||false}function kt(n){return typeof n=="string"||n&&typeof n=="object"&&ce.call(n)==P||false}function xt(n){for(var t=-1,e=Fe(n),r=e.length,u=Xt(r);++t<r;)u[t]=n[e[t]];return u}function Ct(n,t,e){var r=-1,u=st(),o=n?n.length:0,i=false;return e=(0>e?Ie(0,o+e):e)||0,Te(n)?i=-1<u(n,t,e):typeof o=="number"?i=-1<(kt(n)?n.indexOf(t,e):u(n,t,e)):h(n,function(n){return++r<e?void 0:!(i=n===t)}),i}function Ot(n,t,e){var r=true;t=J.createCallback(t,e,3),e=-1;
+var u=n?n.length:0;if(typeof u=="number")for(;++e<u&&(r=!!t(n[e],e,n)););else h(n,function(n,e,u){return r=!!t(n,e,u)});return r}function Nt(n,t,e){var r=[];t=J.createCallback(t,e,3),e=-1;var u=n?n.length:0;if(typeof u=="number")for(;++e<u;){var o=n[e];t(o,e,n)&&r.push(o)}else h(n,function(n,e,u){t(n,e,u)&&r.push(n)});return r}function It(n,t,e){t=J.createCallback(t,e,3),e=-1;var r=n?n.length:0;if(typeof r!="number"){var u;return h(n,function(n,e,r){return t(n,e,r)?(u=n,false):void 0}),u}for(;++e<r;){var o=n[e];
+if(t(o,e,n))return o}}function St(n,t,e){var r=-1,u=n?n.length:0;if(t=t&&typeof e=="undefined"?t:tt(t,e,3),typeof u=="number")for(;++r<u&&false!==t(n[r],r,n););else h(n,t);return n}function Et(n,t,e){var r=n?n.length:0;if(t=t&&typeof e=="undefined"?t:tt(t,e,3),typeof r=="number")for(;r--&&false!==t(n[r],r,n););else{var u=Fe(n),r=u.length;h(n,function(n,e,o){return e=u?u[--r]:--r,t(o[e],e,o)})}return n}function Rt(n,t,e){var r=-1,u=n?n.length:0;if(t=J.createCallback(t,e,3),typeof u=="number")for(var o=Xt(u);++r<u;)o[r]=t(n[r],r,n);
+else o=[],h(n,function(n,e,u){o[++r]=t(n,e,u)});return o}function At(n,t,e){var u=-1/0,o=u;if(typeof t!="function"&&e&&e[t]===n&&(t=null),null==t&&Te(n)){e=-1;for(var i=n.length;++e<i;){var a=n[e];a>o&&(o=a)}}else t=null==t&&kt(n)?r:J.createCallback(t,e,3),St(n,function(n,e,r){e=t(n,e,r),e>u&&(u=e,o=n)});return o}function Dt(n,t,e,r){if(!n)return e;var u=3>arguments.length;t=J.createCallback(t,r,4);var o=-1,i=n.length;if(typeof i=="number")for(u&&(e=n[++o]);++o<i;)e=t(e,n[o],o,n);else h(n,function(n,r,o){e=u?(u=false,n):t(e,n,r,o)
+});return e}function $t(n,t,e,r){var u=3>arguments.length;return t=J.createCallback(t,r,4),Et(n,function(n,r,o){e=u?(u=false,n):t(e,n,r,o)}),e}function Tt(n){var t=-1,e=n?n.length:0,r=Xt(typeof e=="number"?e:0);return St(n,function(n){var e=at(0,++t);r[t]=r[e],r[e]=n}),r}function Ft(n,t,e){var r;t=J.createCallback(t,e,3),e=-1;var u=n?n.length:0;if(typeof u=="number")for(;++e<u&&!(r=t(n[e],e,n)););else h(n,function(n,e,u){return!(r=t(n,e,u))});return!!r}function Bt(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=-1;
+for(t=J.createCallback(t,e,3);++o<u&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[0]:v;return p(n,0,Se(Ie(0,r),u))}function Wt(t,e,r){if(typeof r=="number"){var u=t?t.length:0;r=0>r?Ie(0,u+r):r||0}else if(r)return r=zt(t,e),t[r]===e?r:-1;return n(t,e,r)}function qt(n,t,e){if(typeof t!="number"&&null!=t){var r=0,u=-1,o=n?n.length:0;for(t=J.createCallback(t,e,3);++u<o&&t(n[u],u,n);)r++}else r=null==t||e?1:Ie(0,t);return p(n,r)}function zt(n,t,e,r){var u=0,o=n?n.length:u;for(e=e?J.createCallback(e,r,1):Ut,t=e(t);u<o;)r=u+o>>>1,e(n[r])<t?u=r+1:o=r;
+return u}function Pt(n,t,e,r){return typeof t!="boolean"&&null!=t&&(r=e,e=typeof t!="function"&&r&&r[t]===n?null:t,t=false),null!=e&&(e=J.createCallback(e,r,3)),ft(n,t,e)}function Kt(){for(var n=1<arguments.length?arguments:arguments[0],t=-1,e=n?At(Ve(n,"length")):0,r=Xt(0>e?0:e);++t<e;)r[t]=Ve(n,t);return r}function Lt(n,t){var e=-1,r=n?n.length:0,u={};for(t||!r||Te(n[0])||(t=[]);++e<r;){var o=n[e];t?u[o]=t[e]:o&&(u[o[0]]=o[1])}return u}function Mt(n,t){return 2<arguments.length?ct(n,17,p(arguments,2),null,t):ct(n,1,null,null,t)
+}function Vt(n,t,e){function r(){c&&ve(c),i=c=p=v,(g||h!==t)&&(s=Ue(),a=n.apply(l,o),c||i||(o=l=null))}function u(){var e=t-(Ue()-f);0<e?c=_e(u,e):(i&&ve(i),e=p,i=c=p=v,e&&(s=Ue(),a=n.apply(l,o),c||i||(o=l=null)))}var o,i,a,f,l,c,p,s=0,h=false,g=true;if(!dt(n))throw new ie;if(t=Ie(0,t)||0,true===e)var y=true,g=false;else wt(e)&&(y=e.leading,h="maxWait"in e&&(Ie(t,e.maxWait)||0),g="trailing"in e?e.trailing:g);return function(){if(o=arguments,f=Ue(),l=this,p=g&&(c||!y),false===h)var e=y&&!c;else{i||y||(s=f);var v=h-(f-s),m=0>=v;
+m?(i&&(i=ve(i)),s=f,a=n.apply(l,o)):i||(i=_e(r,v))}return m&&c?c=ve(c):c||t===h||(c=_e(u,t)),e&&(m=true,a=n.apply(l,o)),!m||c||i||(o=l=null),a}}function Ut(n){return n}function Gt(n,t,e){var r=true,u=t&&bt(t);t&&(e||u.length)||(null==e&&(e=t),o=Q,t=n,n=J,u=bt(t)),false===e?r=false:wt(e)&&"chain"in e&&(r=e.chain);var o=n,i=dt(o);St(u,function(e){var u=n[e]=t[e];i&&(o.prototype[e]=function(){var t=this.__chain__,e=this.__wrapped__,i=[e];if(be.apply(i,arguments),i=u.apply(n,i),r||t){if(e===i&&wt(i))return this;
+i=new o(i),i.__chain__=t}return i})})}function Ht(){}function Jt(n){return function(t){return t[n]}}function Qt(){return this.__wrapped__}e=e?Y.defaults(G.Object(),e,Y.pick(G,A)):G;var Xt=e.Array,Yt=e.Boolean,Zt=e.Date,ne=e.Function,te=e.Math,ee=e.Number,re=e.Object,ue=e.RegExp,oe=e.String,ie=e.TypeError,ae=[],fe=re.prototype,le=e._,ce=fe.toString,pe=ue("^"+oe(ce).replace(/[.*+?^${}()|[\]\\]/g,"\\$&").replace(/toString| for [^\]]+/g,".*?")+"$"),se=te.ceil,ve=e.clearTimeout,he=te.floor,ge=ne.prototype.toString,ye=vt(ye=re.getPrototypeOf)&&ye,me=fe.hasOwnProperty,be=ae.push,_e=e.setTimeout,de=ae.splice,we=ae.unshift,je=function(){try{var n={},t=vt(t=re.defineProperty)&&t,e=t(n,n,n)&&t
+}catch(r){}return e}(),ke=vt(ke=re.create)&&ke,xe=vt(xe=Xt.isArray)&&xe,Ce=e.isFinite,Oe=e.isNaN,Ne=vt(Ne=re.keys)&&Ne,Ie=te.max,Se=te.min,Ee=e.parseInt,Re=te.random,Ae={};Ae[$]=Xt,Ae[T]=Yt,Ae[F]=Zt,Ae[B]=ne,Ae[q]=re,Ae[W]=ee,Ae[z]=ue,Ae[P]=oe,Q.prototype=J.prototype;var De=J.support={};De.funcDecomp=!vt(e.a)&&E.test(s),De.funcNames=typeof ne.name=="string",J.templateSettings={escape:/<%-([\s\S]+?)%>/g,evaluate:/<%([\s\S]+?)%>/g,interpolate:N,variable:"",imports:{_:J}},ke||(nt=function(){function n(){}return function(t){if(wt(t)){n.prototype=t;
+var r=new n;n.prototype=null}return r||e.Object()}}());var $e=je?function(n,t){M.value=t,je(n,"__bindData__",M)}:Ht,Te=xe||function(n){return n&&typeof n=="object"&&typeof n.length=="number"&&ce.call(n)==$||false},Fe=Ne?function(n){return wt(n)?Ne(n):[]}:H,Be={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},We=_t(Be),qe=ue("("+Fe(We).join("|")+")","g"),ze=ue("["+Fe(Be).join("")+"]","g"),Pe=ye?function(n){if(!n||ce.call(n)!=q)return false;var t=n.valueOf,e=vt(t)&&(e=ye(t))&&ye(e);return e?n==e||ye(n)==e:ht(n)
+}:ht,Ke=lt(function(n,t,e){me.call(n,e)?n[e]++:n[e]=1}),Le=lt(function(n,t,e){(me.call(n,e)?n[e]:n[e]=[]).push(t)}),Me=lt(function(n,t,e){n[e]=t}),Ve=Rt,Ue=vt(Ue=Zt.now)&&Ue||function(){return(new Zt).getTime()},Ge=8==Ee(d+"08")?Ee:function(n,t){return Ee(kt(n)?n.replace(I,""):n,t||0)};return J.after=function(n,t){if(!dt(t))throw new ie;return function(){return 1>--n?t.apply(this,arguments):void 0}},J.assign=U,J.at=function(n){for(var t=arguments,e=-1,r=ut(t,true,false,1),t=t[2]&&t[2][t[1]]===n?1:r.length,u=Xt(t);++e<t;)u[e]=n[r[e]];
+return u},J.bind=Mt,J.bindAll=function(n){for(var t=1<arguments.length?ut(arguments,true,false,1):bt(n),e=-1,r=t.length;++e<r;){var u=t[e];n[u]=ct(n[u],1,null,null,n)}return n},J.bindKey=function(n,t){return 2<arguments.length?ct(t,19,p(arguments,2),null,n):ct(t,3,null,null,n)},J.chain=function(n){return n=new Q(n),n.__chain__=true,n},J.compact=function(n){for(var t=-1,e=n?n.length:0,r=[];++t<e;){var u=n[t];u&&r.push(u)}return r},J.compose=function(){for(var n=arguments,t=n.length;t--;)if(!dt(n[t]))throw new ie;
+return function(){for(var t=arguments,e=n.length;e--;)t=[n[e].apply(this,t)];return t[0]}},J.constant=function(n){return function(){return n}},J.countBy=Ke,J.create=function(n,t){var e=nt(n);return t?U(e,t):e},J.createCallback=function(n,t,e){var r=typeof n;if(null==n||"function"==r)return tt(n,t,e);if("object"!=r)return Jt(n);var u=Fe(n),o=u[0],i=n[o];return 1!=u.length||i!==i||wt(i)?function(t){for(var e=u.length,r=false;e--&&(r=ot(t[u[e]],n[u[e]],null,true)););return r}:function(n){return n=n[o],i===n&&(0!==i||1/i==1/n)
+}},J.curry=function(n,t){return t=typeof t=="number"?t:+t||n.length,ct(n,4,null,null,null,t)},J.debounce=Vt,J.defaults=_,J.defer=function(n){if(!dt(n))throw new ie;var t=p(arguments,1);return _e(function(){n.apply(v,t)},1)},J.delay=function(n,t){if(!dt(n))throw new ie;var e=p(arguments,2);return _e(function(){n.apply(v,e)},t)},J.difference=function(n){return rt(n,ut(arguments,true,true,1))},J.filter=Nt,J.flatten=function(n,t,e,r){return typeof t!="boolean"&&null!=t&&(r=e,e=typeof t!="function"&&r&&r[t]===n?null:t,t=false),null!=e&&(n=Rt(n,e,r)),ut(n,t)
+},J.forEach=St,J.forEachRight=Et,J.forIn=g,J.forInRight=function(n,t,e){var r=[];g(n,function(n,t){r.push(t,n)});var u=r.length;for(t=tt(t,e,3);u--&&false!==t(r[u--],r[u],n););return n},J.forOwn=h,J.forOwnRight=mt,J.functions=bt,J.groupBy=Le,J.indexBy=Me,J.initial=function(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=u;for(t=J.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else r=null==t||e?1:t||r;return p(n,0,Se(Ie(0,u-r),u))},J.intersection=function(){for(var e=[],r=-1,u=arguments.length,i=a(),f=st(),p=f===n,s=a();++r<u;){var v=arguments[r];
+(Te(v)||yt(v))&&(e.push(v),i.push(p&&v.length>=b&&o(r?e[r]:s)))}var p=e[0],h=-1,g=p?p.length:0,y=[];n:for(;++h<g;){var m=i[0],v=p[h];if(0>(m?t(m,v):f(s,v))){for(r=u,(m||s).push(v);--r;)if(m=i[r],0>(m?t(m,v):f(e[r],v)))continue n;y.push(v)}}for(;u--;)(m=i[u])&&c(m);return l(i),l(s),y},J.invert=_t,J.invoke=function(n,t){var e=p(arguments,2),r=-1,u=typeof t=="function",o=n?n.length:0,i=Xt(typeof o=="number"?o:0);return St(n,function(n){i[++r]=(u?t:n[t]).apply(n,e)}),i},J.keys=Fe,J.map=Rt,J.mapValues=function(n,t,e){var r={};
+return t=J.createCallback(t,e,3),h(n,function(n,e,u){r[e]=t(n,e,u)}),r},J.max=At,J.memoize=function(n,t){function e(){var r=e.cache,u=t?t.apply(this,arguments):m+arguments[0];return me.call(r,u)?r[u]:r[u]=n.apply(this,arguments)}if(!dt(n))throw new ie;return e.cache={},e},J.merge=function(n){var t=arguments,e=2;if(!wt(n))return n;if("number"!=typeof t[2]&&(e=t.length),3<e&&"function"==typeof t[e-2])var r=tt(t[--e-1],t[e--],2);else 2<e&&"function"==typeof t[e-1]&&(r=t[--e]);for(var t=p(arguments,1,e),u=-1,o=a(),i=a();++u<e;)it(n,t[u],r,o,i);
+return l(o),l(i),n},J.min=function(n,t,e){var u=1/0,o=u;if(typeof t!="function"&&e&&e[t]===n&&(t=null),null==t&&Te(n)){e=-1;for(var i=n.length;++e<i;){var a=n[e];a<o&&(o=a)}}else t=null==t&&kt(n)?r:J.createCallback(t,e,3),St(n,function(n,e,r){e=t(n,e,r),e<u&&(u=e,o=n)});return o},J.omit=function(n,t,e){var r={};if(typeof t!="function"){var u=[];g(n,function(n,t){u.push(t)});for(var u=rt(u,ut(arguments,true,false,1)),o=-1,i=u.length;++o<i;){var a=u[o];r[a]=n[a]}}else t=J.createCallback(t,e,3),g(n,function(n,e,u){t(n,e,u)||(r[e]=n)
+});return r},J.once=function(n){var t,e;if(!dt(n))throw new ie;return function(){return t?e:(t=true,e=n.apply(this,arguments),n=null,e)}},J.pairs=function(n){for(var t=-1,e=Fe(n),r=e.length,u=Xt(r);++t<r;){var o=e[t];u[t]=[o,n[o]]}return u},J.partial=function(n){return ct(n,16,p(arguments,1))},J.partialRight=function(n){return ct(n,32,null,p(arguments,1))},J.pick=function(n,t,e){var r={};if(typeof t!="function")for(var u=-1,o=ut(arguments,true,false,1),i=wt(n)?o.length:0;++u<i;){var a=o[u];a in n&&(r[a]=n[a])
+}else t=J.createCallback(t,e,3),g(n,function(n,e,u){t(n,e,u)&&(r[e]=n)});return r},J.pluck=Ve,J.property=Jt,J.pull=function(n){for(var t=arguments,e=0,r=t.length,u=n?n.length:0;++e<r;)for(var o=-1,i=t[e];++o<u;)n[o]===i&&(de.call(n,o--,1),u--);return n},J.range=function(n,t,e){n=+n||0,e=typeof e=="number"?e:+e||1,null==t&&(t=n,n=0);var r=-1;t=Ie(0,se((t-n)/(e||1)));for(var u=Xt(t);++r<t;)u[r]=n,n+=e;return u},J.reject=function(n,t,e){return t=J.createCallback(t,e,3),Nt(n,function(n,e,r){return!t(n,e,r)
+})},J.remove=function(n,t,e){var r=-1,u=n?n.length:0,o=[];for(t=J.createCallback(t,e,3);++r<u;)e=n[r],t(e,r,n)&&(o.push(e),de.call(n,r--,1),u--);return o},J.rest=qt,J.shuffle=Tt,J.sortBy=function(n,t,e){var r=-1,o=Te(t),i=n?n.length:0,p=Xt(typeof i=="number"?i:0);for(o||(t=J.createCallback(t,e,3)),St(n,function(n,e,u){var i=p[++r]=f();o?i.m=Rt(t,function(t){return n[t]}):(i.m=a())[0]=t(n,e,u),i.n=r,i.o=n}),i=p.length,p.sort(u);i--;)n=p[i],p[i]=n.o,o||l(n.m),c(n);return p},J.tap=function(n,t){return t(n),n
+},J.throttle=function(n,t,e){var r=true,u=true;if(!dt(n))throw new ie;return false===e?r=false:wt(e)&&(r="leading"in e?e.leading:r,u="trailing"in e?e.trailing:u),L.leading=r,L.maxWait=t,L.trailing=u,Vt(n,t,L)},J.times=function(n,t,e){n=-1<(n=+n)?n:0;var r=-1,u=Xt(n);for(t=tt(t,e,1);++r<n;)u[r]=t(r);return u},J.toArray=function(n){return n&&typeof n.length=="number"?p(n):xt(n)},J.transform=function(n,t,e,r){var u=Te(n);if(null==e)if(u)e=[];else{var o=n&&n.constructor;e=nt(o&&o.prototype)}return t&&(t=J.createCallback(t,r,4),(u?St:h)(n,function(n,r,u){return t(e,n,r,u)
+})),e},J.union=function(){return ft(ut(arguments,true,true))},J.uniq=Pt,J.values=xt,J.where=Nt,J.without=function(n){return rt(n,p(arguments,1))},J.wrap=function(n,t){return ct(t,16,[n])},J.xor=function(){for(var n=-1,t=arguments.length;++n<t;){var e=arguments[n];if(Te(e)||yt(e))var r=r?ft(rt(r,e).concat(rt(e,r))):e}return r||[]},J.zip=Kt,J.zipObject=Lt,J.collect=Rt,J.drop=qt,J.each=St,J.eachRight=Et,J.extend=U,J.methods=bt,J.object=Lt,J.select=Nt,J.tail=qt,J.unique=Pt,J.unzip=Kt,Gt(J),J.clone=function(n,t,e,r){return typeof t!="boolean"&&null!=t&&(r=e,e=t,t=false),Z(n,t,typeof e=="function"&&tt(e,r,1))
+},J.cloneDeep=function(n,t,e){return Z(n,true,typeof t=="function"&&tt(t,e,1))},J.contains=Ct,J.escape=function(n){return null==n?"":oe(n).replace(ze,pt)},J.every=Ot,J.find=It,J.findIndex=function(n,t,e){var r=-1,u=n?n.length:0;for(t=J.createCallback(t,e,3);++r<u;)if(t(n[r],r,n))return r;return-1},J.findKey=function(n,t,e){var r;return t=J.createCallback(t,e,3),h(n,function(n,e,u){return t(n,e,u)?(r=e,false):void 0}),r},J.findLast=function(n,t,e){var r;return t=J.createCallback(t,e,3),Et(n,function(n,e,u){return t(n,e,u)?(r=n,false):void 0
+}),r},J.findLastIndex=function(n,t,e){var r=n?n.length:0;for(t=J.createCallback(t,e,3);r--;)if(t(n[r],r,n))return r;return-1},J.findLastKey=function(n,t,e){var r;return t=J.createCallback(t,e,3),mt(n,function(n,e,u){return t(n,e,u)?(r=e,false):void 0}),r},J.has=function(n,t){return n?me.call(n,t):false},J.identity=Ut,J.indexOf=Wt,J.isArguments=yt,J.isArray=Te,J.isBoolean=function(n){return true===n||false===n||n&&typeof n=="object"&&ce.call(n)==T||false},J.isDate=function(n){return n&&typeof n=="object"&&ce.call(n)==F||false
+},J.isElement=function(n){return n&&1===n.nodeType||false},J.isEmpty=function(n){var t=true;if(!n)return t;var e=ce.call(n),r=n.length;return e==$||e==P||e==D||e==q&&typeof r=="number"&&dt(n.splice)?!r:(h(n,function(){return t=false}),t)},J.isEqual=function(n,t,e,r){return ot(n,t,typeof e=="function"&&tt(e,r,2))},J.isFinite=function(n){return Ce(n)&&!Oe(parseFloat(n))},J.isFunction=dt,J.isNaN=function(n){return jt(n)&&n!=+n},J.isNull=function(n){return null===n},J.isNumber=jt,J.isObject=wt,J.isPlainObject=Pe,J.isRegExp=function(n){return n&&typeof n=="object"&&ce.call(n)==z||false
+},J.isString=kt,J.isUndefined=function(n){return typeof n=="undefined"},J.lastIndexOf=function(n,t,e){var r=n?n.length:0;for(typeof e=="number"&&(r=(0>e?Ie(0,r+e):Se(e,r-1))+1);r--;)if(n[r]===t)return r;return-1},J.mixin=Gt,J.noConflict=function(){return e._=le,this},J.noop=Ht,J.now=Ue,J.parseInt=Ge,J.random=function(n,t,e){var r=null==n,u=null==t;return null==e&&(typeof n=="boolean"&&u?(e=n,n=1):u||typeof t!="boolean"||(e=t,u=true)),r&&u&&(t=1),n=+n||0,u?(t=n,n=0):t=+t||0,e||n%1||t%1?(e=Re(),Se(n+e*(t-n+parseFloat("1e-"+((e+"").length-1))),t)):at(n,t)
+},J.reduce=Dt,J.reduceRight=$t,J.result=function(n,t){if(n){var e=n[t];return dt(e)?n[t]():e}},J.runInContext=s,J.size=function(n){var t=n?n.length:0;return typeof t=="number"?t:Fe(n).length},J.some=Ft,J.sortedIndex=zt,J.template=function(n,t,e){var r=J.templateSettings;n=oe(n||""),e=_({},e,r);var u,o=_({},e.imports,r.imports),r=Fe(o),o=xt(o),a=0,f=e.interpolate||S,l="__p+='",f=ue((e.escape||S).source+"|"+f.source+"|"+(f===N?x:S).source+"|"+(e.evaluate||S).source+"|$","g");n.replace(f,function(t,e,r,o,f,c){return r||(r=o),l+=n.slice(a,c).replace(R,i),e&&(l+="'+__e("+e+")+'"),f&&(u=true,l+="';"+f+";\n__p+='"),r&&(l+="'+((__t=("+r+"))==null?'':__t)+'"),a=c+t.length,t
+}),l+="';",f=e=e.variable,f||(e="obj",l="with("+e+"){"+l+"}"),l=(u?l.replace(w,""):l).replace(j,"$1").replace(k,"$1;"),l="function("+e+"){"+(f?"":e+"||("+e+"={});")+"var __t,__p='',__e=_.escape"+(u?",__j=Array.prototype.join;function print(){__p+=__j.call(arguments,'')}":";")+l+"return __p}";try{var c=ne(r,"return "+l).apply(v,o)}catch(p){throw p.source=l,p}return t?c(t):(c.source=l,c)},J.unescape=function(n){return null==n?"":oe(n).replace(qe,gt)},J.uniqueId=function(n){var t=++y;return oe(null==n?"":n)+t
+},J.all=Ot,J.any=Ft,J.detect=It,J.findWhere=It,J.foldl=Dt,J.foldr=$t,J.include=Ct,J.inject=Dt,Gt(function(){var n={};return h(J,function(t,e){J.prototype[e]||(n[e]=t)}),n}(),false),J.first=Bt,J.last=function(n,t,e){var r=0,u=n?n.length:0;if(typeof t!="number"&&null!=t){var o=u;for(t=J.createCallback(t,e,3);o--&&t(n[o],o,n);)r++}else if(r=t,null==r||e)return n?n[u-1]:v;return p(n,Ie(0,u-r))},J.sample=function(n,t,e){return n&&typeof n.length!="number"&&(n=xt(n)),null==t||e?n?n[at(0,n.length-1)]:v:(n=Tt(n),n.length=Se(Ie(0,t),n.length),n)
+},J.take=Bt,J.head=Bt,h(J,function(n,t){var e="sample"!==t;J.prototype[t]||(J.prototype[t]=function(t,r){var u=this.__chain__,o=n(this.__wrapped__,t,r);return u||null!=t&&(!r||e&&typeof t=="function")?new Q(o,u):o})}),J.VERSION="2.4.1",J.prototype.chain=function(){return this.__chain__=true,this},J.prototype.toString=function(){return oe(this.__wrapped__)},J.prototype.value=Qt,J.prototype.valueOf=Qt,St(["join","pop","shift"],function(n){var t=ae[n];J.prototype[n]=function(){var n=this.__chain__,e=t.apply(this.__wrapped__,arguments);
+return n?new Q(e,n):e}}),St(["push","reverse","sort","unshift"],function(n){var t=ae[n];J.prototype[n]=function(){return t.apply(this.__wrapped__,arguments),this}}),St(["concat","slice","splice"],function(n){var t=ae[n];J.prototype[n]=function(){return new Q(t.apply(this.__wrapped__,arguments),this.__chain__)}}),J}var v,h=[],g=[],y=0,m=+new Date+"",b=75,_=40,d=" \t\x0B\f\xa0\ufeff\n\r\u2028\u2029\u1680\u180e\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u202f\u205f\u3000",w=/\b__p\+='';/g,j=/\b(__p\+=)''\+/g,k=/(__e\(.*?\)|\b__t\))\+'';/g,x=/\$\{([^\\}]*(?:\\.[^\\}]*)*)\}/g,C=/\w*$/,O=/^\s*function[ \n\r\t]+\w/,N=/<%=([\s\S]+?)%>/g,I=RegExp("^["+d+"]*0+(?=.$)"),S=/($^)/,E=/\bthis\b/,R=/['\n\r\t\u2028\u2029\\]/g,A="Array Boolean Date Function Math Number Object RegExp String _ attachEvent clearTimeout isFinite isNaN parseInt setTimeout".split(" "),D="[object Arguments]",$="[object Array]",T="[object Boolean]",F="[object Date]",B="[object Function]",W="[object Number]",q="[object Object]",z="[object RegExp]",P="[object String]",K={};
+K[B]=false,K[D]=K[$]=K[T]=K[F]=K[W]=K[q]=K[z]=K[P]=true;var L={leading:false,maxWait:0,trailing:false},M={configurable:false,enumerable:false,value:null,writable:false},V={"boolean":false,"function":true,object:true,number:false,string:false,undefined:false},U={"\\":"\\","'":"'","\n":"n","\r":"r","\t":"t","\u2028":"u2028","\u2029":"u2029"},G=V[typeof window]&&window||this,H=V[typeof exports]&&exports&&!exports.nodeType&&exports,J=V[typeof module]&&module&&!module.nodeType&&module,Q=J&&J.exports===H&&H,X=V[typeof global]&&global;!X||X.global!==X&&X.window!==X||(G=X);
+var Y=s();typeof define=="function"&&typeof define.amd=="object"&&define.amd?(G._=Y, define(function(){return Y})):H&&J?Q?(J.exports=Y)._=Y:H._=Y:G._=Y}).call(this);
\ No newline at end of file
--- a/src/hdalab/static/hdalab/lib/underscore-min.js	Fri Apr 03 18:41:06 2015 +0200
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-//     Underscore.js 1.6.0
-//     http://underscorejs.org
-//     (c) 2009-2014 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors
-//     Underscore may be freely distributed under the MIT license.
-(function(){var n=this,t=n._,r={},e=Array.prototype,u=Object.prototype,i=Function.prototype,a=e.push,o=e.slice,c=e.concat,l=u.toString,f=u.hasOwnProperty,s=e.forEach,p=e.map,h=e.reduce,v=e.reduceRight,g=e.filter,d=e.every,m=e.some,y=e.indexOf,b=e.lastIndexOf,x=Array.isArray,w=Object.keys,_=i.bind,j=function(n){return n instanceof j?n:this instanceof j?void(this._wrapped=n):new j(n)};"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=j),exports._=j):n._=j,j.VERSION="1.6.0";var A=j.each=j.forEach=function(n,t,e){if(null==n)return n;if(s&&n.forEach===s)n.forEach(t,e);else if(n.length===+n.length){for(var u=0,i=n.length;i>u;u++)if(t.call(e,n[u],u,n)===r)return}else for(var a=j.keys(n),u=0,i=a.length;i>u;u++)if(t.call(e,n[a[u]],a[u],n)===r)return;return n};j.map=j.collect=function(n,t,r){var e=[];return null==n?e:p&&n.map===p?n.map(t,r):(A(n,function(n,u,i){e.push(t.call(r,n,u,i))}),e)};var O="Reduce of empty array with no initial value";j.reduce=j.foldl=j.inject=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),h&&n.reduce===h)return e&&(t=j.bind(t,e)),u?n.reduce(t,r):n.reduce(t);if(A(n,function(n,i,a){u?r=t.call(e,r,n,i,a):(r=n,u=!0)}),!u)throw new TypeError(O);return r},j.reduceRight=j.foldr=function(n,t,r,e){var u=arguments.length>2;if(null==n&&(n=[]),v&&n.reduceRight===v)return e&&(t=j.bind(t,e)),u?n.reduceRight(t,r):n.reduceRight(t);var i=n.length;if(i!==+i){var a=j.keys(n);i=a.length}if(A(n,function(o,c,l){c=a?a[--i]:--i,u?r=t.call(e,r,n[c],c,l):(r=n[c],u=!0)}),!u)throw new TypeError(O);return r},j.find=j.detect=function(n,t,r){var e;return k(n,function(n,u,i){return t.call(r,n,u,i)?(e=n,!0):void 0}),e},j.filter=j.select=function(n,t,r){var e=[];return null==n?e:g&&n.filter===g?n.filter(t,r):(A(n,function(n,u,i){t.call(r,n,u,i)&&e.push(n)}),e)},j.reject=function(n,t,r){return j.filter(n,function(n,e,u){return!t.call(r,n,e,u)},r)},j.every=j.all=function(n,t,e){t||(t=j.identity);var u=!0;return null==n?u:d&&n.every===d?n.every(t,e):(A(n,function(n,i,a){return(u=u&&t.call(e,n,i,a))?void 0:r}),!!u)};var k=j.some=j.any=function(n,t,e){t||(t=j.identity);var u=!1;return null==n?u:m&&n.some===m?n.some(t,e):(A(n,function(n,i,a){return u||(u=t.call(e,n,i,a))?r:void 0}),!!u)};j.contains=j.include=function(n,t){return null==n?!1:y&&n.indexOf===y?n.indexOf(t)!=-1:k(n,function(n){return n===t})},j.invoke=function(n,t){var r=o.call(arguments,2),e=j.isFunction(t);return j.map(n,function(n){return(e?t:n[t]).apply(n,r)})},j.pluck=function(n,t){return j.map(n,j.property(t))},j.where=function(n,t){return j.filter(n,j.matches(t))},j.findWhere=function(n,t){return j.find(n,j.matches(t))},j.max=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.max.apply(Math,n);var e=-1/0,u=-1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;o>u&&(e=n,u=o)}),e},j.min=function(n,t,r){if(!t&&j.isArray(n)&&n[0]===+n[0]&&n.length<65535)return Math.min.apply(Math,n);var e=1/0,u=1/0;return A(n,function(n,i,a){var o=t?t.call(r,n,i,a):n;u>o&&(e=n,u=o)}),e},j.shuffle=function(n){var t,r=0,e=[];return A(n,function(n){t=j.random(r++),e[r-1]=e[t],e[t]=n}),e},j.sample=function(n,t,r){return null==t||r?(n.length!==+n.length&&(n=j.values(n)),n[j.random(n.length-1)]):j.shuffle(n).slice(0,Math.max(0,t))};var E=function(n){return null==n?j.identity:j.isFunction(n)?n:j.property(n)};j.sortBy=function(n,t,r){return t=E(t),j.pluck(j.map(n,function(n,e,u){return{value:n,index:e,criteria:t.call(r,n,e,u)}}).sort(function(n,t){var r=n.criteria,e=t.criteria;if(r!==e){if(r>e||r===void 0)return 1;if(e>r||e===void 0)return-1}return n.index-t.index}),"value")};var F=function(n){return function(t,r,e){var u={};return r=E(r),A(t,function(i,a){var o=r.call(e,i,a,t);n(u,o,i)}),u}};j.groupBy=F(function(n,t,r){j.has(n,t)?n[t].push(r):n[t]=[r]}),j.indexBy=F(function(n,t,r){n[t]=r}),j.countBy=F(function(n,t){j.has(n,t)?n[t]++:n[t]=1}),j.sortedIndex=function(n,t,r,e){r=E(r);for(var u=r.call(e,t),i=0,a=n.length;a>i;){var o=i+a>>>1;r.call(e,n[o])<u?i=o+1:a=o}return i},j.toArray=function(n){return n?j.isArray(n)?o.call(n):n.length===+n.length?j.map(n,j.identity):j.values(n):[]},j.size=function(n){return null==n?0:n.length===+n.length?n.length:j.keys(n).length},j.first=j.head=j.take=function(n,t,r){return null==n?void 0:null==t||r?n[0]:0>t?[]:o.call(n,0,t)},j.initial=function(n,t,r){return o.call(n,0,n.length-(null==t||r?1:t))},j.last=function(n,t,r){return null==n?void 0:null==t||r?n[n.length-1]:o.call(n,Math.max(n.length-t,0))},j.rest=j.tail=j.drop=function(n,t,r){return o.call(n,null==t||r?1:t)},j.compact=function(n){return j.filter(n,j.identity)};var M=function(n,t,r){return t&&j.every(n,j.isArray)?c.apply(r,n):(A(n,function(n){j.isArray(n)||j.isArguments(n)?t?a.apply(r,n):M(n,t,r):r.push(n)}),r)};j.flatten=function(n,t){return M(n,t,[])},j.without=function(n){return j.difference(n,o.call(arguments,1))},j.partition=function(n,t){var r=[],e=[];return A(n,function(n){(t(n)?r:e).push(n)}),[r,e]},j.uniq=j.unique=function(n,t,r,e){j.isFunction(t)&&(e=r,r=t,t=!1);var u=r?j.map(n,r,e):n,i=[],a=[];return A(u,function(r,e){(t?e&&a[a.length-1]===r:j.contains(a,r))||(a.push(r),i.push(n[e]))}),i},j.union=function(){return j.uniq(j.flatten(arguments,!0))},j.intersection=function(n){var t=o.call(arguments,1);return j.filter(j.uniq(n),function(n){return j.every(t,function(t){return j.contains(t,n)})})},j.difference=function(n){var t=c.apply(e,o.call(arguments,1));return j.filter(n,function(n){return!j.contains(t,n)})},j.zip=function(){for(var n=j.max(j.pluck(arguments,"length").concat(0)),t=new Array(n),r=0;n>r;r++)t[r]=j.pluck(arguments,""+r);return t},j.object=function(n,t){if(null==n)return{};for(var r={},e=0,u=n.length;u>e;e++)t?r[n[e]]=t[e]:r[n[e][0]]=n[e][1];return r},j.indexOf=function(n,t,r){if(null==n)return-1;var e=0,u=n.length;if(r){if("number"!=typeof r)return e=j.sortedIndex(n,t),n[e]===t?e:-1;e=0>r?Math.max(0,u+r):r}if(y&&n.indexOf===y)return n.indexOf(t,r);for(;u>e;e++)if(n[e]===t)return e;return-1},j.lastIndexOf=function(n,t,r){if(null==n)return-1;var e=null!=r;if(b&&n.lastIndexOf===b)return e?n.lastIndexOf(t,r):n.lastIndexOf(t);for(var u=e?r:n.length;u--;)if(n[u]===t)return u;return-1},j.range=function(n,t,r){arguments.length<=1&&(t=n||0,n=0),r=arguments[2]||1;for(var e=Math.max(Math.ceil((t-n)/r),0),u=0,i=new Array(e);e>u;)i[u++]=n,n+=r;return i};var R=function(){};j.bind=function(n,t){var r,e;if(_&&n.bind===_)return _.apply(n,o.call(arguments,1));if(!j.isFunction(n))throw new TypeError;return r=o.call(arguments,2),e=function(){if(!(this instanceof e))return n.apply(t,r.concat(o.call(arguments)));R.prototype=n.prototype;var u=new R;R.prototype=null;var i=n.apply(u,r.concat(o.call(arguments)));return Object(i)===i?i:u}},j.partial=function(n){var t=o.call(arguments,1);return function(){for(var r=0,e=t.slice(),u=0,i=e.length;i>u;u++)e[u]===j&&(e[u]=arguments[r++]);for(;r<arguments.length;)e.push(arguments[r++]);return n.apply(this,e)}},j.bindAll=function(n){var t=o.call(arguments,1);if(0===t.length)throw new Error("bindAll must be passed function names");return A(t,function(t){n[t]=j.bind(n[t],n)}),n},j.memoize=function(n,t){var r={};return t||(t=j.identity),function(){var e=t.apply(this,arguments);return j.has(r,e)?r[e]:r[e]=n.apply(this,arguments)}},j.delay=function(n,t){var r=o.call(arguments,2);return setTimeout(function(){return n.apply(null,r)},t)},j.defer=function(n){return j.delay.apply(j,[n,1].concat(o.call(arguments,1)))},j.throttle=function(n,t,r){var e,u,i,a=null,o=0;r||(r={});var c=function(){o=r.leading===!1?0:j.now(),a=null,i=n.apply(e,u),e=u=null};return function(){var l=j.now();o||r.leading!==!1||(o=l);var f=t-(l-o);return e=this,u=arguments,0>=f?(clearTimeout(a),a=null,o=l,i=n.apply(e,u),e=u=null):a||r.trailing===!1||(a=setTimeout(c,f)),i}},j.debounce=function(n,t,r){var e,u,i,a,o,c=function(){var l=j.now()-a;t>l?e=setTimeout(c,t-l):(e=null,r||(o=n.apply(i,u),i=u=null))};return function(){i=this,u=arguments,a=j.now();var l=r&&!e;return e||(e=setTimeout(c,t)),l&&(o=n.apply(i,u),i=u=null),o}},j.once=function(n){var t,r=!1;return function(){return r?t:(r=!0,t=n.apply(this,arguments),n=null,t)}},j.wrap=function(n,t){return j.partial(t,n)},j.compose=function(){var n=arguments;return function(){for(var t=arguments,r=n.length-1;r>=0;r--)t=[n[r].apply(this,t)];return t[0]}},j.after=function(n,t){return function(){return--n<1?t.apply(this,arguments):void 0}},j.keys=function(n){if(!j.isObject(n))return[];if(w)return w(n);var t=[];for(var r in n)j.has(n,r)&&t.push(r);return t},j.values=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=n[t[u]];return e},j.pairs=function(n){for(var t=j.keys(n),r=t.length,e=new Array(r),u=0;r>u;u++)e[u]=[t[u],n[t[u]]];return e},j.invert=function(n){for(var t={},r=j.keys(n),e=0,u=r.length;u>e;e++)t[n[r[e]]]=r[e];return t},j.functions=j.methods=function(n){var t=[];for(var r in n)j.isFunction(n[r])&&t.push(r);return t.sort()},j.extend=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]=t[r]}),n},j.pick=function(n){var t={},r=c.apply(e,o.call(arguments,1));return A(r,function(r){r in n&&(t[r]=n[r])}),t},j.omit=function(n){var t={},r=c.apply(e,o.call(arguments,1));for(var u in n)j.contains(r,u)||(t[u]=n[u]);return t},j.defaults=function(n){return A(o.call(arguments,1),function(t){if(t)for(var r in t)n[r]===void 0&&(n[r]=t[r])}),n},j.clone=function(n){return j.isObject(n)?j.isArray(n)?n.slice():j.extend({},n):n},j.tap=function(n,t){return t(n),n};var S=function(n,t,r,e){if(n===t)return 0!==n||1/n==1/t;if(null==n||null==t)return n===t;n instanceof j&&(n=n._wrapped),t instanceof j&&(t=t._wrapped);var u=l.call(n);if(u!=l.call(t))return!1;switch(u){case"[object String]":return n==String(t);case"[object Number]":return n!=+n?t!=+t:0==n?1/n==1/t:n==+t;case"[object Date]":case"[object Boolean]":return+n==+t;case"[object RegExp]":return n.source==t.source&&n.global==t.global&&n.multiline==t.multiline&&n.ignoreCase==t.ignoreCase}if("object"!=typeof n||"object"!=typeof t)return!1;for(var i=r.length;i--;)if(r[i]==n)return e[i]==t;var a=n.constructor,o=t.constructor;if(a!==o&&!(j.isFunction(a)&&a instanceof a&&j.isFunction(o)&&o instanceof o)&&"constructor"in n&&"constructor"in t)return!1;r.push(n),e.push(t);var c=0,f=!0;if("[object Array]"==u){if(c=n.length,f=c==t.length)for(;c--&&(f=S(n[c],t[c],r,e)););}else{for(var s in n)if(j.has(n,s)&&(c++,!(f=j.has(t,s)&&S(n[s],t[s],r,e))))break;if(f){for(s in t)if(j.has(t,s)&&!c--)break;f=!c}}return r.pop(),e.pop(),f};j.isEqual=function(n,t){return S(n,t,[],[])},j.isEmpty=function(n){if(null==n)return!0;if(j.isArray(n)||j.isString(n))return 0===n.length;for(var t in n)if(j.has(n,t))return!1;return!0},j.isElement=function(n){return!(!n||1!==n.nodeType)},j.isArray=x||function(n){return"[object Array]"==l.call(n)},j.isObject=function(n){return n===Object(n)},A(["Arguments","Function","String","Number","Date","RegExp"],function(n){j["is"+n]=function(t){return l.call(t)=="[object "+n+"]"}}),j.isArguments(arguments)||(j.isArguments=function(n){return!(!n||!j.has(n,"callee"))}),"function"!=typeof/./&&(j.isFunction=function(n){return"function"==typeof n}),j.isFinite=function(n){return isFinite(n)&&!isNaN(parseFloat(n))},j.isNaN=function(n){return j.isNumber(n)&&n!=+n},j.isBoolean=function(n){return n===!0||n===!1||"[object Boolean]"==l.call(n)},j.isNull=function(n){return null===n},j.isUndefined=function(n){return n===void 0},j.has=function(n,t){return f.call(n,t)},j.noConflict=function(){return n._=t,this},j.identity=function(n){return n},j.constant=function(n){return function(){return n}},j.property=function(n){return function(t){return t[n]}},j.matches=function(n){return function(t){if(t===n)return!0;for(var r in n)if(n[r]!==t[r])return!1;return!0}},j.times=function(n,t,r){for(var e=Array(Math.max(0,n)),u=0;n>u;u++)e[u]=t.call(r,u);return e},j.random=function(n,t){return null==t&&(t=n,n=0),n+Math.floor(Math.random()*(t-n+1))},j.now=Date.now||function(){return(new Date).getTime()};var T={escape:{"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#x27;"}};T.unescape=j.invert(T.escape);var I={escape:new RegExp("["+j.keys(T.escape).join("")+"]","g"),unescape:new RegExp("("+j.keys(T.unescape).join("|")+")","g")};j.each(["escape","unescape"],function(n){j[n]=function(t){return null==t?"":(""+t).replace(I[n],function(t){return T[n][t]})}}),j.result=function(n,t){if(null==n)return void 0;var r=n[t];return j.isFunction(r)?r.call(n):r},j.mixin=function(n){A(j.functions(n),function(t){var r=j[t]=n[t];j.prototype[t]=function(){var n=[this._wrapped];return a.apply(n,arguments),z.call(this,r.apply(j,n))}})};var N=0;j.uniqueId=function(n){var t=++N+"";return n?n+t:t},j.templateSettings={evaluate:/<%([\s\S]+?)%>/g,interpolate:/<%=([\s\S]+?)%>/g,escape:/<%-([\s\S]+?)%>/g};var q=/(.)^/,B={"'":"'","\\":"\\","\r":"r","\n":"n","	":"t","\u2028":"u2028","\u2029":"u2029"},D=/\\|'|\r|\n|\t|\u2028|\u2029/g;j.template=function(n,t,r){var e;r=j.defaults({},r,j.templateSettings);var u=new RegExp([(r.escape||q).source,(r.interpolate||q).source,(r.evaluate||q).source].join("|")+"|$","g"),i=0,a="__p+='";n.replace(u,function(t,r,e,u,o){return a+=n.slice(i,o).replace(D,function(n){return"\\"+B[n]}),r&&(a+="'+\n((__t=("+r+"))==null?'':_.escape(__t))+\n'"),e&&(a+="'+\n((__t=("+e+"))==null?'':__t)+\n'"),u&&(a+="';\n"+u+"\n__p+='"),i=o+t.length,t}),a+="';\n",r.variable||(a="with(obj||{}){\n"+a+"}\n"),a="var __t,__p='',__j=Array.prototype.join,"+"print=function(){__p+=__j.call(arguments,'');};\n"+a+"return __p;\n";try{e=new Function(r.variable||"obj","_",a)}catch(o){throw o.source=a,o}if(t)return e(t,j);var c=function(n){return e.call(this,n,j)};return c.source="function("+(r.variable||"obj")+"){\n"+a+"}",c},j.chain=function(n){return j(n).chain()};var z=function(n){return this._chain?j(n).chain():n};j.mixin(j),A(["pop","push","reverse","shift","sort","splice","unshift"],function(n){var t=e[n];j.prototype[n]=function(){var r=this._wrapped;return t.apply(r,arguments),"shift"!=n&&"splice"!=n||0!==r.length||delete r[0],z.call(this,r)}}),A(["concat","join","slice"],function(n){var t=e[n];j.prototype[n]=function(){return z.call(this,t.apply(this._wrapped,arguments))}}),j.extend(j.prototype,{chain:function(){return this._chain=!0,this},value:function(){return this._wrapped}}),"function"==typeof define&&define.amd&&define("underscore",[],function(){return j})}).call(this);
-//# sourceMappingURL=underscore-min.map
\ No newline at end of file
--- a/src/hdalab/templates/categories.html	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/hdalab/templates/categories.html	Mon Apr 27 17:29:51 2015 +0200
@@ -13,7 +13,7 @@
 
 {% block js_import %}
 {{block.super}}
-        <script src="{% static 'hdalab/lib/underscore-min.js' %}"></script>
+        <script src="{% static 'hdalab/lib/lodash.min.js' %}"></script>
         <script src="{% static 'hdalab/lib/mustache.js' %}"></script>
         <script src="{% static 'hdalab/lib/jquery-ui-1.10.4.min.js' %}"></script>
         <script type="text/javascript">
@@ -59,7 +59,7 @@
             <li><a id="mode" href="#"><span>Mode</span></a></li>
         </ul>
         <div id="morecategories">{% trans 'Voir plus ou moins de catégories' %}</div>
-        
+
         <h3>Recherche de catégories de Wikipédia&nbsp;: </h3>
         <p>
             <form id="catform"><input id="catsearch" placeholder="{% trans 'Entrez une catégorie'%}"/></form>
@@ -71,4 +71,4 @@
         </div>
     </div>
     <div id="tree" class="cattree"></div>
-{% endblock %}
\ No newline at end of file
+{% endblock %}
--- a/src/hdalab/templates/editorial/manage_renkans.html	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/hdalab/templates/editorial/manage_renkans.html	Mon Apr 27 17:29:51 2015 +0200
@@ -24,7 +24,7 @@
 <script type="text/javascript">
     var favorite = {{favorite}};
     initSearch(favorite);
-    
+
     var renkanActionMessages = {
         publish  : '{% trans "Are you sure you want to PUBLISH this renkan ?" %}',
         unpublish: '{% trans "Are you sure you want to UNPUBLISH this renkan ?" %}',
@@ -46,7 +46,7 @@
       <p>{% trans 'Modification date' %} : {% trans 'begin' %} <input type="text" name="startdate" value="{{ startdate }}" class="date" /> -
                                            {% trans 'end' %} : <input type="text" name="enddate" value="{{ enddate }}" class="date" /></p>
       <p>{% trans 'Username' %} : <input type="text" name="username" value="{{ username }}"/></p>
-      <p>{% trans 'State' %} : 
+      <p>{% trans 'State' %} :
         <select name="state">
             <option value=""></option>
             <option value="2"{% if state == '2' %} selected="selected"{% endif %}>{% trans 'Moderated' %}</option>
@@ -84,7 +84,7 @@
             <td>{{ r.modification_date|date:"Y-m-d H:i" }}</td>
             <td>{% thumbnail r.image 100x100 as thumb %}<img src="{{ thumb.url }}" width="{{ thumb.width }}" height="{{ thumb.height }}" /></td>
             <td>{{ hr.state|state_to_str }}</td>
-            <td>
+            <td class="renkan_list_actions">
                 <a title="View renkan" href="{% url 'renkan_view' %}?rk_id={{ r.rk_id }}" class="renkan-basic-action"><span class="ui-icon ui-icon-eye"></span></a>
                 <form action="{% url 'renkan_moderate' rk_id=r.rk_id %}" method="post">
                     {% csrf_token %}
@@ -102,4 +102,4 @@
     </table>
     <p>{% if page.has_previous %}<a href="?page={{ page.previous_page_number }}&sort={{ sort_param }}&order={{ order_param }}{{ filters }}" >{% trans 'Previous' %}</a>{% endif %}
        {% if page.has_previous and page.has_next %} - {% endif %}{% if page.has_next %}<a href="?page={{ page.next_page_number }}&sort={{ sort_param }}&order={{ order_param }}{{ filters }}">{% trans 'Next' %}</a>{% endif %}</p>
-{% endblock %}
\ No newline at end of file
+{% endblock %}
--- a/src/hdalab/templates/facettes.html	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/hdalab/templates/facettes.html	Mon Apr 27 17:29:51 2015 +0200
@@ -15,7 +15,7 @@
 {% block js_import %}
 {{block.super}}
         <script src="{% static 'hdalab/lib/raphael-min.js' %}"></script>
-        <script src="{% static 'hdalab/lib/underscore-min.js' %}"></script>
+        <script src="{% static 'hdalab/lib/lodash.min.js' %}"></script>
         <script src="{% static 'hdalab/lib/jquery-ui-1.10.4.min.js' %}"></script>
         <script src="{% static 'hdalab/lib/leaflet/leaflet-src.js' %}"></script>
         <script src="{% static 'hdalab/lib/leaflet-zoom-min/L.Control.ZoomMin.js' %}"></script>
@@ -23,7 +23,7 @@
 
         <script src="{% url 'jsi18n' 'hdalab' %}"></script>
         <script src="{% static 'hdalab/js/gomina.js?refresh' %}"></script>
-        
+
         <script type="text/javascript">
         gomNs.languageCode = '{{LANGUAGE_CODE}}';
         gomNs.urls = {
@@ -109,7 +109,7 @@
                         <input id="tagsearch" placeholder="{% trans 'Entrez un mot-clef' %}"/>
                     </form>
                     <div class="wpinfo">
-                        
+
                     </div>
                 </div>
             </div>
--- a/src/hdalab/templates/notice.html	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/hdalab/templates/notice.html	Mon Apr 27 17:29:51 2015 +0200
@@ -10,7 +10,7 @@
 
 {% block js_import %}
 {{block.super}}
-        <script src="{% static 'hdalab/lib/underscore-min.js' %}"></script>
+        <script src="{% static 'hdalab/lib/lodash.min.js' %}"></script>
         <script src="{% static 'hdalab/js/notice.js?refresh' %}"></script>
 {% endblock %}
 
@@ -55,5 +55,5 @@
     {% endfor %}
     </ul>
 </div>
-    
-{% endblock %}
\ No newline at end of file
+
+{% endblock %}
--- a/src/hdalab/templates/renkan_edit.html	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/hdalab/templates/renkan_edit.html	Mon Apr 27 17:29:51 2015 +0200
@@ -15,9 +15,9 @@
 {% block js_import %}
 {{block.super}}
         <script src="{% static 'hdalab/lib/bjqs-1.3.min.js' %}"></script>
-	    <script src="{% static 'renkanmanager/lib/jquery-ui/jquery-ui.js' %}"></script>
-		<script src="{% static 'renkanmanager/lib/jquery-mousewheel/jquery.mousewheel.js' %}"></script>
-        <script src="{% static 'renkanmanager/lib/underscore/underscore.js' %}"></script>
+        <script src="{% static 'renkanmanager/lib/jquery-ui/jquery-ui.js' %}"></script>
+        <script src="{% static 'renkanmanager/lib/jquery-mousewheel/jquery.mousewheel.js' %}"></script>
+        <script src="{% static 'renkanmanager/lib/lodash/lodash.js' %}"></script>
         <script src="{% static 'renkanmanager/lib/backbone/backbone.js' %}"></script>
         <script src="{% static 'renkanmanager/lib/backbone-relational/backbone-relational.js' %}"></script>
         <script src="{% static 'renkanmanager/lib/paper/paper-full.js' %}"></script>
@@ -82,11 +82,11 @@
                        node_fill_color: false*/
                     language: "{{LANGUAGE_CODE}}"
                 });
-                
+
                 //_create_user_//
-                
+
                 //_____________//
-                io_options = { 
+                io_options = {
                 		url: "{% url 'renkan_get_put' %}" + window.location.search,
                 		{% if user.is_authenticated %}
                 			user_authenticated: true,
@@ -97,10 +97,10 @@
                         {% endif %}
                 };
                 Rkns.jsonIOSaveOnClick(_renkan, io_options);
-                
+
                 _rkn = _renkan;
             };
-            
+
             $(function() {
                 var form;
 
@@ -113,8 +113,8 @@
 			    			dialog.dialog("close");
 			            });
                     }
-                });            
-                
+                });
+
                 function manageLoginForm(e, form){
                     e.preventDefault();
                     f = $(form);
@@ -129,9 +129,9 @@
                                 io_options.user_id= d.attr("id");
                                 io_options.user_name= $("#username",d).html();
                                 io_options.user_authenticated = true;
-                                
+
                                 _rkn.setCurrentUser(io_options.user_id, io_options.user_name);
-                                $("#menu.profile").html(d.html());                           
+                                $("#menu.profile").html(d.html());
                                 $(".Rk-Save-Button").click();
                                 dialog.dialog( "close" );
                                 return true;
@@ -147,11 +147,11 @@
                         }
                     });
                 }
-                
+
 			    form = dialog.find( "form" ).on( "submit", function( event ) {
 			        manageLoginForm(event, this);
 			    });
-			    
+
 			  //help dialog init
 			    var help_dialog = $( "#help-container" ).dialog({
 			        autoOpen: false,
@@ -172,10 +172,10 @@
 					     	showmarkers : false,
 					     	automatic: false
 					    });
-			        	
+
 			        	$("#toggle-help").click(function(){
 			        		if (help_dialog.dialog("isOpen")){
-			        			help_dialog.dialog("close");	
+			        			help_dialog.dialog("close");
 			        		}
 			        		else{
 			        			help_dialog.dialog("open");
@@ -187,7 +187,7 @@
 			    	}
 			    });
         	});
-            
+
         </script>
 {% endblock %}
 
@@ -234,4 +234,4 @@
     <div id="renkan"></div>
   </div>
 </div>
-{% endblock %}
\ No newline at end of file
+{% endblock %}
--- a/src/hdalab/templates/renkan_view.html	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/hdalab/templates/renkan_view.html	Mon Apr 27 17:29:51 2015 +0200
@@ -12,8 +12,7 @@
 {% block js_import %}
 {{block.super}}
         <script src="{% static 'renkanmanager/lib/jquery-mousewheel/jquery.mousewheel.js' %}"></script>
-        <script src="{% static 'renkanmanager/lib/underscore/underscore.js' %}"></script>
-        <script src="{% static 'renkanmanager/lib/backbone/backbone.js' %}"></script>
+        <script src="{% static 'renkanmanager/lib/lodash/lodash.js' %}"></script>
         <script src="{% static 'renkanmanager/lib/backbone-relational/backbone-relational.js' %}"></script>
         <script src="{% static 'renkanmanager/lib/paper/paper-full.js' %}"></script>
         <script type="text/javascript">
@@ -24,7 +23,7 @@
         <script src="{% static 'renkanmanager/lib/requirejs/require.js' %}"></script>
         <script src="{% static 'renkanmanager/lib/renkan/js/renkan.js' %}"></script>
         <script type="text/javascript">
-        
+
             function startRenkan(){
                 var _renkan = new Rkns.Renkan({
                     static_url : "{% static 'renkanmanager/lib/renkan/' %}",
@@ -48,5 +47,5 @@
   <div class="rnk-container">
     <div id="renkan"></div>
   </div>
-</div>    
-{% endblock %}
\ No newline at end of file
+</div>
+{% endblock %}
--- a/src/hdalab/templates/renkan_view_full.html	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/hdalab/templates/renkan_view_full.html	Mon Apr 27 17:29:51 2015 +0200
@@ -15,7 +15,7 @@
         <link rel="stylesheet" type="text/css" href="{% static 'renkanmanager/lib/renkan/css/renkan.css' %}" />
         <script src="{% static 'hdalab/lib/jquery.min.js' %}"></script>
         <script src="{% static 'renkanmanager/lib/jquery-mousewheel/jquery.mousewheel.js' %}"></script>
-        <script src="{% static 'renkanmanager/lib/underscore/underscore.js' %}"></script>
+        <script src="{% static 'renkanmanager/lib/lodash/lodash.js' %}"></script>
         <script src="{% static 'renkanmanager/lib/backbone/backbone.js' %}"></script>
         <script src="{% static 'renkanmanager/lib/backbone-relational/backbone-relational.js' %}"></script>
         <script src="{% static 'renkanmanager/lib/paper/paper-full.js' %}"></script>
@@ -27,7 +27,7 @@
         <script src="{% static 'renkanmanager/lib/requirejs/require.js' %}"></script>
         <script src="{% static 'renkanmanager/lib/renkan/js/renkan.js' %}"></script>
         <script type="text/javascript">
-        
+
             function startRenkan(){
                 var _renkan = new Rkns.Renkan({
                     static_url : "{% static 'renkanmanager/lib/renkan/' %}",
@@ -56,4 +56,4 @@
         </div>
       </main>
     </body>
-</html>
\ No newline at end of file
+</html>
--- a/src/hdalab/templates/thesaurus.html	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/hdalab/templates/thesaurus.html	Mon Apr 27 17:29:51 2015 +0200
@@ -13,7 +13,7 @@
 
 {% block js_import %}
 {{block.super}}
-        <script src="{% static 'hdalab/lib/underscore-min.js' %}"></script>
+        <script src="{% static 'hdalab/lib/lodash.min.js' %}"></script>
         <script src="{% static 'hdalab/lib/mustache.js' %}"></script>
         <script src="{% static 'hdalab/lib/jquery-ui-1.10.4.min.js' %}"></script>
         <script type="text/javascript">
@@ -40,18 +40,18 @@
         </ul>
         <p>Les mots-clés de ces branches ont été liés avec Wikipédia. Ils deviennent ainsi sémantiquement interopérables avec les tags d’HDA-Lab. Comme le montre l’interface, ce procédé permet d’organiser et de visualiser les tags et les ressources d'HDA-Lab en utilisant des thésaurus « métiers » externes. Dans cet extrait, le mot-clé « Cité jardin » est présenté, en vis-à-vis, dans deux univers sémantiques différents</p>
     </div>
-    
+
     <div class="column leftcol">
         <h3>Arborescence 1</h3>
         <div class="cattree">
-        
+
         </div>
     </div>
     <div class="separator"></div>
     <div class="column rightcol">
         <h3>Arborescence 2</h3>
         <div class="cattree">
-            
+
         </div>
     </div>
-{% endblock %}
\ No newline at end of file
+{% endblock %}
--- a/src/hdalab/views/ajax.py	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/hdalab/views/ajax.py	Mon Apr 27 17:29:51 2015 +0200
@@ -23,27 +23,27 @@
 logger = logging.getLogger(__name__)
 
 def tagtranslation(request):
-    
+
     lang = request.GET.get('lang',request.LANGUAGE_CODE)
     labels = request.GET.get('labels',None)
 
     if not labels:
         return HttpResponse(content=json.dumps({}), content_type='application/json')
-    
+
     labelslist = [lbl.strip() for lbl in labels.split(",")]
     masters = []
-    
+
     for lbl in labelslist:
         labelqs = Tag.objects.select_related('dbpedia_fields').filter(~Q(dbpedia_uri = None), label__iexact = lbl)[0:1]
         if len(labelqs) > 0:
             tag = labelqs.get()
             if tag.dbpedia_fields:
                 masters.append(tag.dbpedia_fields)
-    
+
     translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=lang)
-    
+
     translations = dict([(t.master.label, t.label) for t in translationqs])
-    
+
     return HttpResponse(content=json.dumps(translations), content_type='application/json')
 
 def subcat(category, globtags, level, max_level ):
@@ -63,7 +63,7 @@
             tag_in_list = {'label' : label, 'contents': []}
             resobj['themes'].append(tag_in_list)
             globtags[label] = {'level': (level + 1), 'access': tag_in_list }
-            
+
     if level < max_level:
         subcats = WpCategory.objects.filter(parent_categories__parent_category = category)
         resobj['themes'] += [subcat(subcats[i], globtags, level + 1, max_level ) for i in range(len(subcats))]
@@ -98,7 +98,7 @@
     master_category = WpCategory.objects.filter(label__iexact=label)[0:1]
     if len(master_category):
         resobj = subcat(master_category[0], globtags, 1, MAX_LEVEL )
-    
+
     #datasheets = Datasheet.objects.filter(validated = True, taggedsheet__tag__label__in = tag_list, taggedsheet__order__lte = MAX_TAG_ORDER).distinct()
     datasheets = Datasheet.objects.filter(validated = True, taggedsheet__tag__label__iexact = label, taggedsheet__order__lte = ROOT_MAX_TAG_ORDER).select_related('organisation').distinct()
     for datasheet in datasheets:
@@ -143,52 +143,52 @@
             'contents': []
         }
 
-    
+
     return HttpResponse(content=json.dumps(resobj), content_type='application/json')
 
 def sessioninfo(request):
-    
+
     data = json.loads(request.GET.get('data', "{}"))
     write = False
-    
+
     if 'sessionid' in request.GET:
         request.session['sessionid'] = request.GET['sessionid']
     if 'sessionkey' in request.GET:
         request.session['sessionkey'] = request.GET['sessionkey']
-        
+
     if 'sessionid' in request.session:
         sessionid = request.session['sessionid']
-        
+
         if HdaSession.objects.filter(sessionid=sessionid).count() == 1:
             sessionkey = request.session.get('sessionkey',None)
             hm = hmac.new(settings.SECRET_KEY, sessionid)
             if hm.hexdigest() == sessionkey:
-                write = True            
+                write = True
         else:
             del request.session['sessionid']
-        
+
     if 'sessionid' not in request.session:
         sessionid = unicode(uuid.uuid1())
         HdaSession.objects.create(sessionid=sessionid, data=json.dumps({}))
         write = True
         request.session['sessionid'] = sessionid
         request.session['sessionkey'] = hmac.new(settings.SECRET_KEY, sessionid).hexdigest()
-        
+
     if write and data:
         HdaSession.objects.filter(sessionid=sessionid).update(data=json.dumps(data))
     else:
         data = HdaSession.objects.get(sessionid=sessionid).data
         data = json.loads(data) if data else {}
-         
+
     resobj = {'data': data, "write_allowed" : write, "sessionid": sessionid }
     if write:
         resobj['sessionkey'] = request.session['sessionkey']
-        
+
     return HttpResponse(content=json.dumps(resobj), content_type='application/json')
 
 
 def tagsearch(request):
-    
+
     q = request.GET.get('term',None)
     maxcount = int(request.GET.get('count','40'))
     lang = request.GET.get('lang',request.LANGUAGE_CODE)
@@ -196,11 +196,11 @@
     count_notices_bool = True
     if count_notices_str:
         count_notices_bool = {'true': True, 'false': False, "0": False, "1": True}.get(count_notices_str.lower())
-    
+
     stemming_langs = [ 'fr', 'en', 'de', 'it' ]
     # For Japanese, there are no word boundaries, we should not use the regexp in that case
     no_translate_langs = [ 'fr' ]
-    
+
     if q:
         lq = q.lower()
         qs = Tag.objects.select_related('dbpedia_fields').filter(datasheet__validated=True)
@@ -217,22 +217,22 @@
                 qs = qs.filter(dbpedia_fields__translations__label__icontains=q, dbpedia_fields__translations__language_code=lang, dbpedia_fields__translations__is_label_translated = True)
     else:
         qs = Tag.objects.filter(~Q(dbpedia_uri = None))
-    
+
     if count_notices_bool:
         qs = qs.annotate(nb=Count('datasheet',distinct=True)).order_by('-nb')[:maxcount]
     else:
         qs = qs.distinct()[:maxcount]
-    
+
     qslist = list(qs)
-    
+
     if lang in no_translate_langs:
         translations = {}
     else:
         transqs = DbpediaFieldsTranslation.objects.filter(master__tag__in = qslist, language_code=lang, is_label_translated=True).select_related("master")
         translations = dict([(tr.master.tag_id, {'label':tr.label,'abstract':tr.abstract, 'is_label_translated': tr.is_label_translated}) for tr in transqs])
-    
+
     res = []
-    
+
     for t in qslist:
         if hasattr(t, 'dbpedia_fields'):
             dbfields = t.dbpedia_fields
@@ -240,7 +240,7 @@
             if count_notices_bool:
                 resobj['nb'] = t.nb
             resobj['thumbnail'] = dbfields.thumbnail if dbfields is not None else None
-            
+
             if t.id in translations:
                 resobj['value'] = translations[t.id]['label']
                 resobj['abstract'] = translations[t.id]['abstract']
@@ -249,27 +249,27 @@
                 resobj['abstract'] = dbfields.abstract if dbfields is not None else None
             if q is None or resobj['value'].lower().find(lq) != -1:
                 res.append(resobj)
-    
+
     return HttpResponse(content=json.dumps(res), content_type='application/json')
 
 def catsearch(request):
-    
+
     q = request.GET.get('term',None)
-    
+
     # On ne récupère que les catégories qui sont également des tags
     qrx = '(\\m|\\b)%s'%q
     qs = Tag.objects.filter(label__iregex=qrx)
-    
+
     labels = [tag.label for tag in qs]
-    
+
     qs = WpCategory.objects.annotate(nb=Count('child_categories__child_category__tags')).filter(label__in = labels, nb__gt=0)
-    
+
     res = [{'value':t.label} for t in qs]
-    
+
     return HttpResponse(content=json.dumps(res), content_type='application/json')
 
 def filter(request):
-    
+
     lang = request.GET.get('lang',request.LANGUAGE_CODE)
     periode = request.GET.get('period',None)
     label = request.GET.get('label', None)
@@ -278,38 +278,38 @@
     max_tag_order = int(request.GET.get('mto', '12'))
     content_count = request.GET.get('contentcount', 8)
     tag_count = request.GET.get('tagcount', 30)
-    
+
     outputstr = filter_generic(lang, periode, label, country, contentlist, max_tag_order, content_count, tag_count)
-        
+
     return HttpResponse(content=outputstr, content_type='application/json')
 
 
 def filter_generic(lang="fr-fr", periode=None, label=None, country=None, contentlist=None, max_tag_order=12, content_count=8, tag_count=30):
-    
+
     no_translate_langs = [ 'fr' ]
-    
+
     key_parts = ("filter",lang,periode,label,country,contentlist,max_tag_order,content_count,tag_count)
     key_parts = [unicode(p).encode("ascii", "ignore") for p in key_parts]
-    
+
     cache_key = fix_cache_key("-".join(key_parts))
-    
+
     outputstr = cache.get(cache_key)
-    
+
     if outputstr is None:
-        
+
         matchtagids = []
-        
+
         tagqs = Tag.objects.exclude(category__label__in = ['Datation', 'Localisation', 'Discipline artistique']).filter(~Q(dbpedia_uri = None))
         countryqs = Country.objects
         discqs = Tag.objects.filter(~Q(dbpedia_uri = None), category__label = u'Discipline artistique').select_related('dbpedia_fields')
         yearqs = TagYears.objects
-        
+
         contentqs = Datasheet.objects.filter(validated=True)
         labeltranslations = []
-    
+
         if label or periode or country or contentlist :
             matchtagqslist = []
-            
+
             if periode:
                 years = periode.split(",")
                 start_year = int(years[0])
@@ -318,18 +318,18 @@
                 minstart = start_year - delta
                 maxend = end_year + delta
                 matchtagqs = Tag.objects.filter(~Q(dbpedia_uri = None),
-                                                years__end_year__gte = start_year, 
+                                                years__end_year__gte = start_year,
                                                 years__start_year__lte = end_year,
                                                 years__end_year__lte = maxend,
                                                 years__start_year__gte = minstart,
                                                 )
                 matchtagqslist.append(matchtagqs)
-                
+
             if label:
                 for txtlbl in label.split(","):
                     matchtagqs = Tag.objects.select_related('dbpedia_fields').filter(~Q(dbpedia_uri = None), label__iexact = txtlbl.strip())
                     matchtagqslist.append(matchtagqs)
-                
+
             if country:
                 for country_uri in country.split(","):
                     matchtagqs = Tag.objects.filter(~Q(dbpedia_uri = None),locatedin__country__dbpedia_uri = country_uri)
@@ -345,40 +345,40 @@
                 newcondid = Q(id__in = matchtagqs)
                 tagcond = newcond if tagcond is None else (tagcond & newcond)
                 tagcondid = newcondid if tagcondid is None else (tagcondid | newcondid)
-            
+
             contentqs = contentqs.filter(tagcond).distinct()
             matchtagidsqs = list(Tag.objects.select_related("dbpedia_fields").only("id").filter(tagcondid))
             matchtagids = [t.id for t in matchtagidsqs]
-            
+
             if lang not in no_translate_langs:
                 masters = [t.dbpedia_fields for t in matchtagidsqs if t.dbpedia_fields is not None]
-                
-                translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=lang)    
+
+                translationqs = DbpediaFieldsTranslation.objects.select_related("master", "master__tag").filter(master__in = masters, language_code=lang)
                 labeltranslations = [{'label':t.master.label, 'translated_label':t.label} for t in translationqs]
-            
+
             tagqs = tagqs.filter(datasheet__in = contentqs)
             countryqs = countryqs.filter(includes__tag__taggedsheet__datasheet__in = contentqs)
             discqs = discqs.filter(datasheet__in = contentqs)
             yearqs = yearqs.filter(tag__taggedsheet__datasheet__in = contentqs)
-            
+
         if contentlist is None:
             contentqs.order_by('?')
-                        
+
         cont_count = contentqs.count()
-        
+
         logger.debug("ajax filter SQL for contentqs %s", contentqs.query)
-        
+
         contenus = dict([(content.id, {'score' : 0, 'tags' : [], 'hda_id': content.hda_id, 'id':content.id, 'title': content.title, 'description': content.description, 'url': content.url}) for content in contentqs[0:content_count]])
         contentids = contenus.keys()
-        
+
         qs = DatasheetExtras.objects.select_related('insee').filter(datasheet__in = contentids)
         for dse in qs:
             contenus[dse.datasheet_id]['coords'] = {'city_name': dse.insee.city_name, 'latitude': dse.insee.latitude, 'longitude': dse.insee.longitude}
-        
+
         qs = list(TaggedSheet.objects.select_related('tag', 'tag__dbpedia_fields').filter(datasheet__in = contentids, order__lte = max_tag_order).order_by('order'))
-        
+
         translations = {}
-        
+
         if lang not in no_translate_langs:
             ts_list = []
             for ts in qs:
@@ -386,69 +386,69 @@
                     ts_list.append(ts.tag.dbpedia_fields)
             transqs = DbpediaFieldsTranslation.objects.filter(master__in = ts_list, language_code = lang)
             translations = dict([(trans.master_id,trans.label) for trans in transqs])
-        
+
         for ts in qs:
             if hasattr(ts, 'tag') and hasattr(ts.tag, 'dbpedia_fields') :
                 match_tag = ts.tag.id in matchtagids
-                contenus[ts.datasheet_id]['tags'].append({'id': ts.tag.id, 
-                                                          'label': ts.tag.label, 
-                                                          'order': ts.order, 
-                                                          'match': match_tag, 
+                contenus[ts.datasheet_id]['tags'].append({'id': ts.tag.id,
+                                                          'label': ts.tag.label,
+                                                          'order': ts.order,
+                                                          'match': match_tag,
                                                           'translated_label': translations.get(ts.tag.dbpedia_fields.id, ts.tag.label) if ts.tag.dbpedia_fields is not None else ts.tag.label,
                                                           'url': ts.tag.dbpedia_uri,
                                                           'wkpd_url': ts.tag.wikipedia_url})
-                
+
                 if match_tag:
                     contenus[ts.datasheet_id]['score'] += 2*max_tag_order - ts.order
-            
+
         if contentlist is None:
             contenus = sorted(contenus.values(),key=lambda e: -e['score'])
         else:
             contenus = contenus.values()
-    
+
         #tagqs = tagqs.annotate(nb=Count('datasheet')).order_by('-nb')[:tag_count]
-        tagqs = tagqs.annotate(nb=Count('datasheet')).order_by('-nb').only('id','label')[:tag_count]
+        tagqs = tagqs.annotate(nb=Count('datasheet')).order_by('-nb').only('id','label', 'dbpedia_uri', 'wikipedia_url')[:tag_count]
         #.select_related('dbpedia_fields')
         # hack to add only necessary fields in the group by
         # contournement bug https://code.djangoproject.com/ticket/17144
-        tagqs.query.clear_select_fields()
-        tagqs.query.add_fields(['id','label'], False)
-        tagqs.query.set_group_by()
-    
+        #tagqs.query.clear_select_fields()
+        #tagqs.query.add_fields(['id','label'], False)
+        #tagqs.query.set_group_by()
+
         tagqslist = list(tagqs)
-        
+
         dbpediafields = dict([(df.tag_id, df) for df in DbpediaFields.objects.filter(tag__in = tagqslist)])
 
         if lang not in no_translate_langs:
             transqs = DbpediaFieldsTranslation.objects.filter(master__in = dbpediafields.values(), language_code = lang)
             translations = dict([(trans.master_id,trans.label) for trans in transqs])
-    
-        tags = [{'id': tag.id, 
+
+        tags = [{'id': tag.id,
                  'label': tag.label,
-                 'score': tag.nb, 
+                 'score': tag.nb,
                  'thumbnail': dbpediafields[tag.id].thumbnail if tag.id in dbpediafields else None,
                  'translated_label': translations.get(dbpediafields[tag.id].id, tag.label) if tag.id in dbpediafields else tag.label,
                  'url': tag.dbpedia_uri,
                  'wkpd_url': tag.wikipedia_url} for tag in tagqslist]
-    
+
         countryqs = countryqs.annotate(nb=Count('includes__tag__taggedsheet'))
         countries = dict([(country.dbpedia_uri, country.nb) for country in countryqs])
-    
+
         discqslist = list(discqs.annotate(nb=Count('taggedsheet')).order_by('-nb')[:10])
 
         if lang not in no_translate_langs:
             list_dbpediafields = [tag.dbpedia_fields for tag in discqslist if tag.dbpedia_fields is not None]
             transqs = DbpediaFieldsTranslation.objects.filter(master__in = list_dbpediafields, language_code = lang)
             translations = dict([(trans.master_id,trans.label) for trans in transqs])
-        
+
         disciplines = [{'label':tag.label,'score':tag.nb, 'translated_label': translations.get(tag.dbpedia_fields.id, tag.label) if tag.dbpedia_fields is not None else tag.label} for tag in discqslist]
-        
+
         years = {}
         yearqs = yearqs.annotate(nb=Count('tag__taggedsheet'))
         for ty in yearqs:
             for year in range(ty.start_year, ty.end_year):
                 years[year] = ty.nb + (years[year] if year in years else 0)
-                
+
         yearchange = []
         for year in sorted(years.keys()):
             score = years[year]
@@ -457,51 +457,51 @@
                     yearchange.append({'year': year, 'score': score})
                 if year+1 not in years and year != -1 and score != 0:
                     yearchange.append({'year': year+1, 'score': 0})
-    
+
         tag_translations = {}
         for t in itertools.chain(labeltranslations,disciplines,tags):
             tag_translations[t['label']] = t['translated_label']
         for c in contenus:
             for t in c['tags']:
                 tag_translations[t['label']] = t['translated_label']
-        
+
         output = {'count': cont_count, 'contents': contenus, 'tags':tags, 'sparkline':yearchange, 'countries':countries, 'disciplines':disciplines, 'tagtranslations': tag_translations}
         outputstr = json.dumps(output)
         cache.set(cache_key, outputstr)
-    
+
     return outputstr
-    
+
 
 
 def subtree(tree):
     MAX_TAG_ORDER = 16
     label = tree['label']
     sub = tree.get('contents',[])
-    
+
     datasheets = Datasheet.objects.filter(validated = True, taggedsheet__tag__label__iexact = label, taggedsheet__order__lte = MAX_TAG_ORDER).annotate(tagorder=Min('taggedsheet__order')).select_related('organisation').distinct()
-    
+
     contents = [{ 'description': ds.description, 'title': ds.title, 'url': ds.url, 'score': int((MAX_TAG_ORDER - ds.tagorder)/2), 'id': ds.id, 'hda_id': ds.hda_id, 'organization': ds.organisation.name, 'organization_url': ds.organisation.website } for ds in datasheets]
-    
+
     contents = sorted(contents, key=lambda e: -e['score'])
-    
+
     res = { 'label': label }
-    
+
     if len(contents):
         res['contents'] = contents
-    
+
     if len(sub):
         subcats = [subtree(st) for st in sub]
         subcats = [sc for sc in subcats if len(sc.get('contents',[])) or len(sc.get('themes',[]))]
         res['themes'] = subcats
-    
+
     return res
 
 def filltree(request):
-    
+
     tree = request.GET.get('tree','{}')
-    
+
     treeobj = json.loads(tree)
-    
+
     res = subtree(treeobj)
-        
+
     return HttpResponse(content=json.dumps(res), content_type='application/json')
--- a/src/requirement.txt	Fri Apr 03 18:41:06 2015 +0200
+++ b/src/requirement.txt	Mon Apr 27 17:29:51 2015 +0200
@@ -1,1 +1,1 @@
-renkanmanager (==0.8.7)
+renkanmanager (==0.9)