Files
tryton/trytond/model/workflow.py
T
Cédric Krier fe674cef55 Enforce unique list of records on method calls
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
2017-07-16 23:49:15 +02:00

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