Browse Source

Merge pull request #358 from Tecnativa/9.0-mig-base_partner_sequence

[9.0] [MIG] base_partner_sequence module
pull/362/head
Pedro M. Baeza 8 years ago
committed by GitHub
parent
commit
07d9aae7ee
  1. 66
      base_partner_sequence/README.rst
  2. 28
      base_partner_sequence/__init__.py
  3. 64
      base_partner_sequence/__openerp__.py
  4. 11
      base_partner_sequence/data/partner_sequence.xml
  5. 21
      base_partner_sequence/i18n/base_partner_sequence.pot
  6. 31
      base_partner_sequence/i18n/fi.po
  7. 31
      base_partner_sequence/i18n/it.po
  8. 7
      base_partner_sequence/models/__init__.py
  9. 75
      base_partner_sequence/models/partner.py
  10. 76
      base_partner_sequence/partner.py
  11. 21
      base_partner_sequence/partner_sequence.xml
  12. 20
      base_partner_sequence/partner_view.xml
  13. 7
      base_partner_sequence/tests/__init__.py
  14. 35
      base_partner_sequence/tests/test_base_partner_sequence.py
  15. 16
      base_partner_sequence/views/partner_view.xml

66
base_partner_sequence/README.rst

@ -0,0 +1,66 @@
.. 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.
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/9.0
Bug Tracker
===========
Bugs are tracked on `GitHub Issues
<https://github.com/OCA/partner-contact/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.
Credits
=======
Contributors
------------
* Thomas Rehn <thomas.rehn@initos.com>
* Stefan Rijnhart <stefan@therp.nl>
* Yannick Vaucher <yannick.vaucher@camptocamp.com>
* Sandy Carter <sandy.carter@savoirfairelinux.com>
* Laurent Mignon (ACSONE) <laurent.mignon@acsone.eu>
* Guewen Baconnier <guewen.baconnier@camptocamp.com>
* Alexandre Fayolle <alexandre.fayolle@camptocamp.com>
* Vicent Cubells <vicent.cubells@tecnativa.com>
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.

28
base_partner_sequence/__init__.py

@ -1,22 +1,8 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
# -*- coding: utf-8 -*-
# Copyright 2004-2009 Tiny SPRL (<http://tiny.be>).
# Copyright 2013 initOS GmbH & Co. KG (<http://www.initos.com>).
# Copyright 2016 Tecnativa - Vicent Cubells
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import partner
from . import models
from . import tests

64
base_partner_sequence/__openerp__.py

@ -1,54 +1,26 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
# Copyright (C) 2013 initOS GmbH & Co. KG (<http://www.initos.com>).
# Author Thomas Rehn <thomas.rehn at initos.com>
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
# -*- coding: utf-8 -*-
# Copyright 2004-2009 Tiny SPRL (<http://tiny.be>).
# Copyright 2013 initOS GmbH & Co. KG (<http://www.initos.com>).
# Copyright 2016 Tecnativa - Vicent Cubells
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{
"name": "Add a sequence on customers' code",
"version": "8.0.1.1.0",
"author": "Tiny/initOS GmbH & Co. KG,Odoo Community Association (OCA)",
"version": "9.0.0.1.0",
"author": "Tiny/initOS GmbH & Co. KG,"
"ACSONE SA/NV,"
"Tecnativa, "
"Odoo Community Association (OCA)",
"category": "Generic Modules/Base",
"website": "http://www.initos.com",
"depends": ["base"],
"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': False
"installable": True,
"license": "AGPL-3",
}
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

11
base_partner_sequence/data/partner_sequence.xml

@ -0,0 +1,11 @@
<?xml version="1.0"?>
<odoo noupdate="1">
<record model="ir.sequence" id="seq_res_partner">
<field name="name">Partner code</field>
<field name="code">res.partner</field>
<field name="prefix">P/</field>
<field name="padding">5</field>
</record>
</odoo>

21
base_partner_sequence/i18n/base_partner_sequence.pot

@ -1,21 +0,0 @@
# Translation of OpenERP Server.
# This file contains the translation of the following modules:
#
msgid ""
msgstr ""
"Project-Id-Version: OpenERP Server 7.0-20131013-231025\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2013-11-13 13:47+0000\n"
"PO-Revision-Date: 2013-11-13 13:47+0000\n"
"Last-Translator: <>\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: base_partner_sequence
#: model:ir.model,name:base_partner_sequence.model_res_partner
msgid "Partner"
msgstr ""

31
base_partner_sequence/i18n/fi.po

@ -0,0 +1,31 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_partner_sequence
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: partner-contact (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-01-19 01:46+0000\n"
"PO-Revision-Date: 2015-05-21 21:57+0000\n"
"Last-Translator: <>\n"
"Language-Team: Finnish (http://www.transifex.com/oca/OCA-partner-contact-8-0/language/fi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: fi\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: base_partner_sequence
#: model:ir.model,name:base_partner_sequence.model_res_partner
msgid "Partner"
msgstr "Kumppani"
#. module: base_partner_sequence
#: view:res.partner:base_partner_sequence.view_partner_form
msgid ""
"{\n"
" 'readonly': [('is_company', '=', False),\n"
" ('parent_id', '!=', False)]}"
msgstr ""

31
base_partner_sequence/i18n/it.po

@ -0,0 +1,31 @@
# Translation of Odoo Server.
# This file contains the translation of the following modules:
# * base_partner_sequence
#
# Translators:
msgid ""
msgstr ""
"Project-Id-Version: partner-contact (8.0)\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2016-02-27 23:26+0000\n"
"PO-Revision-Date: 2016-03-11 15:30+0000\n"
"Last-Translator: Maxime Chambreuil <maxime.chambreuil@gmail.com>\n"
"Language-Team: Italian (http://www.transifex.com/oca/OCA-partner-contact-8-0/language/it/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: \n"
"Language: it\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. module: base_partner_sequence
#: model:ir.model,name:base_partner_sequence.model_res_partner
msgid "Partner"
msgstr "Partner"
#. module: base_partner_sequence
#: view:res.partner:base_partner_sequence.view_partner_form
msgid ""
"{\n"
" 'readonly': [('is_company', '=', False),\n"
" ('parent_id', '!=', False)]}"
msgstr ""

7
base_partner_sequence/models/__init__.py

@ -0,0 +1,7 @@
# -*- coding: utf-8 -*-
# Copyright 2004-2009 Tiny SPRL (<http://tiny.be>).
# Copyright 2013 initOS GmbH & Co. KG (<http://www.initos.com>).
# Copyright 2016 Tecnativa - Vicent Cubells
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import partner

75
base_partner_sequence/models/partner.py

@ -0,0 +1,75 @@
# -*- coding: utf-8 -*-
# Copyright 2004-2009 Tiny SPRL (<http://tiny.be>).
# Copyright 2013 initOS GmbH & Co. KG (<http://www.initos.com>).
# Copyright 2016 Tecnativa - Vicent Cubells
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from openerp import models, api, exceptions, _
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 partner_id: id of the partner object
:param vals: known field values of the partner object
:return: true if a sequence value should be assigned to the
partner's 'ref'
"""
if not vals and not partner_id:
raise exceptions.Warning(
_('Either field values or an id must be provided.')
)
if vals is None:
vals = {}
values = vals.copy()
# only assign a 'ref' to commercial partners
if partner_id:
partner = self.browse(partner_id)
values.setdefault('is_company', partner.is_company)
values.setdefault('parent_id', partner.parent_id.id)
return values.get('is_company') or not values.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'].next_by_code('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.multi
def copy(self, default=None):
for partner in self:
default = default or {}
if self._needsRef(self.id):
default.update({
'ref': self._get_next_ref(),
})
return super(ResPartner, self).copy(default)

76
base_partner_sequence/partner.py

@ -1,76 +0,0 @@
# -*- encoding: utf-8 -*-
##############################################################################
#
# OpenERP, Open Source Management Solution
# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>).
# Copyright (C) 2013 initOS GmbH & Co. KG (<http://www.initos.com>).
# Author Thomas Rehn <thomas.rehn at initos.com>
#
# 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 <http://www.gnu.org/licenses/>.
#
##############################################################################
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:

21
base_partner_sequence/partner_sequence.xml

@ -1,21 +0,0 @@
<?xml version="1.0"?>
<openerp>
<data noupdate="1">
#
# Sequences for res.partner
#
<record model="ir.sequence.type" id="seq_type_res_partner">
<field name="name">Partner code</field>
<field name="code">res.partner</field>
</record>
<record model="ir.sequence" id="seq_res_partner">
<field name="name">Partner code</field>
<field name="code">res.partner</field>
<field name="prefix">P/</field>
<field name="padding">5</field>
</record>
</data>
</openerp>

20
base_partner_sequence/partner_view.xml

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<record id="view_partner_form" model="ir.ui.view">
<field name="name">Make partner reference readonly when non-commercial</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<field name="ref" position="attributes">
<attribute name="attrs">{
'readonly': [('is_company', '=', False),
('parent_id', '!=', False)]}</attribute>
</field>
</field>
</record>
</data>
</openerp>

7
base_partner_sequence/tests/__init__.py

@ -0,0 +1,7 @@
# -*- coding: utf-8 -*-
# Copyright 2004-2009 Tiny SPRL (<http://tiny.be>).
# Copyright 2013 initOS GmbH & Co. KG (<http://www.initos.com>).
# Copyright 2016 Tecnativa - Vicent Cubells
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from . import test_base_partner_sequence

35
base_partner_sequence/tests/test_base_partner_sequence.py

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
# Copyright 2015 ACSONE SA/NV (<http://acsone.eu>).
# Copyright 2016 Tecnativa - Vicent Cubells
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import openerp.tests.common as common
class TestBasePartnerSequence(common.TransactionCase):
def setUp(self):
super(TestBasePartnerSequence, self).setUp()
self.res_partner = self.env['res.partner']
self.partner = self.res_partner.create({
'name': "test1",
'email': "test@test.com"})
def test_ref_sequence_on_partner(self):
# Test sequence on creating partner and copying it
self.assertTrue(self.partner.ref, "A partner has always a ref.")
copy = self.partner.copy()
self.assertTrue(copy.ref, "A partner with ref created by copy "
"has a ref by default.")
def test_ref_sequence_on_contact(self):
# Test if sequence doesn't increase on creating a contact child
contact = self.res_partner.create({
'name': "contact1",
'email': "contact@contact.com",
'parent_id': self.partner.id})
self.assertEqual(
self.partner.ref, contact.ref, "All it's ok as sequence doesn't "
"increase.")

16
base_partner_sequence/views/partner_view.xml

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<odoo>
<record id="view_partner_form" model="ir.ui.view">
<field name="name">Make partner reference readonly when non-commercial</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form"/>
<field name="arch" type="xml">
<field name="ref" position="attributes">
<attribute name="attrs">{'readonly': [('is_company', '=', False), ('parent_id', '!=', False)]}</attribute>
</field>
</field>
</record>
</odoo>
Loading…
Cancel
Save