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..a7b4412e0 --- /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': 'Hidden', + 'complexity': 'normal', # easy, normal, expert + 'depends': [ + 'account_report_company', + 'partner_firstname', + ], + 'description': """ +Adapt the computation of display name so that it gets visible in tree and kanban views. + """, + '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..f02fed714 --- /dev/null +++ b/firstname_display_name_trigger/res_partner.py @@ -0,0 +1,65 @@ +# -*- 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)) + + 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) + + _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), + } 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()