[IMP] base: apps integration
This commit is contained in:
parent
68134d38a3
commit
0b6078dfea
|
@ -41,6 +41,10 @@
|
||||||
margin-right: 0px !important;
|
margin-right: 0px !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.apps-client {
|
||||||
|
border: 0;
|
||||||
|
}
|
||||||
|
|
||||||
.oe_notification {
|
.oe_notification {
|
||||||
z-index: 1600;
|
z-index: 1600;
|
||||||
}
|
}
|
||||||
|
|
|
@ -161,6 +161,9 @@ $sheet-padding: 16px
|
||||||
.oe_systray
|
.oe_systray
|
||||||
margin-right: 0px !important
|
margin-right: 0px !important
|
||||||
|
|
||||||
|
.apps-client
|
||||||
|
border: 0
|
||||||
|
|
||||||
// Notifications {{{
|
// Notifications {{{
|
||||||
.oe_notification
|
.oe_notification
|
||||||
z-index: 1600
|
z-index: 1600
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
##############################################################################
|
##############################################################################
|
||||||
#
|
#
|
||||||
# OpenERP, Open Source Management Solution
|
# OpenERP, Open Source Management Solution
|
||||||
# Copyright (C) 2004-2013 OpenERP S.A. (<http://openerp.com>).
|
# Copyright (C) 2004-2014 OpenERP S.A. (<http://openerp.com>).
|
||||||
#
|
#
|
||||||
# This program is free software: you can redistribute it and/or modify
|
# This program is free software: you can redistribute it and/or modify
|
||||||
# it under the terms of the GNU Affero General Public License as
|
# it under the terms of the GNU Affero General Public License as
|
||||||
|
@ -664,7 +664,7 @@ class module(osv.osv):
|
||||||
|
|
||||||
apps_server = urlparse.urlparse(self.get_apps_server(cr, uid, context=context))
|
apps_server = urlparse.urlparse(self.get_apps_server(cr, uid, context=context))
|
||||||
|
|
||||||
OPENERP = 'openerp'
|
OPENERP = openerp.release.product_name.lower()
|
||||||
tmp = tempfile.mkdtemp()
|
tmp = tempfile.mkdtemp()
|
||||||
_logger.debug('Install from url: %r', urls)
|
_logger.debug('Install from url: %r', urls)
|
||||||
try:
|
try:
|
||||||
|
|
|
@ -1,27 +1,18 @@
|
||||||
openerp.base = function(instance) {
|
openerp.base = function(instance) {
|
||||||
|
|
||||||
instance.base.apps_remote = null;
|
|
||||||
instance.base.apps_client = null;
|
instance.base.apps_client = null;
|
||||||
|
|
||||||
var _t = instance.web._t;
|
var _t = instance.web._t;
|
||||||
|
|
||||||
instance.base.Apps = instance.web.Widget.extend({
|
instance.base.Apps = instance.web.Widget.extend({
|
||||||
template: 'EmptyComponent',
|
template: 'EmptyComponent',
|
||||||
remote_action_id: 'loempia.action_embed',
|
remote_action_tag: 'loempia.embed',
|
||||||
failback_action_id: 'base.open_module_tree',
|
failback_action_id: 'base.open_module_tree',
|
||||||
|
|
||||||
init: function(parent, action) {
|
init: function(parent, action) {
|
||||||
this._super(parent, action);
|
this._super(parent, action);
|
||||||
var options = action.params || {};
|
var options = action.params || {};
|
||||||
|
this.params = options; // NOTE forwarded to embedded client action
|
||||||
if (options.apps_user) {
|
|
||||||
sessionStorage.setItem('apps.login', options.apps_user);
|
|
||||||
}
|
|
||||||
if (options.apps_access_token) {
|
|
||||||
sessionStorage.setItem('apps.access_token', options.apps_access_token);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.params = options; // NOTE read by embedded client action
|
|
||||||
},
|
},
|
||||||
|
|
||||||
get_client: function() {
|
get_client: function() {
|
||||||
|
@ -33,28 +24,7 @@ openerp.base = function(instance) {
|
||||||
d.reject(client);
|
d.reject(client);
|
||||||
};
|
};
|
||||||
i.onload = function() {
|
i.onload = function() {
|
||||||
client.session.session_bind(client.origin).then(function() {
|
d.resolve(client);
|
||||||
// check if client can authenticate
|
|
||||||
client.authenticate().then(
|
|
||||||
function() { /* done */
|
|
||||||
d.resolve(client);
|
|
||||||
}, function() { /* fail */
|
|
||||||
if (client.login === 'anonymous') {
|
|
||||||
d.reject(client);
|
|
||||||
} else {
|
|
||||||
sessionStorage.removeItem('apps.login');
|
|
||||||
sessionStorage.removeItem('apps.access_token');
|
|
||||||
client.bind_credentials(client.dbname, 'anonymous', 'anonymous');
|
|
||||||
client.authenticate().then(
|
|
||||||
function() { /* done */
|
|
||||||
d.resolve(client);
|
|
||||||
}, function() { /* fail */
|
|
||||||
d.reject(client);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
};
|
};
|
||||||
var ts = new Date().getTime();
|
var ts = new Date().getTime();
|
||||||
i.src = _.str.sprintf('%s/web/static/src/img/sep-a.gif?%s', client.origin, ts);
|
i.src = _.str.sprintf('%s/web/static/src/img/sep-a.gif?%s', client.origin, ts);
|
||||||
|
@ -71,12 +41,10 @@ openerp.base = function(instance) {
|
||||||
if (dbname[0] === '/') {
|
if (dbname[0] === '/') {
|
||||||
dbname = dbname.substr(1);
|
dbname = dbname.substr(1);
|
||||||
}
|
}
|
||||||
var login = (sessionStorage ? sessionStorage.getItem('apps.login') : null) || 'anonymous';
|
var client = {
|
||||||
var passwd = (sessionStorage ? sessionStorage.getItem('apps.access_token') : null) || 'anonymous';
|
origin: host,
|
||||||
if (_.isNull(instance.base.apps_remote)) {
|
dbname: dbname
|
||||||
instance.base.apps_remote = new openerp.init();
|
};
|
||||||
}
|
|
||||||
var client = new instance.base.apps_remote.web.EmbeddedClient(null, host, dbname, login, passwd);
|
|
||||||
instance.base.apps_client = client;
|
instance.base.apps_client = client;
|
||||||
return check_client_available(client);
|
return check_client_available(client);
|
||||||
});
|
});
|
||||||
|
@ -84,35 +52,141 @@ openerp.base = function(instance) {
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
if (instance.base.apps_client) {
|
$(window).off("message.apps");
|
||||||
instance.base.apps_client.destroy();
|
if (this.$ifr) {
|
||||||
|
this.$ifr.remove();
|
||||||
|
this.$ifr = null;
|
||||||
}
|
}
|
||||||
return this._super();
|
return this._super();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_on_message: function($e) {
|
||||||
|
var self = this, client = this.client, e = $e.originalEvent;
|
||||||
|
|
||||||
|
if (e.origin !== client.origin) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var dispatcher = {
|
||||||
|
'event': function(m) { self.trigger('message:' + m.event, m); },
|
||||||
|
'action': function(m) {
|
||||||
|
self.do_action(m.action).then(function(r) {
|
||||||
|
var w = self.$ifr[0].contentWindow;
|
||||||
|
w.postMessage({id: m.id, result: r}, client.origin);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
'rpc': function(m) {
|
||||||
|
self.session.rpc.apply(self.session, m.args).then(function(r) {
|
||||||
|
var w = self.$ifr[0].contentWindow;
|
||||||
|
w.postMessage({id: m.id, result: r}, client.origin);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
'Model': function(m) {
|
||||||
|
var M = new instance.web.Model(m.model);
|
||||||
|
M[m.method].apply(M, m.args).then(function(r) {
|
||||||
|
var w = self.$ifr[0].contentWindow;
|
||||||
|
w.postMessage({id: m.id, result: r}, client.origin);
|
||||||
|
});
|
||||||
|
},
|
||||||
|
};
|
||||||
|
// console.log(e.data);
|
||||||
|
if (!_.isObject(e.data)) { return; }
|
||||||
|
if (dispatcher[e.data.type]) {
|
||||||
|
dispatcher[e.data.type](e.data);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
start: function() {
|
start: function() {
|
||||||
var self = this;
|
var self = this;
|
||||||
// desactivated for now because apps does not work anyway due to changes in the framework
|
return self.get_client().
|
||||||
/*return self.get_client().
|
|
||||||
done(function(client) {
|
done(function(client) {
|
||||||
client.replace(self.$el).
|
self.client = client;
|
||||||
done(function() {
|
|
||||||
client.$el.removeClass('openerp');
|
var qs = (instance.session.debug ? 'debug&' : '') + 'db=' + client.dbname;
|
||||||
client.do_action(self.remote_action_id, {hide_breadcrumb: true});
|
var u = client.origin + '/apps/embed/client?' + qs;
|
||||||
|
var css = {width: '100%', height: '400px'};
|
||||||
|
self.$ifr = $('<iframe>').attr('src', u);
|
||||||
|
|
||||||
|
$(window).on("message.apps", self.proxy('_on_message'));
|
||||||
|
|
||||||
|
self.on('message:ready', self, function(m) {
|
||||||
|
var w = this.$ifr[0].contentWindow;
|
||||||
|
var act = {
|
||||||
|
type: 'ir.actions.client',
|
||||||
|
tag: this.remote_action_tag,
|
||||||
|
params: _.extend({}, this.params, {
|
||||||
|
db: this.session.db,
|
||||||
|
origin: this.session.origin,
|
||||||
|
})
|
||||||
|
};
|
||||||
|
w.postMessage({type:'action', action: act}, client.origin);
|
||||||
|
});
|
||||||
|
|
||||||
|
self.on('message:set_height', self, function(m) {
|
||||||
|
this.$ifr.height(m.height);
|
||||||
|
});
|
||||||
|
|
||||||
|
self.on('message:update_count', self, function(m) {
|
||||||
|
var count = m.count
|
||||||
|
var get_upd_menu_id = function() {
|
||||||
|
if (_.isUndefined(self._upd_menu_id)) {
|
||||||
|
var IMD = new instance.web.Model('ir.model.data');
|
||||||
|
return IMD.call('get_object_reference', ['base', 'menu_module_updates']).then(function(r) {
|
||||||
|
var mid = r[1];
|
||||||
|
if(r[0] !== 'ir.ui.menu') {
|
||||||
|
// invalid reference, return null
|
||||||
|
mid = null;
|
||||||
|
}
|
||||||
|
self._upd_menu_id = mid;
|
||||||
|
return mid;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
return $.Deferred().resolve(self._upd_menu_id).promise();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
$.when(get_upd_menu_id()).done(function(menu_id) {
|
||||||
|
if (_.isNull(menu_id)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
var $menu = instance.webclient.menu.$secondary_menus.find(_.str.sprintf('a[data-menu=%s]', menu_id));
|
||||||
|
if ($menu.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (_.isUndefined(count)) {
|
||||||
|
count = 0;
|
||||||
|
}
|
||||||
|
var needupdate = $menu.find('#menu_counter');
|
||||||
|
if (needupdate && needupdate.length !== 0) {
|
||||||
|
if (count > 0) {
|
||||||
|
needupdate.text(count);
|
||||||
|
} else {
|
||||||
|
needupdate.remove();
|
||||||
|
}
|
||||||
|
} else if (count > 0) {
|
||||||
|
$menu.append(instance.web.qweb.render("Menu.needaction_counter", {widget: {needaction_counter: count}}));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
self.on('message:blockUI', self, function() { instance.web.blockUI(); });
|
||||||
|
self.on('message:unblockUI', self, function() { instance.web.unblockUI(); });
|
||||||
|
self.on('message:warn', self, function(m) {instance.webclient.do_warn(m.title, m.message, m.sticky); });
|
||||||
|
|
||||||
|
self.$ifr.appendTo(self.$el).css(css).addClass('apps-client');
|
||||||
}).
|
}).
|
||||||
fail(function(client) {*/
|
fail(function(client) {
|
||||||
self.do_warn(_t('Odoo Apps will be available soon'), _t('Showing locally available modules'), true);
|
self.do_warn(_t('Odoo Apps will be available soon'), _t('Showing locally available modules'), true);
|
||||||
self.rpc('/web/action/load', {action_id: self.failback_action_id}).done(function(action) {
|
self.rpc('/web/action/load', {action_id: self.failback_action_id}).done(function(action) {
|
||||||
self.do_action(action);
|
self.do_action(action);
|
||||||
instance.webclient.menu.open_action(action.id);
|
instance.webclient.menu.open_action(action.id);
|
||||||
});
|
});
|
||||||
//});
|
});
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
instance.base.AppsUpdates = instance.base.Apps.extend({
|
instance.base.AppsUpdates = instance.base.Apps.extend({
|
||||||
remote_action_id: 'loempia.action_embed_updates'
|
remote_action_tag: 'loempia.embed.updates',
|
||||||
});
|
});
|
||||||
|
|
||||||
instance.web.client_actions.add("apps", "instance.base.Apps");
|
instance.web.client_actions.add("apps", "instance.base.Apps");
|
||||||
|
|
Loading…
Reference in New Issue