[IMP] base: apps integration

This commit is contained in:
Christophe Simonis 2014-10-21 12:48:19 +02:00
parent 68134d38a3
commit 0b6078dfea
4 changed files with 134 additions and 53 deletions

View File

@ -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;
} }

View File

@ -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

View File

@ -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:

View File

@ -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");