From 27cd4b6eb0b2d28e4367b2902d00d8daccedee3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20Krier?= Date: Thu, 28 May 2020 18:22:45 +0200 Subject: [PATCH] Check price_decimal configuration The price_decimal stored in ir.configuration is checked against the current configuration value. We do not allow to start serving a database for which the values are different as it may be due to a misconfiguration which can lead to data corruption. issue9324 review317381002 --- CHANGELOG | 2 ++ __init__.py | 2 ++ ir.py | 24 ++++++++++++++++++++++++ product.py | 4 ++-- 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 ir.py diff --git a/CHANGELOG b/CHANGELOG index 14cbec54cc..f7d834b361 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +* Check price_decimal configuration + Version 5.6.0 - 2020-05-04 * Bug fixes (see mercurial logs for details) * Add round_price diff --git a/__init__.py b/__init__.py index 134d210c72..4314810344 100644 --- a/__init__.py +++ b/__init__.py @@ -2,6 +2,7 @@ # this repository contains the full copyright notices and license terms. from trytond.pool import Pool +from . import ir from . import uom from . import category from . import product @@ -14,6 +15,7 @@ __all__ = [price_digits, round_price, uom_conversion_digits] def register(): Pool.register( + ir.Configuration, uom.UomCategory, uom.Uom, category.Category, diff --git a/ir.py b/ir.py new file mode 100644 index 0000000000..ef981fedd9 --- /dev/null +++ b/ir.py @@ -0,0 +1,24 @@ +# This file is part of Tryton. The COPYRIGHT file at the top level of +# this repository contains the full copyright notices and license terms. +from trytond.config import config +from trytond.model import fields +from trytond.pool import PoolMeta + +price_decimal = config.getint('product', 'price_decimal', default=4) + + +class Configuration(metaclass=PoolMeta): + __name__ = 'ir.configuration' + product_price_decimal = fields.Integer("Product Price Decimal") + + @classmethod + def default_product_price_decimal(cls): + return price_decimal + + def check(self): + super().check() + if self.product_price_decimal != price_decimal: + raise ValueError( + "The price_decimal %s in [product] configuration section " + "is different from the value %s in 'ir.configuration'." % ( + self.product_price_decimal, price_decimal)) diff --git a/product.py b/product.py index f81b3d19ec..bfdc184048 100644 --- a/product.py +++ b/product.py @@ -18,12 +18,12 @@ from trytond.pyson import Eval from trytond.transaction import Transaction from trytond.pool import Pool from trytond import backend -from trytond.config import config from trytond.tools import lstrip_wildcard from trytond.tools.multivalue import migrate_property from trytond.modules.company.model import ( CompanyMultiValueMixin, CompanyValueMixin) from .exceptions import InvalidIdentifierCode +from .ir import price_decimal __all__ = ['price_digits', 'round_price', 'TemplateFunction'] @@ -39,7 +39,7 @@ COST_PRICE_METHODS = [ ('average', 'Average'), ] -price_digits = (16, config.getint('product', 'price_decimal', default=4)) +price_digits = (16, price_decimal) def round_price(value, rounding=None):