From 28d177e520800af7ef6333765a562246174c9eb4 Mon Sep 17 00:00:00 2001 From: Tejas Tank Date: Thu, 30 Aug 2012 19:53:48 +0530 Subject: [PATCH 1/8] [FIX] i18n address format bzr revid: tta@openerp.com-20120830142348-vm37rbyceaup8zfq --- openerp/addons/base/res/res_partner.py | 34 ++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index 93d12228ebe..f70b45d9472 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -507,6 +507,40 @@ class res_partner(osv.osv): args['company_name'] = '' return address_format % args + def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): + res = super(res_partner,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) + if view_type == 'form': + fieldstyle = { 'state_id': {'placeholder': "State", 'style': "width:24%;", 'options': '{"no_open": true}', 'class': "oe_no_button"}, + 'city': {'placeholder': "City", 'style': "width: 40%;", 'options': '', 'class': ""}, + 'zip': {'placeholder': "ZIP", 'style': 'width:34%;', 'options': '', 'class': ""} + } + country_id = self.pool.get('res.users').browse(cr, uid, uid,context).company_id.country_id + if country_id and country_id.address_format: + address_format = country_id.address_format + else: + address_format = self._defaults['address_format'] + address_format = address_format.replace("_code","_id").replace("_name","_id") + fields = re.findall('(state_id|city|zip)', address_format) + + nodelist = [] + doc = etree.XML(res['arch']) + for field in ['city','state_id','zip']: + nodelist.append(doc.xpath("//field[@name='%s']" % (field))[0]) + + tot = len(fields) + for idx, node in enumerate(nodelist): + if idx < tot: + field = fields[idx] + node.set('name', fields[idx]) + node.set('style', fieldstyle[field]['style']) + node.set('placeholder', fieldstyle[field]['placeholder']) + node.set('options', fieldstyle[field]['options']) + node.set('class', fieldstyle[field]['class']) + else: + node.getparent().remove(node) + + res['arch'] = etree.tostring(doc) + return res # res.partner.address is deprecated; it is still there for backward compability only and will be removed in next version From 1a2f7a5131826ec6cba245292e9364454db62e8c Mon Sep 17 00:00:00 2001 From: Tejas Tank Date: Fri, 31 Aug 2012 16:08:30 +0530 Subject: [PATCH 2/8] IMP: i18n address format. bzr revid: tta@openerp.com-20120831103830-3551ioq85r61kh94 --- openerp/addons/base/res/res_partner.py | 41 +++++++++++++++----------- 1 file changed, 24 insertions(+), 17 deletions(-) diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index f70b45d9472..830804cfae7 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -29,6 +29,7 @@ from tools.translate import _ import logging import pooler import pytz +from lxml import etree def _tz_get(self,cr,uid, context=None): return [(x, x) for x in pytz.all_timezones] @@ -508,28 +509,34 @@ class res_partner(osv.osv): return address_format % args def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): - res = super(res_partner,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) - if view_type == 'form': - fieldstyle = { 'state_id': {'placeholder': "State", 'style': "width:24%;", 'options': '{"no_open": true}', 'class': "oe_no_button"}, - 'city': {'placeholder': "City", 'style': "width: 40%;", 'options': '', 'class': ""}, - 'zip': {'placeholder': "ZIP", 'style': 'width:34%;', 'options': '', 'class': ""} - } - country_id = self.pool.get('res.users').browse(cr, uid, uid,context).company_id.country_id - if country_id and country_id.address_format: - address_format = country_id.address_format - else: - address_format = self._defaults['address_format'] - address_format = address_format.replace("_code","_id").replace("_name","_id") - fields = re.findall('(state_id|city|zip)', address_format) - + res = super(res_partner,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) + if view_id and context and view_type == 'form': nodelist = [] doc = etree.XML(res['arch']) for field in ['city','state_id','zip']: - nodelist.append(doc.xpath("//field[@name='%s']" % (field))[0]) + nodes = doc.xpath("//field[@name='%s']" % (field)) + for node in nodes: + nodelist.append(node) + if not nodelist: + return res + + fieldstyle = { + 'state_id': {'placeholder': "State", 'style': "width:24%;", 'options': '{"no_open": true}', 'class': "oe_no_button"}, + 'city': {'placeholder': "City", 'style': "width: 40%;", 'options': '', 'class': ""}, + 'zip': {'placeholder': "ZIP", 'style': 'width:34%;', 'options': '', 'class': ""} + } + user_obj = self.pool.get('res.users') + country_id = user_obj.browse(cr, uid, uid,context).company_id.country_id + if country_id and country_id.address_format: + address_format = country_id.address_format + else: + address_format = "%(company_name)s\n%(street)s\n%(street2)s\n%(city)s,%(state_code)s %(zip)s\n%(country_name)s" + address_format = address_format.replace("_code","_id").replace("_name","_id") + fields = re.findall('(state_id|city|zip)', address_format) - tot = len(fields) + cfields = len(fields) for idx, node in enumerate(nodelist): - if idx < tot: + if idx < cfields: field = fields[idx] node.set('name', fields[idx]) node.set('style', fieldstyle[field]['style']) From bd2ccbfd8e8d662cd462e1e9bf65e15bb836f8b7 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Thu, 13 Sep 2012 20:16:38 +0200 Subject: [PATCH 3/8] [IMP] address format according to user's country bzr revid: fp@tinyerp.com-20120913181638-lrxd1hrgikl6purj --- openerp/addons/base/res/res_partner.py | 91 +++++++++++++------------- 1 file changed, 46 insertions(+), 45 deletions(-) diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index f487da88ee1..5489aa77128 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -30,6 +30,47 @@ import pooler import pytz from lxml import etree +class format_address(object): + def fields_view_get_address(self, cr, uid, arch, context={}): + user_obj = self.pool.get('res.users') + fmt = user_obj.browse(cr, uid, uid,context).company_id.country_id + fmt = fmt and fmt.address_format + layouts = { + '%(city)s %(state_code)s\n%(zip)s': """ +
+ + +
+ +
+ """, + '%(zip)s %(city)s': """ +
+ + +
+ +
+ """, + '%(city)s\n%(state_name)s\n%(zip)s': """ +
+ + + +
+ """ + } + for k,v in layouts.items(): + if fmt and (k in fmt): + doc = etree.fromstring(arch) + for node in doc.xpath("//div[@class='address_format']"): + tree = etree.fromstring(v) + node.getparent().replace(node, tree) + arch = etree.tostring(doc) + break + return arch + + def _tz_get(self,cr,uid, context=None): return [(x, x) for x in pytz.all_timezones] @@ -120,7 +161,7 @@ def _lang_get(self, cr, uid, context=None): POSTAL_ADDRESS_FIELDS = ('street', 'street2', 'zip', 'city', 'state_id', 'country_id') ADDRESS_FIELDS = POSTAL_ADDRESS_FIELDS + ('email', 'phone', 'fax', 'mobile', 'website', 'ref', 'lang') -class res_partner(osv.osv): +class res_partner(osv.osv, format_address): _description = 'Partner' _name = "res.partner" @@ -227,9 +268,10 @@ class res_partner(osv.osv): def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): if (not view_id) and (view_type=='form') and context and context.get('force_email', False): view_id = self.pool.get('ir.model.data').get_object_reference(cr, user, 'base', 'view_partner_simple_form')[1] - - return super(res_partner, self).fields_view_get(cr, user, view_id=view_id, view_type=view_type, context=context, toolbar=toolbar, submenu=submenu) - + res = super(res_partner,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) + if view_type == 'form': + res['arch'] = self.fields_view_get_address(cr, uid, res['arch'], context=context) + return res _defaults = { 'active': True, @@ -515,47 +557,6 @@ class res_partner(osv.osv): address_format = '%(company_name)s\n' + address_format return address_format % args - def fields_view_get(self, cr, uid, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): - res = super(res_partner,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) - if view_type == 'form': - user_obj = self.pool.get('res.users') - fmt = user_obj.browse(cr, uid, uid,context).company_id.country_id - fmt = fmt and fmt.address_format - layouts = { - '%(city)s %(state_code)s\n%(zip)s': """ -
- - -
- -
- """, - '%(zip)s %(city)s': """ -
- - -
- -
- """, - '%(city)s\n%(state_name)s\n%(zip)s': """ -
- - - -
- """ - } - for k,v in layouts.items(): - if fmt and (k in fmt): - doc = etree.fromstring(res['arch']) - for node in doc.xpath("//div[@class='address_format']"): - tree = etree.fromstring(v) - node.getparent().replace(node, tree) - res['arch'] = etree.tostring(doc) - break - return res - # res.partner.address is deprecated; it is still there for backward compability only and will be removed in next version class res_partner_address(osv.osv): _table = "res_partner" From 30872ea9daa8af29501f3cf04c20d706c65aab76 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Thu, 13 Sep 2012 20:19:52 +0200 Subject: [PATCH 4/8] [IMP] address format of leads according to country bzr revid: fp@tinyerp.com-20120913181952-h19q4v0vu6geungq --- addons/crm/crm_lead.py | 10 +++++++++- addons/sale/wizard/sale_make_invoice_advance.py | 2 +- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index ddfdb05ca66..fff47205582 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -27,13 +27,15 @@ import time import tools from tools.translate import _ +from base.res.res_partner import format_address + CRM_LEAD_PENDING_STATES = ( crm.AVAILABLE_STATES[2][0], # Cancelled crm.AVAILABLE_STATES[3][0], # Done crm.AVAILABLE_STATES[4][0], # Pending ) -class crm_lead(base_stage, osv.osv): +class crm_lead(base_stage, format_address, osv.osv): """ CRM Lead Case """ _name = "crm.lead" _description = "Lead/Opportunity" @@ -105,6 +107,12 @@ class crm_lead(base_stage, osv.osv): return result, fold + def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): + res = super(crm_lead,self).fields_view_get(cr, user, view_id, view_type, context, toolbar=toolbar, submenu=submenu) + if view_type == 'form': + res['arch'] = self.fields_view_get_address(cr, user, res['arch'], context=context) + return res + _group_by_full = { 'stage_id': _read_group_stage_ids } diff --git a/addons/sale/wizard/sale_make_invoice_advance.py b/addons/sale/wizard/sale_make_invoice_advance.py index a2c45bead62..ee3aa942b7b 100644 --- a/addons/sale/wizard/sale_make_invoice_advance.py +++ b/addons/sale/wizard/sale_make_invoice_advance.py @@ -30,7 +30,7 @@ class sale_advance_payment_inv(osv.osv_memory): 'advance_payment_method':fields.selection( [('all', 'Invoice the whole sale order'), ('percentage','Percentage'), ('fixed','Fixed price (deposit)'), ('lines', 'Some order lines')], - 'Invoice Method', required=True, + 'What do you want to invoice?', required=True, help="""Use All to create the final invoice. Use Percentage to invoice a percentage of the total amount. Use Fixed Price to invoice a specific amound in advance. From b58a89384469b9ff10295145632b6161d9fc341f Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Thu, 13 Sep 2012 20:21:56 +0200 Subject: [PATCH 5/8] [IMP] rename coutnries bzr revid: fp@tinyerp.com-20120913182156-dh0wnc9qe0mcb5qc --- openerp/addons/base/__openerp__.py | 2 +- .../res_country_data.xml} | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) rename openerp/addons/base/{country_data.xml => res/res_country_data.xml} (99%) diff --git a/openerp/addons/base/__openerp__.py b/openerp/addons/base/__openerp__.py index 937c9cbd20b..590d3b11a87 100644 --- a/openerp/addons/base/__openerp__.py +++ b/openerp/addons/base/__openerp__.py @@ -36,7 +36,7 @@ The kernel of OpenERP, needed for all installation. 'data': [ 'base_data.xml', 'currency_data.xml', - 'country_data.xml', + 'res/res_country_data.xml', 'security/base_security.xml', 'base_menu.xml', 'res/res_security.xml', diff --git a/openerp/addons/base/country_data.xml b/openerp/addons/base/res/res_country_data.xml similarity index 99% rename from openerp/addons/base/country_data.xml rename to openerp/addons/base/res/res_country_data.xml index d4d880cb8ed..068850727e8 100644 --- a/openerp/addons/base/country_data.xml +++ b/openerp/addons/base/res/res_country_data.xml @@ -1,7 +1,7 @@ - + + From 6c7771b48c7926620722fc8c20f4bd0d5a81c641 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Thu, 13 Sep 2012 20:22:56 +0200 Subject: [PATCH 6/8] fix bzr revid: fp@tinyerp.com-20120913182256-p7crbo4889pcgg45 --- openerp/addons/base/res/res_partner.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index 5489aa77128..f3ab68685a9 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -268,9 +268,9 @@ class res_partner(osv.osv, format_address): def fields_view_get(self, cr, user, view_id=None, view_type='form', context=None, toolbar=False, submenu=False): if (not view_id) and (view_type=='form') and context and context.get('force_email', False): view_id = self.pool.get('ir.model.data').get_object_reference(cr, user, 'base', 'view_partner_simple_form')[1] - res = super(res_partner,self).fields_view_get(cr, uid, view_id, view_type, context, toolbar=toolbar, submenu=submenu) + res = super(res_partner,self).fields_view_get(cr, user, view_id, view_type, context, toolbar=toolbar, submenu=submenu) if view_type == 'form': - res['arch'] = self.fields_view_get_address(cr, uid, res['arch'], context=context) + res['arch'] = self.fields_view_get_address(cr, user, res['arch'], context=context) return res _defaults = { From 85f04253b78628c785c53912777656ca7ecb3040 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Thu, 13 Sep 2012 20:27:36 +0200 Subject: [PATCH 7/8] [IMP] better layout for BE address bzr revid: fp@tinyerp.com-20120913182736-t22gg05mu202b1b2 --- openerp/addons/base/res/res_partner.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index f3ab68685a9..008e8048a5d 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -47,7 +47,7 @@ class format_address(object): '%(zip)s %(city)s': """
- +
From 9df7381ced04b44e470fe0a060b6b82773f20c84 Mon Sep 17 00:00:00 2001 From: Fabien Pinckaers Date: Thu, 13 Sep 2012 20:52:31 +0200 Subject: [PATCH 8/8] [FIX] clean error message when creating a user froma partner form bzr revid: fp@tinyerp.com-20120913185231-efkupz42kovrekpx --- addons/mail/res_users.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/addons/mail/res_users.py b/addons/mail/res_users.py index f9ca54c478d..8bbe075f159 100644 --- a/addons/mail/res_users.py +++ b/addons/mail/res_users.py @@ -72,6 +72,9 @@ class res_users(osv.Model): def create(self, cr, uid, data, context=None): # create default alias same as the login + if not data.get('login', False): + raise osv.except_osv(_('Invalid Action!'), _('You may not create a user.')) + mail_alias = self.pool.get('mail.alias') alias_id = mail_alias.create_unique_alias(cr, uid, {'alias_name': data['login']}, model_name=self._name, context=context) data['alias_id'] = alias_id