From 5ca2cf4e5dcb48a9af8de98739851f9324b4291c Mon Sep 17 00:00:00 2001 From: Yannick Vaucher Date: Thu, 23 May 2013 14:13:51 +0200 Subject: [PATCH 1/5] [ADD] module firstname_display_name_trigger --- firstname_display_name_trigger/__init__.py | 24 +++++++++++ firstname_display_name_trigger/__openerp__.py | 41 +++++++++++++++++++ firstname_display_name_trigger/res_partner.py | 41 +++++++++++++++++++ 3 files changed, 106 insertions(+) create mode 100644 firstname_display_name_trigger/__init__.py create mode 100644 firstname_display_name_trigger/__openerp__.py create mode 100644 firstname_display_name_trigger/res_partner.py diff --git a/firstname_display_name_trigger/__init__.py b/firstname_display_name_trigger/__init__.py new file mode 100644 index 000000000..179a1e127 --- /dev/null +++ b/firstname_display_name_trigger/__init__.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Yannick Vaucher +# Copyright 2013 Camptocamp SA +# +# 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 res_partner + +# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/firstname_display_name_trigger/__openerp__.py b/firstname_display_name_trigger/__openerp__.py new file mode 100644 index 000000000..c4af15560 --- /dev/null +++ b/firstname_display_name_trigger/__openerp__.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Yannick Vaucher +# Copyright 2013 Camptocamp SA +# +# 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': 'Link module if partner_lastname and account_report_company are installed', + 'version': '1.0', + 'author': 'Camptocamp', + 'maintainer': 'Camptocamp', + 'category': 'CRM', + 'complexity': 'normal', # easy, normal, expert + 'depends': [ + 'account_report_company', + 'partner_firstname', + ], + 'description': """ +Adapt computation of display name so it make it visible in tree and kanban view. + """, + 'website': 'http://www.camptocamp.com', + 'data': [], + 'installable': True, + 'images': [], + 'auto_install': True, + 'license': 'AGPL-3', + 'application': False} + diff --git a/firstname_display_name_trigger/res_partner.py b/firstname_display_name_trigger/res_partner.py new file mode 100644 index 000000000..6ec559e25 --- /dev/null +++ b/firstname_display_name_trigger/res_partner.py @@ -0,0 +1,41 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Author: Yannick Vaucher +# Copyright 2013 Camptocamp SA +# +# 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 orm, fields + + +class ResPartner(orm.Model): + _inherit = 'res.partner' + + def _display_name_compute(self, cr, uid, ids, name, args, context=None): + return dict(self.name_get(cr, uid, ids, context=context)) + + _display_name_store_triggers = { + 'res.partner': (lambda self,cr,uid,ids,context=None: self.search(cr, uid, [('id','child_of',ids)]), + ['parent_id', 'is_company', 'name', 'firstname', 'lastname'], 10) + } + + # indirection to avoid passing a copy of the overridable method when declaring the function field + _display_name = lambda self, *args, **kwargs: self._display_name_compute(*args, **kwargs) + + _columns = { + # extra field to allow ORDER BY to match visible names + 'display_name': fields.function(_display_name, type='char', string='Name', store=_display_name_store_triggers), + } From 11cff5c971d7f5d61d85f5a72890564d58eb5602 Mon Sep 17 00:00:00 2001 From: Yannick Vaucher Date: Fri, 24 May 2013 13:39:16 +0200 Subject: [PATCH 2/5] [ADD] firstname_display_name - python unit tests --- .../tests/__init__.py | 5 +++ .../tests/test_display_name.py | 31 +++++++++++++++++++ 2 files changed, 36 insertions(+) create mode 100644 firstname_display_name_trigger/tests/__init__.py create mode 100644 firstname_display_name_trigger/tests/test_display_name.py diff --git a/firstname_display_name_trigger/tests/__init__.py b/firstname_display_name_trigger/tests/__init__.py new file mode 100644 index 000000000..d9303ffab --- /dev/null +++ b/firstname_display_name_trigger/tests/__init__.py @@ -0,0 +1,5 @@ +import test_display_name + +checks = [ + test_display_name + ] diff --git a/firstname_display_name_trigger/tests/test_display_name.py b/firstname_display_name_trigger/tests/test_display_name.py new file mode 100644 index 000000000..b0b55c687 --- /dev/null +++ b/firstname_display_name_trigger/tests/test_display_name.py @@ -0,0 +1,31 @@ +import unittest2 + +import openerp.tests.common as common + +class test_display_name(common.TransactionCase): + + def setUp(self): + super(test_display_name,self).setUp() + cr, uid = self.cr, self.uid + self.res_partner = self.registry('res.partner') + + + def test_00_create_res_partner(self): + """ Test if the display name has been correctly set """ + cr, uid = self.cr, self.uid + partner_id = self.res_partner.create(cr, uid, {'lastname': 'Lastname', 'firstname': 'Firstname', 'is_company': True}) + partner_records = self.res_partner.browse(cr, uid, [partner_id]) + p1 = partner_records[0] + self.assertEqual(p1.display_name, 'Lastname Firstname', 'Partner display_name incorect') + + def test_01_res_partner_write_lastname(self): + """ Test if the display name has been correctly set """ + cr, uid = self.cr, self.uid + partner_id = self.res_partner.create(cr, uid, {'lastname': 'Lastname', 'firstname': 'Firstname', 'is_company': True}) + partner_records = self.res_partner.browse(cr, uid, [partner_id]) + p1 = partner_records[0] + self.res_partner.write(cr, uid, partner_id, {'lastname': 'Last'}) + self.assertEqual(p1.display_name, 'Last Firstname', 'Partner display_name incorect') + +if __name__ == '__main__': + unittest2.main() From 224ebb36c3906639ec7dd7534add4700d7a4cbe6 Mon Sep 17 00:00:00 2001 From: Yannick Vaucher Date: Fri, 24 May 2013 13:42:19 +0200 Subject: [PATCH 3/5] [ADD] firstnamt_display_name_trigger - name_get overwrite to by pass reading of name --- firstname_display_name_trigger/res_partner.py | 26 ++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/firstname_display_name_trigger/res_partner.py b/firstname_display_name_trigger/res_partner.py index 6ec559e25..f02fed714 100644 --- a/firstname_display_name_trigger/res_partner.py +++ b/firstname_display_name_trigger/res_partner.py @@ -27,10 +27,34 @@ class ResPartner(orm.Model): def _display_name_compute(self, cr, uid, ids, name, args, context=None): return dict(self.name_get(cr, uid, ids, context=context)) + def name_get(self, cr, uid, ids, context=None): + """ By pass of name_get to use directly firstname and lastname + as we cannot ensure name as already been computed when calling this + method for display_name""" + if context is None: + context = {} + if isinstance(ids, (int, long)): + ids = [ids] + res = [] + for record in self.browse(cr, uid, ids, context=context): + name = '%s %s'%(record.lastname if record.lastname else u"", + record.firstname if record.firstname else u"") + if record.parent_id and not record.is_company: + name = "%s, %s" % (record.parent_id.name, name) + if context.get('show_address'): + name = name + "\n" + self._display_address(cr, uid, record, without_company=True, context=context) + name = name.replace('\n\n','\n') + name = name.replace('\n\n','\n') + if context.get('show_email') and record.email: + name = "%s <%s>" % (name, record.email) + res.append((record.id, name)) + return res + + _display_name_store_triggers = { 'res.partner': (lambda self,cr,uid,ids,context=None: self.search(cr, uid, [('id','child_of',ids)]), ['parent_id', 'is_company', 'name', 'firstname', 'lastname'], 10) - } + } # indirection to avoid passing a copy of the overridable method when declaring the function field _display_name = lambda self, *args, **kwargs: self._display_name_compute(*args, **kwargs) From 0865702b2f59f79097525b8ab77789ad4984a7c8 Mon Sep 17 00:00:00 2001 From: Alexandre Fayolle Date: Fri, 24 May 2013 14:04:58 +0200 Subject: [PATCH 4/5] [IMP] update description --- firstname_display_name_trigger/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firstname_display_name_trigger/__openerp__.py b/firstname_display_name_trigger/__openerp__.py index c4af15560..7cadbd10b 100644 --- a/firstname_display_name_trigger/__openerp__.py +++ b/firstname_display_name_trigger/__openerp__.py @@ -29,7 +29,7 @@ 'partner_firstname', ], 'description': """ -Adapt computation of display name so it make it visible in tree and kanban view. +Adapt the computation of display name so that it gets visible in tree and kanban views. """, 'website': 'http://www.camptocamp.com', 'data': [], From 3d2f2cf286380eecd271916ec63951a4d47c78b5 Mon Sep 17 00:00:00 2001 From: Yannick Vaucher Date: Tue, 18 Jun 2013 10:44:56 +0200 Subject: [PATCH 5/5] [IMP] firstname_display_name_trigger - change category to Hidden --- firstname_display_name_trigger/__openerp__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firstname_display_name_trigger/__openerp__.py b/firstname_display_name_trigger/__openerp__.py index 7cadbd10b..a7b4412e0 100644 --- a/firstname_display_name_trigger/__openerp__.py +++ b/firstname_display_name_trigger/__openerp__.py @@ -22,7 +22,7 @@ 'version': '1.0', 'author': 'Camptocamp', 'maintainer': 'Camptocamp', - 'category': 'CRM', + 'category': 'Hidden', 'complexity': 'normal', # easy, normal, expert 'depends': [ 'account_report_company',