0002-misc-split-form-pages-tests-block.patch
tests/test_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 |
... | ... | |
8714 | 8711 |
'1_structured': {'id': '1', 'text': 'un', 'more': 'foo'}, |
8715 | 8712 |
} |
8716 | 8713 |
assert '2020-04-18' in formdata.evolution[0].parts[0].content |
8717 | ||
8718 | ||
8719 |
def test_block_simple(pub, blocks_feature): |
|
8720 |
create_user(pub) |
|
8721 |
FormDef.wipe() |
|
8722 |
BlockDef.wipe() |
|
8723 | ||
8724 |
block = BlockDef() |
|
8725 |
block.name = 'foobar' |
|
8726 |
block.fields = [ |
|
8727 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
8728 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
8729 |
] |
|
8730 |
block.store() |
|
8731 | ||
8732 |
formdef = FormDef() |
|
8733 |
formdef.name = 'form title' |
|
8734 |
formdef.fields = [ |
|
8735 |
fields.BlockField(id='1', label='test', type='block:foobar', hint='hintblock'), |
|
8736 |
] |
|
8737 |
formdef.store() |
|
8738 | ||
8739 |
app = get_app(pub) |
|
8740 |
resp = app.get(formdef.get_url()) |
|
8741 |
assert resp.text.count('>hintblock<') == 1 |
|
8742 |
resp.form['f1$element0$f123'] = 'foo' |
|
8743 |
resp.form['f1$element0$f234'] = 'bar' |
|
8744 |
resp = resp.form.submit('submit') # -> validation page |
|
8745 |
assert resp.form['f1$element0$f123'].attrs['readonly'] |
|
8746 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
8747 |
assert resp.form['f1$element0$f234'].attrs['readonly'] |
|
8748 |
assert resp.form['f1$element0$f234'].value == 'bar' |
|
8749 |
resp = resp.form.submit('submit') # -> end page |
|
8750 |
resp = resp.follow() |
|
8751 |
assert '>foo<' in resp |
|
8752 |
assert '>bar<' in resp |
|
8753 | ||
8754 | ||
8755 |
def test_block_required(pub, blocks_feature): |
|
8756 |
create_user(pub) |
|
8757 |
FormDef.wipe() |
|
8758 |
BlockDef.wipe() |
|
8759 | ||
8760 |
block = BlockDef() |
|
8761 |
block.name = 'foobar' |
|
8762 |
block.fields = [ |
|
8763 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
8764 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
8765 |
] |
|
8766 |
block.store() |
|
8767 | ||
8768 |
formdef = FormDef() |
|
8769 |
formdef.name = 'form title' |
|
8770 |
formdef.fields = [ |
|
8771 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
8772 |
] |
|
8773 |
formdef.store() |
|
8774 | ||
8775 |
app = get_app(pub) |
|
8776 |
resp = app.get(formdef.get_url()) |
|
8777 |
resp = resp.form.submit('submit') # -> error page |
|
8778 |
assert 'There were errors processing the form' in resp |
|
8779 |
assert resp.text.count('required field') == 1 |
|
8780 |
resp.form['f1$element0$f123'] = 'foo' |
|
8781 |
resp.form['f1$element0$f234'] = 'bar' |
|
8782 |
resp = resp.form.submit('submit') # -> validation page |
|
8783 |
assert 'Check values then click submit.' in resp.text |
|
8784 | ||
8785 |
resp = app.get(formdef.get_url()) |
|
8786 |
resp.form['f1$element0$f123'] = 'foo' |
|
8787 |
resp = resp.form.submit('submit') # -> error page |
|
8788 |
assert 'There were errors processing the form' in resp |
|
8789 |
assert resp.text.count('required field') == 1 |
|
8790 |
resp.form['f1$element0$f234'] = 'bar' |
|
8791 |
resp = resp.form.submit('submit') # -> validation page |
|
8792 |
assert 'Check values then click submit.' in resp.text |
|
8793 | ||
8794 |
# only one required |
|
8795 |
block.fields = [ |
|
8796 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
8797 |
fields.StringField(id='234', required=False, label='Test2', type='string'), |
|
8798 |
] |
|
8799 |
block.store() |
|
8800 | ||
8801 |
resp = app.get(formdef.get_url()) |
|
8802 |
resp.form['f1$element0$f123'] = 'foo' |
|
8803 |
resp = resp.form.submit('submit') # -> validation page |
|
8804 |
assert 'Check values then click submit.' in resp.text |
|
8805 | ||
8806 |
# none required, but globally required |
|
8807 |
block.fields = [ |
|
8808 |
fields.StringField(id='123', required=False, label='Test', type='string'), |
|
8809 |
fields.StringField(id='234', required=False, label='Test2', type='string'), |
|
8810 |
] |
|
8811 |
block.store() |
|
8812 | ||
8813 |
resp = app.get(formdef.get_url()) |
|
8814 |
resp = resp.form.submit('submit') # -> error page |
|
8815 |
assert 'There were errors processing the form' in resp |
|
8816 |
assert resp.text.count('required field') == 1 |
|
8817 |
resp.form['f1$element0$f234'] = 'bar' |
|
8818 |
resp = resp.form.submit('submit') # -> validation page |
|
8819 |
assert 'Check values then click submit.' in resp.text |
|
8820 | ||
8821 | ||
8822 |
def test_block_date(pub, blocks_feature): |
|
8823 |
create_user(pub) |
|
8824 |
FormDef.wipe() |
|
8825 |
BlockDef.wipe() |
|
8826 | ||
8827 |
block = BlockDef() |
|
8828 |
block.name = 'foobar' |
|
8829 |
block.fields = [ |
|
8830 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
8831 |
fields.DateField(id='234', required=True, label='Test2', type='date'), |
|
8832 |
] |
|
8833 |
block.store() |
|
8834 | ||
8835 |
formdef = FormDef() |
|
8836 |
formdef.name = 'form title' |
|
8837 |
formdef.fields = [ |
|
8838 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
8839 |
] |
|
8840 |
formdef.store() |
|
8841 | ||
8842 |
app = get_app(pub) |
|
8843 |
resp = app.get(formdef.get_url()) |
|
8844 |
resp.form['f1$element0$f123'] = 'foo' |
|
8845 |
resp.form['f1$element0$f234'] = '2020-06-16' |
|
8846 |
resp = resp.form.submit('submit') # -> validation page |
|
8847 |
assert 'Check values then click submit.' in resp.text |
|
8848 |
resp = resp.form.submit('submit') # -> submit |
|
8849 |
resp = resp.follow() |
|
8850 |
assert '>2020-06-16<' in resp |
|
8851 | ||
8852 | ||
8853 |
def test_block_bool(pub, blocks_feature): |
|
8854 |
create_user(pub) |
|
8855 |
FormDef.wipe() |
|
8856 |
BlockDef.wipe() |
|
8857 | ||
8858 |
block = BlockDef() |
|
8859 |
block.name = 'foobar' |
|
8860 |
block.fields = [ |
|
8861 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
8862 |
fields.BoolField(id='234', required=False, label='Test2', type='bool'), |
|
8863 |
] |
|
8864 |
block.store() |
|
8865 | ||
8866 |
formdef = FormDef() |
|
8867 |
formdef.name = 'form title' |
|
8868 |
formdef.fields = [ |
|
8869 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
8870 |
] |
|
8871 |
formdef.store() |
|
8872 | ||
8873 |
for value in (True, False): |
|
8874 |
app = get_app(pub) |
|
8875 |
resp = app.get(formdef.get_url()) |
|
8876 |
resp.form['f1$element0$f123'] = 'foo' |
|
8877 |
resp.form['f1$element0$f234'].checked = value |
|
8878 |
resp = resp.form.submit('submit') # -> validation page |
|
8879 |
assert resp.form['f1$element0$f234disabled'].checked is value |
|
8880 |
assert resp.form['f1$element0$f234'].value == str(value) |
|
8881 |
assert 'Check values then click submit.' in resp |
|
8882 |
resp = resp.form.submit('submit') # -> submit |
|
8883 |
resp = resp.follow() |
|
8884 |
if value: |
|
8885 |
assert '<div class="value">Yes</div>' in resp |
|
8886 |
else: |
|
8887 |
assert '<div class="value">No</div>' in resp |
|
8888 | ||
8889 | ||
8890 |
def test_block_autocomplete_list(pub, blocks_feature): |
|
8891 |
create_user(pub) |
|
8892 |
FormDef.wipe() |
|
8893 |
BlockDef.wipe() |
|
8894 | ||
8895 |
block = BlockDef() |
|
8896 |
block.name = 'foobar' |
|
8897 |
block.fields = [ |
|
8898 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
8899 |
fields.ItemField(id='234', required=True, label='Test2', type='item', |
|
8900 |
display_mode='autocomplete', items=['Foo', 'Bar']), |
|
8901 |
] |
|
8902 |
block.store() |
|
8903 | ||
8904 |
formdef = FormDef() |
|
8905 |
formdef.name = 'form title' |
|
8906 |
formdef.fields = [ |
|
8907 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
8908 |
] |
|
8909 |
formdef.store() |
|
8910 | ||
8911 |
app = get_app(pub) |
|
8912 |
resp = app.get(formdef.get_url()) |
|
8913 |
resp.form['f1$element0$f123'] = 'foo' |
|
8914 |
resp.form['f1$element0$f234'] = 'Bar' |
|
8915 |
resp = resp.form.submit('submit') # -> validation page |
|
8916 |
assert 'Check values then click submit.' in resp.text |
|
8917 |
resp = resp.form.submit('submit') # -> submit |
|
8918 |
resp = resp.follow() |
|
8919 |
assert '>Bar<' in resp |
|
8920 | ||
8921 | ||
8922 |
def test_block_geoloc_prefill(pub, blocks_feature): |
|
8923 |
create_user(pub) |
|
8924 |
FormDef.wipe() |
|
8925 |
BlockDef.wipe() |
|
8926 | ||
8927 |
block = BlockDef() |
|
8928 |
block.name = 'foobar' |
|
8929 |
block.fields = [ |
|
8930 |
fields.StringField(id='123', required=True, label='Test', type='string', |
|
8931 |
prefill={'type': 'geolocation', 'value': 'road'}), |
|
8932 |
] |
|
8933 |
block.store() |
|
8934 | ||
8935 |
formdef = FormDef() |
|
8936 |
formdef.name = 'form title' |
|
8937 |
formdef.fields = [ |
|
8938 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
8939 |
] |
|
8940 |
formdef.store() |
|
8941 | ||
8942 |
app = get_app(pub) |
|
8943 |
resp = app.get(formdef.get_url()) |
|
8944 |
assert 'qommon.geolocation.js' in resp |
|
8945 |
assert resp.html.find('div', {'data-geolocation': 'road'}) |
|
8946 | ||
8947 | ||
8948 |
def test_block_string_prefill(pub, blocks_feature): |
|
8949 |
create_user(pub) |
|
8950 |
FormDef.wipe() |
|
8951 |
BlockDef.wipe() |
|
8952 | ||
8953 |
block = BlockDef() |
|
8954 |
block.name = 'foobar' |
|
8955 |
block.fields = [ |
|
8956 |
fields.StringField(id='123', required=True, label='Test', type='string', |
|
8957 |
prefill={'type': 'string', 'value': '{{ form_var_foo }} World'}), |
|
8958 |
] |
|
8959 |
block.store() |
|
8960 | ||
8961 |
formdef = FormDef() |
|
8962 |
formdef.name = 'form title' |
|
8963 |
formdef.fields = [ |
|
8964 |
fields.PageField(id='0', label='1st page', type='page'), |
|
8965 |
fields.StringField(id='1', label='string', varname='foo'), |
|
8966 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
8967 |
fields.BlockField(id='3', label='test', type='block:foobar'), |
|
8968 |
] |
|
8969 |
formdef.store() |
|
8970 |
formdef.data_class().wipe() |
|
8971 | ||
8972 |
app = get_app(pub) |
|
8973 |
resp = app.get(formdef.get_url()) |
|
8974 |
resp.form['f1'] = 'Hello' |
|
8975 |
resp = resp.form.submit('submit') # -> 2nd page |
|
8976 |
assert resp.form['f3$element0$f123'].value == 'Hello World' |
|
8977 |
resp = resp.form.submit('submit') # -> validation page |
|
8978 |
resp = resp.form.submit('submit') # -> end page |
|
8979 |
resp = resp.follow() |
|
8980 | ||
8981 |
formdata = formdef.data_class().select()[0] |
|
8982 |
assert formdata.data['3']['data'][0]['123'] == 'Hello World' |
|
8983 | ||
8984 |
# check unmodified prefilled field |
|
8985 |
app = get_app(pub) |
|
8986 |
resp = app.get(formdef.get_url()) |
|
8987 |
resp.form['f1'] = 'Hello' |
|
8988 |
resp = resp.form.submit('submit') # -> 2nd page |
|
8989 |
assert resp.form['f3$element0$f123'].value == 'Hello World' |
|
8990 |
resp = resp.form.submit('submit') # -> validation page |
|
8991 |
resp = resp.form.submit('previous') # -> 2nd page |
|
8992 |
resp = resp.form.submit('previous') # -> 1st page |
|
8993 |
resp.form['f1'] = 'Test' |
|
8994 |
resp = resp.form.submit('submit') # -> 2nd page |
|
8995 |
assert resp.form['f3$element0$f123'].value == 'Test World' |
|
8996 | ||
8997 |
# check modified prefilled field |
|
8998 |
app = get_app(pub) |
|
8999 |
resp = app.get(formdef.get_url()) |
|
9000 |
resp.form['f1'] = 'Hello' |
|
9001 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9002 |
assert resp.form['f3$element0$f123'].value == 'Hello World' |
|
9003 |
resp.form['f3$element0$f123'] = 'Foobar' |
|
9004 |
resp = resp.form.submit('submit') # -> validation page |
|
9005 |
resp = resp.form.submit('previous') # -> 2nd page |
|
9006 |
resp = resp.form.submit('previous') # -> 1st page |
|
9007 |
resp.form['f1'] = 'Test' |
|
9008 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9009 |
assert resp.form['f3$element0$f123'].value == 'Foobar' |
|
9010 | ||
9011 | ||
9012 |
def test_block_locked_prefill(pub, blocks_feature): |
|
9013 |
create_user(pub) |
|
9014 |
FormDef.wipe() |
|
9015 |
BlockDef.wipe() |
|
9016 | ||
9017 |
block = BlockDef() |
|
9018 |
block.name = 'foobar' |
|
9019 |
block.fields = [ |
|
9020 |
fields.StringField(id='123', required=True, label='Test', type='string', |
|
9021 |
prefill={'type': 'string', 'value': '{{ form_var_foo }} World', 'locked': True}), |
|
9022 |
] |
|
9023 |
block.store() |
|
9024 | ||
9025 |
formdef = FormDef() |
|
9026 |
formdef.name = 'form title' |
|
9027 |
formdef.fields = [ |
|
9028 |
fields.PageField(id='0', label='1st page', type='page'), |
|
9029 |
fields.StringField(id='1', label='string', varname='foo'), |
|
9030 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
9031 |
fields.BlockField(id='3', label='test', type='block:foobar'), |
|
9032 |
] |
|
9033 |
formdef.store() |
|
9034 |
formdef.data_class().wipe() |
|
9035 | ||
9036 |
app = get_app(pub) |
|
9037 |
resp = app.get(formdef.get_url()) |
|
9038 |
resp.form['f1'] = 'Hello' |
|
9039 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9040 |
assert resp.form['f3$element0$f123'].value == 'Hello World' |
|
9041 |
assert 'readonly' in resp.form['f3$element0$f123'].attrs |
|
9042 |
resp.form['f3$element0$f123'].value = 'Hello' # try changing the value |
|
9043 |
resp = resp.form.submit('submit') # -> validation page |
|
9044 |
resp = resp.form.submit('submit') # -> end page |
|
9045 |
resp = resp.follow() |
|
9046 | ||
9047 |
formdata = formdef.data_class().select()[0] |
|
9048 |
assert formdata.data['3']['data'][0]['123'] == 'Hello World' # value got reverted |
|
9049 | ||
9050 | ||
9051 |
def test_workflow_form_block_prefill(pub): |
|
9052 |
create_user(pub) |
|
9053 |
FormDef.wipe() |
|
9054 |
BlockDef.wipe() |
|
9055 | ||
9056 |
block = BlockDef() |
|
9057 |
block.name = 'foobar' |
|
9058 |
block.fields = [ |
|
9059 |
fields.StringField(id='123', required=True, label='Test', type='string', |
|
9060 |
prefill={'type': 'user', 'value': 'email'}), |
|
9061 |
] |
|
9062 |
block.store() |
|
9063 | ||
9064 |
wf = Workflow(name='status') |
|
9065 |
st1 = wf.add_status('Status1', 'st1') |
|
9066 | ||
9067 |
display_form = FormWorkflowStatusItem() |
|
9068 |
display_form.id = '_x' |
|
9069 |
display_form.by = ['_submitter'] |
|
9070 |
display_form.varname = 'xxx' |
|
9071 |
display_form.formdef = WorkflowFormFieldsFormDef(item=display_form) |
|
9072 |
display_form.formdef.fields.append( |
|
9073 |
fields.BlockField(id='3', label='test', type='block:foobar') |
|
9074 |
) |
|
9075 |
st1.items.append(display_form) |
|
9076 |
display_form.parent = st1 |
|
9077 | ||
9078 |
wf.store() |
|
9079 | ||
9080 |
formdef = create_formdef() |
|
9081 |
formdef.workflow_id = wf.id |
|
9082 |
formdef.fields = [] |
|
9083 |
formdef.store() |
|
9084 |
formdef.data_class().wipe() |
|
9085 | ||
9086 |
resp = login(get_app(pub), username='foo', password='foo').get('/test/') |
|
9087 |
resp = resp.form.submit('submit') # -> validation |
|
9088 |
resp = resp.form.submit('submit').follow() |
|
9089 |
assert 'The form has been recorded' in resp |
|
9090 |
assert resp.form['f3$element0$f123'].value == 'foo@localhost' |
|
9091 | ||
9092 | ||
9093 |
def test_block_title_and_comment(pub, blocks_feature): |
|
9094 |
create_user(pub) |
|
9095 |
FormDef.wipe() |
|
9096 |
BlockDef.wipe() |
|
9097 | ||
9098 |
block = BlockDef() |
|
9099 |
block.name = 'foobar' |
|
9100 |
block.fields = [ |
|
9101 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
9102 |
fields.TitleField(id='234', label='Blah', type='title'), |
|
9103 |
fields.CommentField(id='345', label='Blah', type='comment'), |
|
9104 |
] |
|
9105 |
block.store() |
|
9106 | ||
9107 |
formdef = FormDef() |
|
9108 |
formdef.name = 'form title' |
|
9109 |
formdef.fields = [ |
|
9110 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
9111 |
] |
|
9112 |
formdef.store() |
|
9113 | ||
9114 |
app = get_app(pub) |
|
9115 |
resp = app.get(formdef.get_url()) |
|
9116 |
resp.form['f1$element0$f123'] = 'foo' |
|
9117 |
resp = resp.form.submit('submit') # -> validation page |
|
9118 |
assert 'Check values then click submit.' in resp.text |
|
9119 |
resp = resp.form.submit('submit') # -> submit |
|
9120 |
resp = resp.follow() |
|
9121 | ||
9122 | ||
9123 |
def test_block_multipage(pub, blocks_feature): |
|
9124 |
create_user(pub) |
|
9125 |
FormDef.wipe() |
|
9126 |
BlockDef.wipe() |
|
9127 | ||
9128 |
block = BlockDef() |
|
9129 |
block.name = 'foobar' |
|
9130 |
block.fields = [ |
|
9131 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
9132 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
9133 |
] |
|
9134 |
block.store() |
|
9135 | ||
9136 |
formdef = FormDef() |
|
9137 |
formdef.name = 'form title' |
|
9138 |
formdef.fields = [ |
|
9139 |
fields.PageField(id='0', label='1st page', type='page'), |
|
9140 |
fields.BlockField(id='1', label='test', type='block:foobar'), |
|
9141 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
9142 |
] |
|
9143 |
formdef.store() |
|
9144 | ||
9145 |
app = get_app(pub) |
|
9146 |
resp = app.get(formdef.get_url()) |
|
9147 |
resp.form['f1$element0$f123'] = 'foo' |
|
9148 |
resp.form['f1$element0$f234'] = 'bar' |
|
9149 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9150 |
resp = resp.form.submit('submit') # -> validation page |
|
9151 |
assert resp.form['f1$element0$f123'].attrs['readonly'] |
|
9152 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
9153 |
resp = resp.form.submit('previous') # -> 2nd page |
|
9154 |
resp = resp.form.submit('previous') # -> 1st page |
|
9155 |
assert 'readonly' not in resp.form['f1$element0$f123'].attrs |
|
9156 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
9157 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9158 |
resp = resp.form.submit('submit') # -> validation page |
|
9159 |
resp = resp.form.submit('submit') # -> submit |
|
9160 |
resp = resp.follow() |
|
9161 |
assert '>foo<' in resp |
|
9162 |
assert '>bar<' in resp |
|
9163 | ||
9164 | ||
9165 |
def test_block_repeated(pub, blocks_feature): |
|
9166 |
create_user(pub) |
|
9167 |
FormDef.wipe() |
|
9168 |
BlockDef.wipe() |
|
9169 | ||
9170 |
block = BlockDef() |
|
9171 |
block.name = 'foobar' |
|
9172 |
block.fields = [ |
|
9173 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
9174 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
9175 |
] |
|
9176 |
block.store() |
|
9177 | ||
9178 |
formdef = FormDef() |
|
9179 |
formdef.name = 'form title' |
|
9180 |
formdef.fields = [ |
|
9181 |
fields.PageField(id='0', label='1st page', type='page'), |
|
9182 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3, hint='hintblock'), |
|
9183 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
9184 |
] |
|
9185 |
formdef.store() |
|
9186 | ||
9187 |
app = get_app(pub) |
|
9188 |
resp = app.get(formdef.get_url()) |
|
9189 |
assert resp.text.count('>Test<') == 1 |
|
9190 |
assert resp.text.count('>hintblock<') == 1 |
|
9191 |
assert 'Add another' in resp |
|
9192 |
assert resp.html.find('div', {'class': 'list-add'}) |
|
9193 |
resp = resp.form.submit('f1$add_element') |
|
9194 |
assert resp.text.count('>Test<') == 2 |
|
9195 |
assert resp.text.count('>hintblock<') == 1 |
|
9196 |
resp = resp.form.submit('f1$add_element') |
|
9197 |
assert resp.text.count('>Test<') == 3 |
|
9198 |
assert resp.text.count('>hintblock<') == 1 |
|
9199 |
assert 'Add another' not in resp |
|
9200 | ||
9201 |
# fill items (1st and 3rd row) |
|
9202 |
resp.form['f1$element0$f123'] = 'foo' |
|
9203 |
resp.form['f1$element0$f234'] = 'bar' |
|
9204 |
resp.form['f1$element2$f123'] = 'foo2' |
|
9205 |
resp.form['f1$element2$f234'] = 'bar2' |
|
9206 | ||
9207 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9208 |
resp = resp.form.submit('submit') # -> validation page |
|
9209 |
assert 'Check values then click submit.' in resp.text |
|
9210 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
9211 |
assert resp.form['f1$element0$f234'].value == 'bar' |
|
9212 |
assert resp.form['f1$element1$f123'].value == 'foo2' |
|
9213 |
assert resp.form['f1$element1$f234'].value == 'bar2' |
|
9214 | ||
9215 |
resp = resp.form.submit('previous') # -> 2nd page |
|
9216 |
resp = resp.form.submit('previous') # -> 1st page |
|
9217 |
assert 'readonly' not in resp.form['f1$element0$f123'].attrs |
|
9218 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
9219 | ||
9220 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9221 |
resp = resp.form.submit('submit') # -> validation page |
|
9222 |
resp = resp.form.submit('submit') # -> submit |
|
9223 |
resp = resp.follow() |
|
9224 |
assert '>foo<' in resp |
|
9225 |
assert '>bar<' in resp |
|
9226 |
assert '>foo2<' in resp |
|
9227 |
assert '>bar2<' in resp |
|
9228 | ||
9229 | ||
9230 |
def test_block_repeated_over_limit(pub, blocks_feature): |
|
9231 |
create_user(pub) |
|
9232 |
FormDef.wipe() |
|
9233 |
BlockDef.wipe() |
|
9234 | ||
9235 |
block = BlockDef() |
|
9236 |
block.name = 'foobar' |
|
9237 |
block.fields = [ |
|
9238 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
9239 |
fields.StringField(id='234', required=True, label='Test2', type='string'), |
|
9240 |
] |
|
9241 |
block.store() |
|
9242 | ||
9243 |
formdef = FormDef() |
|
9244 |
formdef.name = 'form title' |
|
9245 |
formdef.fields = [ |
|
9246 |
fields.PageField(id='0', label='1st page', type='page'), |
|
9247 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3), |
|
9248 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
9249 |
] |
|
9250 |
formdef.store() |
|
9251 | ||
9252 |
app = get_app(pub) |
|
9253 |
resp = app.get(formdef.get_url()) |
|
9254 |
assert resp.text.count('>Test<') == 1 |
|
9255 |
assert 'Add another' in resp |
|
9256 |
resp = resp.form.submit('f1$add_element') |
|
9257 |
assert resp.text.count('>Test<') == 2 |
|
9258 |
resp = resp.form.submit('f1$add_element') |
|
9259 |
assert resp.text.count('>Test<') == 3 |
|
9260 |
assert 'Add another' not in resp |
|
9261 | ||
9262 |
# fill items |
|
9263 |
resp.form['f1$element0$f123'] = 'foo' |
|
9264 |
resp.form['f1$element0$f234'] = 'bar' |
|
9265 |
resp.form['f1$element1$f123'] = 'foo1' |
|
9266 |
resp.form['f1$element1$f234'] = 'bar1' |
|
9267 |
resp.form['f1$element2$f123'] = 'foo2' |
|
9268 |
resp.form['f1$element2$f234'] = 'bar2' |
|
9269 | ||
9270 |
# (modify formdef to only allow 2) |
|
9271 |
formdef.fields[1].max_items = 2 |
|
9272 |
formdef.store() |
|
9273 | ||
9274 |
# submit form |
|
9275 |
resp = resp.form.submit('submit') |
|
9276 |
assert 'Too many elements (maximum: 2)' in resp |
|
9277 | ||
9278 | ||
9279 |
def test_block_repeated_files(pub, blocks_feature): |
|
9280 |
create_user(pub) |
|
9281 |
FormDef.wipe() |
|
9282 |
BlockDef.wipe() |
|
9283 | ||
9284 |
block = BlockDef() |
|
9285 |
block.name = 'foobar' |
|
9286 |
block.fields = [ |
|
9287 |
fields.StringField(id='123', required=True, label='Test', type='string'), |
|
9288 |
fields.FileField(id='234', required=True, label='Test2', type='file'), |
|
9289 |
] |
|
9290 |
block.store() |
|
9291 | ||
9292 |
formdef = FormDef() |
|
9293 |
formdef.name = 'form title' |
|
9294 |
formdef.fields = [ |
|
9295 |
fields.PageField(id='0', label='1st page', type='page'), |
|
9296 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3), |
|
9297 |
fields.PageField(id='2', label='2nd page', type='page'), |
|
9298 |
] |
|
9299 |
formdef.store() |
|
9300 | ||
9301 |
app = get_app(pub) |
|
9302 |
resp = app.get(formdef.get_url()) |
|
9303 |
assert resp.text.count('>Test<') == 1 |
|
9304 |
assert 'Add another' in resp |
|
9305 |
resp = resp.form.submit('f1$add_element') |
|
9306 |
assert resp.text.count('>Test<') == 2 |
|
9307 |
resp = resp.form.submit('f1$add_element') |
|
9308 |
assert resp.text.count('>Test<') == 3 |
|
9309 |
assert 'Add another' not in resp |
|
9310 | ||
9311 |
# fill items (1st and 3rd row) |
|
9312 |
resp.form['f1$element0$f123'] = 'foo' |
|
9313 |
resp.form['f1$element0$f234$file'] = Upload('test1.txt', b'foobar1', 'text/plain') |
|
9314 |
resp.form['f1$element2$f123'] = 'foo2' |
|
9315 |
resp.form['f1$element2$f234$file'] = Upload('test2.txt', b'foobar2', 'text/plain') |
|
9316 | ||
9317 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9318 |
resp = resp.form.submit('submit') # -> validation page |
|
9319 |
assert 'Check values then click submit.' in resp.text |
|
9320 |
assert resp.form['f1$element0$f123'].value == 'foo' |
|
9321 |
assert 'test1.txt' in resp |
|
9322 |
assert resp.form['f1$element1$f123'].value == 'foo2' |
|
9323 |
assert 'test2.txt' in resp |
|
9324 | ||
9325 |
resp = resp.form.submit('previous') # -> 2nd page |
|
9326 |
resp = resp.form.submit('previous') # -> 1st page |
|
9327 |
resp = resp.form.submit('submit') # -> 2nd page |
|
9328 |
resp = resp.form.submit('submit') # -> validation page |
|
9329 |
resp = resp.form.submit('submit') # -> submit |
|
9330 |
resp = resp.follow() |
|
9331 |
assert '>foo<' in resp |
|
9332 |
assert 'test1.txt' in resp |
|
9333 |
assert '>foo2<' in resp |
|
9334 |
assert 'test2.txt' in resp |
|
9335 | ||
9336 | ||
9337 |
def test_block_digest(pub, blocks_feature): |
|
9338 |
create_user(pub) |
|
9339 |
FormDef.wipe() |
|
9340 |
BlockDef.wipe() |
|
9341 | ||
9342 |
block = BlockDef() |
|
9343 |
block.name = 'foobar' |
|
9344 |
block.fields = [ |
|
9345 |
fields.StringField(id='123', required=True, label='Test', |
|
9346 |
type='string', varname='foo'), |
|
9347 |
fields.StringField(id='234', required=True, label='Test2', |
|
9348 |
type='string', varname='bar'), |
|
9349 |
] |
|
9350 |
block.store() |
|
9351 | ||
9352 |
formdef = FormDef() |
|
9353 |
formdef.name = 'form title' |
|
9354 |
formdef.fields = [ |
|
9355 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3), |
|
9356 |
] |
|
9357 |
formdef.store() |
|
9358 | ||
9359 |
app = get_app(pub) |
|
9360 |
resp = app.get(formdef.get_url()) |
|
9361 |
resp.form['f1$element0$f123'] = 'foo' |
|
9362 |
resp.form['f1$element0$f234'] = 'bar' |
|
9363 |
resp = resp.form.submit('f1$add_element') |
|
9364 |
resp.form['f1$element1$f123'] = 'foo2' |
|
9365 |
resp.form['f1$element1$f234'] = 'bar2' |
|
9366 | ||
9367 |
resp = resp.form.submit('submit') # -> validation page |
|
9368 |
resp = resp.form.submit('submit') # -> submit |
|
9369 | ||
9370 |
assert formdef.data_class().select()[0].data['1']['data'] == [ |
|
9371 |
{'123': 'foo', '234': 'bar'}, {'123': 'foo2', '234': 'bar2'}] |
|
9372 |
# by default it gets the type of object |
|
9373 |
assert formdef.data_class().select()[0].data['1_display'] == 'foobar, foobar' |
|
9374 | ||
9375 |
# set a digest template |
|
9376 |
formdef.data_class().wipe() |
|
9377 | ||
9378 |
block.digest_template = 'X{{foobar_var_foo}}Y' |
|
9379 |
block.store() |
|
9380 | ||
9381 |
resp = app.get(formdef.get_url()) |
|
9382 |
resp.form['f1$element0$f123'] = 'foo' |
|
9383 |
resp.form['f1$element0$f234'] = 'bar' |
|
9384 |
resp = resp.form.submit('f1$add_element') |
|
9385 |
resp.form['f1$element1$f123'] = 'foo2' |
|
9386 |
resp.form['f1$element1$f234'] = 'bar2' |
|
9387 | ||
9388 |
resp = resp.form.submit('submit') # -> validation page |
|
9389 |
resp = resp.form.submit('submit') # -> submit |
|
9390 |
assert formdef.data_class().select()[0].data['1']['data'] == [ |
|
9391 |
{'123': 'foo', '234': 'bar'}, {'123': 'foo2', '234': 'bar2'}] |
|
9392 |
assert formdef.data_class().select()[0].data['1_display'] == 'XfooY, Xfoo2Y' |
|
9393 | ||
9394 | ||
9395 |
def test_block_digest_item(pub, blocks_feature): |
|
9396 |
create_user(pub) |
|
9397 |
FormDef.wipe() |
|
9398 |
BlockDef.wipe() |
|
9399 |
NamedDataSource.wipe() |
|
9400 | ||
9401 |
# add a named data source |
|
9402 |
data_source = NamedDataSource(name='foobar') |
|
9403 |
data_source.data_source = { |
|
9404 |
'type': 'formula', |
|
9405 |
'value': repr([{'id': '1', 'text': 'un'}, |
|
9406 |
{'id': '2', 'text': 'deux'}])} |
|
9407 |
data_source.store() |
|
9408 | ||
9409 |
block = BlockDef() |
|
9410 |
block.name = 'foobar' |
|
9411 |
block.fields = [ |
|
9412 |
fields.StringField(id='123', required=True, label='Test', |
|
9413 |
type='string', varname='foo'), |
|
9414 |
fields.ItemField(id='234', required=True, label='Test2', |
|
9415 |
type='item', varname='bar', data_source={'type': 'foobar'}), |
|
9416 |
] |
|
9417 |
block.store() |
|
9418 | ||
9419 |
formdef = FormDef() |
|
9420 |
formdef.name = 'form title' |
|
9421 |
formdef.fields = [ |
|
9422 |
fields.BlockField(id='1', label='test', type='block:foobar', max_items=3), |
|
9423 |
] |
|
9424 |
formdef.store() |
|
9425 | ||
9426 |
app = get_app(pub) |
|
9427 |
resp = app.get(formdef.get_url()) |
|
9428 |
resp.form['f1$element0$f123'] = 'foo' |
|
9429 |
resp.form['f1$element0$f234'] = '1' |
|
9430 |
resp = resp.form.submit('f1$add_element') |
|
9431 |
resp.form['f1$element1$f123'] = 'foo2' |
|
9432 |
resp.form['f1$element1$f234'] = '2' |
|
9433 | ||
9434 |
resp = resp.form.submit('submit') # -> validation page |
|
9435 |
resp = resp.form.submit('submit') # -> submit |
|
9436 | ||
9437 |
assert formdef.data_class().select()[0].data['1']['data'] == [ |
|
9438 |
{'123': 'foo', '234': '1', '234_display': 'un'}, |
|
9439 |
{'123': 'foo2', '234': '2', '234_display': 'deux'}, |
|
9440 |
] |
|
9441 |
# by default it gets the type of object |
|
9442 |
assert formdef.data_class().select()[0].data['1_display'] == 'foobar, foobar' |
|
9443 | ||
9444 |
# set a digest template |
|
9445 |
formdef.data_class().wipe() |
|
9446 | ||
9447 |
block.digest_template = 'X{{foobar_var_bar}}Y' |
|
9448 |
block.store() |
|
9449 | ||
9450 |
resp = app.get(formdef.get_url()) |
|
9451 |
resp.form['f1$element0$f123'] = 'foo' |
|
9452 |
resp.form['f1$element0$f234'] = '1' |
|
9453 |
resp = resp.form.submit('f1$add_element') |
|
9454 |
resp.form['f1$element1$f123'] = 'foo2' |
|
9455 |
resp.form['f1$element1$f234'] = '2' |
|
9456 | ||
9457 |
resp = resp.form.submit('submit') # -> validation page |
|
9458 |
resp = resp.form.submit('submit') # -> submit |
|
9459 |
assert formdef.data_class().select()[0].data['1']['data'] == [ |
|
9460 |
{'123': 'foo', '234': '1', '234_display': 'un'}, |
|
9461 |
{'123': 'foo2', '234': '2', '234_display': 'deux'}, |
|
9462 |
] |
|
9463 |
assert formdef.data_class().select()[0].data['1_display'] == 'XunY, XdeuxY' |
tests/test_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 |
- |