An option is added on RPC definition to enforce uniqueness of records instantiated. The key methods ModeView.button and Workflow.transition have an assert to detect error in development code. issue6184 review36411002
48 lines
1.7 KiB
Python
48 lines
1.7 KiB
Python
# 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 collections import OrderedDict
|
|
from functools import wraps
|
|
|
|
|
|
class Workflow(object):
|
|
"""
|
|
Mix-in class to handle transition check.
|
|
"""
|
|
_transition_state = 'state'
|
|
|
|
@classmethod
|
|
def __setup__(cls):
|
|
super(Workflow, cls).__setup__()
|
|
cls._transitions = set()
|
|
|
|
@staticmethod
|
|
def transition(state):
|
|
def check_transition(func):
|
|
@wraps(func)
|
|
def wrapper(cls, records, *args, **kwargs):
|
|
filtered = []
|
|
to_update = OrderedDict()
|
|
|
|
assert len(records) == len(set(records)), "Duplicate records"
|
|
|
|
for record in records:
|
|
current_state = getattr(record, cls._transition_state)
|
|
transition = (current_state, state)
|
|
if transition in cls._transitions:
|
|
filtered.append(record)
|
|
if current_state != state:
|
|
to_update[record] = current_state
|
|
|
|
result = func(cls, filtered, *args, **kwargs)
|
|
if to_update:
|
|
for record in to_update.keys():
|
|
current_state = getattr(record, cls._transition_state)
|
|
if current_state != to_update[record]:
|
|
del to_update[record]
|
|
cls.write(list(to_update), {
|
|
cls._transition_state: state,
|
|
})
|
|
return result
|
|
return wrapper
|
|
return check_transition
|