trigger-jumps works without formdef-id (fix #3079)

This commit is contained in:
Thomas NOËL 2013-06-20 11:43:09 +02:00
parent b1cb4aa3dd
commit c2caa0f1ce
1 changed files with 58 additions and 27 deletions

View File

@ -21,6 +21,7 @@ import json
from qommon.ctl import Command, make_option
from wcs.formdef import FormDef
from wcs.workflows import Workflow
from wcs.wf.jump import JumpWorkflowStatusItem, jump_and_perform
@ -41,25 +42,28 @@ class CmdTriggerJumps(Command):
def __init__(self):
Command.__init__(self, [
make_option('--formdef-id', metavar='FORMDEF_ID', action='store',
dest='formdef_id', help='(mandatory)'),
make_option('--trigger', metavar='TRIGGER', action='store',
dest='trigger', help='(mandatory) trigger name'),
make_option('--vhost', metavar='VHOST', action='store',
dest='vhost'),
make_option('--workflow-id', metavar='WORKFLOW_ID', action='store',
dest='workflow_id'),
make_option('--formdef-id', metavar='FORMDEF_ID', action='store',
dest='formdef_id'),
make_option('--all-formdata', metavar='ALL_FORMDATA',
action='store_true', dest='all_formdata'),
])
def execute(self, base_options, sub_options, args):
if not sub_options.all_formdata and not args:
exit('missing input json file(s) (or --all-formdata flag)')
if not sub_options.vhost:
print >> sys.stderr, 'you must specificy --vhost'
sys.exit(1)
exit('you must specificy --vhost')
if not sub_options.trigger:
print >> sys.stderr, 'you must specificy --trigger'
sys.exit(1)
if not sub_options.formdef_id:
print >> sys.stderr, 'you must specificy --formdef-id'
sys.exit(1)
exit('you must specificy --trigger')
if sub_options.formdef_id and sub_options.workflow_id:
exit('specify --workflow-id or --formdef-id')
import publisher
self.config.remove_option('main', 'error_log')
@ -68,31 +72,44 @@ class CmdTriggerJumps(Command):
publisher.app_dir = os.path.join(publisher.app_dir, sub_options.vhost)
publisher.set_config()
formdef = FormDef.get(id=sub_options.formdef_id)
trigger = sub_options.trigger
if not sub_options.all_formdata:
rows = list(get_rows(args))
else:
rows = '__all__'
if sub_options.formdef_id:
formdef = FormDef.get(id=sub_options.formdef_id, ignore_errors=True)
if not formdef:
exit('formdef-id does not exist')
select_and_jump_formdata(formdef, trigger, rows)
else:
if sub_options.workflow_id:
workflow = Workflow.get(id=sub_options.workflow_id, ignore_errors=True)
if not workflow:
exit('workflow does not exist')
workflows = [workflow]
else:
workflows = Workflow.select()
for workflow in workflows:
status_ids = list(get_status_ids_accepting_trigger(workflow, trigger))
if status_ids:
for formdef in [f for f in FormDef.select() if f.workflow_id == workflow.id]:
select_and_jump_formdata(formdef, trigger, rows, status_ids)
rows = list(get_rows(args))
for formdata, jump_to in get_formdata_accepting_trigger(formdef, trigger):
for row in rows:
if match_row(formdata, row):
print 'formdata %s jumps to status %s' % \
(formdata, jump_to)
jump_and_perform(formdata, jump_to, row.get('data'))
break # next formdata
CmdTriggerJumps.register()
def exit(message):
print >> sys.stderr, message
sys.exit(1)
def get_rows(args):
if not args:
for row in json.load(sys.stdin):
yield row
for arg in args:
for row in json.load(file(arg)):
yield row
def get_status_ids_accepting_trigger(formdef, trigger):
workflow = formdef.get_workflow()
def get_status_ids_accepting_trigger(workflow, trigger):
for status in workflow.possible_status:
for item in status.items:
if isinstance(item, JumpWorkflowStatusItem) and \
@ -100,14 +117,15 @@ def get_status_ids_accepting_trigger(formdef, trigger):
yield 'wf-%s' % status.id, item.status
break
def get_formdata_accepting_trigger(formdef, trigger):
status_ids = get_status_ids_accepting_trigger(formdef, trigger)
def get_formdata_accepting_trigger(formdef, trigger, status_ids=None):
if status_ids is None:
workflow = formdef.get_workflow()
status_ids = get_status_ids_accepting_trigger(workflow, trigger)
formdata_ids = []
data_class = formdef.data_class()
for status_id, jump_to in status_ids:
formdata_ids = data_class.get_ids_with_indexed_value(
'status', status_id)
formdata_ids = data_class.get_ids_with_indexed_value('status', status_id)
for formdata_id in formdata_ids:
yield data_class.get(id=formdata_id), jump_to
@ -119,3 +137,16 @@ def match_row(formdata, row):
return False
return True
def select_and_jump_formdata(formdef, trigger, rows, status_ids=None):
for formdata, jump_to in get_formdata_accepting_trigger(formdef, trigger, status_ids):
print 'formdata:', formdata
if rows == '__all__':
print 'formdata %s jumps to status %s' % (formdata, jump_to)
jump_and_perform(formdata, jump_to)
else:
for row in rows:
if match_row(formdata, row):
print 'formdata %s jumps to status %s' % (formdata, jump_to)
jump_and_perform(formdata, jump_to, row.get('data'))
break # next formdata