diff --git a/partner_street_number/README.rst b/partner_street_number/README.rst new file mode 100644 index 000000000..684f943a9 --- /dev/null +++ b/partner_street_number/README.rst @@ -0,0 +1,54 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :alt: License + +Split street name and number +============================ + +This module introduces separate fields for street name and street number. + +Changes to the Odoo datamodel +============================= +- Introduce two new fields for street name and number +- Keep 'Street' field as a function field to return street name + number +- Data written to the 'Street' field will be parsed into street name and number + if possible. This will be performed upon installation of the module for + existing partners. + +Compatibility +============= +This module is compatible with OpenERP 8.0. + + +Installation +============ + +Upon installation, the module will do a simple migration of existing values in +the street column to split up the street name and number. + +Credits +======= + +Contributors +------------ + +* Stefan Rijnhart +* Ronald Portier +* Pedro M. Baeza + +Icon +---- + +* Based on https://openclipart.org/detail/149575/brass-plaques-tags. + +Maintainer +---------- + +.. image:: http://odoo-community.org/logo.png + :alt: Odoo Community Association + :target: http://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/partner_street_number/__init__.py b/partner_street_number/__init__.py new file mode 100644 index 000000000..55fd67147 --- /dev/null +++ b/partner_street_number/__init__.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Odoo, an open source suite of business apps +# This module copyright (C) 2013-2015 Therp BV (). +# +# 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 models + +import logging +from openerp import SUPERUSER_ID + + +def post_init_hook(cr, registry): + """ + Post-install script. Because 'street' is now a stored function field, we + should be able to retrieve its values from the cursor. We use those to + fill the new name/number fields using the street field's inverse function, + which does a basic street name/number split. + """ + logging.getLogger('openerp.addons.partner_street_number').info( + 'Migrating existing street names') + cr.execute( + 'SELECT id, street FROM res_partner ' + 'WHERE street IS NOT NULL and street_name IS NULL' + ) + partner_obj = registry['res.partner'] + for partner in cr.fetchall(): + partner_obj.write( + cr, SUPERUSER_ID, partner[0], {'street': partner[1]}) diff --git a/partner_street_number/__openerp__.py b/partner_street_number/__openerp__.py new file mode 100644 index 000000000..b3435c100 --- /dev/null +++ b/partner_street_number/__openerp__.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Odoo, an open source suite of business apps +# This module copyright (C) 2013-2015 Therp BV (). +# +# 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": "Street name and number", + "summary": "Introduces separate fields for street name and street number.", + "version": "0.1", + "author": "Therp BV,Odoo Community Association (OCA)", + "website": "https://github.com/oca/partner-contact", + "category": 'Tools', + "depends": [ + 'base' + ], + "data": [ + 'views/res_partner.xml', + ], + 'installable': True, + 'license': 'AGPL-3', + 'post_init_hook': 'post_init_hook', +} diff --git a/partner_street_number/i18n/nl.po b/partner_street_number/i18n/nl.po new file mode 100644 index 000000000..0cb2df6a1 --- /dev/null +++ b/partner_street_number/i18n/nl.po @@ -0,0 +1,46 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * partner_street_number +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-03-12 22:26+0000\n" +"PO-Revision-Date: 2015-03-12 22:26+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: partner_street_number +#: view:res.partner:partner_street_number.view_partner_form +msgid "Number..." +msgstr "Nummer..." + +#. module: partner_street_number +#: model:ir.model,name:partner_street_number.model_res_partner +msgid "Partner" +msgstr "Relatie" + +#. module: partner_street_number +#: field:res.partner,street_name:0 +msgid "Street name" +msgstr "Straatnaam" + +#. module: partner_street_number +#: field:res.partner,street_number:0 +msgid "Street number" +msgstr "Huisnummer" + +#. module: partner_street_number +#: view:res.partner:partner_street_number.view_partner_form +msgid "Street..." +msgstr "Straat..." + +#. module: partner_street_number +#: view:res.partner:partner_street_number.view_partner_form +msgid "{'default_parent_id': active_id, 'default_street_name': street_name, 'default_street_number': street_number, 'default_street2': street2, 'default_city': city, 'default_state_id': state_id, 'default_zip': zip, 'default_country_id': country_id, 'default_supplier': supplier, 'default_customer': customer, 'default_use_parent_address': True}" +msgstr "" diff --git a/partner_street_number/i18n/partner_street_number.pot b/partner_street_number/i18n/partner_street_number.pot new file mode 100644 index 000000000..8a8554a89 --- /dev/null +++ b/partner_street_number/i18n/partner_street_number.pot @@ -0,0 +1,46 @@ +# Translation of Odoo Server. +# This file contains the translation of the following modules: +# * partner_street_number +# +msgid "" +msgstr "" +"Project-Id-Version: Odoo Server 8.0\n" +"Report-Msgid-Bugs-To: \n" +"POT-Creation-Date: 2015-03-12 22:26+0000\n" +"PO-Revision-Date: 2015-03-12 22:26+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: partner_street_number +#: view:res.partner:partner_street_number.view_partner_form +msgid "Number..." +msgstr "" + +#. module: partner_street_number +#: model:ir.model,name:partner_street_number.model_res_partner +msgid "Partner" +msgstr "" + +#. module: partner_street_number +#: field:res.partner,street_name:0 +msgid "Street name" +msgstr "" + +#. module: partner_street_number +#: field:res.partner,street_number:0 +msgid "Street number" +msgstr "" + +#. module: partner_street_number +#: view:res.partner:partner_street_number.view_partner_form +msgid "Street..." +msgstr "" + +#. module: partner_street_number +#: view:res.partner:partner_street_number.view_partner_form +msgid "{'default_parent_id': active_id, 'default_street_name': street_name, 'default_street_number': street_number, 'default_street2': street2, 'default_city': city, 'default_state_id': state_id, 'default_zip': zip, 'default_country_id': country_id, 'default_supplier': supplier, 'default_customer': customer, 'default_use_parent_address': True}" +msgstr "" diff --git a/partner_street_number/models/__init__.py b/partner_street_number/models/__init__.py new file mode 100644 index 000000000..91fed54d4 --- /dev/null +++ b/partner_street_number/models/__init__.py @@ -0,0 +1 @@ +from . import res_partner diff --git a/partner_street_number/models/res_partner.py b/partner_street_number/models/res_partner.py new file mode 100644 index 000000000..b28f44d2a --- /dev/null +++ b/partner_street_number/models/res_partner.py @@ -0,0 +1,97 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Odoo, an open source suite of business apps +# This module copyright (C) 2013-2015 Therp BV (). +# +# @authors: Stefan Rijnhart, Ronald Portier +# +# 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 re +from openerp import models, fields, api + + +class ResPartner(models.Model): + _inherit = 'res.partner' + + @api.one + @api.depends('street_name', 'street_number') + def _get_street(self): + self.street = ' '.join( + filter(None, [self.street_name, self.street_number])) + + def _write_street(self): + """ + Simplistically try to parse in case a value should get written + to the 'street' field (for instance at import time, which provides + us with a way of easily restoring the data when this module is + installed on a database that already contains addresses). + """ + street_name = self.street and self.street.strip() or False + street_number = False + if self.street: + match = re.search(r'(.+)\s+(\d.*)', self.street.strip()) + if match and len(match.group(2)) < 6: + street_name = match.group(1) + street_number = match.group(2) + for partner in self: + self.street_name = street_name + self.street_number = street_number + + @api.model + def _display_address(self, address, without_company=False): + """ + Inject a context key to prevent the 'street' name to be + deleted from the result of _address_fields when called from + the super. + """ + return super(ResPartner, self.with_context(display_address=True)).\ + _display_address(address, without_company=without_company) + + @api.model + def _address_fields(self): + """ + Pass on the fields for address synchronisation to contacts. + + This method is used on at least two occassions: + + [1] when address fields are synced to contacts, and + [2] when addresses are formatted + + We want to prevent the 'street' field to be passed in the + first case, as it has a fallback write method which should + not be triggered in this case, while leaving the field in + in the second case. Therefore, we remove the field + name from the list of address fields unless we find the context + key that this module injects when formatting an address. + + Could have checked for the occurrence of the synchronisation + method instead, leaving the field in by default but that could + lead to silent data corruption should the synchronisation API + ever change. + """ + res = super(ResPartner, self)._address_fields() + if 'street' in res and not ( + self._context.get('display_address')): + res.remove('street') + return res + ['street_name', 'street_number'] + + street_name = fields.Char('Street name') + street_number = fields.Char('Street number') + # Must be stored as per https://bugs.launchpad.net/bugs/1253200 + street = fields.Char( + compute='_get_street', store=True, inverse='_write_street') diff --git a/partner_street_number/static/description/icon.png b/partner_street_number/static/description/icon.png new file mode 100644 index 000000000..d72dfde5c Binary files /dev/null and b/partner_street_number/static/description/icon.png differ diff --git a/partner_street_number/static/description/icon.svg b/partner_street_number/static/description/icon.svg new file mode 100644 index 000000000..059bd0e60 --- /dev/null +++ b/partner_street_number/static/description/icon.svg @@ -0,0 +1,301 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + Openclipart + + + Brass plaques, tags + 2011-07-14T01:26:24 + Part of this is a digital picture of some brass foil, then I added vector edges. The other two are all vector. + https://openclipart.org/detail/149575/brass-plaques-tags-by-raker-tooth + + + Raker Tooth + + + + + Brass plaques + brass tags + gold look + metal effects + name tags + + + + + + + + + + + diff --git a/partner_street_number/views/res_partner.xml b/partner_street_number/views/res_partner.xml new file mode 100644 index 000000000..6f642964f --- /dev/null +++ b/partner_street_number/views/res_partner.xml @@ -0,0 +1,44 @@ + + + + + + Add separate fields for street name and number + res.partner + + + + +
+ + +
+
+ + +
+ + +
+
+ + + {'default_parent_id': active_id, 'default_street_name': street_name, 'default_street_number': street_number, 'default_street2': street2, 'default_city': city, 'default_state_id': state_id, 'default_zip': zip, 'default_country_id': country_id, 'default_supplier': supplier, 'default_customer': customer, 'default_use_parent_address': True} + + +
+
+
+