From 14447a42f7a522a888b030cb51488d92542e9169 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Mon, 12 Jan 2015 22:53:00 +0100 Subject: [PATCH] Compact vat_number It is better to standardize the format of the vat number using the compact method of python-stdnum. issue4445 review14861002 --- CHANGELOG | 1 + party.py | 38 ++++++++++++++++++++++++++------------ setup.py | 2 +- 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index ed3aaef60b..fe389819e9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,4 @@ +* compact vat number * value Function fields don't set the value anymore Version 3.4.0 - 2014-10-20 diff --git a/party.py b/party.py index 517c4e1f20..9d1e94ca8e 100644 --- a/party.py +++ b/party.py @@ -1,6 +1,7 @@ # This file is part of Tryton. The COPYRIGHT file at the top level of # this repository contains the full copyright notices and license terms. import logging +from importlib import import_module from sql.functions import CharLength @@ -127,6 +128,23 @@ class Party(ModelSQL, ModelView): def on_change_with_vat_code(self, name=None): return (self.vat_country or '') + (self.vat_number or '') + @fields.depends('vat_country', 'vat_number') + def on_change_with_vat_number(self): + if not self.vat_country: + return self.vat_number + code = self.vat_country.lower() + vat_module = None + try: + module = import_module('stdnum.%s' % code) + vat_module = getattr(module, 'vat', None) + if not vat_module: + vat_module = import_module('stdnum.%s.vat' % code) + except ImportError: + pass + if vat_module: + return vat_module.compact(self.vat_number) + return self.vat_number + @classmethod def search_vat_code(cls, name, clause): res = [] @@ -216,25 +234,21 @@ class Party(ModelSQL, ModelView): ''' if not HAS_VATNUMBER: return - vat_number = self.vat_number if not self.vat_country: return + vat_number = self.on_change_with_vat_number() + if vat_number != self.vat_number: + self.vat_number = vat_number + self.save() + if not getattr(vatnumber, 'check_vat_' + self.vat_country.lower())(vat_number): - - # Check if user doesn't have put country code in number - if vat_number.startswith(self.vat_country): - vat_number = vat_number[len(self.vat_country):] - Party.write([self], { - 'vat_number': vat_number, + self.raise_user_error('invalid_vat', { + 'vat': vat_number, + 'party': self.rec_name, }) - else: - self.raise_user_error('invalid_vat', { - 'vat': vat_number, - 'party': self.rec_name, - }) class PartyCategory(ModelSQL): diff --git a/setup.py b/setup.py index 4794955ee8..c777ee6243 100644 --- a/setup.py +++ b/setup.py @@ -92,7 +92,7 @@ setup(name=name, license='GPL-3', install_requires=requires, extras_require={ - 'VAT': ['vatnumber'], + 'VAT': ['vatnumber', 'python-stdnum'], }, zip_safe=False, entry_points="""