Sylvain LE GAL
11 years ago
13 changed files with 303 additions and 0 deletions
-
7web_easy_switch_company/__init__.py
-
66web_easy_switch_company/__openerp__.py
-
6web_easy_switch_company/controllers/__init__.py
-
13web_easy_switch_company/controllers/main.py
-
7web_easy_switch_company/model/__init__.py
-
32web_easy_switch_company/model/res_company.py
-
13web_easy_switch_company/model/res_users.py
-
BINweb_easy_switch_company/static/src/img/icon.png
-
BINweb_easy_switch_company/static/src/img/selection-off.png
-
BINweb_easy_switch_company/static/src/img/selection-on.png
-
115web_easy_switch_company/static/src/js/switch_company.js
-
29web_easy_switch_company/static/src/xml/switch_company.xml
-
15web_easy_switch_company/view/res_users_view.xml
@ -0,0 +1,7 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# See __openerp__.py file for Copyright and Licence Informations. |
||||
|
################################################################################ |
||||
|
|
||||
|
import model |
||||
|
import controllers |
@ -0,0 +1,66 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# See Copyright and Licence Informations undermentioned. |
||||
|
################################################################################ |
||||
|
|
||||
|
{ |
||||
|
'name': 'Multicompany - Easy Switch Company', |
||||
|
'version': '1.0', |
||||
|
'category': 'web', |
||||
|
'description': """ |
||||
|
Add menu to allow user to switch to another company more easily |
||||
|
=============================================================== |
||||
|
|
||||
|
Functionnalities : |
||||
|
------------------ |
||||
|
* Add a new menu in the top bar to switch to another company more easily; |
||||
|
* Remove the old behaviour to switch company; |
||||
|
* Remove the display of the current company after the name of the user, |
||||
|
the information is redundant and because the name of the company is displayed |
||||
|
only if company_id != 1 by default. |
||||
|
|
||||
|
Documentations : |
||||
|
---------------- |
||||
|
* Video : http://www.youtube.com/watch?v=Cpm6dg-IEQQ |
||||
|
|
||||
|
Technical informations : |
||||
|
------------------------ |
||||
|
* 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 and Licence : |
||||
|
----------------------- |
||||
|
* 2014, Groupement Régional Alimentaire de Proximité |
||||
|
* Licence : AGPL-3 (http://www.gnu.org/licenses/) |
||||
|
|
||||
|
Contacts : |
||||
|
---------- |
||||
|
* Sylvain LE GAL (https://twitter.com/legalsylvain); |
||||
|
* <informatique@grap.coop> for any help or question about this module. |
||||
|
""", |
||||
|
'author': 'GRAP', |
||||
|
'website': 'http://www.grap.coop', |
||||
|
'license': 'AGPL-3', |
||||
|
'depends': [ |
||||
|
'web', |
||||
|
], |
||||
|
'data': [ |
||||
|
'view/res_users_view.xml', |
||||
|
], |
||||
|
'demo': [], |
||||
|
'js': [ |
||||
|
'static/src/js/switch_company.js', |
||||
|
], |
||||
|
'css': [], |
||||
|
'qweb': [ |
||||
|
'static/src/xml/switch_company.xml', |
||||
|
], |
||||
|
'images': [], |
||||
|
'post_load': '', |
||||
|
'application': False, |
||||
|
'installable': True, |
||||
|
'auto_install': False, |
||||
|
} |
@ -0,0 +1,6 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# See __openerp__.py file for Copyright and Licence Informations. |
||||
|
################################################################################ |
||||
|
|
||||
|
import main |
@ -0,0 +1,13 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# See __openerp__.py file for Copyright and Licence Informations. |
||||
|
################################################################################ |
||||
|
|
||||
|
import openerp |
||||
|
|
||||
|
class WebEasySwitchCompanyController(openerp.addons.web.http.Controller): |
||||
|
_cp_path = '/web_easy_switch_company/switch' |
||||
|
|
||||
|
@openerp.addons.web.http.jsonrequest |
||||
|
def change_current_company(self, req, company_id): |
||||
|
req.session.model('res.users').change_current_company(company_id) |
@ -0,0 +1,7 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# See __openerp__.py file for Copyright and Licence Informations. |
||||
|
################################################################################ |
||||
|
|
||||
|
import res_users |
||||
|
import res_company |
@ -0,0 +1,32 @@ |
|||||
|
## -*- encoding: utf-8 -*- |
||||
|
################################################################################# |
||||
|
## See __openerp__.py file for Copyright and Licence Informations. |
||||
|
################################################################################# |
||||
|
|
||||
|
from openerp.osv.orm import Model |
||||
|
from openerp.osv import fields |
||||
|
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), |
||||
|
}), |
||||
|
} |
@ -0,0 +1,13 @@ |
|||||
|
# -*- encoding: utf-8 -*- |
||||
|
################################################################################ |
||||
|
# See __openerp__.py file for Copyright and Licence Informations. |
||||
|
################################################################################ |
||||
|
|
||||
|
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}) |
After Width: 128 | Height: 128 | Size: 6.0 KiB |
After Width: 16 | Height: 16 | Size: 112 B |
After Width: 16 | Height: 16 | Size: 445 B |
@ -0,0 +1,115 @@ |
|||||
|
/******************************************************************************/ |
||||
|
/* See __openerp__.py file for Copyright and Licence Informations. */ |
||||
|
/******************************************************************************/ |
||||
|
|
||||
|
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(); |
||||
|
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','company_ids'],[['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
|
||||
|
self._fetch('res.company',['name',],[['id','in', res_users[0].company_ids]]).then(function(res_company){ |
||||
|
for ( var i=0 ; i < res_company.length; i++) { |
||||
|
res_company[i]['logo_topbar'] = self.session.url( |
||||
|
'/web/binary/image', { |
||||
|
model:'res.company', |
||||
|
field: 'logo_topbar', |
||||
|
id: res_company[i].id |
||||
|
}); |
||||
|
if (res_company[i].id == self.current_company_id){ |
||||
|
res_company[i]['logo_state'] = '/web_easy_switch_company/static/src/img/selection-on.png'; |
||||
|
} |
||||
|
else{ |
||||
|
res_company[i]['logo_state'] = '/web_easy_switch_company/static/src/img/selection-off.png'; |
||||
|
} |
||||
|
self.companies.push(res_company[i]); |
||||
|
} |
||||
|
// 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')); |
||||
|
}, |
||||
|
|
||||
|
}); |
||||
|
|
||||
|
}; |
||||
|
|
@ -0,0 +1,29 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<!-- *********************************************************************** --> |
||||
|
<!-- See __openerp__.py file for Copyright and Licence Informations. --> |
||||
|
<!-- *********************************************************************** --> |
||||
|
<template> |
||||
|
|
||||
|
<t t-name="web_easy_switch_company.SwitchCompanyWidget"> |
||||
|
<span class="oe_user_menu oe_topbar_item oe_dropdown_toggle oe_dropdown_arrow"> |
||||
|
<span> |
||||
|
<t t-esc="widget.current_company_name"/> |
||||
|
</span> |
||||
|
<ul class="oe_dropdown_menu"> |
||||
|
<t t-foreach="widget.companies" t-as="company"> |
||||
|
<li> |
||||
|
<a class="easy_switch_company_company_item" |
||||
|
href="#" |
||||
|
t-att-data-company-id="company.id"> |
||||
|
<img class="oe_topbar_avatar" t-att-src="company.logo_topbar"/> |
||||
|
<img class="oe_topbar_avatar" t-att-src="company.logo_state"/> |
||||
|
<t t-esc="company.name"/> |
||||
|
</a> |
||||
|
</li> |
||||
|
</t> |
||||
|
</ul> |
||||
|
</span> |
||||
|
</t> |
||||
|
|
||||
|
</template> |
||||
|
|
@ -0,0 +1,15 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<openerp> |
||||
|
<data> |
||||
|
|
||||
|
<record id="view_res_users_simple_modif_form" model="ir.ui.view"> |
||||
|
<field name="name">res.users.form</field> |
||||
|
<field name="model">res.users</field> |
||||
|
<field name="inherit_id" ref="base.view_users_form_simple_modif"/> |
||||
|
<field name="arch" type="xml"> |
||||
|
<!-- hide old behaviour to change company --> |
||||
|
<field name="company_id" position="replace" /> |
||||
|
</field> |
||||
|
</record> |
||||
|
</data> |
||||
|
</openerp> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue