diff --git a/ir.py b/ir.py index c0a54f8..faa4970 100644 --- a/ir.py +++ b/ir.py @@ -5,12 +5,14 @@ from trytond.model import ModelSQL, ModelView, MatchMixin, fields from trytond.pool import PoolMeta, Pool from trytond.pyson import Eval, And, Bool from trytond.transaction import Transaction +from trytond.i18n import gettext +from trytond.ir.sequence import MissingError from trytond import backend from sql import Literal, For __all__ = ['Sequence', 'SequencePeriod', 'SequenceStrict'] -sql_sequence = backend.get('Database').has_sequence() +sql_sequence = backend.Database.has_sequence() class Sequence(metaclass=PoolMeta): @@ -21,16 +23,6 @@ class Sequence(metaclass=PoolMeta): depends=['type'], order=[('start_date', 'ASC')]) - @classmethod - def __setup__(cls): - super(Sequence, cls).__setup__() - cls._error_messages.update({ - 'missing_date': - 'Must define a Date value in context for Sequence "%s".', - 'missing_period': - 'Cannot find a valid period for date "%s" in Sequence "%s".' - }) - @classmethod def write(cls, sequences, values, *args): super(Sequence, cls).write(sequences, values, *args) @@ -39,30 +31,29 @@ class Sequence(metaclass=PoolMeta): for period in sequence.periods: period.update_sql_sequence() - @classmethod - def get_id(cls, domain, _lock=False): - if isinstance(domain, cls): - domain = domain.id - if isinstance(domain, int): - domain = [('id', '=', domain)] - + def get_id(self, _lock=False): + cls = self.__class__ with Transaction().set_context(user=False, _check_access=False): with Transaction().set_user(0): try: - sequence, = cls.search(domain, limit=1) + sequence = cls(self.id) except TypeError: - cls.raise_user_error('missing') + raise MissingError(gettext('ir.msg_sequence_missing')) date = Transaction().context.get('date') if sequence.periods: if not date: - cls.raise_user_error('missing_date', sequence.rec_name) + raise MissingError(gettext( + 'ir_sequence_period.sequence.msg_missing_date', + sequence=sequence.rec_name)) pattern = sequence._get_period_pattern() for period in sequence.periods: if period.match(pattern): - return period.get_id(_lock=_lock) - cls.raise_user_error('missing_period', (date, - sequence.rec_name)) - return super(Sequence, cls).get_id(domain, _lock=_lock) + return period.get(_lock=_lock) + raise MissingError(gettext( + 'ir_sequence_period.sequence.msg_missing_date', + date=date, + sequence=sequence.rec_name)) + return super(Sequence, cls).get(_lock=_lock) return '' def _get_period_pattern(self): @@ -181,8 +172,9 @@ class SequencePeriod(ModelSQL, ModelView, MatchMixin): transaction.database.sequence_delete( transaction.connection, self._sql_sequence_name) - def get_id(self, _lock=False): + def get(self, _lock=False): Sequence = Pool().get('ir.sequence') + cls = self.__class__ if _lock: transaction = Transaction() @@ -199,27 +191,30 @@ class SequencePeriod(ModelSQL, ModelView, MatchMixin): cursor.execute(*query) date = Transaction().context.get('date') return '%s%s%s' % ( - Sequence._process(self.prefix or self.sequence.prefix, date=date), - self._get_sequence(), - Sequence._process(self.suffix or self.sequence.suffix, date=date), + Sequence._process(self.prefix or self.sequence.prefix, + date=date), + cls._get_sequence(self), + Sequence._process(self.suffix or self.sequence.suffix, + date=date), ) - def _get_sequence(self): - if self.sequence.type == 'incremental': - if sql_sequence and not self._strict: + @classmethod + def _get_sequence(cls, period): + if period.sequence.type == 'incremental': + if sql_sequence and not cls._strict: cursor = Transaction().connection.cursor() cursor.execute('SELECT nextval(\'"%s"\')' - % self._sql_sequence_name) + % period._sql_sequence_name) number_next, = cursor.fetchone() else: # Pre-fetch number_next - number_next = self.number_next_internal + number_next = period.number_next_internal - self.write([self], { + cls.write([period], { 'number_next_internal': (number_next - + self.sequence.number_increment), + + period.sequence.number_increment), }) - return '%%0%sd' % self.sequence.padding % number_next + return '%%0%sd' % period.sequence.padding % number_next else: raise NotImplementedError() diff --git a/locale/es.po b/locale/es.po index 07ffdea..3bc9fa1 100644 --- a/locale/es.po +++ b/locale/es.po @@ -2,11 +2,11 @@ msgid "" msgstr "Content-Type: text/plain; charset=utf-8\n" -msgctxt "error:ir.sequence:" +msgctxt "model:ir.message,text:msg_missing_date" msgid "Must define a Date value in context for Sequence \"%s\"." msgstr "Debe definir un valor de Fecha en contexto para la Secuencia \"%s\"." -msgctxt "error:ir.sequence:" +msgctxt "model:ir.message,text:msg_missing_period" msgid "Cannot find a valid period for date \"%s\" in Sequence \"%s\"." msgstr "No se ha podido encontrar un período válido para la fecha \"%s\" en la Secuencia \"%s\"." diff --git a/message.xml b/message.xml new file mode 100644 index 0000000..f5a0b73 --- /dev/null +++ b/message.xml @@ -0,0 +1,13 @@ + + + + + + Must define a Date value in context for Sequence "%(sequence)s". + + + Cannot find a valid period for date "%(date)s" in Sequence "%(sequence)s". + + + \ No newline at end of file diff --git a/tests/test_ir_sequence_period.py b/tests/test_ir_sequence_period.py index 86af787..4d5913a 100644 --- a/tests/test_ir_sequence_period.py +++ b/tests/test_ir_sequence_period.py @@ -22,12 +22,12 @@ class IrSequencePeriodTestCase(ModuleTestCase): with Transaction().set_context(user=False, _check_access=False): with Transaction().set_user(0): - SequenceType.create([{ + type, = SequenceType.create([{ 'name': 'Tests', - 'code': 'test'}]) + }]) sequence, = Sequence.create([{ 'name': 'Test incremental', - 'code': 'test', + 'sequence_type': type.id, 'prefix': '${year}/', 'suffix': '', 'type': 'incremental', diff --git a/tryton.cfg b/tryton.cfg index b632fbd..24a52cd 100644 --- a/tryton.cfg +++ b/tryton.cfg @@ -12,3 +12,4 @@ extras_depend: xml: ir.xml + message.xml