1568 lines
48 KiB
Python
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
|