0002-misc-split-form-pages-tests-block.patch
tests/form_pages/test_all.py | ||
---|---|---|
1 | 1 |
# -*- coding: utf-8 -*- |
2 | 2 | |
3 |
import datetime |
|
4 | 3 |
import json |
5 | 4 |
import pytest |
6 | 5 |
import hashlib |
... | ... | |
19 | 18 |
except ImportError: |
20 | 19 |
Image = None |
21 | 20 | |
22 |
from django.utils import six |
|
23 | 21 |
from django.utils.six import StringIO, BytesIO |
24 | 22 |
from django.utils.six.moves.urllib import parse as urlparse |
25 | 23 | |
... | ... | |
30 | 28 |
from wcs.qommon.emails import docutils |
31 | 29 |
from wcs.qommon.form import UploadedFile |
32 | 30 |
from wcs.qommon.ident.password_accounts import PasswordAccount |
33 |
from wcs.blocks import BlockDef |
|
34 | 31 |
from wcs.carddef import CardDef |
35 | 32 |
from wcs.formdef import FormDef |
36 |
from wcs.workflows import (Workflow, EditableWorkflowStatusItem,
|
|
37 |
DisplayMessageWorkflowStatusItem, WorkflowBackofficeFieldsFormDef,
|
|
38 |
ChoiceWorkflowStatusItem, JumpOnSubmitWorkflowStatusItem,
|
|
39 |
SendmailWorkflowStatusItem, CommentableWorkflowStatusItem,
|
|
40 |
WorkflowVariablesFieldsFormDef)
|
|
33 |
from wcs.workflows import ( |
|
34 |
Workflow, EditableWorkflowStatusItem,
|
|
35 |
DisplayMessageWorkflowStatusItem, WorkflowBackofficeFieldsFormDef,
|
|
36 |
ChoiceWorkflowStatusItem, JumpOnSubmitWorkflowStatusItem,
|
|
37 |
CommentableWorkflowStatusItem, WorkflowVariablesFieldsFormDef)
|
|
41 | 38 |
from wcs.wf.backoffice_fields import SetBackofficeFieldsWorkflowStatusItem |
42 | 39 |
from wcs.wf.export_to_model import ExportToModel, transform_to_pdf |
43 | 40 |
from wcs.wf.jump import JumpWorkflowStatusItem |
... | ... | |
8760 | 8757 |
'1_structured': {'id': '1', 'text': 'un', 'more': 'foo'}, |
8761 | 8758 |
} |
8762 | 8759 |
assert '2020-04-18' in formdata.evolution[0].parts[0].content |
8763 | ||
8764 | ||
8765 |
def test_block_simple(pub, blocks_feature): |
|
8766 |
create_user(pub) |
|
8767 |
FormDef.wipe() |
|
8768 |
BlockDef.wipe() |
|
8769 | ||
8770 |
block = BlockDef() |
|
8771 |
block.name = 'foobar' |
|
8772 |
block.fields = [ |
|
8773 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
8774 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
8775 |
] |
|
8776 |
block.store() |
|
8777 | ||
8778 |
formdef = FormDef() |
|
8779 |
formdef.name = 'form title' |
|
8780 |
formdef.fields = [ |
|
8781 |
fields.BlockField(id='1', label='test', type='block:foobar', hint='hintblock'), |
|
8782 |
] |
|
8783 |
formdef.store() |
|
8784 | ||
8785 |
app = get_app(pub) |
|
8786 |
resp = app.get(formdef.get_url()) |
|
8787 |
assert resp.text.count('>hintblock<') == 1 |
|
8788 |
resp.form['f1$element0$f123'] = 'foo' |
|
8789 |
resp.form['f1$element0$f234'] = 'bar' |
|
8790 |
resp = resp.form.submit('submit') # -> validation page |
|
8791 |
assert resp.form['f1$element0$f123'].attrs['readonly'] |
|
8792 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
8793 |
assert resp.form['f1$element0$f234'].attrs['readonly'] |
|
8794 |
assert resp.form['f1$element0$f234'].value == 'bar' |
|
8795 |
resp = resp.form.submit('submit') # -> end page |
|
8796 |
resp = resp.follow() |
|
8797 |
assert '>foo<' in resp |
|
8798 |
assert '>bar<' in resp |
|
8799 | ||
8800 | ||
8801 |
def test_block_required(pub, blocks_feature): |
|
8802 |
create_user(pub) |
|
8803 |
FormDef.wipe() |
|
8804 |
BlockDef.wipe() |
|
8805 | ||
8806 |
block = BlockDef() |
|
8807 |
block.name = 'foobar' |
|
8808 |
block.fields = [ |
|
8809 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
8810 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
8811 |
] |
|
8812 |
block.store() |
|
8813 | ||
8814 |
formdef = FormDef() |
|
8815 |
formdef.name = 'form title' |
|
8816 |
formdef.fields = [ |
|
8817 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
8818 |
] |
|
8819 |
formdef.store() |
|
8820 | ||
8821 |
app = get_app(pub) |
|
8822 |
resp = app.get(formdef.get_url()) |
|
8823 |
resp = resp.form.submit('submit') # -> error page |
|
8824 |
assert 'There were errors processing the form' in resp |
|
8825 |
assert resp.text.count('required field') == 1 |
|
8826 |
resp.form['f1$element0$f123'] = 'foo' |
|
8827 |
resp.form['f1$element0$f234'] = 'bar' |
|
8828 |
resp = resp.form.submit('submit') # -> validation page |
|
8829 |
assert 'Check values then click submit.' in resp.text |
|
8830 | ||
8831 |
resp = app.get(formdef.get_url()) |
|
8832 |
resp.form['f1$element0$f123'] = 'foo' |
|
8833 |
resp = resp.form.submit('submit') # -> error page |
|
8834 |
assert 'There were errors processing the form' in resp |
|
8835 |
assert resp.text.count('required field') == 1 |
|
8836 |
resp.form['f1$element0$f234'] = 'bar' |
|
8837 |
resp = resp.form.submit('submit') # -> validation page |
|
8838 |
assert 'Check values then click submit.' in resp.text |
|
8839 | ||
8840 |
# only one required |
|
8841 |
block.fields = [ |
|
8842 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
8843 |
fields.StringField(id='234', required=False, label='Test2', type='string'), |
|
8844 |
] |
|
8845 |
block.store() |
|
8846 | ||
8847 |
resp = app.get(formdef.get_url()) |
|
8848 |
resp.form['f1$element0$f123'] = 'foo' |
|
8849 |
resp = resp.form.submit('submit') # -> validation page |
|
8850 |
assert 'Check values then click submit.' in resp.text |
|
8851 | ||
8852 |
# none required, but globally required |
|
8853 |
block.fields = [ |
|
8854 |
fields.StringField(id='123', required=False, label='Test', type='string'), |
|
8855 |
fields.StringField(id='234', required=False, label='Test2', type='string'), |
|
8856 |
] |
|
8857 |
block.store() |
|
8858 | ||
8859 |
resp = app.get(formdef.get_url()) |
|
8860 |
resp = resp.form.submit('submit') # -> error page |
|
8861 |
assert 'There were errors processing the form' in resp |
|
8862 |
assert resp.text.count('required field') == 1 |
|
8863 |
resp.form['f1$element0$f234'] = 'bar' |
|
8864 |
resp = resp.form.submit('submit') # -> validation page |
|
8865 |
assert 'Check values then click submit.' in resp.text |
|
8866 | ||
8867 | ||
8868 |
def test_block_date(pub, blocks_feature): |
|
8869 |
create_user(pub) |
|
8870 |
FormDef.wipe() |
|
8871 |
BlockDef.wipe() |
|
8872 | ||
8873 |
block = BlockDef() |
|
8874 |
block.name = 'foobar' |
|
8875 |
block.fields = [ |
|
8876 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
8877 |
fields.DateField(id='234', required=True, label='Test2', type='date'), |
|
8878 |
] |
|
8879 |
block.store() |
|
8880 | ||
8881 |
formdef = FormDef() |
|
8882 |
formdef.name = 'form title' |
|
8883 |
formdef.fields = [ |
|
8884 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
8885 |
] |
|
8886 |
formdef.store() |
|
8887 | ||
8888 |
app = get_app(pub) |
|
8889 |
resp = app.get(formdef.get_url()) |
|
8890 |
resp.form['f1$element0$f123'] = 'foo' |
|
8891 |
resp.form['f1$element0$f234'] = '2020-06-16' |
|
8892 |
resp = resp.form.submit('submit') # -> validation page |
|
8893 |
assert 'Check values then click submit.' in resp.text |
|
8894 |
resp = resp.form.submit('submit') # -> submit |
|
8895 |
resp = resp.follow() |
|
8896 |
assert '>2020-06-16<' in resp |
|
8897 | ||
8898 | ||
8899 |
def test_block_bool(pub, blocks_feature): |
|
8900 |
create_user(pub) |
|
8901 |
FormDef.wipe() |
|
8902 |
BlockDef.wipe() |
|
8903 | ||
8904 |
block = BlockDef() |
|
8905 |
block.name = 'foobar' |
|
8906 |
block.fields = [ |
|
8907 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
8908 |
fields.BoolField(id='234', required=False, label='Test2', type='bool'), |
|
8909 |
] |
|
8910 |
block.store() |
|
8911 | ||
8912 |
formdef = FormDef() |
|
8913 |
formdef.name = 'form title' |
|
8914 |
formdef.fields = [ |
|
8915 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
8916 |
] |
|
8917 |
formdef.store() |
|
8918 | ||
8919 |
for value in (True, False): |
|
8920 |
app = get_app(pub) |
|
8921 |
resp = app.get(formdef.get_url()) |
|
8922 |
resp.form['f1$element0$f123'] = 'foo' |
|
8923 |
resp.form['f1$element0$f234'].checked = value |
|
8924 |
resp = resp.form.submit('submit') # -> validation page |
|
8925 |
assert resp.form['f1$element0$f234disabled'].checked is value |
|
8926 |
assert resp.form['f1$element0$f234'].value == str(value) |
|
8927 |
assert 'Check values then click submit.' in resp |
|
8928 |
resp = resp.form.submit('submit') # -> submit |
|
8929 |
resp = resp.follow() |
|
8930 |
if value: |
|
8931 |
assert '<div class="value">Yes</div>' in resp |
|
8932 |
else: |
|
8933 |
assert '<div class="value">No</div>' in resp |
|
8934 | ||
8935 | ||
8936 |
def test_block_autocomplete_list(pub, blocks_feature): |
|
8937 |
create_user(pub) |
|
8938 |
FormDef.wipe() |
|
8939 |
BlockDef.wipe() |
|
8940 | ||
8941 |
block = BlockDef() |
|
8942 |
block.name = 'foobar' |
|
8943 |
block.fields = [ |
|
8944 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
8945 |
fields.ItemField(id='234', required=True, label='Test2', type='item', |
|
8946 |
display_mode='autocomplete', items=['Foo', 'Bar']), |
|
8947 |
] |
|
8948 |
block.store() |
|
8949 | ||
8950 |
formdef = FormDef() |
|
8951 |
formdef.name = 'form title' |
|
8952 |
formdef.fields = [ |
|
8953 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
8954 |
] |
|
8955 |
formdef.store() |
|
8956 | ||
8957 |
app = get_app(pub) |
|
8958 |
resp = app.get(formdef.get_url()) |
|
8959 |
resp.form['f1$element0$f123'] = 'foo' |
|
8960 |
resp.form['f1$element0$f234'] = 'Bar' |
|
8961 |
resp = resp.form.submit('submit') # -> validation page |
|
8962 |
assert 'Check values then click submit.' in resp.text |
|
8963 |
resp = resp.form.submit('submit') # -> submit |
|
8964 |
resp = resp.follow() |
|
8965 |
assert '>Bar<' in resp |
|
8966 | ||
8967 | ||
8968 |
def test_block_geoloc_prefill(pub, blocks_feature): |
|
8969 |
create_user(pub) |
|
8970 |
FormDef.wipe() |
|
8971 |
BlockDef.wipe() |
|
8972 | ||
8973 |
block = BlockDef() |
|
8974 |
block.name = 'foobar' |
|
8975 |
block.fields = [ |
|
8976 |
fields.StringField(id='123', required=True, label='Test', type='string', |
|
8977 |
prefill={'type': 'geolocation', 'value': 'road'}), |
|
8978 |
] |
|
8979 |
block.store() |
|
8980 | ||
8981 |
formdef = FormDef() |
|
8982 |
formdef.name = 'form title' |
|
8983 |
formdef.fields = [ |
|
8984 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
8985 |
] |
|
8986 |
formdef.store() |
|
8987 | ||
8988 |
app = get_app(pub) |
|
8989 |
resp = app.get(formdef.get_url()) |
|
8990 |
assert 'qommon.geolocation.js' in resp |
|
8991 |
assert resp.html.find('div', {'data-geolocation': 'road'}) |
|
8992 | ||
8993 | ||
8994 |
def test_block_string_prefill(pub, blocks_feature): |
|
8995 |
create_user(pub) |
|
8996 |
FormDef.wipe() |
|
8997 |
BlockDef.wipe() |
|
8998 | ||
8999 |
block = BlockDef() |
|
9000 |
block.name = 'foobar' |
|
9001 |
block.fields = [ |
|
9002 |
fields.StringField(id='123', required=True, label='Test', type='string', |
|
9003 |
prefill={'type': 'string', 'value': '{{ form_var_foo }} World'}), |
|
9004 |
] |
|
9005 |
block.store() |
|
9006 | ||
9007 |
formdef = FormDef() |
|
9008 |
formdef.name = 'form title' |
|
9009 |
formdef.fields = [ |
|
9010 |
fields.PageField(id='0', label='1st page', type='page'), |
|
9011 |
fields.StringField(id='1', label='string', varname='foo'), |
|
9012 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
9013 |
fields.BlockField(id='3', label='test', type='block:foobar'), |
|
9014 |
] |
|
9015 |
formdef.store() |
|
9016 |
formdef.data_class().wipe() |
|
9017 | ||
9018 |
app = get_app(pub) |
|
9019 |
resp = app.get(formdef.get_url()) |
|
9020 |
resp.form['f1'] = 'Hello' |
|
9021 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9022 |
assert resp.form['f3$element0$f123'].value == 'Hello World' |
|
9023 |
resp = resp.form.submit('submit') # -> validation page |
|
9024 |
resp = resp.form.submit('submit') # -> end page |
|
9025 |
resp = resp.follow() |
|
9026 | ||
9027 |
formdata = formdef.data_class().select()[0] |
|
9028 |
assert formdata.data['3']['data'][0]['123'] == 'Hello World' |
|
9029 | ||
9030 |
# check unmodified prefilled field |
|
9031 |
app = get_app(pub) |
|
9032 |
resp = app.get(formdef.get_url()) |
|
9033 |
resp.form['f1'] = 'Hello' |
|
9034 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9035 |
assert resp.form['f3$element0$f123'].value == 'Hello World' |
|
9036 |
resp = resp.form.submit('submit') # -> validation page |
|
9037 |
resp = resp.form.submit('previous') # -> 2nd page |
|
9038 |
resp = resp.form.submit('previous') # -> 1st page |
|
9039 |
resp.form['f1'] = 'Test' |
|
9040 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9041 |
assert resp.form['f3$element0$f123'].value == 'Test World' |
|
9042 | ||
9043 |
# check modified prefilled field |
|
9044 |
app = get_app(pub) |
|
9045 |
resp = app.get(formdef.get_url()) |
|
9046 |
resp.form['f1'] = 'Hello' |
|
9047 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9048 |
assert resp.form['f3$element0$f123'].value == 'Hello World' |
|
9049 |
resp.form['f3$element0$f123'] = 'Foobar' |
|
9050 |
resp = resp.form.submit('submit') # -> validation page |
|
9051 |
resp = resp.form.submit('previous') # -> 2nd page |
|
9052 |
resp = resp.form.submit('previous') # -> 1st page |
|
9053 |
resp.form['f1'] = 'Test' |
|
9054 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9055 |
assert resp.form['f3$element0$f123'].value == 'Foobar' |
|
9056 | ||
9057 | ||
9058 |
def test_block_locked_prefill(pub, blocks_feature): |
|
9059 |
create_user(pub) |
|
9060 |
FormDef.wipe() |
|
9061 |
BlockDef.wipe() |
|
9062 | ||
9063 |
block = BlockDef() |
|
9064 |
block.name = 'foobar' |
|
9065 |
block.fields = [ |
|
9066 |
fields.StringField(id='123', required=True, label='Test', type='string', |
|
9067 |
prefill={'type': 'string', 'value': '{{ form_var_foo }} World', 'locked': True}), |
|
9068 |
] |
|
9069 |
block.store() |
|
9070 | ||
9071 |
formdef = FormDef() |
|
9072 |
formdef.name = 'form title' |
|
9073 |
formdef.fields = [ |
|
9074 |
fields.PageField(id='0', label='1st page', type='page'), |
|
9075 |
fields.StringField(id='1', label='string', varname='foo'), |
|
9076 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
9077 |
fields.BlockField(id='3', label='test', type='block:foobar'), |
|
9078 |
] |
|
9079 |
formdef.store() |
|
9080 |
formdef.data_class().wipe() |
|
9081 | ||
9082 |
app = get_app(pub) |
|
9083 |
resp = app.get(formdef.get_url()) |
|
9084 |
resp.form['f1'] = 'Hello' |
|
9085 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9086 |
assert resp.form['f3$element0$f123'].value == 'Hello World' |
|
9087 |
assert 'readonly' in resp.form['f3$element0$f123'].attrs |
|
9088 |
resp.form['f3$element0$f123'].value = 'Hello' # try changing the value |
|
9089 |
resp = resp.form.submit('submit') # -> validation page |
|
9090 |
resp = resp.form.submit('submit') # -> end page |
|
9091 |
resp = resp.follow() |
|
9092 | ||
9093 |
formdata = formdef.data_class().select()[0] |
|
9094 |
assert formdata.data['3']['data'][0]['123'] == 'Hello World' # value got reverted |
|
9095 | ||
9096 | ||
9097 |
def test_workflow_form_block_prefill(pub): |
|
9098 |
create_user(pub) |
|
9099 |
FormDef.wipe() |
|
9100 |
BlockDef.wipe() |
|
9101 | ||
9102 |
block = BlockDef() |
|
9103 |
block.name = 'foobar' |
|
9104 |
block.fields = [ |
|
9105 |
fields.StringField(id='123', required=True, label='Test', type='string', |
|
9106 |
prefill={'type': 'user', 'value': 'email'}), |
|
9107 |
] |
|
9108 |
block.store() |
|
9109 | ||
9110 |
wf = Workflow(name='status') |
|
9111 |
st1 = wf.add_status('Status1', 'st1') |
|
9112 | ||
9113 |
display_form = FormWorkflowStatusItem() |
|
9114 |
display_form.id = '_x' |
|
9115 |
display_form.by = ['_submitter'] |
|
9116 |
display_form.varname = 'xxx' |
|
9117 |
display_form.formdef = WorkflowFormFieldsFormDef(item=display_form) |
|
9118 |
display_form.formdef.fields.append( |
|
9119 |
fields.BlockField(id='3', label='test', type='block:foobar') |
|
9120 |
) |
|
9121 |
st1.items.append(display_form) |
|
9122 |
display_form.parent = st1 |
|
9123 | ||
9124 |
wf.store() |
|
9125 | ||
9126 |
formdef = create_formdef() |
|
9127 |
formdef.workflow_id = wf.id |
|
9128 |
formdef.fields = [] |
|
9129 |
formdef.store() |
|
9130 |
formdef.data_class().wipe() |
|
9131 | ||
9132 |
resp = login(get_app(pub), username='foo', password='foo').get('/test/') |
|
9133 |
resp = resp.form.submit('submit') # -> validation |
|
9134 |
resp = resp.form.submit('submit').follow() |
|
9135 |
assert 'The form has been recorded' in resp |
|
9136 |
assert resp.form['f3$element0$f123'].value == 'foo@localhost' |
|
9137 | ||
9138 | ||
9139 |
def test_block_title_and_comment(pub, blocks_feature): |
|
9140 |
create_user(pub) |
|
9141 |
FormDef.wipe() |
|
9142 |
BlockDef.wipe() |
|
9143 | ||
9144 |
block = BlockDef() |
|
9145 |
block.name = 'foobar' |
|
9146 |
block.fields = [ |
|
9147 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
9148 |
fields.TitleField(id='234', label='Blah', type='title'), |
|
9149 |
fields.CommentField(id='345', label='Blah', type='comment'), |
|
9150 |
] |
|
9151 |
block.store() |
|
9152 | ||
9153 |
formdef = FormDef() |
|
9154 |
formdef.name = 'form title' |
|
9155 |
formdef.fields = [ |
|
9156 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
9157 |
] |
|
9158 |
formdef.store() |
|
9159 | ||
9160 |
app = get_app(pub) |
|
9161 |
resp = app.get(formdef.get_url()) |
|
9162 |
resp.form['f1$element0$f123'] = 'foo' |
|
9163 |
resp = resp.form.submit('submit') # -> validation page |
|
9164 |
assert 'Check values then click submit.' in resp.text |
|
9165 |
resp = resp.form.submit('submit') # -> submit |
|
9166 |
resp = resp.follow() |
|
9167 | ||
9168 | ||
9169 |
def test_block_multipage(pub, blocks_feature): |
|
9170 |
create_user(pub) |
|
9171 |
FormDef.wipe() |
|
9172 |
BlockDef.wipe() |
|
9173 | ||
9174 |
block = BlockDef() |
|
9175 |
block.name = 'foobar' |
|
9176 |
block.fields = [ |
|
9177 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
9178 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
9179 |
] |
|
9180 |
block.store() |
|
9181 | ||
9182 |
formdef = FormDef() |
|
9183 |
formdef.name = 'form title' |
|
9184 |
formdef.fields = [ |
|
9185 |
fields.PageField(id='0', label='1st page', type='page'), |
|
9186 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
9187 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
9188 |
] |
|
9189 |
formdef.store() |
|
9190 | ||
9191 |
app = get_app(pub) |
|
9192 |
resp = app.get(formdef.get_url()) |
|
9193 |
resp.form['f1$element0$f123'] = 'foo' |
|
9194 |
resp.form['f1$element0$f234'] = 'bar' |
|
9195 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9196 |
resp = resp.form.submit('submit') # -> validation page |
|
9197 |
assert resp.form['f1$element0$f123'].attrs['readonly'] |
|
9198 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
9199 |
resp = resp.form.submit('previous') # -> 2nd page |
|
9200 |
resp = resp.form.submit('previous') # -> 1st page |
|
9201 |
assert 'readonly' not in resp.form['f1$element0$f123'].attrs |
|
9202 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
9203 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9204 |
resp = resp.form.submit('submit') # -> validation page |
|
9205 |
resp = resp.form.submit('submit') # -> submit |
|
9206 |
resp = resp.follow() |
|
9207 |
assert '>foo<' in resp |
|
9208 |
assert '>bar<' in resp |
|
9209 | ||
9210 | ||
9211 |
def test_block_repeated(pub, blocks_feature): |
|
9212 |
create_user(pub) |
|
9213 |
FormDef.wipe() |
|
9214 |
BlockDef.wipe() |
|
9215 | ||
9216 |
block = BlockDef() |
|
9217 |
block.name = 'foobar' |
|
9218 |
block.fields = [ |
|
9219 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
9220 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
9221 |
] |
|
9222 |
block.store() |
|
9223 | ||
9224 |
formdef = FormDef() |
|
9225 |
formdef.name = 'form title' |
|
9226 |
formdef.fields = [ |
|
9227 |
fields.PageField(id='0', label='1st page', type='page'), |
|
9228 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3, hint='hintblock'), |
|
9229 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
9230 |
] |
|
9231 |
formdef.store() |
|
9232 | ||
9233 |
app = get_app(pub) |
|
9234 |
resp = app.get(formdef.get_url()) |
|
9235 |
assert resp.text.count('>Test<') == 1 |
|
9236 |
assert resp.text.count('>hintblock<') == 1 |
|
9237 |
assert 'Add another' in resp |
|
9238 |
assert resp.html.find('div', {'class': 'list-add'}) |
|
9239 |
resp = resp.form.submit('f1$add_element') |
|
9240 |
assert resp.text.count('>Test<') == 2 |
|
9241 |
assert resp.text.count('>hintblock<') == 1 |
|
9242 |
resp = resp.form.submit('f1$add_element') |
|
9243 |
assert resp.text.count('>Test<') == 3 |
|
9244 |
assert resp.text.count('>hintblock<') == 1 |
|
9245 |
assert 'Add another' not in resp |
|
9246 | ||
9247 |
# fill items (1st and 3rd row) |
|
9248 |
resp.form['f1$element0$f123'] = 'foo' |
|
9249 |
resp.form['f1$element0$f234'] = 'bar' |
|
9250 |
resp.form['f1$element2$f123'] = 'foo2' |
|
9251 |
resp.form['f1$element2$f234'] = 'bar2' |
|
9252 | ||
9253 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9254 |
resp = resp.form.submit('submit') # -> validation page |
|
9255 |
assert 'Check values then click submit.' in resp.text |
|
9256 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
9257 |
assert resp.form['f1$element0$f234'].value == 'bar' |
|
9258 |
assert resp.form['f1$element1$f123'].value == 'foo2' |
|
9259 |
assert resp.form['f1$element1$f234'].value == 'bar2' |
|
9260 | ||
9261 |
resp = resp.form.submit('previous') # -> 2nd page |
|
9262 |
resp = resp.form.submit('previous') # -> 1st page |
|
9263 |
assert 'readonly' not in resp.form['f1$element0$f123'].attrs |
|
9264 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
9265 | ||
9266 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9267 |
resp = resp.form.submit('submit') # -> validation page |
|
9268 |
resp = resp.form.submit('submit') # -> submit |
|
9269 |
resp = resp.follow() |
|
9270 |
assert '>foo<' in resp |
|
9271 |
assert '>bar<' in resp |
|
9272 |
assert '>foo2<' in resp |
|
9273 |
assert '>bar2<' in resp |
|
9274 | ||
9275 | ||
9276 |
def test_block_repeated_over_limit(pub, blocks_feature): |
|
9277 |
create_user(pub) |
|
9278 |
FormDef.wipe() |
|
9279 |
BlockDef.wipe() |
|
9280 | ||
9281 |
block = BlockDef() |
|
9282 |
block.name = 'foobar' |
|
9283 |
block.fields = [ |
|
9284 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
9285 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
9286 |
] |
|
9287 |
block.store() |
|
9288 | ||
9289 |
formdef = FormDef() |
|
9290 |
formdef.name = 'form title' |
|
9291 |
formdef.fields = [ |
|
9292 |
fields.PageField(id='0', label='1st page', type='page'), |
|
9293 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3), |
|
9294 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
9295 |
] |
|
9296 |
formdef.store() |
|
9297 | ||
9298 |
app = get_app(pub) |
|
9299 |
resp = app.get(formdef.get_url()) |
|
9300 |
assert resp.text.count('>Test<') == 1 |
|
9301 |
assert 'Add another' in resp |
|
9302 |
resp = resp.form.submit('f1$add_element') |
|
9303 |
assert resp.text.count('>Test<') == 2 |
|
9304 |
resp = resp.form.submit('f1$add_element') |
|
9305 |
assert resp.text.count('>Test<') == 3 |
|
9306 |
assert 'Add another' not in resp |
|
9307 | ||
9308 |
# fill items |
|
9309 |
resp.form['f1$element0$f123'] = 'foo' |
|
9310 |
resp.form['f1$element0$f234'] = 'bar' |
|
9311 |
resp.form['f1$element1$f123'] = 'foo1' |
|
9312 |
resp.form['f1$element1$f234'] = 'bar1' |
|
9313 |
resp.form['f1$element2$f123'] = 'foo2' |
|
9314 |
resp.form['f1$element2$f234'] = 'bar2' |
|
9315 | ||
9316 |
# (modify formdef to only allow 2) |
|
9317 |
formdef.fields[1].max_items = 2 |
|
9318 |
formdef.store() |
|
9319 | ||
9320 |
# submit form |
|
9321 |
resp = resp.form.submit('submit') |
|
9322 |
assert 'Too many elements (maximum: 2)' in resp |
|
9323 | ||
9324 | ||
9325 |
def test_block_repeated_files(pub, blocks_feature): |
|
9326 |
create_user(pub) |
|
9327 |
FormDef.wipe() |
|
9328 |
BlockDef.wipe() |
|
9329 | ||
9330 |
block = BlockDef() |
|
9331 |
block.name = 'foobar' |
|
9332 |
block.fields = [ |
|
9333 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
9334 |
fields.FileField(id='234', required=True, label='Test2', type='file'), |
|
9335 |
] |
|
9336 |
block.store() |
|
9337 | ||
9338 |
formdef = FormDef() |
|
9339 |
formdef.name = 'form title' |
|
9340 |
formdef.fields = [ |
|
9341 |
fields.PageField(id='0', label='1st page', type='page'), |
|
9342 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3), |
|
9343 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
9344 |
] |
|
9345 |
formdef.store() |
|
9346 | ||
9347 |
app = get_app(pub) |
|
9348 |
resp = app.get(formdef.get_url()) |
|
9349 |
assert resp.text.count('>Test<') == 1 |
|
9350 |
assert 'Add another' in resp |
|
9351 |
resp = resp.form.submit('f1$add_element') |
|
9352 |
assert resp.text.count('>Test<') == 2 |
|
9353 |
resp = resp.form.submit('f1$add_element') |
|
9354 |
assert resp.text.count('>Test<') == 3 |
|
9355 |
assert 'Add another' not in resp |
|
9356 | ||
9357 |
# fill items (1st and 3rd row) |
|
9358 |
resp.form['f1$element0$f123'] = 'foo' |
|
9359 |
resp.form['f1$element0$f234$file'] = Upload('test1.txt', b'foobar1', 'text/plain') |
|
9360 |
resp.form['f1$element2$f123'] = 'foo2' |
|
9361 |
resp.form['f1$element2$f234$file'] = Upload('test2.txt', b'foobar2', 'text/plain') |
|
9362 | ||
9363 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9364 |
resp = resp.form.submit('submit') # -> validation page |
|
9365 |
assert 'Check values then click submit.' in resp.text |
|
9366 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
9367 |
assert 'test1.txt' in resp |
|
9368 |
assert resp.form['f1$element1$f123'].value == 'foo2' |
|
9369 |
assert 'test2.txt' in resp |
|
9370 | ||
9371 |
resp = resp.form.submit('previous') # -> 2nd page |
|
9372 |
resp = resp.form.submit('previous') # -> 1st page |
|
9373 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9374 |
resp = resp.form.submit('submit') # -> validation page |
|
9375 |
resp = resp.form.submit('submit') # -> submit |
|
9376 |
resp = resp.follow() |
|
9377 |
assert '>foo<' in resp |
|
9378 |
assert 'test1.txt' in resp |
|
9379 |
assert '>foo2<' in resp |
|
9380 |
assert 'test2.txt' in resp |
|
9381 | ||
9382 | ||
9383 |
def test_block_digest(pub, blocks_feature): |
|
9384 |
create_user(pub) |
|
9385 |
FormDef.wipe() |
|
9386 |
BlockDef.wipe() |
|
9387 | ||
9388 |
block = BlockDef() |
|
9389 |
block.name = 'foobar' |
|
9390 |
block.fields = [ |
|
9391 |
fields.StringField(id='123', required=True, label='Test', |
|
9392 |
type='string', varname='foo'), |
|
9393 |
fields.StringField(id='234', required=True, label='Test2', |
|
9394 |
type='string', varname='bar'), |
|
9395 |
] |
|
9396 |
block.store() |
|
9397 | ||
9398 |
formdef = FormDef() |
|
9399 |
formdef.name = 'form title' |
|
9400 |
formdef.fields = [ |
|
9401 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3), |
|
9402 |
] |
|
9403 |
formdef.store() |
|
9404 | ||
9405 |
app = get_app(pub) |
|
9406 |
resp = app.get(formdef.get_url()) |
|
9407 |
resp.form['f1$element0$f123'] = 'foo' |
|
9408 |
resp.form['f1$element0$f234'] = 'bar' |
|
9409 |
resp = resp.form.submit('f1$add_element') |
|
9410 |
resp.form['f1$element1$f123'] = 'foo2' |
|
9411 |
resp.form['f1$element1$f234'] = 'bar2' |
|
9412 | ||
9413 |
resp = resp.form.submit('submit') # -> validation page |
|
9414 |
resp = resp.form.submit('submit') # -> submit |
|
9415 | ||
9416 |
assert formdef.data_class().select()[0].data['1']['data'] == [ |
|
9417 |
{'123': 'foo', '234': 'bar'}, {'123': 'foo2', '234': 'bar2'}] |
|
9418 |
# by default it gets the type of object |
|
9419 |
assert formdef.data_class().select()[0].data['1_display'] == 'foobar, foobar' |
|
9420 | ||
9421 |
# set a digest template |
|
9422 |
formdef.data_class().wipe() |
|
9423 | ||
9424 |
block.digest_template = 'X{{foobar_var_foo}}Y' |
|
9425 |
block.store() |
|
9426 | ||
9427 |
resp = app.get(formdef.get_url()) |
|
9428 |
resp.form['f1$element0$f123'] = 'foo' |
|
9429 |
resp.form['f1$element0$f234'] = 'bar' |
|
9430 |
resp = resp.form.submit('f1$add_element') |
|
9431 |
resp.form['f1$element1$f123'] = 'foo2' |
|
9432 |
resp.form['f1$element1$f234'] = 'bar2' |
|
9433 | ||
9434 |
resp = resp.form.submit('submit') # -> validation page |
|
9435 |
resp = resp.form.submit('submit') # -> submit |
|
9436 |
assert formdef.data_class().select()[0].data['1']['data'] == [ |
|
9437 |
{'123': 'foo', '234': 'bar'}, {'123': 'foo2', '234': 'bar2'}] |
|
9438 |
assert formdef.data_class().select()[0].data['1_display'] == 'XfooY, Xfoo2Y' |
|
9439 | ||
9440 | ||
9441 |
def test_block_digest_item(pub, blocks_feature): |
|
9442 |
create_user(pub) |
|
9443 |
FormDef.wipe() |
|
9444 |
BlockDef.wipe() |
|
9445 |
NamedDataSource.wipe() |
|
9446 | ||
9447 |
# add a named data source |
|
9448 |
data_source = NamedDataSource(name='foobar') |
|
9449 |
data_source.data_source = { |
|
9450 |
'type': 'formula', |
|
9451 |
'value': repr([{'id': '1', 'text': 'un'}, |
|
9452 |
{'id': '2', 'text': 'deux'}])} |
|
9453 |
data_source.store() |
|
9454 | ||
9455 |
block = BlockDef() |
|
9456 |
block.name = 'foobar' |
|
9457 |
block.fields = [ |
|
9458 |
fields.StringField(id='123', required=True, label='Test', |
|
9459 |
type='string', varname='foo'), |
|
9460 |
fields.ItemField(id='234', required=True, label='Test2', |
|
9461 |
type='item', varname='bar', data_source={'type': 'foobar'}), |
|
9462 |
] |
|
9463 |
block.store() |
|
9464 | ||
9465 |
formdef = FormDef() |
|
9466 |
formdef.name = 'form title' |
|
9467 |
formdef.fields = [ |
|
9468 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3), |
|
9469 |
] |
|
9470 |
formdef.store() |
|
9471 | ||
9472 |
app = get_app(pub) |
|
9473 |
resp = app.get(formdef.get_url()) |
|
9474 |
resp.form['f1$element0$f123'] = 'foo' |
|
9475 |
resp.form['f1$element0$f234'] = '1' |
|
9476 |
resp = resp.form.submit('f1$add_element') |
|
9477 |
resp.form['f1$element1$f123'] = 'foo2' |
|
9478 |
resp.form['f1$element1$f234'] = '2' |
|
9479 | ||
9480 |
resp = resp.form.submit('submit') # -> validation page |
|
9481 |
resp = resp.form.submit('submit') # -> submit |
|
9482 | ||
9483 |
assert formdef.data_class().select()[0].data['1']['data'] == [ |
|
9484 |
{'123': 'foo', '234': '1', '234_display': 'un'}, |
|
9485 |
{'123': 'foo2', '234': '2', '234_display': 'deux'}, |
|
9486 |
] |
|
9487 |
# by default it gets the type of object |
|
9488 |
assert formdef.data_class().select()[0].data['1_display'] == 'foobar, foobar' |
|
9489 | ||
9490 |
# set a digest template |
|
9491 |
formdef.data_class().wipe() |
|
9492 | ||
9493 |
block.digest_template = 'X{{foobar_var_bar}}Y' |
|
9494 |
block.store() |
|
9495 | ||
9496 |
resp = app.get(formdef.get_url()) |
|
9497 |
resp.form['f1$element0$f123'] = 'foo' |
|
9498 |
resp.form['f1$element0$f234'] = '1' |
|
9499 |
resp = resp.form.submit('f1$add_element') |
|
9500 |
resp.form['f1$element1$f123'] = 'foo2' |
|
9501 |
resp.form['f1$element1$f234'] = '2' |
|
9502 | ||
9503 |
resp = resp.form.submit('submit') # -> validation page |
|
9504 |
resp = resp.form.submit('submit') # -> submit |
|
9505 |
assert formdef.data_class().select()[0].data['1']['data'] == [ |
|
9506 |
{'123': 'foo', '234': '1', '234_display': 'un'}, |
|
9507 |
{'123': 'foo2', '234': '2', '234_display': 'deux'}, |
|
9508 |
] |
|
9509 |
assert formdef.data_class().select()[0].data['1_display'] == 'XunY, XdeuxY' |
tests/form_pages/test_block.py | ||
---|---|---|
1 |
# -*- coding: utf-8 -*- |
|
2 | ||
3 |
import pytest |
|
4 |
from webtest import Upload |
|
5 | ||
6 |
from wcs.qommon.ident.password_accounts import PasswordAccount |
|
7 |
from wcs.blocks import BlockDef |
|
8 |
from wcs.formdef import FormDef |
|
9 |
from wcs.workflows import Workflow |
|
10 |
from wcs.wf.form import FormWorkflowStatusItem, WorkflowFormFieldsFormDef |
|
11 |
from wcs.categories import Category |
|
12 |
from wcs.data_sources import NamedDataSource |
|
13 |
from wcs import fields |
|
14 | ||
15 |
from utilities import get_app, login, create_temporary_pub, clean_temporary_pub |
|
16 | ||
17 | ||
18 |
def pytest_generate_tests(metafunc): |
|
19 |
if 'pub' in metafunc.fixturenames: |
|
20 |
metafunc.parametrize('pub', ['pickle', 'sql', 'pickle-templates', 'pickle-lazy'], indirect=True) |
|
21 | ||
22 | ||
23 |
@pytest.fixture |
|
24 |
def pub(request, emails): |
|
25 |
pub = create_temporary_pub( |
|
26 |
sql_mode=bool('sql' in request.param), |
|
27 |
templates_mode=bool('templates' in request.param), |
|
28 |
lazy_mode=bool('lazy' in request.param), |
|
29 |
) |
|
30 |
pub.cfg['identification'] = {'methods': ['password']} |
|
31 |
pub.cfg['language'] = {'language': 'en'} |
|
32 |
pub.write_cfg() |
|
33 | ||
34 |
if Category.count() == 0: |
|
35 |
cat = Category(name='foobar') |
|
36 |
cat.store() |
|
37 | ||
38 |
return pub |
|
39 | ||
40 | ||
41 |
def teardown_module(module): |
|
42 |
clean_temporary_pub() |
|
43 | ||
44 | ||
45 |
def create_user(pub): |
|
46 |
pub.user_class.wipe() |
|
47 |
PasswordAccount.wipe() |
|
48 | ||
49 |
user = pub.user_class() |
|
50 |
user.name = 'User Name' |
|
51 |
user.email = 'foo@localhost' |
|
52 |
user.store() |
|
53 |
account = PasswordAccount(id='foo') |
|
54 |
account.set_password('foo') |
|
55 |
account.user_id = user.id |
|
56 |
account.store() |
|
57 |
return user |
|
58 | ||
59 | ||
60 |
def test_block_simple(pub, blocks_feature): |
|
61 |
FormDef.wipe() |
|
62 |
BlockDef.wipe() |
|
63 | ||
64 |
block = BlockDef() |
|
65 |
block.name = 'foobar' |
|
66 |
block.fields = [ |
|
67 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
68 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
69 |
] |
|
70 |
block.store() |
|
71 | ||
72 |
formdef = FormDef() |
|
73 |
formdef.name = 'form title' |
|
74 |
formdef.fields = [ |
|
75 |
fields.BlockField(id='1', label='test', type='block:foobar', hint='hintblock'), |
|
76 |
] |
|
77 |
formdef.store() |
|
78 | ||
79 |
app = get_app(pub) |
|
80 |
resp = app.get(formdef.get_url()) |
|
81 |
assert resp.text.count('>hintblock<') == 1 |
|
82 |
resp.form['f1$element0$f123'] = 'foo' |
|
83 |
resp.form['f1$element0$f234'] = 'bar' |
|
84 |
resp = resp.form.submit('submit') # -> validation page |
|
85 |
assert resp.form['f1$element0$f123'].attrs['readonly'] |
|
86 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
87 |
assert resp.form['f1$element0$f234'].attrs['readonly'] |
|
88 |
assert resp.form['f1$element0$f234'].value == 'bar' |
|
89 |
resp = resp.form.submit('submit') # -> end page |
|
90 |
resp = resp.follow() |
|
91 |
assert '>foo<' in resp |
|
92 |
assert '>bar<' in resp |
|
93 | ||
94 | ||
95 |
def test_block_required(pub, blocks_feature): |
|
96 |
FormDef.wipe() |
|
97 |
BlockDef.wipe() |
|
98 | ||
99 |
block = BlockDef() |
|
100 |
block.name = 'foobar' |
|
101 |
block.fields = [ |
|
102 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
103 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
104 |
] |
|
105 |
block.store() |
|
106 | ||
107 |
formdef = FormDef() |
|
108 |
formdef.name = 'form title' |
|
109 |
formdef.fields = [ |
|
110 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
111 |
] |
|
112 |
formdef.store() |
|
113 | ||
114 |
app = get_app(pub) |
|
115 |
resp = app.get(formdef.get_url()) |
|
116 |
resp = resp.form.submit('submit') # -> error page |
|
117 |
assert 'There were errors processing the form' in resp |
|
118 |
assert resp.text.count('required field') == 1 |
|
119 |
resp.form['f1$element0$f123'] = 'foo' |
|
120 |
resp.form['f1$element0$f234'] = 'bar' |
|
121 |
resp = resp.form.submit('submit') # -> validation page |
|
122 |
assert 'Check values then click submit.' in resp.text |
|
123 | ||
124 |
resp = app.get(formdef.get_url()) |
|
125 |
resp.form['f1$element0$f123'] = 'foo' |
|
126 |
resp = resp.form.submit('submit') # -> error page |
|
127 |
assert 'There were errors processing the form' in resp |
|
128 |
assert resp.text.count('required field') == 1 |
|
129 |
resp.form['f1$element0$f234'] = 'bar' |
|
130 |
resp = resp.form.submit('submit') # -> validation page |
|
131 |
assert 'Check values then click submit.' in resp.text |
|
132 | ||
133 |
# only one required |
|
134 |
block.fields = [ |
|
135 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
136 |
fields.StringField(id='234', required=False, label='Test2', type='string'), |
|
137 |
] |
|
138 |
block.store() |
|
139 | ||
140 |
resp = app.get(formdef.get_url()) |
|
141 |
resp.form['f1$element0$f123'] = 'foo' |
|
142 |
resp = resp.form.submit('submit') # -> validation page |
|
143 |
assert 'Check values then click submit.' in resp.text |
|
144 | ||
145 |
# none required, but globally required |
|
146 |
block.fields = [ |
|
147 |
fields.StringField(id='123', required=False, label='Test', type='string'), |
|
148 |
fields.StringField(id='234', required=False, label='Test2', type='string'), |
|
149 |
] |
|
150 |
block.store() |
|
151 | ||
152 |
resp = app.get(formdef.get_url()) |
|
153 |
resp = resp.form.submit('submit') # -> error page |
|
154 |
assert 'There were errors processing the form' in resp |
|
155 |
assert resp.text.count('required field') == 1 |
|
156 |
resp.form['f1$element0$f234'] = 'bar' |
|
157 |
resp = resp.form.submit('submit') # -> validation page |
|
158 |
assert 'Check values then click submit.' in resp.text |
|
159 | ||
160 | ||
161 |
def test_block_date(pub, blocks_feature): |
|
162 |
FormDef.wipe() |
|
163 |
BlockDef.wipe() |
|
164 | ||
165 |
block = BlockDef() |
|
166 |
block.name = 'foobar' |
|
167 |
block.fields = [ |
|
168 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
169 |
fields.DateField(id='234', required=True, label='Test2', type='date'), |
|
170 |
] |
|
171 |
block.store() |
|
172 | ||
173 |
formdef = FormDef() |
|
174 |
formdef.name = 'form title' |
|
175 |
formdef.fields = [ |
|
176 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
177 |
] |
|
178 |
formdef.store() |
|
179 | ||
180 |
app = get_app(pub) |
|
181 |
resp = app.get(formdef.get_url()) |
|
182 |
resp.form['f1$element0$f123'] = 'foo' |
|
183 |
resp.form['f1$element0$f234'] = '2020-06-16' |
|
184 |
resp = resp.form.submit('submit') # -> validation page |
|
185 |
assert 'Check values then click submit.' in resp.text |
|
186 |
resp = resp.form.submit('submit') # -> submit |
|
187 |
resp = resp.follow() |
|
188 |
assert '>2020-06-16<' in resp |
|
189 | ||
190 | ||
191 |
def test_block_bool(pub, blocks_feature): |
|
192 |
FormDef.wipe() |
|
193 |
BlockDef.wipe() |
|
194 | ||
195 |
block = BlockDef() |
|
196 |
block.name = 'foobar' |
|
197 |
block.fields = [ |
|
198 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
199 |
fields.BoolField(id='234', required=False, label='Test2', type='bool'), |
|
200 |
] |
|
201 |
block.store() |
|
202 | ||
203 |
formdef = FormDef() |
|
204 |
formdef.name = 'form title' |
|
205 |
formdef.fields = [ |
|
206 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
207 |
] |
|
208 |
formdef.store() |
|
209 | ||
210 |
for value in (True, False): |
|
211 |
app = get_app(pub) |
|
212 |
resp = app.get(formdef.get_url()) |
|
213 |
resp.form['f1$element0$f123'] = 'foo' |
|
214 |
resp.form['f1$element0$f234'].checked = value |
|
215 |
resp = resp.form.submit('submit') # -> validation page |
|
216 |
assert resp.form['f1$element0$f234disabled'].checked is value |
|
217 |
assert resp.form['f1$element0$f234'].value == str(value) |
|
218 |
assert 'Check values then click submit.' in resp |
|
219 |
resp = resp.form.submit('submit') # -> submit |
|
220 |
resp = resp.follow() |
|
221 |
if value: |
|
222 |
assert '<div class="value">Yes</div>' in resp |
|
223 |
else: |
|
224 |
assert '<div class="value">No</div>' in resp |
|
225 | ||
226 | ||
227 |
def test_block_autocomplete_list(pub, blocks_feature): |
|
228 |
FormDef.wipe() |
|
229 |
BlockDef.wipe() |
|
230 | ||
231 |
block = BlockDef() |
|
232 |
block.name = 'foobar' |
|
233 |
block.fields = [ |
|
234 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
235 |
fields.ItemField( |
|
236 |
id='234', required=True, label='Test2', type='item', |
|
237 |
display_mode='autocomplete', items=['Foo', 'Bar']), |
|
238 |
] |
|
239 |
block.store() |
|
240 | ||
241 |
formdef = FormDef() |
|
242 |
formdef.name = 'form title' |
|
243 |
formdef.fields = [ |
|
244 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
245 |
] |
|
246 |
formdef.store() |
|
247 | ||
248 |
app = get_app(pub) |
|
249 |
resp = app.get(formdef.get_url()) |
|
250 |
resp.form['f1$element0$f123'] = 'foo' |
|
251 |
resp.form['f1$element0$f234'] = 'Bar' |
|
252 |
resp = resp.form.submit('submit') # -> validation page |
|
253 |
assert 'Check values then click submit.' in resp.text |
|
254 |
resp = resp.form.submit('submit') # -> submit |
|
255 |
resp = resp.follow() |
|
256 |
assert '>Bar<' in resp |
|
257 | ||
258 | ||
259 |
def test_block_geoloc_prefill(pub, blocks_feature): |
|
260 |
FormDef.wipe() |
|
261 |
BlockDef.wipe() |
|
262 | ||
263 |
block = BlockDef() |
|
264 |
block.name = 'foobar' |
|
265 |
block.fields = [ |
|
266 |
fields.StringField( |
|
267 |
id='123', required=True, label='Test', type='string', |
|
268 |
prefill={'type': 'geolocation', 'value': 'road'}), |
|
269 |
] |
|
270 |
block.store() |
|
271 | ||
272 |
formdef = FormDef() |
|
273 |
formdef.name = 'form title' |
|
274 |
formdef.fields = [ |
|
275 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
276 |
] |
|
277 |
formdef.store() |
|
278 | ||
279 |
app = get_app(pub) |
|
280 |
resp = app.get(formdef.get_url()) |
|
281 |
assert 'qommon.geolocation.js' in resp |
|
282 |
assert resp.html.find('div', {'data-geolocation': 'road'}) |
|
283 | ||
284 | ||
285 |
def test_block_string_prefill(pub, blocks_feature): |
|
286 |
FormDef.wipe() |
|
287 |
BlockDef.wipe() |
|
288 | ||
289 |
block = BlockDef() |
|
290 |
block.name = 'foobar' |
|
291 |
block.fields = [ |
|
292 |
fields.StringField( |
|
293 |
id='123', required=True, label='Test', type='string', |
|
294 |
prefill={'type': 'string', 'value': '{{ form_var_foo }} World'}), |
|
295 |
] |
|
296 |
block.store() |
|
297 | ||
298 |
formdef = FormDef() |
|
299 |
formdef.name = 'form title' |
|
300 |
formdef.fields = [ |
|
301 |
fields.PageField(id='0', label='1st page', type='page'), |
|
302 |
fields.StringField(id='1', label='string', varname='foo'), |
|
303 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
304 |
fields.BlockField(id='3', label='test', type='block:foobar'), |
|
305 |
] |
|
306 |
formdef.store() |
|
307 |
formdef.data_class().wipe() |
|
308 | ||
309 |
app = get_app(pub) |
|
310 |
resp = app.get(formdef.get_url()) |
|
311 |
resp.form['f1'] = 'Hello' |
|
312 |
resp = resp.form.submit('submit') # -> 2nd page |
|
313 |
assert resp.form['f3$element0$f123'].value == 'Hello World' |
|
314 |
resp = resp.form.submit('submit') # -> validation page |
|
315 |
resp = resp.form.submit('submit') # -> end page |
|
316 |
resp = resp.follow() |
|
317 | ||
318 |
formdata = formdef.data_class().select()[0] |
|
319 |
assert formdata.data['3']['data'][0]['123'] == 'Hello World' |
|
320 | ||
321 |
# check unmodified prefilled field |
|
322 |
app = get_app(pub) |
|
323 |
resp = app.get(formdef.get_url()) |
|
324 |
resp.form['f1'] = 'Hello' |
|
325 |
resp = resp.form.submit('submit') # -> 2nd page |
|
326 |
assert resp.form['f3$element0$f123'].value == 'Hello World' |
|
327 |
resp = resp.form.submit('submit') # -> validation page |
|
328 |
resp = resp.form.submit('previous') # -> 2nd page |
|
329 |
resp = resp.form.submit('previous') # -> 1st page |
|
330 |
resp.form['f1'] = 'Test' |
|
331 |
resp = resp.form.submit('submit') # -> 2nd page |
|
332 |
assert resp.form['f3$element0$f123'].value == 'Test World' |
|
333 | ||
334 |
# check modified prefilled field |
|
335 |
app = get_app(pub) |
|
336 |
resp = app.get(formdef.get_url()) |
|
337 |
resp.form['f1'] = 'Hello' |
|
338 |
resp = resp.form.submit('submit') # -> 2nd page |
|
339 |
assert resp.form['f3$element0$f123'].value == 'Hello World' |
|
340 |
resp.form['f3$element0$f123'] = 'Foobar' |
|
341 |
resp = resp.form.submit('submit') # -> validation page |
|
342 |
resp = resp.form.submit('previous') # -> 2nd page |
|
343 |
resp = resp.form.submit('previous') # -> 1st page |
|
344 |
resp.form['f1'] = 'Test' |
|
345 |
resp = resp.form.submit('submit') # -> 2nd page |
|
346 |
assert resp.form['f3$element0$f123'].value == 'Foobar' |
|
347 | ||
348 | ||
349 |
def test_block_locked_prefill(pub, blocks_feature): |
|
350 |
FormDef.wipe() |
|
351 |
BlockDef.wipe() |
|
352 | ||
353 |
block = BlockDef() |
|
354 |
block.name = 'foobar' |
|
355 |
block.fields = [ |
|
356 |
fields.StringField( |
|
357 |
id='123', required=True, label='Test', type='string', |
|
358 |
prefill={'type': 'string', 'value': '{{ form_var_foo }} World', 'locked': True}), |
|
359 |
] |
|
360 |
block.store() |
|
361 | ||
362 |
formdef = FormDef() |
|
363 |
formdef.name = 'form title' |
|
364 |
formdef.fields = [ |
|
365 |
fields.PageField(id='0', label='1st page', type='page'), |
|
366 |
fields.StringField(id='1', label='string', varname='foo'), |
|
367 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
368 |
fields.BlockField(id='3', label='test', type='block:foobar'), |
|
369 |
] |
|
370 |
formdef.store() |
|
371 |
formdef.data_class().wipe() |
|
372 | ||
373 |
app = get_app(pub) |
|
374 |
resp = app.get(formdef.get_url()) |
|
375 |
resp.form['f1'] = 'Hello' |
|
376 |
resp = resp.form.submit('submit') # -> 2nd page |
|
377 |
assert resp.form['f3$element0$f123'].value == 'Hello World' |
|
378 |
assert 'readonly' in resp.form['f3$element0$f123'].attrs |
|
379 |
resp.form['f3$element0$f123'].value = 'Hello' # try changing the value |
|
380 |
resp = resp.form.submit('submit') # -> validation page |
|
381 |
resp = resp.form.submit('submit') # -> end page |
|
382 |
resp = resp.follow() |
|
383 | ||
384 |
formdata = formdef.data_class().select()[0] |
|
385 |
assert formdata.data['3']['data'][0]['123'] == 'Hello World' # value got reverted |
|
386 | ||
387 | ||
388 |
def test_workflow_form_block_prefill(pub): |
|
389 |
FormDef.wipe() |
|
390 |
BlockDef.wipe() |
|
391 |
create_user(pub) |
|
392 | ||
393 |
block = BlockDef() |
|
394 |
block.name = 'foobar' |
|
395 |
block.fields = [ |
|
396 |
fields.StringField( |
|
397 |
id='123', required=True, label='Test', type='string', |
|
398 |
prefill={'type': 'user', 'value': 'email'}), |
|
399 |
] |
|
400 |
block.store() |
|
401 | ||
402 |
wf = Workflow(name='status') |
|
403 |
st1 = wf.add_status('Status1', 'st1') |
|
404 | ||
405 |
display_form = FormWorkflowStatusItem() |
|
406 |
display_form.id = '_x' |
|
407 |
display_form.by = ['_submitter'] |
|
408 |
display_form.varname = 'xxx' |
|
409 |
display_form.formdef = WorkflowFormFieldsFormDef(item=display_form) |
|
410 |
display_form.formdef.fields.append( |
|
411 |
fields.BlockField(id='3', label='test', type='block:foobar') |
|
412 |
) |
|
413 |
st1.items.append(display_form) |
|
414 |
display_form.parent = st1 |
|
415 | ||
416 |
wf.store() |
|
417 | ||
418 |
FormDef.wipe() |
|
419 |
formdef = FormDef() |
|
420 |
formdef.name = 'test' |
|
421 |
formdef.fields = [] |
|
422 |
formdef.workflow_id = wf.id |
|
423 |
formdef.store() |
|
424 |
formdef.data_class().wipe() |
|
425 | ||
426 |
resp = login(get_app(pub), username='foo', password='foo').get('/test/') |
|
427 |
resp = resp.form.submit('submit') # -> validation |
|
428 |
resp = resp.form.submit('submit').follow() |
|
429 |
assert 'The form has been recorded' in resp |
|
430 |
assert resp.form['f3$element0$f123'].value == 'foo@localhost' |
|
431 | ||
432 | ||
433 |
def test_block_title_and_comment(pub, blocks_feature): |
|
434 |
FormDef.wipe() |
|
435 |
BlockDef.wipe() |
|
436 | ||
437 |
block = BlockDef() |
|
438 |
block.name = 'foobar' |
|
439 |
block.fields = [ |
|
440 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
441 |
fields.TitleField(id='234', label='Blah', type='title'), |
|
442 |
fields.CommentField(id='345', label='Blah', type='comment'), |
|
443 |
] |
|
444 |
block.store() |
|
445 | ||
446 |
formdef = FormDef() |
|
447 |
formdef.name = 'form title' |
|
448 |
formdef.fields = [ |
|
449 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
450 |
] |
|
451 |
formdef.store() |
|
452 | ||
453 |
app = get_app(pub) |
|
454 |
resp = app.get(formdef.get_url()) |
|
455 |
resp.form['f1$element0$f123'] = 'foo' |
|
456 |
resp = resp.form.submit('submit') # -> validation page |
|
457 |
assert 'Check values then click submit.' in resp.text |
|
458 |
resp = resp.form.submit('submit') # -> submit |
|
459 |
resp = resp.follow() |
|
460 | ||
461 | ||
462 |
def test_block_multipage(pub, blocks_feature): |
|
463 |
FormDef.wipe() |
|
464 |
BlockDef.wipe() |
|
465 | ||
466 |
block = BlockDef() |
|
467 |
block.name = 'foobar' |
|
468 |
block.fields = [ |
|
469 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
470 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
471 |
] |
|
472 |
block.store() |
|
473 | ||
474 |
formdef = FormDef() |
|
475 |
formdef.name = 'form title' |
|
476 |
formdef.fields = [ |
|
477 |
fields.PageField(id='0', label='1st page', type='page'), |
|
478 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
479 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
480 |
] |
|
481 |
formdef.store() |
|
482 | ||
483 |
app = get_app(pub) |
|
484 |
resp = app.get(formdef.get_url()) |
|
485 |
resp.form['f1$element0$f123'] = 'foo' |
|
486 |
resp.form['f1$element0$f234'] = 'bar' |
|
487 |
resp = resp.form.submit('submit') # -> 2nd page |
|
488 |
resp = resp.form.submit('submit') # -> validation page |
|
489 |
assert resp.form['f1$element0$f123'].attrs['readonly'] |
|
490 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
491 |
resp = resp.form.submit('previous') # -> 2nd page |
|
492 |
resp = resp.form.submit('previous') # -> 1st page |
|
493 |
assert 'readonly' not in resp.form['f1$element0$f123'].attrs |
|
494 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
495 |
resp = resp.form.submit('submit') # -> 2nd page |
|
496 |
resp = resp.form.submit('submit') # -> validation page |
|
497 |
resp = resp.form.submit('submit') # -> submit |
|
498 |
resp = resp.follow() |
|
499 |
assert '>foo<' in resp |
|
500 |
assert '>bar<' in resp |
|
501 | ||
502 | ||
503 |
def test_block_repeated(pub, blocks_feature): |
|
504 |
FormDef.wipe() |
|
505 |
BlockDef.wipe() |
|
506 | ||
507 |
block = BlockDef() |
|
508 |
block.name = 'foobar' |
|
509 |
block.fields = [ |
|
510 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
511 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
512 |
] |
|
513 |
block.store() |
|
514 | ||
515 |
formdef = FormDef() |
|
516 |
formdef.name = 'form title' |
|
517 |
formdef.fields = [ |
|
518 |
fields.PageField(id='0', label='1st page', type='page'), |
|
519 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3, hint='hintblock'), |
|
520 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
521 |
] |
|
522 |
formdef.store() |
|
523 | ||
524 |
app = get_app(pub) |
|
525 |
resp = app.get(formdef.get_url()) |
|
526 |
assert resp.text.count('>Test<') == 1 |
|
527 |
assert resp.text.count('>hintblock<') == 1 |
|
528 |
assert 'Add another' in resp |
|
529 |
assert resp.html.find('div', {'class': 'list-add'}) |
|
530 |
resp = resp.form.submit('f1$add_element') |
|
531 |
assert resp.text.count('>Test<') == 2 |
|
532 |
assert resp.text.count('>hintblock<') == 1 |
|
533 |
resp = resp.form.submit('f1$add_element') |
|
534 |
assert resp.text.count('>Test<') == 3 |
|
535 |
assert resp.text.count('>hintblock<') == 1 |
|
536 |
assert 'Add another' not in resp |
|
537 | ||
538 |
# fill items (1st and 3rd row) |
|
539 |
resp.form['f1$element0$f123'] = 'foo' |
|
540 |
resp.form['f1$element0$f234'] = 'bar' |
|
541 |
resp.form['f1$element2$f123'] = 'foo2' |
|
542 |
resp.form['f1$element2$f234'] = 'bar2' |
|
543 | ||
544 |
resp = resp.form.submit('submit') # -> 2nd page |
|
545 |
resp = resp.form.submit('submit') # -> validation page |
|
546 |
assert 'Check values then click submit.' in resp.text |
|
547 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
548 |
assert resp.form['f1$element0$f234'].value == 'bar' |
|
549 |
assert resp.form['f1$element1$f123'].value == 'foo2' |
|
550 |
assert resp.form['f1$element1$f234'].value == 'bar2' |
|
551 | ||
552 |
resp = resp.form.submit('previous') # -> 2nd page |
|
553 |
resp = resp.form.submit('previous') # -> 1st page |
|
554 |
assert 'readonly' not in resp.form['f1$element0$f123'].attrs |
|
555 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
556 | ||
557 |
resp = resp.form.submit('submit') # -> 2nd page |
|
558 |
resp = resp.form.submit('submit') # -> validation page |
|
559 |
resp = resp.form.submit('submit') # -> submit |
|
560 |
resp = resp.follow() |
|
561 |
assert '>foo<' in resp |
|
562 |
assert '>bar<' in resp |
|
563 |
assert '>foo2<' in resp |
|
564 |
assert '>bar2<' in resp |
|
565 | ||
566 | ||
567 |
def test_block_repeated_over_limit(pub, blocks_feature): |
|
568 |
FormDef.wipe() |
|
569 |
BlockDef.wipe() |
|
570 | ||
571 |
block = BlockDef() |
|
572 |
block.name = 'foobar' |
|
573 |
block.fields = [ |
|
574 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
575 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
576 |
] |
|
577 |
block.store() |
|
578 | ||
579 |
formdef = FormDef() |
|
580 |
formdef.name = 'form title' |
|
581 |
formdef.fields = [ |
|
582 |
fields.PageField(id='0', label='1st page', type='page'), |
|
583 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3), |
|
584 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
585 |
] |
|
586 |
formdef.store() |
|
587 | ||
588 |
app = get_app(pub) |
|
589 |
resp = app.get(formdef.get_url()) |
|
590 |
assert resp.text.count('>Test<') == 1 |
|
591 |
assert 'Add another' in resp |
|
592 |
resp = resp.form.submit('f1$add_element') |
|
593 |
assert resp.text.count('>Test<') == 2 |
|
594 |
resp = resp.form.submit('f1$add_element') |
|
595 |
assert resp.text.count('>Test<') == 3 |
|
596 |
assert 'Add another' not in resp |
|
597 | ||
598 |
# fill items |
|
599 |
resp.form['f1$element0$f123'] = 'foo' |
|
600 |
resp.form['f1$element0$f234'] = 'bar' |
|
601 |
resp.form['f1$element1$f123'] = 'foo1' |
|
602 |
resp.form['f1$element1$f234'] = 'bar1' |
|
603 |
resp.form['f1$element2$f123'] = 'foo2' |
|
604 |
resp.form['f1$element2$f234'] = 'bar2' |
|
605 | ||
606 |
# (modify formdef to only allow 2) |
|
607 |
formdef.fields[1].max_items = 2 |
|
608 |
formdef.store() |
|
609 | ||
610 |
# submit form |
|
611 |
resp = resp.form.submit('submit') |
|
612 |
assert 'Too many elements (maximum: 2)' in resp |
|
613 | ||
614 | ||
615 |
def test_block_repeated_files(pub, blocks_feature): |
|
616 |
FormDef.wipe() |
|
617 |
BlockDef.wipe() |
|
618 | ||
619 |
block = BlockDef() |
|
620 |
block.name = 'foobar' |
|
621 |
block.fields = [ |
|
622 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
623 |
fields.FileField(id='234', required=True, label='Test2', type='file'), |
|
624 |
] |
|
625 |
block.store() |
|
626 | ||
627 |
formdef = FormDef() |
|
628 |
formdef.name = 'form title' |
|
629 |
formdef.fields = [ |
|
630 |
fields.PageField(id='0', label='1st page', type='page'), |
|
631 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3), |
|
632 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
633 |
] |
|
634 |
formdef.store() |
|
635 | ||
636 |
app = get_app(pub) |
|
637 |
resp = app.get(formdef.get_url()) |
|
638 |
assert resp.text.count('>Test<') == 1 |
|
639 |
assert 'Add another' in resp |
|
640 |
resp = resp.form.submit('f1$add_element') |
|
641 |
assert resp.text.count('>Test<') == 2 |
|
642 |
resp = resp.form.submit('f1$add_element') |
|
643 |
assert resp.text.count('>Test<') == 3 |
|
644 |
assert 'Add another' not in resp |
|
645 | ||
646 |
# fill items (1st and 3rd row) |
|
647 |
resp.form['f1$element0$f123'] = 'foo' |
|
648 |
resp.form['f1$element0$f234$file'] = Upload('test1.txt', b'foobar1', 'text/plain') |
|
649 |
resp.form['f1$element2$f123'] = 'foo2' |
|
650 |
resp.form['f1$element2$f234$file'] = Upload('test2.txt', b'foobar2', 'text/plain') |
|
651 | ||
652 |
resp = resp.form.submit('submit') # -> 2nd page |
|
653 |
resp = resp.form.submit('submit') # -> validation page |
|
654 |
assert 'Check values then click submit.' in resp.text |
|
655 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
656 |
assert 'test1.txt' in resp |
|
657 |
assert resp.form['f1$element1$f123'].value == 'foo2' |
|
658 |
assert 'test2.txt' in resp |
|
659 | ||
660 |
resp = resp.form.submit('previous') # -> 2nd page |
|
661 |
resp = resp.form.submit('previous') # -> 1st page |
|
662 |
resp = resp.form.submit('submit') # -> 2nd page |
|
663 |
resp = resp.form.submit('submit') # -> validation page |
|
664 |
resp = resp.form.submit('submit') # -> submit |
|
665 |
resp = resp.follow() |
|
666 |
assert '>foo<' in resp |
|
667 |
assert 'test1.txt' in resp |
|
668 |
assert '>foo2<' in resp |
|
669 |
assert 'test2.txt' in resp |
|
670 | ||
671 | ||
672 |
def test_block_digest(pub, blocks_feature): |
|
673 |
FormDef.wipe() |
|
674 |
BlockDef.wipe() |
|
675 | ||
676 |
block = BlockDef() |
|
677 |
block.name = 'foobar' |
|
678 |
block.fields = [ |
|
679 |
fields.StringField( |
|
680 |
id='123', required=True, label='Test', |
|
681 |
type='string', varname='foo'), |
|
682 |
fields.StringField( |
|
683 |
id='234', required=True, label='Test2', |
|
684 |
type='string', varname='bar'), |
|
685 |
] |
|
686 |
block.store() |
|
687 | ||
688 |
formdef = FormDef() |
|
689 |
formdef.name = 'form title' |
|
690 |
formdef.fields = [ |
|
691 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3), |
|
692 |
] |
|
693 |
formdef.store() |
|
694 |
formdef.data_class().wipe() |
|
695 | ||
696 |
app = get_app(pub) |
|
697 |
resp = app.get(formdef.get_url()) |
|
698 |
resp.form['f1$element0$f123'] = 'foo' |
|
699 |
resp.form['f1$element0$f234'] = 'bar' |
|
700 |
resp = resp.form.submit('f1$add_element') |
|
701 |
resp.form['f1$element1$f123'] = 'foo2' |
|
702 |
resp.form['f1$element1$f234'] = 'bar2' |
|
703 | ||
704 |
resp = resp.form.submit('submit') # -> validation page |
|
705 |
resp = resp.form.submit('submit') # -> submit |
|
706 | ||
707 |
assert formdef.data_class().select()[0].data['1']['data'] == [ |
|
708 |
{'123': 'foo', '234': 'bar'}, {'123': 'foo2', '234': 'bar2'}] |
|
709 |
# by default it gets the type of object |
|
710 |
assert formdef.data_class().select()[0].data['1_display'] == 'foobar, foobar' |
|
711 | ||
712 |
# set a digest template |
|
713 |
formdef.data_class().wipe() |
|
714 | ||
715 |
block.digest_template = 'X{{foobar_var_foo}}Y' |
|
716 |
block.store() |
|
717 | ||
718 |
resp = app.get(formdef.get_url()) |
|
719 |
resp.form['f1$element0$f123'] = 'foo' |
|
720 |
resp.form['f1$element0$f234'] = 'bar' |
|
721 |
resp = resp.form.submit('f1$add_element') |
|
722 |
resp.form['f1$element1$f123'] = 'foo2' |
|
723 |
resp.form['f1$element1$f234'] = 'bar2' |
|
724 | ||
725 |
resp = resp.form.submit('submit') # -> validation page |
|
726 |
resp = resp.form.submit('submit') # -> submit |
|
727 |
assert formdef.data_class().select()[0].data['1']['data'] == [ |
|
728 |
{'123': 'foo', '234': 'bar'}, {'123': 'foo2', '234': 'bar2'}] |
|
729 |
assert formdef.data_class().select()[0].data['1_display'] == 'XfooY, Xfoo2Y' |
|
730 | ||
731 | ||
732 |
def test_block_digest_item(pub, blocks_feature): |
|
733 |
FormDef.wipe() |
|
734 |
BlockDef.wipe() |
|
735 |
NamedDataSource.wipe() |
|
736 | ||
737 |
# add a named data source |
|
738 |
data_source = NamedDataSource(name='foobar') |
|
739 |
data_source.data_source = { |
|
740 |
'type': 'formula', |
|
741 |
'value': repr([{'id': '1', 'text': 'un'}, |
|
742 |
{'id': '2', 'text': 'deux'}])} |
|
743 |
data_source.store() |
|
744 | ||
745 |
block = BlockDef() |
|
746 |
block.name = 'foobar' |
|
747 |
block.fields = [ |
|
748 |
fields.StringField( |
|
749 |
id='123', required=True, label='Test', |
|
750 |
type='string', varname='foo'), |
|
751 |
fields.ItemField( |
|
752 |
id='234', required=True, label='Test2', |
|
753 |
type='item', varname='bar', data_source={'type': 'foobar'}), |
|
754 |
] |
|
755 |
block.store() |
|
756 | ||
757 |
formdef = FormDef() |
|
758 |
formdef.name = 'form title' |
|
759 |
formdef.fields = [ |
|
760 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3), |
|
761 |
] |
|
762 |
formdef.store() |
|
763 |
formdef.data_class().wipe() |
|
764 | ||
765 |
app = get_app(pub) |
|
766 |
resp = app.get(formdef.get_url()) |
|
767 |
resp.form['f1$element0$f123'] = 'foo' |
|
768 |
resp.form['f1$element0$f234'] = '1' |
|
769 |
resp = resp.form.submit('f1$add_element') |
|
770 |
resp.form['f1$element1$f123'] = 'foo2' |
|
771 |
resp.form['f1$element1$f234'] = '2' |
|
772 | ||
773 |
resp = resp.form.submit('submit') # -> validation page |
|
774 |
resp = resp.form.submit('submit') # -> submit |
|
775 | ||
776 |
assert formdef.data_class().select()[0].data['1']['data'] == [ |
|
777 |
{'123': 'foo', '234': '1', '234_display': 'un'}, |
|
778 |
{'123': 'foo2', '234': '2', '234_display': 'deux'}, |
|
779 |
] |
|
780 |
# by default it gets the type of object |
|
781 |
assert formdef.data_class().select()[0].data['1_display'] == 'foobar, foobar' |
|
782 | ||
783 |
# set a digest template |
|
784 |
formdef.data_class().wipe() |
|
785 | ||
786 |
block.digest_template = 'X{{foobar_var_bar}}Y' |
|
787 |
block.store() |
|
788 | ||
789 |
resp = app.get(formdef.get_url()) |
|
790 |
resp.form['f1$element0$f123'] = 'foo' |
|
791 |
resp.form['f1$element0$f234'] = '1' |
|
792 |
resp = resp.form.submit('f1$add_element') |
|
793 |
resp.form['f1$element1$f123'] = 'foo2' |
|
794 |
resp.form['f1$element1$f234'] = '2' |
|
795 | ||
796 |
resp = resp.form.submit('submit') # -> validation page |
|
797 |
resp = resp.form.submit('submit') # -> submit |
|
798 |
assert formdef.data_class().select()[0].data['1']['data'] == [ |
|
799 |
{'123': 'foo', '234': '1', '234_display': 'un'}, |
|
800 |
{'123': 'foo2', '234': '2', '234_display': 'deux'}, |
|
801 |
] |
|
802 |
assert formdef.data_class().select()[0].data['1_display'] == 'XunY, XdeuxY' |
|
0 |
- |