From 04d052e9e72e378ed9950f9bc4cf72d165f9cb80 Mon Sep 17 00:00:00 2001 From: Thomas NOEL Date: Mon, 14 Nov 2016 18:12:38 +0100 Subject: [PATCH] trigger_jump: reset substitutions vars on each formdata (#13964) --- tests/test_ctl.py | 96 +++++++++++++++++++++++++++++++++++++++++++----- wcs/ctl/trigger_jumps.py | 14 +++++-- 2 files changed, 98 insertions(+), 12 deletions(-) diff --git a/tests/test_ctl.py b/tests/test_ctl.py index b32d628..e1add41 100644 --- a/tests/test_ctl.py +++ b/tests/test_ctl.py @@ -4,9 +4,15 @@ import collections from email.mime.text import MIMEText from email.mime.multipart import MIMEMultipart +from wcs.formdef import FormDef +from wcs.workflows import Workflow +from wcs.wf.jump import JumpWorkflowStatusItem +from wcs.fields import StringField, EmailField import wcs.qommon.ctl from wcs.ctl.collectstatic import CmdCollectStatic from wcs.ctl.process_bounce import CmdProcessBounce +from wcs.ctl.wipe_data import CmdWipeData +from wcs.ctl.trigger_jumps import CmdTriggerJumps, select_and_jump_formdata from utilities import create_temporary_pub, clean_temporary_pub @@ -53,13 +59,10 @@ def test_get_bounce_addrs(): assert CmdProcessBounce.get_bounce_addrs(msg) == ['foobar@localhost'] def test_wipe_formdata(pub): - from wcs import formdef, fields - from wcs.ctl.wipe_data import CmdWipeData - - form_1 = formdef.FormDef() + form_1 = FormDef() form_1.name = 'example' - form_1.fields = [fields.StringField(id='0', label='Your Name'), - fields.EmailField(id='1', label='Email')] + form_1.fields = [StringField(id='0', label='Your Name'), + EmailField(id='1', label='Email')] form_1.store() form_1.data_class().wipe() formdata_1 = form_1.data_class()() @@ -69,10 +72,10 @@ def test_wipe_formdata(pub): assert form_1.data_class().count() == 1 - form_2 = formdef.FormDef() + form_2 = FormDef() form_2.name = 'example2' - form_2.fields = [fields.StringField(id='0', label='First Name'), - fields.StringField(id='1', label='Last Name')] + form_2.fields = [StringField(id='0', label='First Name'), + StringField(id='1', label='Last Name')] form_2.store() form_2.data_class().wipe() formdata_2 = form_2.data_class()() @@ -108,3 +111,78 @@ def test_wipe_formdata(pub): wipe_cmd.wipe(pub, sub_options, []) assert form_1.data_class().count() == 0 assert form_2.data_class().count() == 0 + +def test_trigger_jumps(pub): + Workflow.wipe() + workflow = Workflow(name='test') + st1 = workflow.add_status('Status1', 'st1') + jump = JumpWorkflowStatusItem() + jump.trigger = 'goto2' + jump.status = 'st2' + st1.items.append(jump) + jump.parent = st1 + st2 = workflow.add_status('Status2', 'st2') + workflow.store() + + FormDef.wipe() + formdef = FormDef() + formdef.name = 'test' + formdef.fields = [StringField(id='0', label='Your Name', varname='name'), + EmailField(id='1', label='Email', varname='email')] + formdef.workflow_id = workflow.id + formdef.store() + + def run_trigger(trigger, rows): + formdef.data_class().wipe() + formdata = formdef.data_class()() + formdata.data = {'0': 'Alice', '1': 'alice@example.net'} + formdata.status = 'wf-%s' % st1.id + formdata.store() + id1 = formdata.id + formdata = formdef.data_class()() + formdata.data = {'0': 'Bob', '1': 'bob@example.net'} + formdata.status = 'wf-%s' % st1.id + formdata.store() + id2 = formdata.id + select_and_jump_formdata(formdef, trigger, rows) + return formdef.data_class().get(id1), formdef.data_class().get(id2) + + f1, f2 = run_trigger('goto2', '__all__') + assert f1.status == f2.status == 'wf-%s' % st2.id + + # check publisher substitutions vars after the last jump_and_perform (#13964) + assert pub in pub.substitutions.sources + assert formdef in pub.substitutions.sources + # we cannot know which formdata is the last one, test each possibility + if f1 in pub.substitutions.sources: + assert f2 not in pub.substitutions.sources + if f2 in pub.substitutions.sources: + assert f1 not in pub.substitutions.sources + + f1, f2 = run_trigger('goto2', [{'select': {}}]) + assert f1.status == f2.status == 'wf-%s' % st2.id + + f1, f2 = run_trigger('goto2', [{'select': {'form_number_raw': '1'}}]) + assert f1.status == 'wf-%s' % st2.id + assert f2.status == 'wf-%s' % st1.id + + f1, f2 = run_trigger('goto2', [{'select': {'form_var_email': 'bob@example.net'}}]) + assert f1.status == 'wf-%s' % st1.id + assert f2.status == 'wf-%s' % st2.id + + f1, f2 = run_trigger('goto2', [{'select': {}, + 'data': {'foo': 'bar'}}]) + assert f1.status == f2.status == 'wf-%s' % st2.id + assert f1.workflow_data['foo'] == f2.workflow_data['foo'] == 'bar' + + f1, f2 = run_trigger('goto2', [{'select': {'form_number_raw': '1'}, + 'data': {'foo': 'bar'}}]) + assert f1.status == 'wf-%s' % st2.id + assert f1.workflow_data['foo'] == 'bar' + assert f2.status == 'wf-%s' % st1.id + assert not f2.workflow_data + + f1, f2 = run_trigger('badtrigger', '__all__') + assert f1.status == f2.status == 'wf-%s' % st1.id + assert not f1.workflow_data + assert not f2.workflow_data diff --git a/wcs/ctl/trigger_jumps.py b/wcs/ctl/trigger_jumps.py index b41c2e2..5fc1e15 100644 --- a/wcs/ctl/trigger_jumps.py +++ b/wcs/ctl/trigger_jumps.py @@ -18,11 +18,13 @@ import os import sys import json +from quixote import get_publisher + 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 +from wcs.wf.jump import JumpWorkflowStatusItem, jump_and_perform as wcs_jump_and_perform class CmdTriggerJumps(Command): @@ -137,15 +139,21 @@ def match_row(substitution_variables, row): return False return True +def jump_and_perform(formdata, jump_to, workflow_data=None): + get_publisher().substitutions.reset() + get_publisher().substitutions.feed(get_publisher()) + get_publisher().substitutions.feed(formdata.formdef) + get_publisher().substitutions.feed(formdata) + print 'formdata %s jumps to status %s' % (formdata, jump_to) + wcs_jump_and_perform(formdata, jump_to, workflow_data=workflow_data) + def select_and_jump_formdata(formdef, trigger, rows, status_ids=None): for formdata, jump_to in get_formdata_accepting_trigger(formdef, trigger, status_ids): if rows == '__all__': - print 'formdata %s jumps to status %s' % (formdata, jump_to) jump_and_perform(formdata, jump_to) else: substitution_variables = formdata.get_substitution_variables() for row in rows: if match_row(substitution_variables, row): - print 'formdata %s jumps to status %s' % (formdata, jump_to) jump_and_perform(formdata, jump_to, row.get('data')) break # next formdata -- 2.10.2