wcs/tests/workflow/test_carddata.py

1568 lines
48 KiB
Python

import datetime
import os
import pytest
from quixote import cleanup
from wcs import sessions
from wcs.carddef import CardDef
from wcs.fields import DateField, FileField, ItemField, MapField, StringField
from wcs.formdef import FormDef
from wcs.qommon.http_request import HTTPRequest
from wcs.qommon.upload_storage import PicklableUpload
from wcs.wf.create_formdata import Mapping
from wcs.workflows import Workflow
from ..utilities import clean_temporary_pub, create_temporary_pub
def setup_module(module):
cleanup()
def teardown_module(module):
clean_temporary_pub()
@pytest.fixture
def pub(request):
pub = create_temporary_pub()
pub.cfg['language'] = {'language': 'en'}
pub.write_cfg()
req = HTTPRequest(None, {'SERVER_NAME': 'example.net', 'SCRIPT_NAME': ''})
req.response.filter = {}
req._user = None
pub._set_request(req)
req.session = sessions.BasicSession(id=1)
pub.set_config(req)
return pub
def test_create_carddata(pub):
CardDef.wipe()
FormDef.wipe()
carddef = CardDef()
carddef.name = 'My card'
carddef.fields = [
StringField(id='1', label='string'),
ItemField(id='2', label='List', items=['item1', 'item2'], varname='clist'),
DateField(id='3', label='Date', varname='cdate'),
FileField(id='4', label='File', varname='cfile'),
]
carddef.store()
wf = Workflow(name='create-carddata')
wf.possible_status = Workflow.get_default_workflow().possible_status[:]
create = wf.possible_status[1].add_action('create_carddata', id='_create', prepend=True)
create.label = 'Create CardDef'
create.varname = 'mycard'
create.formdef_slug = carddef.url_name
create.mappings = [
Mapping(field_id='1', expression='=form_var_undefined'),
Mapping(field_id='2', expression='{{ form_var_list }}'),
Mapping(field_id='3', expression='{{ form_var_date }}'),
Mapping(field_id='4', expression='{{ form_var_file|default_if_none:"" }}'),
]
wf.store()
formdef = FormDef()
formdef.name = 'source form'
formdef.fields = [
ItemField(id='1', label='List', items=['item1', 'item2'], varname='list'),
DateField(id='2', label='Date', varname='date'),
FileField(id='3', label='File', varname='file'),
]
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
assert carddef.data_class().count() == 0
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
errors = pub.loggederror_class.select()
assert len(errors) == 2
assert any('form_var_undefined' in (error.exception_message or '') for error in errors)
assert any('invalid date value' in (error.exception_message or '') for error in errors)
formdata = formdef.data_class()()
today = datetime.date.today()
upload = PicklableUpload('test.jpeg', 'image/jpeg')
with open(os.path.join(os.path.dirname(__file__), '..', 'image-with-gps-data.jpeg'), 'rb') as jpg:
upload.receive([jpg.read()])
formdata.data = {'1': 'item1', '1_display': 'item1', '2': today.timetuple(), '3': upload}
formdata.just_created()
formdata.perform_workflow()
assert formdata.get_substitution_variables()['form_links_mycard_form_number'] == '1-2'
carddata = carddef.data_class().get(id=2)
assert carddata.data['2'] == 'item1'
assert carddata.data['2_display'] == 'item1'
assert carddata.data['3'] == today.timetuple()
assert carddata.data['4'].base_filename == 'test.jpeg'
create.condition = {'type': 'python', 'value': '1 == 2'}
wf.store()
del formdef._workflow
carddef.data_class().wipe()
assert carddef.data_class().count() == 0
formdata.perform_workflow()
assert carddef.data_class().count() == 0
def test_create_carddata_with_links(pub):
CardDef.wipe()
FormDef.wipe()
carddef1 = CardDef()
carddef1.name = 'Card 1'
carddef1.fields = [
StringField(id='1', label='string', varname='foo'),
]
carddef1.store()
carddef1.data_class().wipe()
carddef2 = CardDef()
carddef2.name = 'Card 2'
carddef2.fields = [
StringField(id='1', label='string', varname='bar'),
ItemField(
id='2', label='card', varname='card1', data_source={'type': 'carddef:%s' % carddef1.url_name}
),
]
carddef2.store()
carddef2.data_class().wipe()
wf = Workflow(name='create-carddata')
st1 = wf.add_status('Create cards', 'st1')
create1 = st1.add_action('create_carddata', id='_create1')
create1.label = 'Create CardDef1'
create1.varname = 'mycard1'
create1.formdef_slug = carddef1.url_name
create1.mappings = [
Mapping(field_id='1', expression='{{ form_var_card1_foo }}'),
]
create2 = st1.add_action('create_carddata', id='_create2')
create2.label = 'Create CardDef2'
create2.varname = 'mycard2'
create2.formdef_slug = carddef2.url_name
create2.mappings = [
Mapping(field_id='1', expression='{{ form_var_card2_bar }}'),
Mapping(field_id='2', expression='{{ form_links_mycard1 }}'),
]
wf.store()
formdef = FormDef()
formdef.name = 'form'
formdef.fields = [
StringField(id='1', label='foo', varname='card1_foo'),
StringField(id='2', label='bar', varname='card2_bar'),
]
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {
'1': 'card1 foo',
'2': 'card2 bar',
}
formdata.just_created()
formdata.perform_workflow()
assert carddef1.data_class().count() == 1
assert carddef2.data_class().count() == 1
carddata1 = carddef1.data_class().select()[0]
carddata2 = carddef2.data_class().select()[0]
assert carddata1.data['1'] == 'card1 foo'
assert carddata2.data['1'] == 'card2 bar'
assert carddata2.data['2'] == str(carddata1.id)
create2.mappings[1] = Mapping(field_id='2', expression='{{ form_links_mycard1_form_number_raw }}')
wf.store()
formdef = FormDef.get(formdef.id)
carddef1.data_class().wipe()
carddef2.data_class().wipe()
formdef.data_class().wipe()
formdata = formdef.data_class()()
formdata.data = {
'1': 'card1 fooo',
'2': 'card2 barr',
}
formdata.just_created()
formdata.perform_workflow()
assert carddef1.data_class().count() == 1
assert carddef2.data_class().count() == 1
carddata1 = carddef1.data_class().select()[0]
carddata2 = carddef2.data_class().select()[0]
assert carddata1.data['1'] == 'card1 fooo'
assert carddata2.data['1'] == 'card2 barr'
assert carddata2.data['2'] == str(carddata1.id)
old_carddata1 = carddata1
formdata.perform_workflow() # again
assert carddef1.data_class().count() == 2
assert carddef2.data_class().count() == 2
carddata1 = carddef1.data_class().get(id=2)
carddata2 = carddef2.data_class().get(id=2)
assert carddata1.data['1'] == 'card1 fooo'
assert carddata2.data['1'] == 'card2 barr'
assert carddata2.data['2'] == str(old_carddata1.id) # first item
create2.mappings[1] = Mapping(field_id='2', expression='{{ form_links_mycard1|last }}')
wf.store()
formdef = FormDef.get(formdef.id)
carddef1.data_class().wipe()
carddef2.data_class().wipe()
formdef.data_class().wipe()
formdata = formdef.data_class()()
formdata.data = {
'1': 'card1 fooo',
'2': 'card2 barr',
}
formdata.just_created()
formdata.perform_workflow()
assert carddef1.data_class().count() == 1
assert carddef2.data_class().count() == 1
carddata1 = carddef1.data_class().select()[0]
carddata2 = carddef2.data_class().select()[0]
assert carddata1.data['1'] == 'card1 fooo'
assert carddata2.data['1'] == 'card2 barr'
assert carddata2.data['2'] == str(carddata1.id)
formdata.perform_workflow() # again
assert carddef1.data_class().count() == 2
assert carddef2.data_class().count() == 2
carddata1 = carddef1.data_class().select(order_by='id')[-1]
carddata2 = carddef2.data_class().select(order_by='id')[-1]
assert carddata1.data['1'] == 'card1 fooo'
assert carddata2.data['1'] == 'card2 barr'
assert carddata2.data['2'] == str(carddata1.id)
create2.mappings[1] = Mapping(field_id='2', expression='{{ form_links_mycard1_0 }}')
wf.store()
formdef = FormDef.get(formdef.id)
carddef1.data_class().wipe()
carddef2.data_class().wipe()
formdef.data_class().wipe()
formdata = formdef.data_class()()
formdata.data = {
'1': 'card1 fooo',
'2': 'card2 barr',
}
formdata.just_created()
formdata.perform_workflow()
assert carddef1.data_class().count() == 1
assert carddef2.data_class().count() == 1
carddata1 = carddef1.data_class().select()[0]
carddata2 = carddef2.data_class().select()[0]
assert carddata1.data['1'] == 'card1 fooo'
assert carddata2.data['1'] == 'card2 barr'
assert carddata2.data['2'] == str(carddata1.id)
create2.mappings[1] = Mapping(field_id='2', expression='{{ form_links_mycard1_0_form_number_raw }}')
wf.store()
formdef = FormDef.get(formdef.id)
carddef1.data_class().wipe()
carddef2.data_class().wipe()
formdef.data_class().wipe()
formdata = formdef.data_class()()
formdata.data = {
'1': 'card1 fooo',
'2': 'card2 barr',
}
formdata.just_created()
formdata.perform_workflow()
assert carddef1.data_class().count() == 1
assert carddef2.data_class().count() == 1
carddata1 = carddef1.data_class().select()[0]
carddata2 = carddef2.data_class().select()[0]
assert carddata1.data['1'] == 'card1 fooo'
assert carddata2.data['1'] == 'card2 barr'
assert carddata2.data['2'] == str(carddata1.id)
def test_create_carddata_with_map_field(pub):
CardDef.wipe()
FormDef.wipe()
carddef = CardDef()
carddef.name = 'My card'
carddef.fields = [
MapField(id='1', label='map', varname='map'),
]
carddef.store()
wf = Workflow(name='create-carddata')
wf.possible_status = Workflow.get_default_workflow().possible_status[:]
create = wf.possible_status[1].add_action('create_carddata', id='_create', prepend=True)
create.label = 'Create CardDef'
create.varname = 'mycard'
create.formdef_slug = carddef.url_name
create.mappings = [
Mapping(field_id='1', expression=''),
]
wf.store()
formdef = FormDef()
formdef.name = 'source form'
formdef.fields = [
MapField(id='1', label='map', varname='map'),
]
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
assert carddef.data_class().count() == 0
# empty value
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
assert not carddef.data_class().select()[0].data.get('1')
# valid coordinates
create.mappings[0].expression = '1;2'
wf.store()
formdef.refresh_from_storage()
carddef.data_class().wipe()
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
assert carddef.data_class().select()[0].data.get('1') == '1;2'
# invalid value
create.mappings[0].expression = 'plop'
wf.store()
formdef.refresh_from_storage()
carddef.data_class().wipe()
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
assert not carddef.data_class().select()[0].data.get('1')
errors = pub.loggederror_class.select()
assert len(errors) == 1
assert any('invalid coordinates' in (error.exception_message or '') for error in errors)
# value from formdata
create.mappings[0].expression = '{{ form_var_map }}'
wf.store()
formdef.refresh_from_storage()
carddef.data_class().wipe()
formdata = formdef.data_class()()
formdata.data = {'1': '2;3'}
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
assert carddef.data_class().select()[0].data.get('1') == '2;3'
def test_create_carddata_user_association(pub):
CardDef.wipe()
FormDef.wipe()
pub.user_class.wipe()
user = pub.user_class()
user.email = 'test@example.net'
user.name_identifiers = ['xyz']
user.store()
user2 = pub.user_class()
user2.store()
carddef = CardDef()
carddef.name = 'My card'
carddef.fields = []
carddef.user_support = 'optional'
carddef.store()
carddef.data_class().wipe()
wf = Workflow(name='create-carddata')
wf.possible_status = Workflow.get_default_workflow().possible_status[:]
create = wf.possible_status[1].add_action('create_carddata', id='_create', prepend=True)
create.label = 'Create CardDef'
create.varname = 'mycard'
create.formdef_slug = carddef.url_name
create.map_fields_by_varname = True
wf.store()
formdef = FormDef()
formdef.name = 'source form'
formdef.fields = []
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {}
formdata.user_id = user.id
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
assert carddef.data_class().select()[0].user is None
# keep user
carddef.data_class().wipe()
create.user_association_mode = 'keep-user'
wf.store()
formdata = FormDef.get(formdef.id).data_class()()
formdata.data = {}
formdata.user_id = user.id
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
assert carddef.data_class().select()[0].user.id == user.id
# user association on direct user
carddef.data_class().wipe()
create.user_association_mode = 'custom'
create.user_association_template = '{{ form_user }}'
wf.store()
formdata = FormDef.get(formdef.id).data_class()()
formdata.data = {}
formdata.user_id = user.id
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
assert carddef.data_class().select()[0].user.id == user.id
# user association on user email
carddef.data_class().wipe()
create.user_association_mode = 'custom'
create.user_association_template = 'test@example.net'
wf.store()
formdata = FormDef.get(formdef.id).data_class()()
formdata.data = {}
formdata.user_id = user2.id
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
assert carddef.data_class().select()[0].user.id == user.id
# user association on name id
carddef.data_class().wipe()
create.user_association_mode = 'custom'
create.user_association_template = 'xyz'
wf.store()
formdata = FormDef.get(formdef.id).data_class()()
formdata.data = {}
formdata.user_id = user2.id
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
assert carddef.data_class().select()[0].user.id == user.id
# user association on invalid user
for invalid_user in (('zzz', 'zzz'), ('{{ 42 }}', '42')):
carddef.data_class().wipe()
create.user_association_mode = 'custom'
create.user_association_template = invalid_user[0]
wf.store()
formdata = FormDef.get(formdef.id).data_class()()
formdata.data = {}
formdata.user_id = user.id
formdata.just_created()
if pub.loggederror_class:
pub.loggederror_class.wipe()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
assert carddef.data_class().select()[0].user is None
if pub.loggederror_class:
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert logged_error.summary == 'Failed to attach user (not found: "%s")' % invalid_user[1]
assert logged_error.formdata_id == str(formdata.id)
# user association on invalid template
carddef.data_class().wipe()
create.user_association_mode = 'custom'
create.user_association_template = '{% %}'
wf.store()
formdata = FormDef.get(formdef.id).data_class()()
formdata.data = {}
formdata.user_id = user.id
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
assert carddef.data_class().select()[0].user is None
def test_create_carddata_map_fields_by_varname(pub):
CardDef.wipe()
FormDef.wipe()
pub.user_class.wipe()
carddef = CardDef()
carddef.name = 'My card'
carddef.fields = [
StringField(id='3', label='string', varname='foo'),
StringField(id='4', label='string', varname='bar'),
]
carddef.store()
carddef.data_class().wipe()
wf = Workflow(name='create-carddata')
wf.possible_status = Workflow.get_default_workflow().possible_status[:]
create = wf.possible_status[1].add_action('create_carddata', id='_create', prepend=True)
create.label = 'Create CardDef'
create.varname = 'mycard'
create.formdef_slug = carddef.url_name
create.map_fields_by_varname = True
wf.store()
formdef = FormDef()
formdef.name = 'source form'
formdef.fields = [
StringField(id='1', label='string', varname='foo'),
StringField(id='2', label='string', varname='xxx'),
]
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {
'1': 'test1',
'2': 'test2',
}
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
carddata = carddef.data_class().select()[0]
assert carddata.data.get('3') == 'test1'
assert not carddata.data.get('4')
def test_edit_carddata_with_data_sourced_object(pub):
FormDef.wipe()
CardDef.wipe()
datasource = {
'type': 'formula',
'value': repr(
[
{'id': 'b', 'text': 'baker', 'extra': 'plop'},
{'id': 'c', 'text': 'cook', 'extra': 'plop2'},
{'id': 'l', 'text': 'lawyer', 'extra': 'plop3'},
]
),
}
carddef = CardDef()
carddef.name = 'Person'
carddef.fields = [
StringField(id='0', label='First Name', varname='first_name'),
StringField(id='1', label='Last Name', varname='last_name'),
ItemField(id='2', label='Profession', type='item', varname='profession', data_source=datasource),
]
carddef.digest_templates = {'default': '{{ form_var_first_name }} {{ form_var_last_name }}'}
carddef.store()
carddef.data_class().wipe()
carddata = carddef.data_class()()
carddata.data = {'0': 'Foo', '1': 'Bar', '2': 'l'}
carddata.data['2_display'] = carddef.fields[2].store_display_value(carddata.data, '2')
carddata.data['2_structured'] = carddef.fields[2].store_structured_value(carddata.data, '2')
carddata.store()
wf = Workflow(name='Card update')
st1 = wf.add_status('Update card', 'st1')
edit = st1.add_action('edit_carddata', id='edit')
edit.formdef_slug = carddef.url_name
edit.mappings = [
Mapping(field_id='2', expression='{{ form_var_new_profession }}'),
]
wf.store()
datasource = {'type': 'carddef:%s' % carddef.url_name}
formdef = FormDef()
formdef.name = 'Persons'
formdef.fields = [
ItemField(id='0', label='Person', type='item', varname='person', data_source=datasource),
StringField(id='1', label='New profession', varname='new_profession'),
]
formdef.workflow = wf
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'0': '1', '1': 'c'}
formdata.store()
formdata.just_created()
formdata.perform_workflow()
data = carddef.data_class().select()[0]
assert data.data['2'] == 'c'
assert data.data['2_display'] == 'cook'
assert data.data['2_structured'] == {'id': 'c', 'text': 'cook', 'extra': 'plop2'}
formdata = formdef.data_class()()
formdata.data = {'0': '1', '1': 'b'}
formdata.store()
formdata.just_created()
formdata.perform_workflow()
data = carddef.data_class().select()[0]
assert data.data['2'] == 'b'
assert data.data['2_display'] == 'baker'
assert data.data['2_structured'] == {'id': 'b', 'text': 'baker', 'extra': 'plop'}
# reset data
for expression in ('=None', '', '""'):
edit.mappings = [
Mapping(field_id='2', expression=expression),
]
wf.store()
formdata = formdef.data_class()()
formdata.data = {'0': '1', '1': 'b'}
formdata.store()
formdata.just_created()
formdata.perform_workflow()
carddata = carddef.data_class().select()[0]
assert carddata.data['2'] in [None, '', '""']
assert carddata.data.get('2_display') is None
assert carddata.data.get('2_structured') is None
# restore initial data
carddata.data = data.data
carddata.store()
def test_edit_carddata_with_linked_object(pub):
FormDef.wipe()
CardDef.wipe()
carddef = CardDef()
carddef.name = 'Parent'
carddef.fields = [
StringField(id='0', label='First Name', varname='first_name'),
StringField(id='1', label='Last Name', varname='last_name'),
StringField(id='2', label='Kids number', varname='kids_number'),
]
carddef.store()
carddef.data_class().wipe()
wf = Workflow(name='Card create and update')
st1 = wf.add_status('Create card', 'st1')
create = st1.add_action('create_carddata')
create.formdef_slug = carddef.url_name
create.mappings = [
Mapping(field_id='0', expression='{{ form_var_first_name }}'),
Mapping(field_id='1', expression='{{ form_var_last_name }}'),
Mapping(field_id='2', expression='{{ form_var_kids_number|default:"0" }}'),
]
jump = st1.add_action('jump', id='_jump')
jump.by = ['_submitter', '_receiver']
jump.status = 'st2'
st2 = wf.add_status('Update card', 'st2')
edit = st2.add_action('edit_carddata', id='edit')
edit.formdef_slug = carddef.url_name
edit.mappings = [
Mapping(field_id='2', expression='{{ form_var_kids_number|add:"1" }}'),
]
wf.store()
formdef = FormDef()
formdef.name = 'Parents'
formdef.fields = [
StringField(id='0', label='First Name', varname='first_name'),
StringField(id='1', label='Last Name', varname='last_name'),
StringField(id='2', label='Number of kids', varname='kids_number'),
]
formdef.workflow = wf
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'0': 'Parent', '1': 'Foo', '2': '2'}
formdata.store()
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
card_data = carddef.data_class().select()[0]
assert card_data.data['2'] == '3'
def test_edit_carddata_manual_targeting(pub):
FormDef.wipe()
CardDef.wipe()
# carddef
carddef = CardDef()
carddef.name = 'Parent'
carddef.fields = [
StringField(id='0', label='First Name', varname='first_name'),
StringField(id='1', label='Last Name', varname='last_name'),
StringField(id='2', label='Kids number', varname='kids_number'),
]
carddef.store()
carddef.data_class().wipe()
# and sample carddatas
for i in range(1, 4):
carddata = carddef.data_class()()
carddata.data = {
'0': 'First name %s' % i,
'1': 'Last name %s' % i,
'2': '0',
}
carddata.store()
# formdef workflow that will update carddata
wf = Workflow(name='Card create and update')
st1 = wf.add_status('Create card', 'st1')
# create linked carddata
edit = st1.add_action('create_carddata')
edit.formdef_slug = carddef.url_name
edit.mappings = [
Mapping(field_id='0', expression='{{ form_var_first_name }}'),
Mapping(field_id='1', expression='{{ form_var_last_name }}'),
Mapping(field_id='2', expression='{{ form_var_kids_number|default:"0" }}'),
]
jump = st1.add_action('jump', id='_jump')
jump.by = ['_submitter', '_receiver']
jump.status = 'st2'
st2 = wf.add_status('Update card', 'st2')
edit = st2.add_action('edit_carddata', id='edit')
edit.formdef_slug = carddef.url_name
edit.target_mode = 'manual' # not configured
edit.mappings = [
Mapping(field_id='2', expression='{{ form_var_kids_number|add:"1" }}'),
]
wf.store()
# associated formdef
formdef = FormDef()
formdef.name = 'Parents'
datasource = {'type': 'carddef:%s' % carddef.url_name}
formdef.fields = [
StringField(id='0', label='First Name', varname='first_name'),
StringField(id='1', label='Last Name', varname='last_name'),
StringField(id='2', label='Number of kids', varname='kids_number'),
ItemField(id='3', label='Card', type='item', varname='card', data_source=datasource),
StringField(id='4', label='string', varname='string'),
]
formdef.workflow = wf
formdef.store()
# create formdatas
# target not configured
formdata = formdef.data_class()()
formdata.data = {
'0': 'Parent',
'1': 'Foo',
'2': '2',
'3': '3', # set from datasource
'4': '1',
}
# set parent
formdata.submission_context = {
'orig_object_type': 'carddef',
'orig_formdata_id': '2',
'orig_formdef_id': str(carddef.id),
}
formdata.store()
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 4
assert carddef.data_class().get(1).data['2'] == '0'
assert carddef.data_class().get(2).data['2'] == '0'
assert carddef.data_class().get(3).data['2'] == '0'
assert carddef.data_class().get(4).data['2'] == '2'
assert pub.loggederror_class.count() == 0
# configure target
edit.target_id = '{{ form_var_string }}' # == '1'
wf.store()
formdata = formdef.data_class()()
formdata.data = {
'0': 'Parent',
'1': 'Foo',
'2': '2',
'3': '3', # set from datasource
'4': '1',
}
# set parent
formdata.submission_context = {
'orig_object_type': 'carddef',
'orig_formdata_id': '2',
'orig_formdef_id': str(carddef.id),
}
formdata.store()
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 5
assert carddef.data_class().get(1).data['2'] == '3' # 2 + 1
assert carddef.data_class().get(2).data['2'] == '0'
assert carddef.data_class().get(3).data['2'] == '0'
assert carddef.data_class().get(4).data['2'] == '2'
assert carddef.data_class().get(5).data['2'] == '2'
assert pub.loggederror_class.count() == 0
# target not found
edit.target_id = '42{{ form_var_string }}' # == '421'
wf.store()
formdata = formdef.data_class()()
formdata.data = {
'0': 'Parent',
'1': 'Foo',
'2': '2',
'3': '3', # set from datasource
'4': '1',
}
# set parent
formdata.submission_context = {
'orig_object_type': 'carddef',
'orig_formdata_id': '2',
'orig_formdef_id': str(carddef.id),
}
formdata.store()
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 6
assert carddef.data_class().get(1).data['2'] == '3' # not changed
assert carddef.data_class().get(2).data['2'] == '0'
assert carddef.data_class().get(3).data['2'] == '0'
assert carddef.data_class().get(4).data['2'] == '2'
assert carddef.data_class().get(5).data['2'] == '2'
assert carddef.data_class().get(6).data['2'] == '2'
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert logged_error.summary == 'Could not find targeted "Parent" object by id 421'
# slug not or badly configured
edit.target_id = '{{ form_var_string }}' # == '1'
edit.formdef_slug = None
wf.store()
formdata = formdef.data_class()()
formdata.data = {
'0': 'Parent',
'1': 'Foo',
'2': '3',
'3': '3', # set from datasource
'4': '1',
}
# set parent
formdata.submission_context = {
'orig_object_type': 'carddef',
'orig_formdata_id': '2',
'orig_formdef_id': str(carddef.id),
}
formdata.store()
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 7
assert carddef.data_class().get(1).data['2'] == '3' # not changed
assert carddef.data_class().get(2).data['2'] == '0'
assert carddef.data_class().get(3).data['2'] == '0'
assert carddef.data_class().get(4).data['2'] == '2'
assert carddef.data_class().get(5).data['2'] == '2'
assert carddef.data_class().get(6).data['2'] == '2'
assert carddef.data_class().get(7).data['2'] == '3'
def test_edit_carddata_targeting_itself(pub):
CardDef.wipe()
carddef = CardDef()
carddef.name = 'Foo Card'
carddef.fields = [
StringField(id='0', label='foo', varname='foo'),
]
carddef.store()
carddef.data_class().wipe()
# card workflow: update itself then jump to second status
card_wf = Workflow(name='Card workflow')
st1 = card_wf.add_status('Status1')
st2 = card_wf.add_status('Status2')
edit = st1.add_action('edit_carddata', id='_edit')
edit.formdef_slug = carddef.url_name
edit.target_mode = 'manual'
edit.target_id = '{{ form_internal_id }}' # itself
edit.mappings = [
Mapping(field_id='0', expression='bar {{ form_internal_id }}'),
]
jump = st1.add_action('jump', '_jump')
jump.status = st2.id
card_wf.store()
carddef.workflow = card_wf
carddef.store()
# create some cardata
for i in range(1, 4):
carddata = carddef.data_class()()
carddata.data = {
'0': 'foo %s' % i,
}
carddata.store()
# run workflow, verify that carddata is modified
carddata.just_created()
carddata.perform_workflow()
assert carddata.data['0'] == 'bar %s' % carddata.id
assert carddata.status == 'wf-%s' % st2.id
def test_edit_carddata_from_created_object(pub):
FormDef.wipe()
CardDef.wipe()
carddef = CardDef()
carddef.name = 'Card'
carddef.fields = [
StringField(id='0', label='Card Field', varname='card_field'),
]
carddef.store()
formdef = FormDef()
formdef.name = 'Form'
formdef.fields = [
StringField(id='0', label='Form Field', varname='form_field'),
]
formdef.store()
# card workflow: create formdata then jump to second status
card_wf = Workflow(name='Card workflow')
st1 = card_wf.add_status('Status1')
st2 = card_wf.add_status('Status2')
create = st1.add_action('create_formdata', id='_create')
create.formdef_slug = formdef.url_name
create.mappings = [
Mapping(field_id='0', expression='...'),
]
jump = st1.add_action('jump', id='_jump')
jump.status = st2.id
# form workflow: edit parent card data
form_wf = Workflow(name='Form workflow')
st1 = form_wf.add_status('Status1')
edit = st1.add_action('edit_carddata', id='edit')
edit.formdef_slug = carddef.url_name
edit.mappings = [
Mapping(field_id='0', expression='HELLO'),
]
form_wf.store()
carddef.workflow = card_wf
carddef.store()
formdef.workflow = form_wf
formdef.store()
carddata = carddef.data_class()()
carddata.data = {'0': 'Foo'}
carddata.store()
carddata.just_created()
carddata.perform_workflow()
carddata_reloaded = carddata.get(carddata.id)
assert carddata_reloaded.data['0'] == 'HELLO'
assert carddata_reloaded.status == 'wf-2'
def test_assign_carddata_with_data_sourced_object(pub):
FormDef.wipe()
CardDef.wipe()
pub.user_class.wipe()
user = pub.user_class()
user.email = 'test@example.net'
user.name_identifiers = ['xyz']
user.store()
carddef = CardDef()
carddef.name = 'Person'
carddef.fields = [
StringField(id='0', label='First Name', varname='first_name'),
StringField(id='1', label='Last Name', varname='last_name'),
]
carddef.digest_templates = {'default': '{{ form_var_first_name }} {{ form_var_last_name }}'}
carddef.store()
carddef.data_class().wipe()
carddata = carddef.data_class()()
carddata.data = {'0': 'Foo', '1': 'Bar'}
carddata.store()
wf = Workflow(name='Card update')
st1 = wf.add_status('Assign card', 'st1')
assign = st1.add_action('assign_carddata', id='assign')
assign.formdef_slug = carddef.url_name
assign.user_association_mode = 'keep-user'
wf.store()
datasource = {'type': 'carddef:%s' % carddef.url_name}
formdef = FormDef()
formdef.name = 'Persons'
formdef.fields = [
ItemField(id='0', label='Person', type='item', varname='person', data_source=datasource),
]
formdef.workflow = wf
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'0': '1'}
formdata.user_id = user.id
formdata.store()
formdata.just_created()
formdata.perform_workflow()
data = carddef.data_class().select()[0]
assert str(data.user_id) == str(user.id)
def test_assign_carddata_with_linked_object(pub):
FormDef.wipe()
CardDef.wipe()
pub.user_class.wipe()
user = pub.user_class()
user.email = 'test@example.net'
user.name_identifiers = ['xyz']
user.store()
carddef = CardDef()
carddef.name = 'Parent'
carddef.fields = [
StringField(id='0', label='First Name', varname='first_name'),
StringField(id='1', label='Last Name', varname='last_name'),
]
carddef.store()
carddef.data_class().wipe()
wf = Workflow(name='Card create and assign')
st1 = wf.add_status('Create card', 'st1')
create = st1.add_action('create_carddata')
create.formdef_slug = carddef.url_name
create.user_association_mode = None
create.mappings = [
Mapping(field_id='0', expression='{{ form_var_first_name }}'),
Mapping(field_id='1', expression='{{ form_var_last_name }}'),
]
jump = st1.add_action('jump', id='_jump')
jump.by = ['_submitter', '_receiver']
jump.status = 'st2'
st2 = wf.add_status('Assign card', 'st2')
assign = st2.add_action('assign_carddata', id='assign')
assign.formdef_slug = carddef.url_name
assign.user_association_mode = 'keep-user'
wf.store()
formdef = FormDef()
formdef.name = 'Parents'
formdef.fields = [
StringField(id='0', label='First Name', varname='first_name'),
StringField(id='1', label='Last Name', varname='last_name'),
]
formdef.workflow = wf
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'0': 'Parent', '1': 'Foo'}
formdata.user_id = user.id
formdata.store()
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 1
card_data = carddef.data_class().select()[0]
assert str(card_data.user_id) == str(user.id)
def test_assign_carddata_manual_targeting(pub):
FormDef.wipe()
CardDef.wipe()
pub.user_class.wipe()
user = pub.user_class()
user.email = 'test@example.net'
user.name_identifiers = ['xyz']
user.store()
# carddef
carddef = CardDef()
carddef.name = 'Parent'
carddef.fields = [
StringField(id='0', label='First Name', varname='first_name'),
StringField(id='1', label='Last Name', varname='last_name'),
]
carddef.store()
carddef.data_class().wipe()
# and sample carddatas
for i in range(1, 4):
carddata = carddef.data_class()()
carddata.data = {
'0': 'First name %s' % i,
'1': 'Last name %s' % i,
}
carddata.store()
# formdef workflow that will assign carddata
wf = Workflow(name='Card create and Assign')
st1 = wf.add_status('Create card', 'st1')
# create linked carddata
create = st1.add_action('create_carddata')
create.formdef_slug = carddef.url_name
create.user_association_mode = None
create.mappings = [
Mapping(field_id='0', expression='{{ form_var_first_name }}'),
Mapping(field_id='1', expression='{{ form_var_last_name }}'),
]
jump = st1.add_action('jump', id='_jump')
jump.by = ['_submitter', '_receiver']
jump.status = 'st2'
st2 = wf.add_status('Assign card', 'st2')
assign = st2.add_action('assign_carddata', id='assign')
assign.formdef_slug = carddef.url_name
assign.target_mode = 'manual' # not configured
assign.user_association_mode = 'keep-user'
wf.store()
# associated formdef
formdef = FormDef()
formdef.name = 'Parents'
datasource = {'type': 'carddef:%s' % carddef.url_name}
formdef.fields = [
StringField(id='0', label='First Name', varname='first_name'),
StringField(id='1', label='Last Name', varname='last_name'),
StringField(id='2', label='string', varname='string'),
ItemField(id='3', label='Card', type='item', varname='card', data_source=datasource),
]
formdef.workflow = wf
formdef.store()
# create formdatas
# target not configured
formdata = formdef.data_class()()
formdata.data = {
'0': 'Parent',
'1': 'Foo',
'2': '1',
'3': '3', # set from datasource
}
# set parent
formdata.submission_context = {
'orig_object_type': 'carddef',
'orig_formdata_id': '2',
'orig_formdef_id': str(carddef.id),
}
formdata.user_id = user.id
formdata.store()
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 4
assert carddef.data_class().get(1).user_id is None
assert carddef.data_class().get(2).user_id is None
assert carddef.data_class().get(3).user_id is None
assert carddef.data_class().get(4).user_id is None
assert pub.loggederror_class.count() == 0
# configure target
assign.target_id = '{{ form_var_string }}' # == '1'
wf.store()
formdata = formdef.data_class()()
formdata.data = {
'0': 'Parent',
'1': 'Foo',
'2': '1',
'3': '3', # set from datasource
}
# set parent
formdata.submission_context = {
'orig_object_type': 'carddef',
'orig_formdata_id': '2',
'orig_formdef_id': str(carddef.id),
}
formdata.user_id = user.id
formdata.store()
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 5
assert carddef.data_class().get(1).user_id == str(user.id)
assert carddef.data_class().get(2).user_id is None
assert carddef.data_class().get(3).user_id is None
assert carddef.data_class().get(4).user_id is None
assert carddef.data_class().get(5).user_id is None
assert pub.loggederror_class.count() == 0
# target not found
assign.target_id = '42{{ form_var_string }}' # == '424'
wf.store()
formdata = formdef.data_class()()
formdata.data = {
'0': 'Parent',
'1': 'Foo',
'2': '4',
'3': '3', # set from datasource
}
# set parent
formdata.submission_context = {
'orig_object_type': 'carddef',
'orig_formdata_id': '2',
'orig_formdef_id': str(carddef.id),
}
formdata.user_id = user.id
formdata.store()
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 6
assert carddef.data_class().get(1).user_id == str(user.id)
assert carddef.data_class().get(2).user_id is None
assert carddef.data_class().get(3).user_id is None
assert carddef.data_class().get(4).user_id is None # not changed
assert carddef.data_class().get(5).user_id is None
assert carddef.data_class().get(6).user_id is None
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert logged_error.summary == 'Could not find targeted "Parent" object by id 424'
# slug not or badly configured
assign.target_id = '{{ form_var_string }}' # == '5'
assign.formdef_slug = None
wf.store()
formdata = formdef.data_class()()
formdata.data = {
'0': 'Parent',
'1': 'Foo',
'2': '5',
'3': '3', # set from datasource
}
# set parent
formdata.submission_context = {
'orig_object_type': 'carddef',
'orig_formdata_id': '2',
'orig_formdef_id': str(carddef.id),
}
formdata.user_id = user.id
formdata.store()
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().count() == 7
assert carddef.data_class().get(1).user_id == str(user.id)
assert carddef.data_class().get(2).user_id is None
assert carddef.data_class().get(3).user_id is None
assert carddef.data_class().get(4).user_id is None
assert carddef.data_class().get(5).user_id is None # not changed
assert carddef.data_class().get(6).user_id is None
assert carddef.data_class().get(7).user_id is None
def test_assign_carddata_targeting_itself(pub):
CardDef.wipe()
pub.user_class.wipe()
user = pub.user_class()
user.email = 'test@example.net'
user.name_identifiers = ['xyz']
user.store()
carddef = CardDef()
carddef.name = 'Foo Card'
carddef.fields = [
StringField(id='0', label='foo', varname='foo'),
]
carddef.store()
carddef.data_class().wipe()
# card workflow: assign itself then jump to second status
card_wf = Workflow(name='Card workflow')
st1 = card_wf.add_status('Status1')
st2 = card_wf.add_status('Status2')
assign = st1.add_action('assign_carddata', id='_assign')
assign.formdef_slug = carddef.url_name
assign.target_mode = 'manual'
assign.target_id = '{{ form_internal_id }}' # itself
assign.user_association_mode = 'custom'
assign.user_association_template = 'xyz'
jump = st1.add_action('jump', id='_jump')
jump.status = st2.id
card_wf.store()
carddef.workflow = card_wf
carddef.store()
# create some cardata
for i in range(1, 4):
carddata = carddef.data_class()()
carddata.data = {
'0': 'foo %s' % i,
}
carddata.user_id = 42
carddata.store()
# run workflow, verify that carddata is assign
carddata.just_created()
carddata.perform_workflow()
assert str(carddata.user_id) == str(user.id)
assert carddata.status == 'wf-%s' % st2.id
def test_assign_carddata_from_created_object(pub):
FormDef.wipe()
CardDef.wipe()
pub.user_class.wipe()
user = pub.user_class()
user.email = 'test@example.net'
user.name_identifiers = ['xyz']
user.store()
carddef = CardDef()
carddef.name = 'Card'
carddef.fields = [
StringField(id='0', label='Card Field', varname='card_field'),
]
carddef.store()
carddef.data_class().wipe()
formdef = FormDef()
formdef.name = 'Form'
formdef.fields = [
StringField(id='0', label='Form Field', varname='form_field'),
]
formdef.store()
# card workflow: create formdata then jump to second status
card_wf = Workflow(name='Card workflow')
st1 = card_wf.add_status('Status1')
st2 = card_wf.add_status('Status2')
create = st1.add_action('create_formdata', id='_create')
create.formdef_slug = formdef.url_name
create.mappings = [
Mapping(field_id='0', expression='...'),
]
jump = st1.add_action('jump', id='_jump')
jump.status = st2.id
# form workflow: assign parent card data
form_wf = Workflow(name='Form workflow')
st1 = form_wf.add_status('Status1')
assign = st1.add_action('assign_carddata', id='assign')
assign.formdef_slug = carddef.url_name
assign.user_association_mode = 'custom'
assign.user_association_template = 'xyz'
form_wf.store()
carddef.workflow = card_wf
carddef.store()
formdef.workflow = form_wf
formdef.store()
carddata = carddef.data_class()()
carddata.data = {'0': 'Foo'}
carddata.store()
carddata.just_created()
carddata.perform_workflow()
assert str(carddata.user_id) == str(user.id)
carddata_reloaded = carddata.get(carddata.id)
assert carddata_reloaded.status == 'wf-2'
assert str(carddata_reloaded.user_id) == str(user.id)
def test_assign_carddata_user_association(pub):
CardDef.wipe()
FormDef.wipe()
pub.user_class.wipe()
user = pub.user_class()
user.email = 'test@example.net'
user.name_identifiers = ['xyz']
user.store()
user2 = pub.user_class()
user2.store()
carddef = CardDef()
carddef.name = 'Person'
carddef.fields = [
StringField(id='0', label='First Name', varname='first_name'),
StringField(id='1', label='Last Name', varname='last_name'),
]
carddef.digest_templates = {'default': '{{ form_var_first_name }} {{ form_var_last_name }}'}
carddef.user_support = 'optional'
carddef.store()
carddef.data_class().wipe()
carddata = carddef.data_class()()
carddata.data = {'0': 'Foo', '1': 'Bar'}
carddata.user_id = user2.id
carddata.store()
wf = Workflow(name='assign-carddata')
wf.possible_status = Workflow.get_default_workflow().possible_status[:]
assign = wf.possible_status[1].add_action('assign_carddata', id='_assign', prepend=True)
assign.label = 'Assign CardDef'
assign.varname = 'mycard'
assign.formdef_slug = carddef.url_name
wf.store()
datasource = {'type': 'carddef:%s' % carddef.url_name}
formdef = FormDef()
formdef.name = 'Persons'
formdef.fields = [
ItemField(id='0', label='Person', type='item', varname='person', data_source=datasource),
]
formdef.workflow = wf
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'0': '1'}
formdata.user_id = user.id
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().select()[0].user is None
# keep user
carddata.user_id = user2.id
carddata.store()
assign.user_association_mode = 'keep-user'
wf.store()
formdata = FormDef.get(formdef.id).data_class()()
formdata.data = {'0': '1'}
formdata.user_id = user.id
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().select()[0].user.id == user.id
# user association on direct user
carddata.user_id = user2.id
carddata.store()
assign.user_association_mode = 'custom'
assign.user_association_template = '{{ form_user }}'
wf.store()
formdata = FormDef.get(formdef.id).data_class()()
formdata.data = {'0': '1'}
formdata.user_id = user.id
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().select()[0].user.id == user.id
# user association on user email
carddata.user_id = user2.id
carddata.store()
assign.user_association_mode = 'custom'
assign.user_association_template = 'test@example.net'
wf.store()
formdata = FormDef.get(formdef.id).data_class()()
formdata.data = {'0': '1'}
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().select()[0].user.id == user.id
# user association on name id
carddata.user_id = user2.id
carddata.store()
assign.user_association_mode = 'custom'
assign.user_association_template = 'xyz'
wf.store()
formdata = FormDef.get(formdef.id).data_class()()
formdata.data = {'0': '1'}
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().select()[0].user.id == user.id
# user association on invalid user
carddata.user_id = user2.id
carddata.store()
assign.user_association_mode = 'custom'
assign.user_association_template = 'zzz'
wf.store()
formdata = FormDef.get(formdef.id).data_class()()
formdata.data = {'0': '1'}
formdata.just_created()
if pub.loggederror_class:
pub.loggederror_class.wipe()
formdata.perform_workflow()
assert carddef.data_class().select()[0].user is None
if pub.loggederror_class:
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert logged_error.summary == 'Failed to attach user (not found: "zzz")'
assert logged_error.formdata_id == str(formdata.id)
# user association on invalid template
carddata.user_id = user2.id
carddata.store()
assign.user_association_mode = 'custom'
assign.user_association_template = '{% %}'
wf.store()
formdata = FormDef.get(formdef.id).data_class()()
formdata.data = {'0': '1'}
formdata.just_created()
formdata.perform_workflow()
assert carddef.data_class().select()[0].user is None