Files
tryton/trytond/model/modelworkflow.py
T

146 lines
4.8 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 trytond.model import ModelStorage
class ModelWorkflow(ModelStorage):
'''
Define a model with a workflow in Tryton.
'''
def __init__(self):
super(ModelWorkflow, self).__init__()
self._rpc.update({
'workflow_trigger_validate': True,
})
def create(self, cursor, user, values, context=None):
res = super(ModelWorkflow, self).create(cursor, user, values,
context=context)
self.workflow_trigger_create(cursor, user, res, context=context)
return res
def write(self, cursor, user, ids, values, context=None):
res = super(ModelWorkflow, self).write(cursor, user, ids, values,
context=context)
self.workflow_trigger_write(cursor, user, ids, context=context)
return res
def delete(self, cursor, user, ids, context=None):
instance_obj = self.pool.get('workflow.instance')
if isinstance(ids, (int, long)):
ids = [ids]
if instance_obj.search(cursor, 0, [
('res_id', 'in', ids),
('res_type', '=', self._name),
('state', '!=', 'complete'),
], context=context):
self.raise_user_error(cursor, 'delete_workflow_record',
context=context)
res = super(ModelWorkflow, self).delete(cursor, user, ids,
context=context)
self.workflow_trigger_delete(cursor, user, ids, context=context)
return res
def workflow_trigger_create(self, cursor, user, ids, context=None):
'''
Trigger create event
:param cursor: the database cursor
:param user: the user id
:param ids: a list of id or an id
:param context: the context
'''
workflow_obj = self.pool.get('workflow')
instance_obj = self.pool.get('workflow.instance')
if isinstance(ids, (int, long)):
ids = [ids]
workflow_ids = workflow_obj.search(cursor, 0, [
('osv', '=', self._name),
('on_create', '=', True),
], context=context)
for res_id in ids:
for wkf_id in workflow_ids:
instance_id = instance_obj.create(cursor, user, {
'res_type': self._name,
'res_id': res_id,
'workflow': wkf_id,
'state': 'active',
}, context=context)
def workflow_trigger_write(self, cursor, user, ids, context=None):
'''
Trigger write event
:param cursor: the database cursor
:param user: the user id
:param ids: a list of id or an id
:param context: the context
'''
instance_obj = self.pool.get('workflow.instance')
if isinstance(ids, (int, long)):
ids = [ids]
instance_ids = instance_obj.search(cursor, 0, [
('res_id', 'in', ids),
('res_type', '=', self._name),
('state', '=', 'active'),
], context=context)
for instance in instance_obj.browse(cursor, 0, instance_ids,
context=context):
instance_obj.update(cursor, user, instance, context=context)
def workflow_trigger_validate(self, cursor, user, ids, signal,
context=None):
'''
Trigger validate event
:param cursor: the database cursor
:param user: the user id
:param ids: a list of id or an id
:param context: the context
'''
instance_obj = self.pool.get('workflow.instance')
if isinstance(ids, (int, long)):
ids = [ids]
instance_ids = instance_obj.search(cursor, 0, [
('res_id', 'in', ids),
('res_type', '=', self._name),
('state', '=', 'active'),
], context=context)
for instance in instance_obj.browse(cursor, 0, instance_ids,
context=context):
instance_obj.validate(cursor, user, instance, signal=signal,
context=context)
def workflow_trigger_delete(self, cursor, user, ids, context=None):
'''
Trigger delete event
:param cursor: the database cursor
:param user: the user id
:param ids: a list of id or an id
:param context: the context
'''
if self._name == 'workflow.instance':
return
instance_obj = self.pool.get('workflow.instance')
if isinstance(ids, (int, long)):
ids = [ids]
instance_ids = instance_obj.search(cursor, 0, [
('res_id', 'in', ids),
('res_type', '=', self._name),
], context=context)
instance_obj.delete(cursor, 0, instance_ids, context=context)