1541 lines
55 KiB
Python
1541 lines
55 KiB
Python
import datetime
|
|
import os
|
|
import time
|
|
|
|
import pytest
|
|
|
|
from wcs import fields
|
|
from wcs.blocks import BlockDef
|
|
from wcs.carddef import CardDef
|
|
from wcs.data_sources import NamedDataSource
|
|
from wcs.formdef import FormDef
|
|
from wcs.qommon.http_request import HTTPRequest
|
|
from wcs.workflows import Workflow, WorkflowBackofficeFieldsFormDef
|
|
|
|
from ..utilities import clean_temporary_pub, create_temporary_pub, get_app, login
|
|
from .test_all import create_environment, create_superuser
|
|
|
|
|
|
@pytest.fixture
|
|
def pub(emails):
|
|
pub = create_temporary_pub()
|
|
|
|
req = HTTPRequest(None, {'SCRIPT_NAME': '/', 'SERVER_NAME': 'example.net'})
|
|
pub.set_app_dir(req)
|
|
pub.cfg['identification'] = {'methods': ['password']}
|
|
pub.cfg['language'] = {'language': 'en'}
|
|
pub.write_cfg()
|
|
with open(os.path.join(pub.app_dir, 'site-options.cfg'), 'w') as fd:
|
|
fd.write(
|
|
'''
|
|
[api-secrets]
|
|
coucou = 1234
|
|
'''
|
|
)
|
|
|
|
return pub
|
|
|
|
|
|
def teardown_module(module):
|
|
clean_temporary_pub()
|
|
|
|
|
|
def test_backoffice_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
create_environment(pub)
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert resp.forms['listing-settings']['filter-status'].checked is True
|
|
resp.forms['listing-settings']['filter-status'].checked = False
|
|
resp.forms['listing-settings']['filter-2'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert '<select name="filter">' not in resp.text
|
|
|
|
resp.forms['listing-settings']['filter-2-value'] = 'baz'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>baz</td>') == 8
|
|
assert resp.text.count('<td>foo</td>') == 0
|
|
assert resp.text.count('<td>bar</td>') == 0
|
|
|
|
resp.forms['listing-settings']['filter-start'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert '>invalid date<' not in resp
|
|
resp.forms['listing-settings']['filter-start-value'] = datetime.datetime(2015, 2, 1).strftime('%Y-%m-%d')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>baz</td>') == 0
|
|
resp.forms['listing-settings']['filter-start-value'] = datetime.datetime(2014, 2, 1).strftime('%Y-%m-%d')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>baz</td>') == 8
|
|
|
|
# check there's no crash on invalid date values
|
|
resp.forms['listing-settings']['filter-start-value'] = 'whatever'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>baz</td>') == 8
|
|
|
|
# check two-digit years are handled correctly
|
|
resp.forms['listing-settings']['filter-start-value'] = datetime.datetime(2014, 2, 1).strftime('%y-%m-%d')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>baz</td>') == 8
|
|
|
|
# and dates being typed in are properly ignored
|
|
resp.forms['listing-settings']['filter-start-value'] = '0020-02-01'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>baz</td>') == 8
|
|
|
|
# check it's also ok for end filter
|
|
resp.forms['listing-settings']['filter-end'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['listing-settings']['filter-end-value'] = datetime.datetime(2014, 2, 2).strftime('%y-%m-%d')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>baz</td>') == 0
|
|
|
|
|
|
def test_backoffice_status_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = []
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
for i in range(3):
|
|
formdata = data_class()
|
|
formdata.data = {}
|
|
formdata.just_created()
|
|
if i % 2 == 0:
|
|
formdata.jump_status('new')
|
|
else:
|
|
formdata.jump_status('finished')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert resp.forms['listing-settings']['filter-status'].checked is True
|
|
assert resp.forms['listing-settings']['filter'].value == 'waiting'
|
|
assert resp.forms['listing-settings']['filter-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-operator'].options] == ['eq', 'ne']
|
|
assert resp.text.count('<tr') == 3
|
|
|
|
resp.forms['listing-settings']['filter-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 2
|
|
|
|
|
|
def test_backoffice_default_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = [
|
|
fields.ItemField(
|
|
id='2',
|
|
label='2nd field',
|
|
type='item',
|
|
items=['foo', 'bar', 'baz'],
|
|
display_locations=['validation', 'summary', 'listings'],
|
|
),
|
|
]
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert 'filter-2-value' not in resp.forms['listing-settings'].fields
|
|
|
|
formdef = FormDef.get_by_urlname('form-title')
|
|
formdef.fields[0].in_filters = True
|
|
formdef.store()
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert 'filter-2-value' in resp.forms['listing-settings'].fields
|
|
|
|
# same check for items field
|
|
formdef.fields.append(
|
|
fields.ItemsField(id='4', label='4th field', type='items', items=['foo', 'bar', 'baz'])
|
|
)
|
|
formdef.store()
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert 'filter-4-value' not in resp.forms['listing-settings'].fields
|
|
|
|
formdef.fields[1].in_filters = True
|
|
formdef.store()
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert 'filter-4-value' in resp.forms['listing-settings'].fields
|
|
|
|
|
|
def test_backoffice_unknown_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = []
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
for i in range(1):
|
|
formdata = data_class()
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert resp.text.count('<tr') == 2
|
|
resp = app.get('/backoffice/management/form-title/?filter-foobar=42')
|
|
assert resp.text.count('<tr') == 1
|
|
assert 'Invalid filter "foobar"' in resp
|
|
resp = app.get('/backoffice/management/form-title/?filter-42=on&filter-42-value=foobar')
|
|
assert resp.text.count('<tr') == 1
|
|
assert 'Invalid filter "42"' in resp
|
|
|
|
resp = app.get('/backoffice/management/form-title/?filter-foobar=42&filter-baz=35')
|
|
assert resp.text.count('<tr') == 1
|
|
assert 'Invalid filters "baz", "foobar"' in resp
|
|
resp = app.get('/backoffice/management/form-title/?filter-42=on&filter-42-value=foobar&filter-baz=35')
|
|
assert resp.text.count('<tr') == 1
|
|
assert 'Invalid filters "42", "baz"' in resp
|
|
|
|
|
|
def test_backoffice_bool_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = [
|
|
fields.BoolField(
|
|
id='4', label='4th field', type='bool', display_locations=['validation', 'summary', 'listings']
|
|
)
|
|
]
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(0, 2):
|
|
formdata = data_class()
|
|
formdata.data = {'4': bool(i % 2)}
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-4'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
assert resp.forms['listing-settings']['filter-4-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-4-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-operator'].options] == ['eq', 'ne']
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'true'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>Yes</td>') > 0
|
|
assert resp.text.count('<td>No</td>') == 0
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'false'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>Yes</td>') == 0
|
|
assert resp.text.count('<td>No</td>') > 0
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'false'
|
|
resp.forms['listing-settings']['filter-4-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>Yes</td>') > 0
|
|
assert resp.text.count('<td>No</td>') == 0
|
|
|
|
|
|
def test_backoffice_item_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = [
|
|
fields.ItemField(
|
|
id='4',
|
|
label='4th field',
|
|
type='item',
|
|
items=['â', 'b', 'c', 'd'],
|
|
display_locations=['validation', 'summary', 'listings'],
|
|
)
|
|
]
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(0, 12):
|
|
formdata = data_class()
|
|
formdata.data = {}
|
|
if i % 4 == 0:
|
|
formdata.data['4'] = 'â'
|
|
formdata.data['4_display'] = 'â'
|
|
elif i % 4 == 1:
|
|
formdata.data['4'] = 'b'
|
|
formdata.data['4_display'] = 'b'
|
|
elif i % 4 == 2:
|
|
formdata.data['4'] = 'd'
|
|
formdata.data['4_display'] = 'd'
|
|
else:
|
|
formdata.data['4'] = ''
|
|
formdata.data['4_display'] = ''
|
|
formdata.just_created()
|
|
if i % 3 == 0:
|
|
formdata.jump_status('new')
|
|
else:
|
|
formdata.jump_status('finished')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-4'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
assert resp.forms['listing-settings']['filter-4-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-4-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-operator'].options] == [
|
|
'eq',
|
|
'ne',
|
|
'lt',
|
|
'lte',
|
|
'gt',
|
|
'gte',
|
|
]
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'â'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>â</td>') > 0
|
|
assert resp.text.count('<td>b</td>') == 0
|
|
assert resp.text.count('<td>d</td>') == 0
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'b'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>â</td>') == 0
|
|
assert resp.text.count('<td>b</td>') > 0
|
|
assert resp.text.count('<td>d</td>') == 0
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'b'
|
|
resp.forms['listing-settings']['filter-4-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>â</td>') > 0
|
|
assert resp.text.count('<td>b</td>') == 0
|
|
assert resp.text.count('<td>d</td>') > 0
|
|
|
|
# in postgresql, option 'c' is never used so not even listed
|
|
with pytest.raises(ValueError):
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'c'
|
|
|
|
# check json view used to fill select filters from javascript
|
|
resp2 = app.get(resp.request.path + 'filter-options?filter_field_id=4&' + resp.request.query_string)
|
|
assert [x['id'] for x in resp2.json['data']] == ['â', 'b', 'd']
|
|
resp2 = app.get(
|
|
resp.request.path + 'filter-options?filter_field_id=4&_search=d&' + resp.request.query_string
|
|
)
|
|
assert [x['id'] for x in resp2.json['data']] == ['d']
|
|
resp2 = app.get(
|
|
resp.request.path + 'filter-options?filter_field_id=7&' + resp.request.query_string, status=404
|
|
)
|
|
|
|
for status in ('all', 'waiting', 'pending', 'done', 'accepted'):
|
|
resp.forms['listing-settings']['filter'] = status
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp2 = app.get(resp.request.path + 'filter-options?filter_field_id=4&' + resp.request.query_string)
|
|
if status == 'accepted':
|
|
assert [x['id'] for x in resp2.json['data']] == []
|
|
else:
|
|
assert [x['id'] for x in resp2.json['data']] == ['â', 'b', 'd']
|
|
|
|
|
|
def test_backoffice_item_double_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = [
|
|
fields.ItemField(
|
|
id='4',
|
|
label='4th field',
|
|
type='item',
|
|
items=['â', 'b', 'c', 'd'],
|
|
display_locations=['validation', 'summary', 'listings'],
|
|
),
|
|
fields.ItemField(
|
|
id='5',
|
|
label='5th field',
|
|
type='item',
|
|
items=['E', 'F', 'G', 'H'],
|
|
display_locations=['validation', 'summary', 'listings'],
|
|
),
|
|
]
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(0, 4):
|
|
formdata = data_class()
|
|
formdata.data = {}
|
|
if i % 4 == 0:
|
|
formdata.data['4'] = 'a'
|
|
formdata.data['4_display'] = 'a'
|
|
formdata.data['5'] = 'E'
|
|
formdata.data['5_display'] = 'E'
|
|
elif i % 4 == 1:
|
|
formdata.data['4'] = 'a'
|
|
formdata.data['4_display'] = 'a'
|
|
formdata.data['5'] = 'F'
|
|
formdata.data['5_display'] = 'F'
|
|
elif i % 4 == 2:
|
|
formdata.data['4'] = 'a'
|
|
formdata.data['4_display'] = 'a'
|
|
formdata.data['5'] = 'G'
|
|
formdata.data['5_display'] = 'G'
|
|
elif i % 4 == 3:
|
|
formdata.data['4'] = 'b'
|
|
formdata.data['4_display'] = 'b'
|
|
formdata.data['5'] = 'F'
|
|
formdata.data['5_display'] = 'F'
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-4'].checked = True
|
|
resp.forms['listing-settings']['filter-5'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
assert resp.forms['listing-settings']['filter-4-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-5-value'].value == ''
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-value'].options] == ['', 'a', 'b']
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-5-value'].options] == ['', 'E', 'F', 'G']
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'a'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-value'].options] == ['', 'a', 'b']
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-5-value'].options] == ['', 'E', 'F', 'G']
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'b'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-value'].options] == ['', 'a', 'b']
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-5-value'].options] == ['', 'F']
|
|
|
|
resp.forms['listing-settings']['filter-5-value'].value = 'F'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-value'].options] == ['', 'a', 'b']
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-5-value'].options] == ['', 'F']
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = ''
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-value'].options] == ['', 'a', 'b']
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-5-value'].options] == ['', 'E', 'F', 'G']
|
|
|
|
|
|
def test_backoffice_bofield_item_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
workflow = Workflow.get_default_workflow()
|
|
workflow.id = '2'
|
|
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
|
|
workflow.backoffice_fields_formdef.fields = [
|
|
fields.ItemField(
|
|
id='bo0-1',
|
|
label='4th field',
|
|
type='item',
|
|
items=['â', 'b', 'c', 'd'],
|
|
display_locations=['validation', 'summary', 'listings'],
|
|
)
|
|
]
|
|
workflow.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = []
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.workflow_id = workflow.id
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(0, 12):
|
|
formdata = data_class()
|
|
formdata.data = {}
|
|
if i % 4 == 0:
|
|
formdata.data['bo0-1'] = 'â'
|
|
formdata.data['bo0-1_display'] = 'â'
|
|
elif i % 4 == 1:
|
|
formdata.data['bo0-1'] = 'b'
|
|
formdata.data['bo0-1_display'] = 'b'
|
|
elif i % 4 == 2:
|
|
formdata.data['bo0-1'] = 'd'
|
|
formdata.data['bo0-1_display'] = 'd'
|
|
formdata.just_created()
|
|
if i % 3 == 0:
|
|
formdata.jump_status('new')
|
|
else:
|
|
formdata.jump_status('finished')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-bo0-1'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
assert resp.forms['listing-settings']['filter-bo0-1-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-bo0-1-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-bo0-1-operator'].options] == [
|
|
'eq',
|
|
'ne',
|
|
'lt',
|
|
'lte',
|
|
'gt',
|
|
'gte',
|
|
]
|
|
|
|
resp.forms['listing-settings']['filter-bo0-1-value'].value = 'â'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>â</td>') > 0
|
|
assert resp.text.count('<td>b</td>') == 0
|
|
assert resp.text.count('<td>d</td>') == 0
|
|
|
|
resp.forms['listing-settings']['filter-bo0-1-value'].value = 'b'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>â</td>') == 0
|
|
assert resp.text.count('<td>b</td>') > 0
|
|
assert resp.text.count('<td>d</td>') == 0
|
|
|
|
resp.forms['listing-settings']['filter-bo0-1-value'].value = 'b'
|
|
resp.forms['listing-settings']['filter-bo0-1-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>â</td>') > 0
|
|
assert resp.text.count('<td>b</td>') == 0
|
|
assert resp.text.count('<td>d</td>') > 0
|
|
|
|
# in postgresql, option 'c' is never used so not even listed
|
|
with pytest.raises(ValueError):
|
|
resp.forms['listing-settings']['filter-bo0-1-value'].value = 'c'
|
|
|
|
# check json view used to fill select filters from javascript
|
|
resp2 = app.get(resp.request.path + 'filter-options?filter_field_id=bo0-1&' + resp.request.query_string)
|
|
assert [x['id'] for x in resp2.json['data']] == ['â', 'b', 'd']
|
|
resp2 = app.get(
|
|
resp.request.path + 'filter-options?filter_field_id=bo0-1&_search=d&' + resp.request.query_string
|
|
)
|
|
assert [x['id'] for x in resp2.json['data']] == ['d']
|
|
|
|
for status in ('all', 'waiting', 'pending', 'done', 'accepted'):
|
|
resp.forms['listing-settings']['filter'] = status
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp2 = app.get(
|
|
resp.request.path + 'filter-options?filter_field_id=bo0-1&' + resp.request.query_string
|
|
)
|
|
if status == 'accepted':
|
|
assert [x['id'] for x in resp2.json['data']] == []
|
|
else:
|
|
assert [x['id'] for x in resp2.json['data']] == ['â', 'b', 'd']
|
|
|
|
|
|
def test_backoffice_items_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = [
|
|
fields.ItemsField(
|
|
id='4',
|
|
label='4th field',
|
|
type='items',
|
|
items=['â', 'b', 'c', 'd'],
|
|
display_locations=['validation', 'summary', 'listings'],
|
|
)
|
|
]
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(0, 4):
|
|
formdata = data_class()
|
|
formdata.data = {}
|
|
if i % 4 == 0:
|
|
formdata.data['4'] = ['â', 'b']
|
|
formdata.data['4_display'] = 'â, b'
|
|
elif i % 4 == 1:
|
|
formdata.data['4'] = ['b', 'd']
|
|
formdata.data['4_display'] = 'b, d'
|
|
elif i % 4 == 2:
|
|
formdata.data['4'] = ['â']
|
|
formdata.data['4_display'] = 'â'
|
|
else:
|
|
formdata.data['4'] = []
|
|
formdata.data['4_display'] = None
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-4'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
assert resp.forms['listing-settings']['filter-4-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-4-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-operator'].options] == [
|
|
'eq',
|
|
'ne',
|
|
'lt',
|
|
'lte',
|
|
'gt',
|
|
'gte',
|
|
]
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'â'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>â, b</td>') > 0
|
|
assert resp.text.count('<td>â</td>') > 0
|
|
assert resp.text.count('<td>b, d</td>') == 0
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'b'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>â, b</td>') > 0
|
|
assert resp.text.count('<td>â</td>') == 0
|
|
assert resp.text.count('<td>b, d</td>') > 0
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'b'
|
|
resp.forms['listing-settings']['filter-4-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>â, b</td>') == 0
|
|
assert resp.text.count('<td>â</td>') > 0
|
|
assert resp.text.count('<td>b, d</td>') == 0
|
|
|
|
# option 'c' is never used so not even listed
|
|
with pytest.raises(ValueError):
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'c'
|
|
|
|
|
|
def test_backoffice_items_cards_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
CardDef.wipe()
|
|
carddef = CardDef()
|
|
carddef.name = 'foo'
|
|
carddef.fields = [
|
|
fields.StringField(id='1', label='Test', type='string', varname='foo'),
|
|
]
|
|
carddef.digest_templates = {'default': 'card {{ form_var_foo }}'}
|
|
carddef.store()
|
|
|
|
card_ids = {}
|
|
for label in ('foo', 'bar', 'baz', 'foo, bar'):
|
|
card = carddef.data_class()()
|
|
card.data = {'1': label}
|
|
card.just_created()
|
|
card.store()
|
|
card_ids[label] = str(card.id)
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = [
|
|
fields.ItemsField(
|
|
id='1',
|
|
label='items',
|
|
type='items',
|
|
data_source={'type': 'carddef:foo', 'value': ''},
|
|
)
|
|
]
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
formdata = data_class()
|
|
formdata.data = {'1': [card_ids['foo']]}
|
|
formdata.data['1_display'] = formdef.fields[0].store_display_value(formdata.data, '1')
|
|
formdata.data['1_structured'] = formdef.fields[0].store_structured_value(formdata.data, '1')
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
formdata = data_class()
|
|
formdata.data = {'1': [card_ids['foo'], card_ids['baz']]}
|
|
formdata.data['1_display'] = formdef.fields[0].store_display_value(formdata.data, '1')
|
|
formdata.data['1_structured'] = formdef.fields[0].store_structured_value(formdata.data, '1')
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
formdata = data_class()
|
|
formdata.data = {'1': [card_ids['foo, bar']]}
|
|
formdata.data['1_display'] = formdef.fields[0].store_display_value(formdata.data, '1')
|
|
formdata.data['1_structured'] = formdef.fields[0].store_structured_value(formdata.data, '1')
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/%s/' % formdef.url_name)
|
|
assert resp.pyquery('tbody tr').length == 3
|
|
resp.forms['listing-settings']['filter-1'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
# option 'bar' is never used so not even listed
|
|
assert [x[2] for x in resp.forms['listing-settings']['filter-1-value'].options] == [
|
|
'',
|
|
'card baz',
|
|
'card foo',
|
|
'card foo, bar',
|
|
]
|
|
|
|
resp.forms['listing-settings']['filter-1-value'].value = card_ids['foo']
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.pyquery('tbody tr').length == 2
|
|
|
|
resp.forms['listing-settings']['filter-1-value'].value = card_ids['baz']
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.pyquery('tbody tr').length == 1
|
|
|
|
|
|
def test_backoffice_string_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = [
|
|
fields.StringField(
|
|
id='4', label='4th field', type='string', display_locations=['validation', 'summary', 'listings']
|
|
)
|
|
]
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(0, 2):
|
|
formdata = data_class()
|
|
formdata.data = {}
|
|
formdata.data['4'] = 'a' if bool(i % 2) else 'b'
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-4'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
assert resp.forms['listing-settings']['filter-4-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-4-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-operator'].options] == [
|
|
'eq',
|
|
'ne',
|
|
'lt',
|
|
'lte',
|
|
'gt',
|
|
'gte',
|
|
]
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'a'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>a</td>') > 0
|
|
assert resp.text.count('<td>b</td>') == 0
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'b'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>a</td>') == 0
|
|
assert resp.text.count('<td>b</td>') > 0
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'b'
|
|
resp.forms['listing-settings']['filter-4-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>a</td>') > 0
|
|
assert resp.text.count('<td>b</td>') == 0
|
|
|
|
|
|
def test_backoffice_string_filter_int_value(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = [
|
|
fields.StringField(
|
|
id='4', label='4th field', type='string', display_locations=['validation', 'summary', 'listings']
|
|
)
|
|
]
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(0, 2):
|
|
formdata = data_class()
|
|
formdata.data = {}
|
|
formdata.data['4'] = '123' if bool(i % 2) else '315610000204'
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-4'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
assert resp.forms['listing-settings']['filter-4-value'].value == ''
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = '123'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>123</td>') > 0
|
|
assert resp.text.count('<td>315610000204</td>') == 0
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = '315610000204'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>123</td>') == 0
|
|
assert resp.text.count('<td>315610000204</td>') > 0
|
|
|
|
|
|
def test_backoffice_email_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = [
|
|
fields.EmailField(
|
|
id='4', label='4th field', type='email', display_locations=['validation', 'summary', 'listings']
|
|
)
|
|
]
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(0, 2):
|
|
formdata = data_class()
|
|
formdata.data = {}
|
|
formdata.data['4'] = 'a@localhost' if bool(i % 2) else 'b@localhost'
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-4'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
assert resp.forms['listing-settings']['filter-4-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-4-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-operator'].options] == ['eq', 'ne']
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'a@localhost'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('>a@localhost</') > 0
|
|
assert resp.text.count('>b@localhost</') == 0
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'b@localhost'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('>a@localhost</') == 0
|
|
assert resp.text.count('>b@localhost</') > 0
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'b@localhost'
|
|
resp.forms['listing-settings']['filter-4-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('>a@localhost</') > 0
|
|
assert resp.text.count('>b@localhost</') == 0
|
|
|
|
|
|
def test_backoffice_date_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = [
|
|
fields.DateField(
|
|
id='4', label='4th field', type='date', display_locations=['validation', 'summary', 'listings']
|
|
)
|
|
]
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(0, 2):
|
|
formdata = data_class()
|
|
formdata.data = {}
|
|
formdata.data['4'] = time.strptime('2020-04-24' if bool(i % 2) else '2015-05-12', '%Y-%m-%d')
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-4'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
assert resp.forms['listing-settings']['filter-4-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-4-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-operator'].options] == [
|
|
'eq',
|
|
'ne',
|
|
'lt',
|
|
'lte',
|
|
'gt',
|
|
'gte',
|
|
]
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = '2020-04-24'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>2020-04-24</td>') > 0
|
|
assert resp.text.count('<td>2015-05-12</td>') == 0
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = '2015-05-12'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>2020-04-24</td>') == 0
|
|
assert resp.text.count('<td>2015-05-12</td>') > 0
|
|
|
|
resp.forms['listing-settings']['filter-4-value'].value = '2015-05-12'
|
|
resp.forms['listing-settings']['filter-4-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>2020-04-24</td>') > 0
|
|
assert resp.text.count('<td>2015-05-12</td>') == 0
|
|
|
|
# date in a different format
|
|
resp.forms['listing-settings']['filter-4-value'].value = '12/05/2015'
|
|
resp.forms['listing-settings']['filter-4-operator'].value = 'eq'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<td>2020-04-24</td>') == 0
|
|
assert resp.text.count('<td>2015-05-12</td>') > 0
|
|
|
|
|
|
def test_backoffice_user_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = []
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
user1 = pub.user_class(name='userA')
|
|
user1.store()
|
|
user2 = pub.user_class(name='userB')
|
|
user2.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(0, 2):
|
|
formdata = data_class()
|
|
formdata.data = {}
|
|
formdata.user_id = user1.id if bool(i % 2) else user2.id
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
|
|
resp = app.get('/backoffice/management/form-title/?filter-user=on&filter-user-value=%s' % user1.id)
|
|
assert resp.text.count('>userA<') > 0
|
|
assert resp.text.count('>userB<') == 0
|
|
assert '<option value="%s" selected="selected">userA</option>' % user1.id in resp
|
|
# check it persits on filter changes
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('>userA<') > 0
|
|
assert resp.text.count('>userB<') == 0
|
|
|
|
resp = app.get('/backoffice/management/form-title/?filter-user=on&filter-user-value=%s' % user2.id)
|
|
assert resp.text.count('>userA<') == 0
|
|
assert resp.text.count('>userB<') > 0
|
|
|
|
# filter on uuid
|
|
user1.name_identifiers = ['0123456789']
|
|
user1.store()
|
|
resp = app.get('/backoffice/management/form-title/?filter-user-uuid=0123456789')
|
|
assert resp.text.count('>userA<') > 0
|
|
assert resp.text.count('>userB<') == 0
|
|
assert '<option value="%s" selected="selected">userA</option>' % user1.id in resp
|
|
# check it persists on filter changes
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('>userA<') > 0
|
|
assert resp.text.count('>userB<') == 0
|
|
|
|
# check with unknown uuid
|
|
resp = app.get('/backoffice/management/form-title/?filter-user-uuid=XXX')
|
|
assert resp.text.count('>userA<') == 0
|
|
assert resp.text.count('>userB<') == 0
|
|
|
|
|
|
def test_backoffice_submission_agent_filter(pub):
|
|
pub.user_class.wipe()
|
|
user = create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = []
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.backoffice_submission_roles = user.roles
|
|
formdef.store()
|
|
|
|
user1 = pub.user_class(name='userA')
|
|
user1.store()
|
|
user2 = pub.user_class(name='userB')
|
|
user2.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(0, 2):
|
|
formdata = data_class()
|
|
formdata.data = {}
|
|
formdata.submission_agent_id = str(user1.id if bool(i % 2) else user2.id)
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/?limit=100')
|
|
# enable submission-agent column
|
|
resp.forms['listing-settings']['submission_agent'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('>userA<') > 0
|
|
assert resp.text.count('>userB<') > 0
|
|
# check the filter is hidden
|
|
assert resp.pyquery.find('li[hidden] input[name=filter-submission-agent]')
|
|
|
|
base_url = resp.request.url
|
|
resp = app.get(base_url + '&filter-submission-agent=on&filter-submission-agent-value=%s' % user1.id)
|
|
assert resp.text.count('>userA<') > 0
|
|
assert resp.text.count('>userB<') == 0
|
|
assert resp.text.count('<tr') == 2
|
|
assert resp.pyquery.find('input[value=userA]') # displayed in sidebar
|
|
# check it persits on filter changes
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('>userA<') > 0
|
|
assert resp.text.count('>userB<') == 0
|
|
assert resp.text.count('<tr') == 2
|
|
|
|
resp = app.get(base_url + '&filter-submission-agent=on&filter-submission-agent-value=%s' % user2.id)
|
|
assert resp.text.count('>userA<') == 0
|
|
assert resp.text.count('>userB<') > 0
|
|
assert resp.text.count('<tr') == 2
|
|
|
|
resp = app.get(
|
|
'/backoffice/management/form-title/?limit=100&filter-submission-agent=on&filter-submission-agent-value=%s'
|
|
% user2.id
|
|
)
|
|
assert resp.text.count('<tr') == 2
|
|
|
|
# filter on uuid
|
|
user1.name_identifiers = ['0123456789']
|
|
user1.store()
|
|
resp = app.get(base_url + '&filter-submission-agent-uuid=0123456789')
|
|
assert resp.text.count('>userA<') > 0
|
|
assert resp.text.count('>userB<') == 0
|
|
assert resp.pyquery.find('input[value=userA]') # displayed in sidebar
|
|
# check it persists on filter changes
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('>userA<') > 0
|
|
assert resp.text.count('>userB<') == 0
|
|
|
|
# check with unknown uuid
|
|
resp = app.get(base_url + '&filter-submission-agent-uuid=XXX')
|
|
assert resp.text.count('>userA<') == 0
|
|
assert resp.text.count('>userB<') == 0
|
|
|
|
|
|
def test_workflow_function_filter(pub):
|
|
pub.user_class.wipe()
|
|
user = create_superuser(pub)
|
|
user.name_identifiers = ['0123456789']
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
workflow = Workflow.get_default_workflow()
|
|
workflow.id = '2'
|
|
workflow.roles['_foobar'] = 'Foobar'
|
|
workflow.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = []
|
|
formdef.workflow = workflow
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
user1 = pub.user_class(name='userA')
|
|
user1.name_identifiers = ['56789']
|
|
user1.store()
|
|
user2 = pub.user_class(name='userB')
|
|
user2.name_identifiers = ['98765']
|
|
user2.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
formdatas = []
|
|
for i in range(3):
|
|
formdatas.append(data_class())
|
|
|
|
formdatas[0].workflow_roles = {'_foobar': ['_user:%s' % user.id]}
|
|
formdatas[1].workflow_roles = {'_foobar': ['_user:%s' % user1.id]}
|
|
formdatas[2].workflow_roles = {'_foobar': ['_user:%s' % user1.id, '_user:%s' % user2.id]}
|
|
|
|
for formdata in formdatas:
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
# enable user-function column
|
|
resp.forms['listing-settings']['filter-user-function'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 4
|
|
|
|
# set a value in the select field
|
|
resp.forms['listing-settings']['filter-user-function-value'].value = '_foobar'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 2
|
|
|
|
|
|
def test_backoffice_internal_id_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = []
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(3):
|
|
formdata = data_class()
|
|
formdata.data = {}
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-internal-id'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
assert resp.forms['listing-settings']['filter-internal-id-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-internal-id-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-internal-id-operator'].options] == [
|
|
'eq',
|
|
'ne',
|
|
'lt',
|
|
'lte',
|
|
'gt',
|
|
'gte',
|
|
]
|
|
|
|
resp.forms['listing-settings']['filter-internal-id-value'].value = '1'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('>1-1<') > 0
|
|
assert resp.text.count('>1-2<') == 0
|
|
assert resp.text.count('>1-3<') == 0
|
|
assert resp.pyquery.find('input[value="1"]') # displayed in sidebar
|
|
# check it persists on filter changes
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('>1-1<') > 0
|
|
assert resp.text.count('>1-2<') == 0
|
|
assert resp.text.count('>1-3<') == 0
|
|
|
|
resp.forms['listing-settings']['filter-internal-id-value'].value = '2'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('>1-1<') == 0
|
|
assert resp.text.count('>1-2<') > 0
|
|
assert resp.text.count('>1-3<') == 0
|
|
resp.forms['listing-settings']['filter-internal-id-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('>1-1<') > 0
|
|
assert resp.text.count('>1-2<') == 0
|
|
assert resp.text.count('>1-3<') > 0
|
|
|
|
# invalid value
|
|
resp.forms['listing-settings']['filter-internal-id-value'].value = 'foobar'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1
|
|
assert 'Invalid value "foobar" for "filter-internal-id-value"' in resp
|
|
|
|
|
|
def test_backoffice_table_varname_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
datasource = {'type': 'formula', 'value': repr([('A', 'aa'), ('B', 'bb'), ('C', 'cc')])}
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.fields = [
|
|
fields.ItemField(id='3', label='3rd field', type='item', data_source=datasource, varname='foo'),
|
|
]
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(0, 3):
|
|
formdata = data_class()
|
|
formdata.data = {}
|
|
formdata.data['3'] = 'A' if bool(i % 2) else 'B'
|
|
formdata.data['3_display'] = 'aa' if bool(i % 2) else 'bb'
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/?filter-foo=A')
|
|
# check filter is applied
|
|
assert resp.text.count('<tr') == 2
|
|
# and kept in parameters
|
|
assert resp.forms['listing-settings']['filter-3'].checked
|
|
assert resp.forms['listing-settings']['filter-3-value'].value == 'A'
|
|
assert resp.forms['listing-settings']['filter-3-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-3-operator'].options] == [
|
|
'eq',
|
|
'ne',
|
|
'lt',
|
|
'lte',
|
|
'gt',
|
|
'gte',
|
|
]
|
|
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 2
|
|
|
|
resp = app.get('/backoffice/management/form-title/?filter-foo=A&filter-foo-operator=ne')
|
|
# check filter is applied
|
|
assert resp.text.count('<tr') == 3
|
|
# and kept in parameters
|
|
assert resp.forms['listing-settings']['filter-3'].checked
|
|
assert resp.forms['listing-settings']['filter-3-value'].value == 'A'
|
|
assert resp.forms['listing-settings']['filter-3-operator'].value == 'ne'
|
|
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 3
|
|
|
|
|
|
def test_backoffice_block_field_filter(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
NamedDataSource.wipe()
|
|
data_source = NamedDataSource(name='foobar')
|
|
data_source.data_source = {
|
|
'type': 'formula',
|
|
'value': repr([{'id': '1', 'text': 'foo', 'more': 'XXX'}, {'id': '2', 'text': 'bar', 'more': 'YYY'}]),
|
|
}
|
|
data_source.store()
|
|
|
|
BlockDef.wipe()
|
|
block = BlockDef()
|
|
block.name = 'foobar'
|
|
block.fields = [
|
|
fields.StringField(id='1', label='String', type='string', varname='string'),
|
|
fields.ItemField(id='2', label='Item', type='item', data_source={'type': 'foobar'}, varname='item'),
|
|
fields.BoolField(id='3', label='Bool', type='bool', varname='bool'),
|
|
fields.DateField(id='4', label='Date', type='date', varname='date'),
|
|
fields.EmailField(id='5', label='Email', type='email', varname='email'),
|
|
]
|
|
block.store()
|
|
|
|
FormDef.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form-title'
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.fields = [
|
|
fields.BlockField(id='0', label='Block Data', varname='blockdata', type='block:foobar', max_items=3),
|
|
]
|
|
formdef.workflow_roles = {'_receiver': role.id}
|
|
formdef.store()
|
|
|
|
data_class = formdef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(10):
|
|
formdata = data_class()
|
|
formdata.data = {
|
|
'0': {
|
|
'data': [
|
|
{
|
|
'1': 'plop%s' % i,
|
|
'2': '1' if i % 2 else '2',
|
|
'2_display': 'foo' if i % 2 else 'bar',
|
|
'2_structured': 'XXX' if i % 2 else 'YYY',
|
|
'3': bool(i % 2),
|
|
'4': '2021-06-%02d' % (i + 1),
|
|
'5': 'a@localhost' if i % 2 else 'b@localhost',
|
|
},
|
|
],
|
|
'schema': {}, # not important here
|
|
},
|
|
'0_display': 'hello',
|
|
}
|
|
if i == 0:
|
|
formdata.data['0']['data'].append(
|
|
{
|
|
'1': 'plop%s' % i,
|
|
'2': '1',
|
|
'2_display': 'foo',
|
|
'2_structured': 'XXX',
|
|
'3': True,
|
|
'4': '2021-06-02',
|
|
'5': 'a@localhost',
|
|
},
|
|
)
|
|
formdata.just_created()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert '<label><input type="checkbox" name="0-1"/>Block Data / String</label>' in resp
|
|
assert '<label><input type="checkbox" name="0-2"/>Block Data / Item</label>' in resp
|
|
assert '<label><input type="checkbox" name="0-3"/>Block Data / Bool</label>' in resp
|
|
assert '<label><input type="checkbox" name="0-4"/>Block Data / Date</label>' in resp
|
|
assert '<label><input type="checkbox" name="0-5"/>Block Data / Email</label>' in resp
|
|
|
|
# string
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-0-1'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.forms['listing-settings']['filter-0-1-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-0-1-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-0-1-operator'].options] == [
|
|
'eq',
|
|
'ne',
|
|
'lt',
|
|
'lte',
|
|
'gt',
|
|
'gte',
|
|
]
|
|
resp.forms['listing-settings']['filter-0-1-value'].value = 'plop0'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 1
|
|
resp.forms['listing-settings']['filter-0-1-value'].value = 'plop2'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 1
|
|
resp.forms['listing-settings']['filter-0-1-value'].value = 'plop10'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 0
|
|
resp.forms['listing-settings']['filter-0-1-value'].value = 'plop2'
|
|
resp.forms['listing-settings']['filter-0-1-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 9
|
|
|
|
# item
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-0-2'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.forms['listing-settings']['filter-0-2-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-0-2-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-0-2-operator'].options] == [
|
|
'eq',
|
|
'ne',
|
|
'lt',
|
|
'lte',
|
|
'gt',
|
|
'gte',
|
|
]
|
|
resp.forms['listing-settings']['filter-0-2-value'].value = '1'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 6
|
|
resp.forms['listing-settings']['filter-0-2-value'].value = '2'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 5
|
|
resp2 = app.get(resp.request.path + 'filter-options?filter_field_id=0-2&_search=foo')
|
|
assert [x['id'] for x in resp2.json['data']] == ['1']
|
|
resp2 = app.get(resp.request.path + 'filter-options?filter_field_id=0-2&_search=bar')
|
|
assert [x['id'] for x in resp2.json['data']] == ['2']
|
|
resp.forms['listing-settings']['filter-0-2-value'].value = '1'
|
|
resp.forms['listing-settings']['filter-0-2-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 4
|
|
|
|
# bool
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-0-3'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.forms['listing-settings']['filter-0-3-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-0-3-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-0-3-operator'].options] == ['eq', 'ne']
|
|
resp.forms['listing-settings']['filter-0-3-value'].value = 'true'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 6
|
|
resp.forms['listing-settings']['filter-0-3-value'].value = 'false'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 5
|
|
resp.forms['listing-settings']['filter-0-3-value'].value = 'false'
|
|
resp.forms['listing-settings']['filter-0-3-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 5
|
|
|
|
# date
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-0-4'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.forms['listing-settings']['filter-0-4-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-0-4-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-0-4-operator'].options] == [
|
|
'eq',
|
|
'ne',
|
|
'lt',
|
|
'lte',
|
|
'gt',
|
|
'gte',
|
|
]
|
|
resp.forms['listing-settings']['filter-0-4-value'].value = '2021-06-01'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 1
|
|
resp.forms['listing-settings']['filter-0-4-value'].value = '2021-06-02'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 2
|
|
resp.forms['listing-settings']['filter-0-4-value'].value = '02/06/2021'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 2
|
|
resp.forms['listing-settings']['filter-0-4-value'].value = '2021-06-02'
|
|
resp.forms['listing-settings']['filter-0-4-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 8
|
|
|
|
# email
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-0-5'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.forms['listing-settings']['filter-0-5-value'].value == ''
|
|
assert resp.forms['listing-settings']['filter-0-5-operator'].value == 'eq'
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-0-5-operator'].options] == ['eq', 'ne']
|
|
resp.forms['listing-settings']['filter-0-5-value'].value = 'a@localhost'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 6
|
|
resp.forms['listing-settings']['filter-0-5-value'].value = 'b@localhost'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 5
|
|
resp.forms['listing-settings']['filter-0-5-value'].value = 'c@localhost'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 0
|
|
resp.forms['listing-settings']['filter-0-5-value'].value = 'a@localhost'
|
|
resp.forms['listing-settings']['filter-0-5-operator'].value = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 4
|
|
|
|
# mix
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['filter-0-1'].checked = True
|
|
resp.forms['listing-settings']['filter-0-2'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['listing-settings']['filter-0-1-value'].value = 'plop1'
|
|
resp.forms['listing-settings']['filter-0-2-value'].value = '1'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 1
|
|
resp.forms['listing-settings']['filter-0-1-value'].value = 'plop0'
|
|
resp.forms['listing-settings']['filter-0-2-value'].value = '1'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 1
|
|
resp.forms['listing-settings']['filter-0-1-value'].value = 'plop0'
|
|
resp.forms['listing-settings']['filter-0-2-value'].value = '2'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 1 + 1
|