wcs/tests/workflow/test_backoffice_field.py

1489 lines
50 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import base64
import datetime
import json
import os
import pytest
from quixote import cleanup, get_publisher
from wcs import sessions
from wcs.blocks import BlockDef
from wcs.carddef import CardDef
from wcs.fields import (
BlockField,
BoolField,
DateField,
FileField,
ItemField,
ItemsField,
MapField,
StringField,
)
from wcs.formdef import FormDef
from wcs.qommon.http_request import HTTPRequest
from wcs.qommon.upload_storage import PicklableUpload
from wcs.wf.backoffice_fields import SetBackofficeFieldsWorkflowStatusItem
from wcs.wf.wscall import WebserviceCallStatusItem
from wcs.workflows import AttachmentEvolutionPart, Workflow, WorkflowBackofficeFieldsFormDef
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():
pub = create_temporary_pub()
pub.cfg['language'] = {'language': 'en'}
pub.cfg['identification'] = {'methods': ['password']}
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_set_backoffice_field(http_requests, pub):
Workflow.wipe()
FormDef.wipe()
wf = Workflow(name='xxx')
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
wf.backoffice_fields_formdef.fields = [
StringField(id='bo1', label='1st backoffice field', varname='backoffice_blah'),
]
st1 = wf.add_status('Status1')
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = [
StringField(id='00', label='String', varname='string'),
StringField(id='01', label='Other string', varname='other'),
]
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'00': 'HELLO'}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
assert item.render_as_line() == 'Backoffice Data'
assert item.get_jump_label('plop') == 'Backoffice Data'
item.label = 'label'
assert item.render_as_line() == 'Backoffice Data (label)'
assert item.get_jump_label('plop') == 'Backoffice Data "label"'
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data.get('bo1') is None
item.fields = [{'field_id': 'bo1', 'value': '=form_var_string'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'HELLO'
item.fields = [{'field_id': 'bo1', 'value': '{{ form_var_string }} WORLD'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'HELLO WORLD'
item.fields = [{'field_id': 'bo1', 'value': '[form_var_string] GOODBYE'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'HELLO GOODBYE'
item.fields = [{'field_id': 'bo1', 'value': '{{ form.var.string }} LAZY'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'HELLO LAZY'
item.fields = [{'field_id': 'bo1', 'value': '=form.var.string'}] # lazy python
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'HELLO'
item.fields = [{'field_id': 'bo1', 'value': '=vars().get("form_var_string") + " PLOP"'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'HELLO PLOP'
item.fields = [
{'field_id': 'bo1', 'value': '=vars().get("form_var_other") or vars().get("form_var_string")'}
]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'HELLO'
item.fields = [{'field_id': 'bo1', 'value': '=vars().get("form_var_bouh", "X") + " PLOP"'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'X PLOP'
item.fields = [{'field_id': 'bo1', 'value': None}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] is None
item.fields = [{'field_id': 'bo1', 'value': ''}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] is None
# check a value computed as the empty string is stored as an empty string, not None
item.fields = [{'field_id': 'bo1', 'value': '=""'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == ''
item.fields = [{'field_id': 'bo1', 'value': '{{ does_not_exist }}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == ''
assert pub.loggederror_class.count() == 0
item.fields = [{'field_id': 'bo1', 'value': '= ~ invalid python ~'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert logged_error.summary == 'Failed to compute Python expression'
assert logged_error.formdata_id == str(formdata.id)
assert logged_error.expression == ' ~ invalid python ~'
assert logged_error.expression_type == 'python'
assert logged_error.exception_class == 'SyntaxError'
assert logged_error.exception_message == 'invalid syntax (<string>, line 1)'
pub.loggederror_class.wipe()
item.fields = [{'field_id': 'bo1', 'value': '{% if bad django %}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert logged_error.summary == 'Failed to compute template'
assert logged_error.formdata_id == str(formdata.id)
assert logged_error.expression == '{% if bad django %}'
assert logged_error.expression_type == 'template'
assert logged_error.exception_class == 'TemplateError'
assert logged_error.exception_message.startswith('syntax error in Django template')
def test_set_backoffice_field_map(http_requests, pub):
Workflow.wipe()
FormDef.wipe()
wf = Workflow(name='xxx')
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
wf.backoffice_fields_formdef.fields = [
MapField(id='bo1', label='1st backoffice field', varname='backoffice_blah'),
]
st1 = wf.add_status('Status1')
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = [
MapField(id='1', label='Map1', varname='map1'),
MapField(id='2', label='Map2', varname='map2'),
]
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'1': '42;10', '2': None}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{{ form_var_map1|default:"" }}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data.get('bo1') == '42;10'
item.fields = [{'field_id': 'bo1', 'value': '{{ form_var_map2|default:"" }}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data.get('bo1') is None
assert pub.loggederror_class.count() == 0
item.fields = [{'field_id': 'bo1', 'value': 'invalid value'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert (
logged_error.summary
== "Failed to set Map field (bo1), error: invalid coordinates 'invalid value' (missing ;)"
)
assert logged_error.formdata_id == str(formdata.id)
assert logged_error.exception_class == 'SetValueError'
assert logged_error.exception_message == "invalid coordinates 'invalid value' (missing ;)"
pub.loggederror_class.wipe()
item.fields = [{'field_id': 'bo1', 'value': 'XXX;YYY'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert logged_error.summary == "Failed to set Map field (bo1), error: invalid coordinates 'XXX;YYY'"
assert logged_error.formdata_id == str(formdata.id)
assert logged_error.exception_class == 'SetValueError'
assert logged_error.exception_message == "invalid coordinates 'XXX;YYY'"
pub.loggederror_class.wipe()
def test_set_backoffice_field_decimal(http_requests, pub):
Workflow.wipe()
FormDef.wipe()
wf = Workflow(name='xxx')
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
wf.backoffice_fields_formdef.fields = [
StringField(id='bo1', label='1st backoffice field', varname='backoffice_blah'),
]
st1 = wf.add_status('Status1')
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = [
StringField(id='1', label='String', varname='string'),
]
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'1': '1000'}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{{ "100"|decimal }}'}]
item.perform(formdata)
assert formdef.data_class().get(formdata.id).data['bo1'] == '100'
formdata.store() # reset
item.fields = [{'field_id': 'bo1', 'value': '{{ form_var_string|decimal }}'}]
item.perform(formdata)
assert formdef.data_class().get(formdata.id).data['bo1'] == '1000'
def test_set_backoffice_field_file(http_requests, pub):
Workflow.wipe()
FormDef.wipe()
wf = Workflow(name='xxx')
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
wf.backoffice_fields_formdef.fields = [
FileField(id='bo1', label='1st backoffice field', varname='backoffice_file'),
StringField(id='bo2', label='2nd backoffice field'),
]
st1 = wf.add_status('Status1')
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = [
FileField(id='00', label='File', varname='file'),
]
formdef.workflow_id = wf.id
formdef.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '=locals().get("form_var_file_raw")'}]
# the file does not exist
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] is None
# store a PiclableUpload
upload = PicklableUpload('test.jpeg', 'image/jpeg')
with open(os.path.join(os.path.dirname(__file__), '..', 'image-with-gps-data.jpeg'), 'rb') as fd:
image_with_gps_data = fd.read()
upload.receive([image_with_gps_data])
formdata = formdef.data_class()()
formdata.data = {'00': upload}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'].base_filename == 'test.jpeg'
assert formdata.data['bo1'].content_type == 'image/jpeg'
assert formdata.data['bo1'].get_content() == image_with_gps_data
assert formdata.data['bo1'].get_base64_content() == base64.encodebytes(image_with_gps_data)
# check with template string
formdata = formdef.data_class()()
formdata.data = {'00': upload}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item.fields = [{'field_id': 'bo1', 'value': '{{form_var_file_raw}}'}]
item.perform(formdata)
assert formdata.data['bo1'].base_filename == 'test.jpeg'
assert formdata.data['bo1'].content_type == 'image/jpeg'
assert formdata.data['bo1'].get_content() == image_with_gps_data
# check with template string, without _raw
formdata = formdef.data_class()()
formdata.data = {'00': upload}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item.fields = [{'field_id': 'bo1', 'value': '{{form_var_file}}'}]
item.perform(formdata)
assert formdata.data['bo1'].base_filename == 'test.jpeg'
assert formdata.data['bo1'].content_type == 'image/jpeg'
assert formdata.data['bo1'].get_content() == image_with_gps_data
# check |strip_metadata filter
formdata = formdef.data_class()()
formdata.data = {'00': upload}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item.fields = [{'field_id': 'bo1', 'value': '{{form_var_file|strip_metadata}}'}]
item.perform(formdata)
assert formdata.data['bo1'].base_filename == 'test.jpeg'
assert formdata.data['bo1'].content_type == 'image/jpeg'
assert b'JFIF' in formdata.data['bo1'].get_content()
assert b'<exif:XResolution>' not in formdata.data['bo1'].get_content()
# check |rename_file filter
formdata = formdef.data_class()()
formdata.data = {'00': upload}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item.fields = [{'field_id': 'bo1', 'value': '{{form_var_file|rename_file:"foobar.jpeg"}}'}]
item.perform(formdata)
assert formdata.data['bo1'].base_filename == 'foobar.jpeg'
assert formdata.data['bo1'].content_type == 'image/jpeg'
assert formdata.data['bo1'].get_content() == image_with_gps_data
formdata = formdef.data_class()()
formdata.data = {'00': upload}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item.fields = [{'field_id': 'bo1', 'value': '{{form_var_file|rename_file:"foobar.$ext"}}'}]
item.perform(formdata)
assert formdata.data['bo1'].base_filename == 'foobar.jpeg'
assert formdata.data['bo1'].content_type == 'image/jpeg'
assert formdata.data['bo1'].get_content() == image_with_gps_data
# check |rename_file with invalid input
formdata = formdef.data_class()()
formdata.data = {'00': upload}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item.fields = [{'field_id': 'bo1', 'value': '{{"xxx"|rename_file:"foobar.jpeg"}}'}]
item.perform(formdata)
assert 'bo1' not in formdata.data
# check with a template string, into a string field
pub.substitutions.feed(formdata)
item.fields = [{'field_id': 'bo2', 'value': '{{form_var_file}}'}]
item.perform(formdata)
assert formdata.data['bo2'] == 'test.jpeg'
# check with template string and missing file
formdata = formdef.data_class()()
formdata.data = {'00': None}
formdata.just_created()
formdata.store()
assert formdata.data.get('bo1') is None
# check stripping metadata
pub.substitutions.feed(formdata)
item.fields = [
{
'field_id': 'bo1',
'value': '=utils.attachment(form_var_file_raw,'
+ ' filename="new_"+form_var_file,'
+ ' content_type="my content type",'
+ ' strip_metadata=True)',
}
]
formdata = formdef.data_class()()
formdata.data = {'00': upload}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'].base_filename == 'new_test.jpeg'
assert formdata.data['bo1'].content_type == 'my content type'
assert formdata.data['bo1'].qfilename != formdata.data['00'].qfilename
assert formdata.data['00'].get_content().find(b'<exif:XResolution>')
assert formdata.data['bo1'].get_content().find(b'<exif:XResolution>') == -1
upload2 = PicklableUpload('test2.odt', 'application/vnd.oasis.opendocument.text')
with open(os.path.join(os.path.dirname(__file__), '..', 'template.odt'), 'rb') as fd:
template_odt = fd.read()
upload2.receive([template_odt])
formdata = formdef.data_class()()
formdata.data = {'00': upload2}
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'].base_filename == 'new_test2.odt'
assert formdata.data['bo1'].content_type == 'my content type'
assert formdata.data['bo1'].get_content() == template_odt
assert formdata.data['bo1'].qfilename == formdata.data['00'].qfilename
# check storing response as attachment
pub.substitutions.feed(formdata)
item = WebserviceCallStatusItem()
item.url = 'http://remote.example.net/xml'
item.varname = 'xxx'
item.response_type = 'attachment'
item.record_errors = True
item.perform(formdata)
attachment = formdata.evolution[-1].parts[-1]
assert isinstance(attachment, AttachmentEvolutionPart)
assert attachment.base_filename == 'xxx.xml'
assert attachment.content_type == 'text/xml'
formdata = formdef.data_class().get(formdata.id)
pub.substitutions.feed(formdata)
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '=attachments.xxx'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'].base_filename == 'xxx.xml'
# check storing a file from an assembled dictionary
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '={"content": "hello world", "filename": "hello.txt"}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'].base_filename == 'hello.txt'
assert formdata.data['bo1'].get_content() == b'hello world'
# check resetting a value
for value in ('', None):
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': value}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] is None
# set from base64 content
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [
{'field_id': 'bo1', 'value': '={"b64_content": "SEVMTE8gV09STEQ=", "filename": "hello.txt"}'}
]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'].base_filename == 'hello.txt'
assert formdata.data['bo1'].get_content() == b'HELLO WORLD'
hello_world = formdata.data['bo1']
# check wrong value
for value in ('="HELLO"', 'BAD'):
formdata.data['bo1'] = hello_world
formdata.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': value}]
pub.loggederror_class.wipe()
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'].base_filename == 'hello.txt'
assert formdata.data['bo1'].get_content() == b'HELLO WORLD'
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert logged_error.summary.startswith('Failed to convert')
assert logged_error.formdata_id == str(formdata.id)
assert logged_error.exception_class == 'ValueError'
# check wrong field
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo3', 'value': '=form_var_file_raw'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data.get('bo3') is None
def test_set_backoffice_field_item(pub):
Workflow.wipe()
FormDef.wipe()
wf = Workflow(name='xxx')
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
st1 = wf.add_status('Status1')
wf.backoffice_fields_formdef.fields = [
ItemField(
id='bo1',
label='1st backoffice field',
varname='backoffice_item',
items=['a', 'b', 'c'],
),
]
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = []
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': 'a'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'a'
assert formdata.data['bo1_display'] == 'a'
datasource = {
'type': 'jsonvalue',
'value': json.dumps(
[
{'id': 'a', 'text': 'aa'},
{'id': 'b', 'text': 'bb'},
{'id': 'c', 'text': 'cc'},
]
),
}
wf.backoffice_fields_formdef.fields = [
ItemField(
id='bo1',
label='1st backoffice field',
varname='backoffice_item',
data_source=datasource,
),
]
wf.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': 'a'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'a'
assert formdata.data['bo1_display'] == 'aa'
datasource = {
'type': 'jsonvalue',
'value': json.dumps(
[{'id': 'a', 'text': 'aa', 'more': 'aaa'}, {'id': 'b', 'text': 'bb', 'more': 'bbb'}]
),
}
wf.backoffice_fields_formdef.fields = [
ItemField(
id='bo1',
label='1st backoffice field',
varname='backoffice_item',
data_source=datasource,
),
]
wf.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': 'a'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'a'
assert formdata.data['bo1_display'] == 'aa'
assert formdata.data['bo1_structured'] == {'id': 'a', 'more': 'aaa', 'text': 'aa'}
# check when assigning using the display value
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': 'aa'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'a'
assert formdata.data['bo1_display'] == 'aa'
assert formdata.data['bo1_structured'] == {'id': 'a', 'more': 'aaa', 'text': 'aa'}
# check with unknown value
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': 'foobar'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == 'foobar'
assert formdata.data.get('bo1_display') is None
assert formdata.data.get('bo1_structured') is None
def test_set_backoffice_field_card_item(pub):
CardDef.wipe()
Workflow.wipe()
FormDef.wipe()
carddef = CardDef()
carddef.name = 'items'
carddef.digest_templates = {'default': '{{form_var_name}}'}
carddef.fields = [
StringField(id='0', label='string', varname='name'),
StringField(id='1', label='string', varname='attr'),
]
carddef.store()
carddef.data_class().wipe()
for i, value in enumerate(['foo', 'bar', 'baz']):
carddata = carddef.data_class()()
carddata.data = {
'0': value,
'1': 'attr%s' % i,
}
carddata.just_created()
carddata.store()
latest_carddata = carddata
latest_carddata_id = carddata.id
ds = {'type': 'carddef:%s' % carddef.url_name}
wf = Workflow(name='xxx')
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.workflow_id = wf.id
formdef.fields = [ItemField(id='0', label='string', data_source=ds, display_disabled_items=True)]
formdef.store()
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
st1 = wf.add_status('Status1')
wf.backoffice_fields_formdef.fields = [
ItemField(id='bo1', label='1st backoffice field', varname='backoffice_item', data_source=ds),
]
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = []
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': str(latest_carddata_id)}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == str(latest_carddata_id)
assert formdata.data['bo1_display'] == 'baz'
assert formdata.data['bo1_structured']['attr'] == 'attr2'
# reset, and get by display id value
formdata.data = {}
formdata.store()
item.fields = [{'field_id': 'bo1', 'value': latest_carddata.get_display_id()}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == str(latest_carddata_id)
assert formdata.data['bo1_display'] == 'baz'
assert formdata.data['bo1_structured']['attr'] == 'attr2'
# reset, and get by text value
formdata.data = {}
formdata.store()
item.fields = [{'field_id': 'bo1', 'value': 'bar'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] != str(latest_carddata_id)
assert formdata.data['bo1_display'] == 'bar'
assert formdata.data['bo1_structured']['attr'] == 'attr1'
# reset, with unknown value
pub.loggederror_class.wipe()
formdata.data = {}
formdata.store()
item.fields = [{'field_id': 'bo1', 'value': 'xxx'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data.get('bo1') is None # invalid value is not stored
assert formdata.data.get('bo1_display') is None
assert formdata.data.get('bo1_structured') is None
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert logged_error.summary.startswith('Failed to convert')
# reset, and get empty value
formdata.data = {}
formdata.store()
item.fields = [{'field_id': 'bo1', 'value': ''}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] is None
assert formdata.data.get('bo1_display') is None
assert formdata.data.get('bo1_structured') is None
def test_set_backoffice_field_items(pub):
Workflow.wipe()
FormDef.wipe()
wf = Workflow(name='xxx')
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
st1 = wf.add_status('Status1')
wf.backoffice_fields_formdef.fields = [
ItemsField(
id='bo1',
label='1st backoffice field',
varname='backoffice_item',
items=['a', 'b', 'c'],
),
]
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = []
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': "=['a', 'b']"}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == ['a', 'b']
assert formdata.data['bo1_display'] == 'a, b'
datasource = {
'type': 'jsonvalue',
'value': json.dumps(
[
{'id': 'a', 'text': 'aa'},
{'id': 'b', 'text': 'bb'},
{'id': 'c', 'text': 'cc'},
]
),
}
wf.backoffice_fields_formdef.fields = [
ItemsField(
id='bo1',
label='1st backoffice field',
varname='backoffice_item',
data_source=datasource,
),
]
wf.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': "=['a', 'b']"}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == ['a', 'b']
assert formdata.data['bo1_display'] == 'aa, bb'
datasource = {
'type': 'jsonvalue',
'value': json.dumps(
[
{'id': 'a', 'text': 'aa', 'more': 'aaa'},
{'id': 'b', 'text': 'bb', 'more': 'bbb'},
{'id': 'c', 'text': 'cc', 'more': 'ccc'},
]
),
}
wf.backoffice_fields_formdef.fields = [
ItemsField(
id='bo1',
label='1st backoffice field',
varname='backoffice_item',
data_source=datasource,
),
]
wf.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': "=['a', 'c']"}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == ['a', 'c']
assert formdata.data['bo1_display'] == 'aa, cc'
assert len(formdata.data['bo1_structured']) == 2
assert {'id': 'a', 'more': 'aaa', 'text': 'aa'} in formdata.data['bo1_structured']
assert {'id': 'c', 'more': 'ccc', 'text': 'cc'} in formdata.data['bo1_structured']
# from formdata field
formdef.fields = [
ItemsField(id='1', label='field', varname='items', data_source=datasource),
]
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'1': ['a', 'c']}
formdata.data['1_display'] = formdef.fields[0].store_display_value(formdata.data, '1')
formdata.data['1_structured'] = formdef.fields[0].store_structured_value(formdata.data, '1')
formdata.just_created()
formdata.store()
pub.substitutions.feed(formdata)
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '=form_var_items_raw'}]
item.perform(formdata)
assert formdata.data['bo1'] == ['a', 'c']
assert formdata.data['bo1_display'] == 'aa, cc'
assert len(formdata.data['bo1_structured']) == 2
assert {'id': 'a', 'more': 'aaa', 'text': 'aa'} in formdata.data['bo1_structured']
assert {'id': 'c', 'more': 'ccc', 'text': 'cc'} in formdata.data['bo1_structured']
# with a template
formdata = formdef.data_class()()
formdata.data = {'1': ['a', 'c']}
formdata.data['1_display'] = formdef.fields[0].store_display_value(formdata.data, '1')
formdata.data['1_structured'] = formdef.fields[0].store_structured_value(formdata.data, '1')
formdata.just_created()
formdata.store()
pub.substitutions.reset()
pub.substitutions.feed(formdata)
item.fields = [{'field_id': 'bo1', 'value': '{{form_var_items_raw}}'}]
item.perform(formdata)
# using a single int
datasource = {
'type': 'jsonvalue',
'value': json.dumps(
[
{'id': 1, 'text': 'aa', 'more': 'aaa'},
{'id': 2, 'text': 'bb', 'more': 'bbb'},
{'id': 3, 'text': 'cc', 'more': 'ccc'},
]
),
}
wf.backoffice_fields_formdef.fields = [
ItemsField(
id='bo1',
label='1st backoffice field',
varname='backoffice_item',
data_source=datasource,
),
]
wf.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '=2'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == ['2']
assert formdata.data['bo1_display'] == 'bb'
assert len(formdata.data['bo1_structured']) == 1
# using an invalid value
formdata.data = {}
formdata.store()
pub.loggederror_class.wipe()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '=Ellipsis'}]
item.perform(formdata)
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert 'Failed to convert' in logged_error.summary
# using a string with multiple values
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '1|3'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == ['1', '3']
assert formdata.data['bo1_display'] == 'aa, cc'
assert len(formdata.data['bo1_structured']) == 2
assert {'id': 1, 'more': 'aaa', 'text': 'aa'} in formdata.data['bo1_structured']
assert {'id': 3, 'more': 'ccc', 'text': 'cc'} in formdata.data['bo1_structured']
def test_set_backoffice_field_date(pub):
Workflow.wipe()
FormDef.wipe()
wf = Workflow(name='xxx')
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
st1 = wf.add_status('Status1')
wf.backoffice_fields_formdef.fields = [
DateField(id='bo1', label='1st backoffice field', varname='backoffice_date'),
]
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = []
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {}
formdata.just_created()
formdata.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '=utils.today()'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert datetime.date(*formdata.data['bo1'][:3]) == datetime.date.today()
formdata.data['bo1'] = None
formdata.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{% now "j/n/Y" %}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert datetime.date(*formdata.data['bo1'][:3]) == datetime.date.today()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '23/3/2017'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert datetime.date(*formdata.data['bo1'][:3]) == datetime.date(2017, 3, 23)
# invalid values => do nothing
assert pub.loggederror_class.count() == 0
for value in ('plop', '={}', '=[]'):
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': value}]
pub.loggederror_class.wipe()
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert datetime.date(*formdata.data['bo1'][:3]) == datetime.date(2017, 3, 23)
assert pub.loggederror_class.count() == 1
assert pub.loggederror_class.select()[0].summary.startswith('Failed to convert')
# None : empty date
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': None}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] is None
def test_set_backoffice_field_boolean(pub):
Workflow.wipe()
FormDef.wipe()
wf = Workflow(name='xxx')
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
st1 = wf.add_status('Status1')
wf.backoffice_fields_formdef.fields = [
BoolField(id='bo1', label='1st backoffice field', varname='backoffice_bool'),
]
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = [BoolField(id='1', label='field', varname='foo')]
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'1': True}
formdata.just_created()
formdata.store()
get_publisher().substitutions.feed(formdata)
for value in ('=True', '=form_var_foo_raw', '{{ form_var_foo_raw }}', 'True', 'Yes', 'true', 'yes'):
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': value}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] is True
formdata.data['bo1'] = None
formdata.store()
for value in ('=False', '=not(form_var_foo_raw)', 'False', 'plop', ''):
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': value}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] is False
formdata.data['bo1'] = None
formdata.store()
def test_set_backoffice_field_str_time_filter(pub):
Workflow.wipe()
FormDef.wipe()
wf = Workflow(name='xxx')
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
st1 = wf.add_status('Status1')
wf.backoffice_fields_formdef.fields = [
StringField(id='bo1', label='1st backoffice field', varname='backoffice_str'),
]
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = [StringField(id='1', label='field', varname='foo')]
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'1': '09:00'}
formdata.just_created()
formdata.store()
get_publisher().substitutions.feed(formdata)
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{{ form_var_foo|time:"H:i:s" }}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == '09:00:00'
formdata.data['bo1'] = None
formdata.store()
# |time will yield the default django reprentation
for lang, value in (('en', '9 a.m.'), ('fr', '09:00')):
with pub.with_language(lang):
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{{ form_var_foo|time }}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == value
formdata.data['bo1'] = None
formdata.store()
def test_set_backoffice_field_block(pub):
BlockDef.wipe()
Workflow.wipe()
FormDef.wipe()
block = BlockDef()
block.name = 'foobar'
block.digest_template = 'X{{foobar_var_foo}}Y'
block.fields = [
StringField(id='123', required=True, label='Test', varname='foo'),
StringField(id='234', required=True, label='Test2', varname='bar'),
]
block.store()
wf = Workflow(name='xxx')
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
st1 = wf.add_status('Status1')
wf.backoffice_fields_formdef.fields = [
BlockField(id='bo1', label='1st backoffice field', block_slug='foobar'),
StringField(id='bo2', label='2nd backoffice field'),
]
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = [
BlockField(id='1', label='test', block_slug='foobar', max_items=3, varname='foo'),
]
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
# value from test_block_digest in tests/test_form_pages.py
formdata.data = {
'1': {
'data': [{'123': 'foo', '234': 'bar'}, {'123': 'foo2', '234': 'bar2'}],
'schema': {'123': 'string', '234': 'string'},
},
'1_display': 'XfooY, Xfoo2Y',
}
formdata.just_created()
formdata.store()
get_publisher().substitutions.feed(formdata)
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{{form_var_foo_raw}}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == formdata.data['1']
assert formdata.data['bo1_display'] == formdata.data['1_display']
# without _raw suffix
formdata = formdef.data_class()()
# value from test_block_digest in tests/test_form_pages.py
formdata.data = {
'1': {
'data': [{'123': 'foo', '234': 'bar'}, {'123': 'foo2', '234': 'bar2'}],
'schema': {'123': 'string', '234': 'string'},
},
'1_display': 'XfooY, Xfoo2Y',
}
formdata.just_created()
formdata.store()
get_publisher().substitutions.reset()
get_publisher().substitutions.feed(formdata)
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [
{'field_id': 'bo1', 'value': '{{form_var_foo}}'},
{'field_id': 'bo2', 'value': '{{form_var_foo}}'},
]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == formdata.data['1']
assert formdata.data['bo1_display'] == formdata.data['1_display']
assert formdata.data['bo2'] == formdata.data['1_display']
def test_set_backoffice_field_block_template_tag(pub):
BlockDef.wipe()
Workflow.wipe()
FormDef.wipe()
block = BlockDef()
block.name = 'foobar'
block.digest_template = 'X{{foobar_var_foo}}Y'
block.fields = [
StringField(id='123', required=True, label='Test', varname='foo'),
StringField(id='234', required=True, label='Test2', varname='bar'),
]
block.store()
wf = Workflow(name='xxx')
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
st1 = wf.add_status('Status1')
wf.backoffice_fields_formdef.fields = [
BlockField(id='bo1', label='1st backoffice field', max_items=3, block_slug='foobar'),
]
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = [
StringField(id='1', label='test', varname='foo'),
]
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'1': 'plop'}
formdata.just_created()
formdata.store()
get_publisher().substitutions.feed(formdata)
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{% block_value foo=form_var_foo bar="xxx" %}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == {
'data': [{'123': 'plop', '234': 'xxx'}],
'schema': {'123': 'string', '234': 'string'},
}
assert formdata.data['bo1_display'] == 'XplopY'
# override
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{% block_value foo=form_var_foo bar="yyy" %}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == {
'data': [{'123': 'plop', '234': 'yyy'}],
'schema': {'123': 'string', '234': 'string'},
}
assert formdata.data['bo1_display'] == 'XplopY'
# append
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{% block_value append=True foo="zzz" bar=form_var_foo %}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == {
'data': [{'123': 'plop', '234': 'yyy'}, {'123': 'zzz', '234': 'plop'}],
'schema': {'123': 'string', '234': 'string'},
}
assert formdata.data['bo1_display'] == 'XplopY, XzzzY'
# merge (into last row)
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{% block_value merge=True foo="AAA" %}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == {
'data': [{'123': 'plop', '234': 'yyy'}, {'123': 'AAA', '234': 'plop'}],
'schema': {'123': 'string', '234': 'string'},
}
assert formdata.data['bo1_display'] == 'XplopY, XAAAY'
# merge (into given row)
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{% block_value merge=0 foo="BBB" %}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == {
'data': [{'123': 'BBB', '234': 'yyy'}, {'123': 'AAA', '234': 'plop'}],
'schema': {'123': 'string', '234': 'string'},
}
assert formdata.data['bo1_display'] == 'XBBBY, XAAAY'
# merge with indexerror (ignored)
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{% block_value merge=50 foo="CCC" %}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == {
'data': [{'123': 'BBB', '234': 'yyy'}, {'123': 'AAA', '234': 'plop'}],
'schema': {'123': 'string', '234': 'string'},
}
assert formdata.data['bo1_display'] == 'XBBBY, XAAAY'
# "item" subfield, make sure raw and display and structured values are stored
datasource = {
'type': 'jsonvalue',
'value': json.dumps(
[
{'id': 'a', 'text': 'aa', 'more': 'aaa'},
{'id': 'b', 'text': 'bb', 'more': 'bbb'},
{'id': 'c', 'text': 'cc', 'more': 'ccc'},
]
),
}
block.fields.append(ItemField(id='345', label='Test3', varname='item', data_source=datasource))
block.store()
wf.backoffice_fields_formdef.fields[0]._block = None # remove cache
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{% block_value item="b" %}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == {
'data': [
{'345': 'b', '345_display': 'bb', '345_structured': {'id': 'b', 'text': 'bb', 'more': 'bbb'}}
],
'schema': {'123': 'string', '234': 'string', '345': 'item'},
}
assert formdata.data['bo1_display'] == 'XNoneY'
# append to invalid existing value (should not happen)
formdata.data['bo1'] = {'invalid': 'value'}
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': '{% block_value item="b" append=True %}'}]
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data['bo1'] == {
'data': [
{'345': 'b', '345_display': 'bb', '345_structured': {'id': 'b', 'text': 'bb', 'more': 'bbb'}}
],
'schema': {'123': 'string', '234': 'string', '345': 'item'},
}
assert formdata.data['bo1_display'] == 'XNoneY'
def test_set_backoffice_field_invalid_block_value(pub):
BlockDef.wipe()
Workflow.wipe()
FormDef.wipe()
block = BlockDef()
block.name = 'foobar'
block.fields = [StringField(id='123', required=True, label='Test', varname='foo')]
block.store()
wf = Workflow(name='xxx')
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
st1 = wf.add_status('Status1')
wf.backoffice_fields_formdef.fields = [
BlockField(id='bo1', label='1st backoffice field', max_items=3, block_slug='foobar'),
]
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = []
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.just_created()
formdata.store()
get_publisher().substitutions.feed(formdata)
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [{'field_id': 'bo1', 'value': 'xxx'}]
pub.loggederror_class.wipe()
item.perform(formdata)
assert pub.loggederror_class.count() == 1
logged_error = pub.loggederror_class.select()[0]
assert (
logged_error.summary
== 'Failed to set Field Block (foobar) field (bo1), error: invalid value for block'
)
formdata = formdef.data_class().get(formdata.id)
assert not formdata.data.get('bo1')
def test_set_backoffice_field_immediate_use(http_requests, pub):
Workflow.wipe()
FormDef.wipe()
wf = Workflow(name='xxx')
wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf)
wf.backoffice_fields_formdef.fields = [
StringField(id='bo1', label='1st backoffice field', varname='backoffice_blah'),
StringField(id='bo2', label='2nd backoffice field', varname='backoffice_barr'),
]
st1 = wf.add_status('Status1')
wf.store()
formdef = FormDef()
formdef.name = 'baz'
formdef.fields = [
StringField(id='00', label='String', varname='string'),
]
formdef.workflow_id = wf.id
formdef.store()
formdata = formdef.data_class()()
formdata.data = {'00': 'HELLO'}
formdata.just_created()
formdata.store()
item = SetBackofficeFieldsWorkflowStatusItem()
item.parent = st1
item.fields = [
{'field_id': 'bo1', 'value': '{{form_var_string}}'},
]
pub.substitutions.reset()
pub.substitutions.feed(formdata)
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data.get('bo1') == 'HELLO'
item.fields = [
{'field_id': 'bo1', 'value': 'WORLD'},
]
pub.substitutions.reset()
pub.substitutions.feed(formdata)
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data.get('bo1') == 'WORLD'
item.fields = [
{'field_id': 'bo1', 'value': 'X{{form_var_string}}X'},
{'field_id': 'bo2', 'value': 'Y{{form_var_backoffice_blah}}Y'},
]
pub.substitutions.reset()
pub.substitutions.feed(formdata)
item.perform(formdata)
formdata = formdef.data_class().get(formdata.id)
assert formdata.data.get('bo1') == 'XHELLOX'
assert formdata.data.get('bo2') == 'YXHELLOXY'