diff --git a/tryton/modules/product/message.xml b/tryton/trytond/trytond/modules/product/message.xml index d77bc0e..d8b1f2f 100644 --- a/tryton/modules/product/message.xml +++ b/tryton/modules/product/message.xml @@ -24,5 +24,8 @@ this repository contains the full copyright notices and license terms. --> The %(type)s "%(code)s" for product "%(product)s" is not valid. + + Code of active product must be unique. + diff --git a/tryton/modules/product/product.py b/tryton/trytond/trytond/modules/product/product.py index 7207c02..559329e 100644 --- a/tryton/modules/product/product.py +++ b/tryton/modules/product/product.py @@ -7,12 +7,13 @@ from importlib import import_module import stdnum import stdnum.exceptions -from sql import Null, Column +from sql import Null, Column, Literal +from sql.operators import Equal from trytond.i18n import gettext from trytond.model import ( ModelView, ModelSQL, Model, UnionMixin, DeactivableMixin, sequence_ordered, - fields) + Exclude, fields) from trytond.pyson import Eval from trytond.transaction import Transaction from trytond.pool import Pool @@ -238,6 +239,14 @@ class Product( super(Product, cls).__setup__() + t = cls.__table__() + cls._sql_constraints = [ + ('code_exclude', Exclude(t, (t.code, Equal), + where=(t.active == Literal(True)) + & (t.code != '')), + 'product.msg_product_code_unique'), + ] + for attr in dir(Template): tfield = getattr(Template, attr) if not isinstance(tfield, fields.Field):