From 2e10e71d69fb857ffc37a590ba10bb2adf90323a Mon Sep 17 00:00:00 2001 From: "Laurent Mignon (ACSONE)" Date: Wed, 28 Oct 2015 16:26:45 +0100 Subject: [PATCH] [IMP] base_partner_sequence Structure + new API --- base_partner_sequence/README.rst | 68 +++++++++++++++++ base_partner_sequence/__init__.py | 23 +----- base_partner_sequence/__openerp__.py | 28 ++----- .../{ => data}/partner_sequence.xml | 0 base_partner_sequence/models/__init__.py | 2 + base_partner_sequence/models/partner.py | 69 +++++++++++++++++ base_partner_sequence/partner.py | 76 ------------------- base_partner_sequence/tests/__init__.py | 2 + .../tests/test_base_partner_sequence.py | 19 +++++ .../{ => views}/partner_view.xml | 0 10 files changed, 168 insertions(+), 119 deletions(-) create mode 100644 base_partner_sequence/README.rst rename base_partner_sequence/{ => data}/partner_sequence.xml (100%) create mode 100644 base_partner_sequence/models/__init__.py create mode 100644 base_partner_sequence/models/partner.py delete mode 100644 base_partner_sequence/partner.py create mode 100644 base_partner_sequence/tests/__init__.py create mode 100644 base_partner_sequence/tests/test_base_partner_sequence.py rename base_partner_sequence/{ => views}/partner_view.xml (100%) diff --git a/base_partner_sequence/README.rst b/base_partner_sequence/README.rst new file mode 100644 index 000000000..39c89d65d --- /dev/null +++ b/base_partner_sequence/README.rst @@ -0,0 +1,68 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +====================================== +Add a sequence on partner's reference. +====================================== + +This module adds the possibility to define a sequence for +the partner's reference. This reference is then set as default +when you create a new partner, using the defined sequence. + +The reference field is treated as a commercial field, i.e. it +is managed from the commercial partner and then propagated to +the partner's contacts. The field is visible on the contacts, +but it can only be modified from the commercial partner. + +No references are assigned for contacts such as shipping and +invoice addresses. +This module is a migration of the original base_partner_sequence +addon to OpenERP version 7.0. + + +Usage +===== + +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/134/8.0 + + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues `_. +In case of trouble, please check there if your issue has already been reported. +If you spotted it first, help us smashing it by providing a detailed and welcomed feedback +`here `_. + + +Credits +======= + +Contributors +------------ + +* Thomas Rehn +* Stefan Rijnhart +* Yannick Vaucher +* Sandy Carter +* Laurent Mignon (ACSONE) +* Guewen Baconnier +* Alexandre Fayolle + +Maintainer +---------- + +.. image:: https://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: https://odoo-community.org + +This module is maintained by the OCA. + +OCA, or the Odoo Community Association, is a nonprofit organization whose +mission is to support the collaborative development of Odoo features and +promote its widespread use. + +To contribute to this module, please visit http://odoo-community.org. diff --git a/base_partner_sequence/__init__.py b/base_partner_sequence/__init__.py index c6e9f2e38..fcf98fb46 100644 --- a/base_partner_sequence/__init__.py +++ b/base_partner_sequence/__init__.py @@ -1,22 +1,3 @@ # -*- encoding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2009 Tiny SPRL (). -# -# 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 partner +from . import models +from . import tests diff --git a/base_partner_sequence/__openerp__.py b/base_partner_sequence/__openerp__.py index 22a6dd805..be79f9951 100644 --- a/base_partner_sequence/__openerp__.py +++ b/base_partner_sequence/__openerp__.py @@ -22,33 +22,17 @@ ############################################################################## { "name": "Add a sequence on customers' code", - "version": "8.0.1.1.0", - "author": "Tiny/initOS GmbH & Co. KG,Odoo Community Association (OCA)", + "version": "8.0.1.1.1", + "author": "Tiny/initOS GmbH & Co. KG," + "ACSONE SA/NV," + "Odoo Community Association (OCA)", "category": "Generic Modules/Base", "website": "http://www.initos.com", - "depends": ["base"], "summary": "Sets customer's code from a sequence", - "description": """ - This module adds the possibility to define a sequence for - the partner code. This code is then set as default when you - create a new commercial partner, using the defined sequence. - - The reference field is treated as a commercial field, i.e. it - is managed from the commercial partner and then propagated to - the partner's contacts. The field is visible on the contacts, - but it can only be modified from the commercial partner. - - No codes are assigned for contacts such as shipping and - invoice addresses. - This module is a migration of the original base_partner_sequence - addon to OpenERP version 7.0. - """, "data": [ - 'partner_sequence.xml', - 'partner_view.xml', + 'data/partner_sequence.xml', + 'views/partner_view.xml', ], - "demo": [], "active": False, "installable": True } -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/base_partner_sequence/partner_sequence.xml b/base_partner_sequence/data/partner_sequence.xml similarity index 100% rename from base_partner_sequence/partner_sequence.xml rename to base_partner_sequence/data/partner_sequence.xml diff --git a/base_partner_sequence/models/__init__.py b/base_partner_sequence/models/__init__.py new file mode 100644 index 000000000..cb85880b7 --- /dev/null +++ b/base_partner_sequence/models/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import partner diff --git a/base_partner_sequence/models/partner.py b/base_partner_sequence/models/partner.py new file mode 100644 index 000000000..8a6f84274 --- /dev/null +++ b/base_partner_sequence/models/partner.py @@ -0,0 +1,69 @@ +# -*- coding: utf-8 -*- +# © 2004-2009 Tiny SPRL (). +# © 2013 initOS GmbH & Co. KG (). +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp import models, api + + +class ResPartner(models.Model): + """Assigns 'ref' from a sequence on creation and copying""" + + _inherit = 'res.partner' + + @api.model + def _needsRef(self, partner_id=None, vals=None): + """ + Checks whether a sequence value should be assigned to a partner's 'ref' + + :param parnter_id: id of the partner object + :param vals: known field values of the partner object + :return: true iff a sequence value should be assigned to the\ + partner's 'ref' + """ + if not vals and not partner_id: + raise Exception('Either field values or an id must be provided.') + vals = vals or {} + # only assign a 'ref' to commercial partners + if partner_id: + partner = self.browse(partner_id) + vals.setdefault('is_company', partner.is_company) + vals.setdefault('parent_id', partner.parent_id.id) + return vals.get('is_company') or not vals.get('parent_id') + + @api.model + def _commercial_fields(self): + """ + Make the partner reference a field that is propagated + to the partner's contacts + """ + return super(ResPartner, self)._commercial_fields() + ['ref'] + + @api.model + def _get_next_ref(self, partner=None, vals=None): + return self.env['ir.sequence'].get('res.partner') + + @api.model + def create(self, vals): + if not vals.get('ref') and self._needsRef(vals=vals): + vals['ref'] = self._get_next_ref(vals=vals) + return super(ResPartner, self).create(vals) + + @api.multi + def write(self, vals): + for partner in self: + ref = vals.get('ref') if 'ref' in vals else partner.ref + if not ref and self._needsRef(partner.id, vals): + vals['ref'] = self._get_next_ref(partner, vals) + super(ResPartner, partner).write(vals) + return True + + @api.one + def copy(self, default=None): + default = default or {} + if self._needsRef(self.id): + default.update({ + 'ref': self._get_next_ref(), + }) + + return super(ResPartner, self).copy(default) diff --git a/base_partner_sequence/partner.py b/base_partner_sequence/partner.py deleted file mode 100644 index 9f66b41d5..000000000 --- a/base_partner_sequence/partner.py +++ /dev/null @@ -1,76 +0,0 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# OpenERP, Open Source Management Solution -# Copyright (C) 2004-2009 Tiny SPRL (). -# Copyright (C) 2013 initOS GmbH & Co. KG (). -# Author Thomas Rehn -# -# 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 - - -class ResPartner(orm.Model): - """Assigns 'ref' from a sequence on creation and copying""" - - _inherit = 'res.partner' - - def create(self, cr, uid, vals, context=None): - context = context or {} - if not vals.get('ref') and self._needsRef(cr, uid, vals=vals, - context=context): - vals['ref'] = self.pool.get('ir.sequence')\ - .next_by_code(cr, uid, 'res.partner') - return super(ResPartner, self).create(cr, uid, vals, context) - - def copy(self, cr, uid, id, default=None, context=None): - default = default or {} - if self._needsRef(cr, uid, id=id, context=context): - default['ref'] = self.pool.get('ir.sequence')\ - .next_by_code(cr, uid, 'res.partner', - context=context) - return super(ResPartner, self).copy(cr, uid, id, default, - context=context) - - def _needsRef(self, cr, uid, id=None, vals=None, context=None): - """ - Checks whether a sequence value should be assigned to a partner's 'ref' - - :param cr: database cursor - :param uid: current user id - :param id: id of the partner object - :param vals: known field values of the partner object - :return: true iff a sequence value should be assigned to the\ - partner's 'ref' - """ - if not vals and not id: - raise Exception('Either field values or an id must be provided.') - # only assign a 'ref' to commercial partners - if id: - vals = self.read(cr, uid, id, ['parent_id', 'is_company'], - context=context) - return vals.get('is_company') or not vals.get('parent_id') - - def _commercial_fields(self, cr, uid, context=None): - """ - Make the partner reference a field that is propagated - to the partner's contacts - """ - return super(ResPartner, self)._commercial_fields( - cr, uid, context=context) + ['ref'] - -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: diff --git a/base_partner_sequence/tests/__init__.py b/base_partner_sequence/tests/__init__.py new file mode 100644 index 000000000..8ef33bbfe --- /dev/null +++ b/base_partner_sequence/tests/__init__.py @@ -0,0 +1,2 @@ +# -*- coding: utf-8 -*- +from . import test_base_partner_sequence diff --git a/base_partner_sequence/tests/test_base_partner_sequence.py b/base_partner_sequence/tests/test_base_partner_sequence.py new file mode 100644 index 000000000..24296253a --- /dev/null +++ b/base_partner_sequence/tests/test_base_partner_sequence.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# © 2015 ACSONE SA/NV (). +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +import openerp.tests.common as common + + +class TestBasePartnerSequence(common.TransactionCase): + + def test_ref_sequence_on_partner(self): + res_partner = self.env['res.partner'] + partner = res_partner.create({ + 'name': "test1", + 'email': "test@test.com"}) + self.assertTrue(partner.ref, "A partner has always a ref.") + + copy = partner.copy() + self.assertTrue(copy.ref, "A partner with ref created by copy " + "has a ref by default.") diff --git a/base_partner_sequence/partner_view.xml b/base_partner_sequence/views/partner_view.xml similarity index 100% rename from base_partner_sequence/partner_view.xml rename to base_partner_sequence/views/partner_view.xml