position: "last"
});
};
+ callback.remove = function(f) {
+ callback.callback_chain = _.difference(callback.callback_chain, _.filter(callback.callback_chain, function(el) {
+ return el.callback === f;
+ }));
+ return callback;
+ };
return callback.add({
callback: method,
}
}
}
+ },
+ /**
+ * Proxies a method of the object, in order to keep the right ``this`` on
+ * method invocations.
+ *
+ * This method is similar to ``Function.prototype.bind`` or ``_.bind``, and
+ * even more so to ``jQuery.proxy`` with a fundamental difference: its
+ * resolution of the method being called is lazy, meaning it will use the
+ * method as it is when the proxy is called, not when the proxy is created.
+ *
+ * Other methods will fix the bound method to what it is when creating the
+ * binding/proxy, which is fine in most javascript code but problematic in
+ * OpenERP Web where developers may want to replace existing callbacks with
+ * theirs.
+ *
+ * The semantics of this precisely replace closing over the method call.
+ *
+ * @param {String} method_name name of the method to invoke
+ * @returns {Function} proxied method
+ */
+ proxy: function (method_name) {
+ var self = this;
+ return function () {
+ return self[method_name].apply(self, arguments);
+ }
}
});
this.context = {};
this.shortcuts = [];
this.active_id = null;
- this.ready = $.Deferred();
return this.session_init();
},
/**
var self = this;
// TODO: session store in cookie should be optional
this.session_id = this.get_cookie('session_id');
- return this.rpc("/web/session/get_session_info", {}).pipe(function(result) {
+ return this.session_reload().pipe(function(result) {
+ var modules = openerp._modules.join(',');
+ var deferred = self.rpc('/web/webclient/qweblist', {mods: modules}).pipe(self.do_load_qweb);
+ if(self.session_is_valid()) {
+ return deferred.pipe(function() { return self.load_modules(); });
+ }
+ return deferred;
+ });
+ },
+ /**
+ * (re)loads the content of a session: db name, username, user id, session
+ * context and status of the support contract
+ *
+ * @returns {$.Deferred} deferred indicating the session is done reloading
+ */
+ session_reload: function () {
+ var self = this;
+ return this.rpc("/web/session/get_session_info", {}).then(function(result) {
// If immediately follows a login (triggered by trying to restore
// an invalid session or no session at all), refresh session data
// (should not change, but just in case...)
user_context: result.context,
openerp_entreprise: result.openerp_entreprise
});
- var modules = openerp._modules.join(',');
- var deferred = self.rpc('/web/webclient/qweblist', {mods: modules}).pipe(self.do_load_qweb);
- if(self.session_is_valid()) {
- return deferred.pipe(function() { self.load_modules(); });
- }
- return deferred;
});
},
session_is_valid: function() {
/**
* The session is validated either by login or by restoration of a previous session
*/
- session_authenticate: function(db, login, password, volatile) {
+ session_authenticate: function(db, login, password, _volatile) {
var self = this;
var base_location = document.location.protocol + '//' + document.location.host;
var params = { db: db, login: login, password: password, base_location: base_location };
user_context: result.context,
openerp_entreprise: result.openerp_entreprise
});
- if (!volatile) {
+ if (!_volatile) {
self.set_cookie('session_id', self.session_id);
}
return self.load_modules();
},
session_logout: function() {
this.set_cookie('session_id', '');
- window.location.reload();
+ },
+ on_session_valid: function() {
},
/**
* Called when a rpc call fail due to an invalid session.
});
})
).then(function() {
- self.ready.resolve();
+ self.on_modules_loaded();
+ self.on_session_valid();
});
});
},
var head = document.head || document.getElementsByTagName('head')[0];
head.appendChild(tag);
} else {
- self.on_modules_loaded();
d.resolve();
}
return d;