diff --git a/web_easy_switch_company/__init__.py b/web_easy_switch_company/__init__.py new file mode 100644 index 00000000..546a4603 --- /dev/null +++ b/web_easy_switch_company/__init__.py @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Web Easy Switch Company module for OpenERP +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +from . import model +from . import controllers diff --git a/web_easy_switch_company/__openerp__.py b/web_easy_switch_company/__openerp__.py new file mode 100644 index 00000000..05f0ea9d --- /dev/null +++ b/web_easy_switch_company/__openerp__.py @@ -0,0 +1,71 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Web Easy Switch Company module for OpenERP +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +{ + 'name': 'Multicompany - Easy Switch Company', + 'version': '1.0', + 'category': 'web', + 'description': """ +Add menu to allow user to switch to another company more easily +=============================================================== + +Functionality: +-------------- + * Add a new menu in the top bar to switch to another company more easily; + * Remove the old behaviour to switch company; + +Documentations: +--------------- + * Video : http://www.youtube.com/watch?v=Cpm6dg-IEQQ + +Technical information: +---------------------- + * Create a field function 'logo_topbar' in res_company to have a good""" + """resized logo; + +Limits: +------- + * It would be interesting to show the structure of the companies; + +Copyright, Author and Licence: +------------------------------ + * Copyright: 2014, Groupement Régional Alimentaire de Proximité; + * Author: Sylvain LE GAL (https://twitter.com/legalsylvain); + * Licence: AGPL-3 (http://www.gnu.org/licenses/)""", + 'author': 'GRAP', + 'website': 'http://www.grap.coop', + 'license': 'AGPL-3', + 'depends': [ + 'web', + ], + 'data': [ + 'view/res_users_view.xml', + ], + 'js': [ + 'static/src/js/switch_company.js', + ], + 'qweb': [ + 'static/src/xml/switch_company.xml', + ], + 'installable': True, + 'auto_install': False, +} diff --git a/web_easy_switch_company/controllers/__init__.py b/web_easy_switch_company/controllers/__init__.py new file mode 100644 index 00000000..b40fe569 --- /dev/null +++ b/web_easy_switch_company/controllers/__init__.py @@ -0,0 +1,23 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Web Easy Switch Company module for OpenERP +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import main diff --git a/web_easy_switch_company/controllers/main.py b/web_easy_switch_company/controllers/main.py new file mode 100644 index 00000000..b8b6a2b6 --- /dev/null +++ b/web_easy_switch_company/controllers/main.py @@ -0,0 +1,36 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Web Easy Switch Company module for OpenERP +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## +import openerp +import openerp.http as http +from openerp.http import request + +class WebEasySwitchCompanyController(http.Controller): + + @http.route('/web_easy_switch_company/switch/change_current_company', type='json', auth='none') + def change_current_company(self, company_id): + registry = openerp.modules.registry.RegistryManager.get(request.session.db) + uid = request.session.uid + context = request.session.context + with registry.cursor() as cr: + res = registry.get("res.users").change_current_company(cr, uid, company_id) + return res + diff --git a/web_easy_switch_company/model/__init__.py b/web_easy_switch_company/model/__init__.py new file mode 100644 index 00000000..e1bd2b92 --- /dev/null +++ b/web_easy_switch_company/model/__init__.py @@ -0,0 +1,24 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Web Easy Switch Company module for OpenERP +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from . import res_users +from . import res_company diff --git a/web_easy_switch_company/model/res_company.py b/web_easy_switch_company/model/res_company.py new file mode 100644 index 00000000..000e21e1 --- /dev/null +++ b/web_easy_switch_company/model/res_company.py @@ -0,0 +1,57 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Web Easy Switch Company module for OpenERP +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.osv import fields +from openerp.osv.orm import Model +from openerp.tools import image_resize_image + + +class res_company(Model): + _inherit = 'res.company' + + # Custom Section + def _switch_company_get_companies_from_partner( + self, cr, uid, ids, context=None): + return self.pool['res.company'].search( + cr, uid, [('partner_id', 'in', ids)], context=context) + + # Fields function Section + def _get_logo_topbar(self, cr, uid, ids, _field_name, _args, context=None): + result = dict.fromkeys(ids, False) + for record in self.browse(cr, uid, ids, context=context): + size = (48, 48) + result[record.id] = image_resize_image( + record.partner_id.image, size) + return result + + # Columns Section + _columns = { + 'logo_topbar': fields.function( + _get_logo_topbar, + string="Logo displayed in the switch company menu", + type="binary", store={ + 'res.company': (lambda s, c, u, i, x: i, ['partner_id'], 10), + 'res.partner': (_switch_company_get_companies_from_partner, + ['image'], 10), + } + ), + } diff --git a/web_easy_switch_company/model/res_users.py b/web_easy_switch_company/model/res_users.py new file mode 100644 index 00000000..c2ab2c13 --- /dev/null +++ b/web_easy_switch_company/model/res_users.py @@ -0,0 +1,31 @@ +# -*- encoding: utf-8 -*- +# ############################################################################# +# +# Web Easy Switch Company module for OpenERP +# Copyright (C) 2014 GRAP (http://www.grap.coop) +# @author Sylvain LE GAL (https://twitter.com/legalsylvain) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + +from openerp.osv.orm import Model + + +class res_users(Model): + _inherit = 'res.users' + + # Custom Function Section + def change_current_company(self, cr, uid, company_id, context=None): + return self.write(cr, uid, uid, {'company_id': company_id}) diff --git a/web_easy_switch_company/static/src/img/icon.png b/web_easy_switch_company/static/src/img/icon.png new file mode 100644 index 00000000..ee270eb3 Binary files /dev/null and b/web_easy_switch_company/static/src/img/icon.png differ diff --git a/web_easy_switch_company/static/src/img/selection-off.png b/web_easy_switch_company/static/src/img/selection-off.png new file mode 100644 index 00000000..c8e922cc Binary files /dev/null and b/web_easy_switch_company/static/src/img/selection-off.png differ diff --git a/web_easy_switch_company/static/src/img/selection-on.png b/web_easy_switch_company/static/src/img/selection-on.png new file mode 100644 index 00000000..8faf7d4d Binary files /dev/null and b/web_easy_switch_company/static/src/img/selection-on.png differ diff --git a/web_easy_switch_company/static/src/js/switch_company.js b/web_easy_switch_company/static/src/js/switch_company.js new file mode 100644 index 00000000..e2e7add4 --- /dev/null +++ b/web_easy_switch_company/static/src/js/switch_company.js @@ -0,0 +1,155 @@ +/****************************************************************************** + Web Easy Switch Company module for OpenERP + Copyright (C) 2014 GRAP (http://www.grap.coop) + @author Sylvain LE GAL (https://twitter.com/legalsylvain) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as + published by the Free Software Foundation, either version 3 of the + License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . +******************************************************************************/ + +openerp.web_easy_switch_company = function (instance) { + + /*************************************************************************** + Create an new 'SwitchCompanyWidget' widget that allow users to switch + from a company to another more easily. + ***************************************************************************/ + instance.web.SwitchCompanyWidget = instance.web.Widget.extend({ + + template:'web_easy_switch_company.SwitchCompanyWidget', + + /*********************************************************************** + Overload section + ***********************************************************************/ + + /** + * Overload 'init' function to initialize the values of the widget. + */ + init: function(parent){ + this._super(parent); + this.companies = []; + this.current_company_id = 0; + this.current_company_name = ''; + }, + + /** + * Overload 'start' function to load datas from DB. + */ + start: function () { + this._super(); + this._load_data(); + }, + + /** + * Overload 'renderElement' function to set events on company items. + */ + renderElement: function() { + var self = this; + this._super(); + if (this.companies.length === 1) { + this.$el.hide(); + } + else{ + this.$el.show(); + this.$el.find('.easy_switch_company_company_item').on('click', function(ev) { + var company_id = $(ev.target).data("company-id"); + + + if (company_id != self.current_company_id){ + var func = '/web_easy_switch_company/switch/change_current_company'; + var param = {'company_id': company_id} + self.rpc(func, param).done(function(res) { + window.location.reload() + }); + } + }); + } + }, + + + /*********************************************************************** + Custom section + ***********************************************************************/ + + /** + * helper function to load data from the server + */ + _fetch: function(model, fields, domain, ctx){ + return new instance.web.Model(model).query(fields).filter(domain).context(ctx).all(); + }, + + /** + * - Load data of the companies allowed to the current users; + * - Launch the rendering of the current widget; + */ + _load_data: function(){ + var self = this; + // Request for current users information + this._fetch('res.users',['company_id'],[['id','=',this.session.uid]]).then(function(res_users){ + self.current_company_id = res_users[0].company_id[0]; + self.current_company_name = res_users[0].company_id[1]; + // Request for other companies + // We have to go through fields_view_get to emulate the + // exact (exotic) behavior of the user preferences form in + // fetching the allowed companies wrt record rules. + // Note: calling res.company.name_search with + // user_preference=True in the context does + // not work either. + new instance.web.Model('res.company').call('name_search',{context:{'user_preference':'True'}}).then(function(res){ + var res_company = res; + for ( var i=0 ; i < res_company.length; i++) { + var logo_topbar, logo_state; + // TODO: fetching the logo of other companies fails with the + // default res.company record rule, so we should + // probably remove the logos from the menu :( + logo_topbar = self.session.url( + '/web/binary/image', { + model:'res.company', + field: 'logo_topbar', + id: res_company[i][0] + }); + if (res_company[i][0] == self.current_company_id){ + logo_state = '/web_easy_switch_company/static/src/img/selection-on.png'; + } + else{ + logo_state = '/web_easy_switch_company/static/src/img/selection-off.png'; + } + self.companies.push({ + id: res_company[i][0], + name: res_company[i][1], + logo_topbar: logo_topbar, + logo_state: logo_state + }); + } + // Update rendering + self.renderElement(); + }); + }); + }, + + }); + + /*************************************************************************** + Extend 'UserMenu' Widget to insert a 'SwitchCompanyWidget' widget. + ***************************************************************************/ + instance.web.UserMenu = instance.web.UserMenu.extend({ + + init: function(parent) { + this._super(parent); + var switch_button = new instance.web.SwitchCompanyWidget(); + switch_button.appendTo(instance.webclient.$el.find('.oe_systray')); + } + + }); + +}; + diff --git a/web_easy_switch_company/static/src/xml/switch_company.xml b/web_easy_switch_company/static/src/xml/switch_company.xml new file mode 100644 index 00000000..1ffb12b2 --- /dev/null +++ b/web_easy_switch_company/static/src/xml/switch_company.xml @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/web_easy_switch_company/view/res_users_view.xml b/web_easy_switch_company/view/res_users_view.xml new file mode 100644 index 00000000..e16259ed --- /dev/null +++ b/web_easy_switch_company/view/res_users_view.xml @@ -0,0 +1,24 @@ + + + + + + res.users.form + res.users + + + + + 1 + + + + + + + +