diff options
| author | Stephane Wirtel <stw@openerp.com> | 2013-10-23 14:53:43 +0200 |
|---|---|---|
| committer | Stephane Wirtel <stw@openerp.com> | 2013-10-23 14:53:43 +0200 |
| commit | c7afc04be334d583510cfa66592397b8400a9190 (patch) | |
| tree | fb19e9db97af5e1111091c20125821c535402d47 /openerp/workflow/instance.py | |
| parent | 5696282656e22df91591800333258d6ecf378df2 (diff) | |
[REF] First step, use the same vocabulary for the cr, uid, res_type and res_id
=> Session, Record.
* a Session is a container of one cursor and one user
* a Record is a container for the res_type and res_id, in this object, the right
names are model and id.
Examples:
session = Session(cr, uid)
record = Record(res_type, res_id)
record.mode, record.id
A new class named 'WorkflowService' is a wrapper for the instance.* functions.
bzr revid: stw@openerp.com-20131023125343-uo0bq52n86ae0fb0
Diffstat (limited to 'openerp/workflow/instance.py')
| -rw-r--r-- | openerp/workflow/instance.py | 87 |
1 files changed, 57 insertions, 30 deletions
diff --git a/openerp/workflow/instance.py b/openerp/workflow/instance.py index eed3e984f42..4db807daaac 100644 --- a/openerp/workflow/instance.py +++ b/openerp/workflow/instance.py @@ -19,57 +19,84 @@ # ############################################################################## import workitem +from helpers import Session +from helpers import Record -def create(cr, ident, wkf_id): - (uid,res_type,res_id) = ident - cr.execute('insert into wkf_instance (res_type,res_id,uid,wkf_id) values (%s,%s,%s,%s) RETURNING id', (res_type,res_id,uid,wkf_id)) - id_new = cr.fetchone()[0] - cr.execute('select * from wkf_activity where flow_start=True and wkf_id=%s', (wkf_id,)) - res = cr.dictfetchall() +def create(session, record, workflow_id): + assert isinstance(session, Session) + assert isinstance(record, Record) + assert isinstance(workflow_id, (int, long)) + + cr = session.cr + cr.execute('insert into wkf_instance (res_type,res_id,uid,wkf_id) values (%s,%s,%s,%s) RETURNING id', (record.model, record.id, session.uid, workflow_id)) + instance_id = cr.fetchone()[0] + cr.execute('select * from wkf_activity where flow_start=True and wkf_id=%s', (workflow_id,)) + activities = cr.dictfetchall() stack = [] - workitem.create(cr, res, id_new, ident, stack=stack) - update(cr, id_new, ident) - return id_new + workitem.create(session, record, activities, instance_id, stack=stack) + update(session, record, instance_id) + return instance_id + +def delete(session, record): + assert isinstance(session, Session) + assert isinstance(record, Record) -def delete(cr, ident): - (uid,res_type,res_id) = ident - cr.execute('delete from wkf_instance where res_id=%s and res_type=%s', (res_id,res_type)) + session.cr.execute('delete from wkf_instance where res_id=%s and res_type=%s', (record.id, record.model)) -def validate(cr, inst_id, ident, signal, force_running=False): - cr.execute("select * from wkf_workitem where inst_id=%s", (inst_id,)) +def validate(session, record, instance_id, signal, force_running=False): + assert isinstance(session, Session) + assert isinstance(record, Record) + assert isinstance(instance_id, (long, int)) + assert isinstance(signal, basestring) + assert isinstance(force_running, bool) + + cr = session.cr + cr.execute("select * from wkf_workitem where inst_id=%s", (instance_id,)) stack = [] - for witem in cr.dictfetchall(): + for work_item in cr.dictfetchall(): stack = [] - workitem.process(cr, witem, ident, signal, force_running, stack=stack) + workitem.process(session, record, work_item, signal, force_running, stack=stack) # An action is returned - _update_end(cr, inst_id, ident) + _update_end(session, record, instance_id) return stack and stack[0] or False -def update(cr, inst_id, ident): - cr.execute("select * from wkf_workitem where inst_id=%s", (inst_id,)) +def update(session, record, instance_id): + assert isinstance(session, Session) + assert isinstance(record, Record) + assert isinstance(instance_id, (long, int)) + + cr = session.cr + cr.execute("select * from wkf_workitem where inst_id=%s", (instance_id,)) for witem in cr.dictfetchall(): stack = [] - workitem.process(cr, witem, ident, stack=stack) - return _update_end(cr, inst_id, ident) + workitem.process(session, record, witem, stack=stack) + return _update_end(session, record, instance_id) + +def _update_end(session, record, instance_id): + assert isinstance(session, Session) + assert isinstance(record, Record) + assert isinstance(instance_id, (long, int)) -def _update_end(cr, inst_id, ident): - cr.execute('select wkf_id from wkf_instance where id=%s', (inst_id,)) + cr = session.cr + cr.execute('select wkf_id from wkf_instance where id=%s', (instance_id,)) wkf_id = cr.fetchone()[0] - cr.execute('select state,flow_stop from wkf_workitem w left join wkf_activity a on (a.id=w.act_id) where w.inst_id=%s', (inst_id,)) + cr.execute('select state,flow_stop from wkf_workitem w left join wkf_activity a on (a.id=w.act_id) where w.inst_id=%s', (instance_id,)) ok=True for r in cr.fetchall(): if (r[0]<>'complete') or not r[1]: ok=False break if ok: - cr.execute('select distinct a.name from wkf_activity a left join wkf_workitem w on (a.id=w.act_id) where w.inst_id=%s', (inst_id,)) + cr.execute('select distinct a.name from wkf_activity a left join wkf_workitem w on (a.id=w.act_id) where w.inst_id=%s', (instance_id,)) act_names = cr.fetchall() - cr.execute("update wkf_instance set state='complete' where id=%s", (inst_id,)) - cr.execute("update wkf_workitem set state='complete' where subflow_id=%s", (inst_id,)) - cr.execute("select i.id,w.osv,i.res_id from wkf_instance i left join wkf w on (i.wkf_id=w.id) where i.id IN (select inst_id from wkf_workitem where subflow_id=%s)", (inst_id,)) - for i in cr.fetchall(): + cr.execute("update wkf_instance set state='complete' where id=%s", (instance_id,)) + cr.execute("update wkf_workitem set state='complete' where subflow_id=%s", (instance_id,)) + cr.execute("select i.id,w.osv,i.res_id from wkf_instance i left join wkf w on (i.wkf_id=w.id) where i.id IN (select inst_id from wkf_workitem where subflow_id=%s)", (instance_id,)) + for cur_instance_id, cur_model_name, cur_record_id in cr.fetchall(): + cur_record = Record(cur_model_name, cur_record_id) for act_name in act_names: - validate(cr, i[0], (ident[0],i[1],i[2]), 'subflow.'+act_name[0]) + validate(session, cur_record, cur_instance_id, 'subflow.%s' % act_name[0]) + return ok |
