From b949dcc5f5e56b1ad716ba1c893fc4cd33d86c45 Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sun, 17 Oct 2021 11:32:45 +0200 Subject: [PATCH] [MIG] partner_data_vies_populator from v13 to v14 Improve error handling to avoid crash when Internet connectivity is down Read country code from VIES, not from VAT number No update when VAT number is invalid Improve tests --- partner_data_vies_populator/README.rst | 97 +------------------ partner_data_vies_populator/__manifest__.py | 8 +- .../models/res_partner.py | 23 +++-- .../readme/CONTRIBUTORS.rst | 6 ++ .../readme/DESCRIPTION.rst | 2 + .../readme/INSTALL.rst | 8 +- .../tests/test_partner_data_vies_populator.py | 72 +++++++++----- requirements.txt | 1 + .../odoo/addons/partner_data_vies_populator | 1 + setup/partner_data_vies_populator/setup.py | 6 ++ 10 files changed, 87 insertions(+), 137 deletions(-) create mode 120000 setup/partner_data_vies_populator/odoo/addons/partner_data_vies_populator create mode 100644 setup/partner_data_vies_populator/setup.py diff --git a/partner_data_vies_populator/README.rst b/partner_data_vies_populator/README.rst index 22a576133..d9f7957bc 100644 --- a/partner_data_vies_populator/README.rst +++ b/partner_data_vies_populator/README.rst @@ -1,96 +1 @@ -=========================== -Partner Data VIES Populator -=========================== - -.. !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - !! This file is generated by oca-gen-addon-readme !! - !! changes will be overwritten. !! - !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! - -.. |badge1| image:: https://img.shields.io/badge/maturity-Beta-yellow.png - :target: https://odoo-community.org/page/development-status - :alt: Beta -.. |badge2| image:: https://img.shields.io/badge/licence-AGPL--3-blue.png - :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html - :alt: License: AGPL-3 -.. |badge3| image:: https://img.shields.io/badge/github-OCA%2Fpartner--contact-lightgray.png?logo=github - :target: https://github.com/OCA/partner-contact/tree/13.0/partner_data_vies_populator - :alt: OCA/partner-contact -.. |badge4| image:: https://img.shields.io/badge/weblate-Translate%20me-F47D42.png - :target: https://translation.odoo-community.org/projects/partner-contact-13-0/partner-contact-13-0-partner_data_vies_populator - :alt: Translate me on Weblate -.. |badge5| image:: https://img.shields.io/badge/runbot-Try%20me-875A7B.png - :target: https://runbot.odoo-community.org/runbot/134/13.0 - :alt: Try me on Runbot - -|badge1| |badge2| |badge3| |badge4| |badge5| - -This module allows you to create the partners (companies) based on their VAT number. -Name and address of the partner will automatically be completed via VIES Webservice. - -VIES Service (based on stdnum python) -http://ec.europa.eu/taxation_customs/vies/vieshome.do - -**Table of contents** - -.. contents:: - :local: - -Installation -============ - -To install this module, you need to: - -#. Clone the branch 13.0 of the repository https://github.com/OCA/partner-contact -#. Add the path to this repository in your configuration (addons-path) -#. Update the module list -#. Search for "Partner Data VIES Populator" in your addons -#. install the module - -Usage -===== - -When changing a company partner VAT number, this module will try to fetch the partner data from VIES webservice, if available on VIES will update the name, address and country. - -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 `_. - -Do not contact contributors directly about support or help with technical issues. - -Credits -======= - -Authors -~~~~~~~ - -* NextERP Romania -* Forest and Biomass Romania - -Contributors -~~~~~~~~~~~~ - -* `NextERP Romania `_: - - * Fekete Mihai - -Maintainers -~~~~~~~~~~~ - -This module is maintained by the OCA. - -.. image:: https://odoo-community.org/logo.png - :alt: Odoo Community Association - :target: https://odoo-community.org - -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. - -This module is part of the `OCA/partner-contact `_ project on GitHub. - -You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute. +Will be regenerated from readme subdir diff --git a/partner_data_vies_populator/__manifest__.py b/partner_data_vies_populator/__manifest__.py index eaa8b7462..3ed7de8ce 100644 --- a/partner_data_vies_populator/__manifest__.py +++ b/partner_data_vies_populator/__manifest__.py @@ -6,16 +6,14 @@ "name": "Partner Data VIES Populator", "summary": "Using VIES webservice, name and address information will " "be fetched and added to the partner.", - "version": "13.0.1.0.0", + "version": "14.0.1.0.0", "category": "Customer Relationship Management", "author": "NextERP Romania," "Forest and Biomass Romania," "Odoo Community Association (OCA)", "website": "https://github.com/OCA/partner-contact", "license": "AGPL-3", - "application": False, - "installable": True, - "external_dependencies": {"python": ["python-stdnum"]}, "depends": ["base_vat"], - "auto_install": False, + "external_dependencies": {"python": ["python-stdnum"]}, + "installable": True, } diff --git a/partner_data_vies_populator/models/res_partner.py b/partner_data_vies_populator/models/res_partner.py index e9dcee445..59fba4054 100644 --- a/partner_data_vies_populator/models/res_partner.py +++ b/partner_data_vies_populator/models/res_partner.py @@ -4,7 +4,8 @@ import logging -from odoo import api, models +from odoo import _, api, models +from odoo.exceptions import UserError _logger = logging.getLogger(__name__) @@ -18,11 +19,16 @@ class ResPartner(models.Model): _inherit = "res.partner" @api.model - def _get_vies_data(self, vat): + def _get_vies_data(self, vat, raise_if_fail=False): res = {} - vat_country, vat_number = self._split_vat(vat) - result = check_vies(vat) - if result.name: + try: + result = check_vies(vat) + except Exception as e: + _logger.warning("Failed to query VIES: %s" % e) + if raise_if_fail: + raise UserError(_("Failed to query VIES.\nTechnical error: %s.") % e) + return res + if result.valid and result.name: res["vat"] = vat # Update partner name if listed on VIES if result.name != "---": @@ -33,7 +39,9 @@ class ResPartner(models.Model): result.address.replace("\n", " ").replace("\r", "").title() ) # Get country by country code - country = self.env["res.country"].search([("code", "ilike", vat_country)]) + country = self.env["res.country"].search( + [("code", "ilike", result.countryCode)] + ) if country: res["country_id"] = country[0].id return res @@ -52,4 +60,5 @@ class ResPartner(models.Model): if vat_country and vat_country not in eu_countries: continue result = self._get_vies_data(vat) - partner.update(result) + if result: + partner.update(result) diff --git a/partner_data_vies_populator/readme/CONTRIBUTORS.rst b/partner_data_vies_populator/readme/CONTRIBUTORS.rst index baba5d11c..0a77744a4 100644 --- a/partner_data_vies_populator/readme/CONTRIBUTORS.rst +++ b/partner_data_vies_populator/readme/CONTRIBUTORS.rst @@ -1,3 +1,9 @@ * `NextERP Romania `_: * Fekete Mihai + +* `Forest and Biomass Romania `_ + +* `Akretion `_ : + + * Alexis de Lattre diff --git a/partner_data_vies_populator/readme/DESCRIPTION.rst b/partner_data_vies_populator/readme/DESCRIPTION.rst index 3adabbf60..30490fd06 100644 --- a/partner_data_vies_populator/readme/DESCRIPTION.rst +++ b/partner_data_vies_populator/readme/DESCRIPTION.rst @@ -3,3 +3,5 @@ Name and address of the partner will automatically be completed via VIES Webserv VIES Service (based on stdnum python) http://ec.europa.eu/taxation_customs/vies/vieshome.do + +Unfortunately, VIES doesn't return a structured address but just a one-line address that aggregate street, zip and city. So, when you use this module to create a partner, the *City* and *Zip* fields will be left empty ; the *Street* field will contain the one-line address. diff --git a/partner_data_vies_populator/readme/INSTALL.rst b/partner_data_vies_populator/readme/INSTALL.rst index 4047a7fef..0f872545f 100644 --- a/partner_data_vies_populator/readme/INSTALL.rst +++ b/partner_data_vies_populator/readme/INSTALL.rst @@ -1,7 +1 @@ -To install this module, you need to: - -#. Clone the branch 13.0 of the repository https://github.com/OCA/partner-contact -#. Add the path to this repository in your configuration (addons-path) -#. Update the module list -#. Search for "Partner Data VIES Populator" in your addons -#. install the module +This module require the `python-stdnum `_ librairy. As Odoo itself depend on this librairy, it should already be installed on your system. diff --git a/partner_data_vies_populator/tests/test_partner_data_vies_populator.py b/partner_data_vies_populator/tests/test_partner_data_vies_populator.py index 17a5dd5a3..47b206891 100644 --- a/partner_data_vies_populator/tests/test_partner_data_vies_populator.py +++ b/partner_data_vies_populator/tests/test_partner_data_vies_populator.py @@ -9,49 +9,77 @@ class TestPartnerCreateByVAT(TransactionCase): def setUp(self): super().setUp() self.partner_model = self.env["res.partner"] + self.be_country_id = self.env.ref("base.be").id self.sample_1 = { - "valid": True, - "name": u"SA ODOO", - "address": u"Chaussée De Namur 40 1367 Ramillies", + "name": "SA ODOO", + "address": "Chaussée De Namur 40 1367 Ramillies", + "country_code": "BE", } def test_create_from_vat1(self): # Create an partner from VAT number field - with Form(self.env["res.partner"]) as partner_form: + with Form(self.partner_model) as partner_form: partner_form.is_company = True partner_form.vat = "be0477472701" # Check if the datas fetch correspond with the datas from VIES. self.assertEqual(partner_form.name, self.sample_1["name"]) self.assertEqual(partner_form.street, self.sample_1["address"]) - self.assertEqual(partner_form.country_id.name, "Belgium") + self.assertEqual( + partner_form.country_id.code, self.sample_1["country_code"] + ) self.assertEqual(partner_form.vat, "BE0477472701") - def test_vat_change1(self): + def test_company_vat_change(self): # Change partner VAT number field - partner1 = self.partner_model.create({"name": "1", "is_company": True}) - with Form(partner1) as partner_form: + partner = self.partner_model.create({"name": "1", "is_company": True}) + with Form(partner) as partner_form: # Check if the datas fetch correspond with the datas from VIES. partner_form.vat = "be0477472701" self.assertEqual(partner_form.name, self.sample_1["name"]) self.assertEqual(partner_form.street, self.sample_1["address"]) - self.assertEqual(partner_form.country_id.name, "Belgium") + self.assertEqual( + partner_form.country_id.code, self.sample_1["country_code"] + ) self.assertEqual(partner_form.vat, "BE0477472701") - # Empty VAT + def test_empty_vat_change(self): + partner = self.partner_model.create( + { + "name": "2", + "is_company": True, + "country_id": self.be_country_id, + } + ) + with Form(partner) as partner_form: partner_form.vat = False - self.assertEqual(partner_form.name, self.sample_1["name"]) - self.assertEqual(partner_form.street, self.sample_1["address"]) - self.assertEqual(partner_form.country_id.name, "Belgium") + self.assertEqual(partner_form.name, partner.name) + self.assertEqual(partner_form.street, False) + self.assertEqual(partner_form.country_id.id, partner.country_id.id) - # Not company - partner_form.is_company = False - self.assertEqual(partner_form.name, self.sample_1["name"]) - self.assertEqual(partner_form.street, self.sample_1["address"]) - self.assertEqual(partner_form.country_id.name, "Belgium") + def test_individual_vat_change(self): + partner = self.partner_model.create( + { + "name": "3", + "is_company": False, + "country_id": self.be_country_id, + } + ) + with Form(partner) as partner_form: + partner_form.vat = "BE0477472701" + self.assertEqual(partner_form.name, partner.name) + self.assertEqual(partner_form.street, False) + self.assertEqual(partner_form.country_id.id, partner.country_id.id) - # Not EU country + def test_non_eu_vat_change(self): + non_eu_country_id = self.env.ref("base.sc").id + partner = self.partner_model.create( + { + "name": "4", + "is_company": True, + "country_id": non_eu_country_id, + } + ) + with Form(partner) as partner_form: partner_form.vat = "GT1234567 - 1" - self.assertEqual(partner_form.name, self.sample_1["name"]) - self.assertEqual(partner_form.street, self.sample_1["address"]) - self.assertEqual(partner_form.country_id.name, "Belgium") + self.assertEqual(partner_form.name, partner.name) diff --git a/requirements.txt b/requirements.txt index 41b756f38..c35786a17 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,3 +1,4 @@ # generated from manifests external_dependencies email-validator phonenumbers +python-stdnum diff --git a/setup/partner_data_vies_populator/odoo/addons/partner_data_vies_populator b/setup/partner_data_vies_populator/odoo/addons/partner_data_vies_populator new file mode 120000 index 000000000..b9f44eac4 --- /dev/null +++ b/setup/partner_data_vies_populator/odoo/addons/partner_data_vies_populator @@ -0,0 +1 @@ +../../../../partner_data_vies_populator \ No newline at end of file diff --git a/setup/partner_data_vies_populator/setup.py b/setup/partner_data_vies_populator/setup.py new file mode 100644 index 000000000..28c57bb64 --- /dev/null +++ b/setup/partner_data_vies_populator/setup.py @@ -0,0 +1,6 @@ +import setuptools + +setuptools.setup( + setup_requires=['setuptools-odoo'], + odoo_addon=True, +)