1242 lines
44 KiB
Python
1242 lines
44 KiB
Python
import os
|
|
import re
|
|
|
|
import pytest
|
|
from quixote import get_publisher
|
|
|
|
from wcs import fields
|
|
from wcs.carddef import CardDef
|
|
from wcs.formdef import FormDef
|
|
from wcs.qommon.http_request import HTTPRequest
|
|
from wcs.qommon.ident.password_accounts import PasswordAccount
|
|
|
|
from ..utilities import clean_temporary_pub, create_temporary_pub, get_app, login
|
|
from .test_all import create_superuser, create_user
|
|
|
|
|
|
@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_custom_view(pub):
|
|
create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [
|
|
fields.ItemField(
|
|
id='1',
|
|
label='field',
|
|
type='item',
|
|
items=['foo', 'bar', 'baz'],
|
|
display_locations=['validation', 'summary', 'listings'],
|
|
),
|
|
]
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
formdef.store()
|
|
|
|
formdef.data_class().wipe()
|
|
for i in range(3):
|
|
formdata = formdef.data_class()()
|
|
formdata.data = {}
|
|
if i == 0:
|
|
formdata.data['1'] = 'foo'
|
|
formdata.data['1_display'] = 'foo'
|
|
else:
|
|
formdata.data['1'] = 'baz'
|
|
formdata.data['1_display'] = 'baz'
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
other_formdef = FormDef()
|
|
other_formdef.workflow_roles = {'_receiver': 1}
|
|
other_formdef.name = 'other form'
|
|
other_formdef.fields = []
|
|
other_formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert resp.text.count('<span>User Label</span>') == 1
|
|
assert resp.text.count('<tr') == 4
|
|
|
|
# create a view for all, with the same slug
|
|
custom_view = pub.custom_view_class()
|
|
custom_view.title = 'custom test view'
|
|
custom_view.formdef = formdef
|
|
custom_view.visibility = 'any'
|
|
custom_view.columns = {'list': [{'id': 'id'}]}
|
|
custom_view.filters = {}
|
|
custom_view.store()
|
|
|
|
# columns
|
|
resp.forms['listing-settings']['user-label'].checked = False
|
|
resp = resp.forms['listing-settings'].submit()
|
|
# filters
|
|
resp.forms['listing-settings']['filter-1'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
resp.forms['listing-settings']['filter-1-value'] = 'baz'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
assert resp.text.count('<span>User Label</span>') == 0
|
|
assert resp.text.count('<tr') == 3
|
|
|
|
resp.forms['save-custom-view']['title'] = 'custom test view'
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert resp.location.endswith('/user-custom-test-view/')
|
|
resp = resp.follow()
|
|
assert resp.text.count('<span>User Label</span>') == 0
|
|
assert resp.text.count('<tr') == 3
|
|
assert resp.pyquery('#sidebar-custom-views li.active a').attr['href'] == '../user-custom-test-view/'
|
|
|
|
resp = app.get('/backoffice/management/form-title/custom-test-view/')
|
|
assert resp.text.count('<tr') == 4
|
|
assert resp.pyquery('#sidebar-custom-views li.active a').attr['href'] == '../custom-test-view/'
|
|
|
|
resp = app.get('/backoffice/management/form-title/user-custom-test-view/')
|
|
resp.forms['listing-settings']['filter-1-value'] = 'foo'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 2
|
|
assert resp.forms['save-custom-view']['update'].checked is True
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert resp.location.endswith('/user-custom-test-view/')
|
|
resp = resp.follow()
|
|
assert resp.text.count('<tr') == 2
|
|
|
|
resp.forms['listing-settings']['filter-1-value'] = 'foo'
|
|
resp.forms['listing-settings']['filter-1-operator'] = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 3
|
|
assert resp.forms['save-custom-view']['update'].checked is True
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert resp.location.endswith('/user-custom-test-view/')
|
|
resp = resp.follow()
|
|
assert resp.text.count('<tr') == 3
|
|
|
|
custom_view.remove_self()
|
|
resp = app.get('/backoffice/management/other-form/')
|
|
assert 'custom test view' not in resp
|
|
|
|
# check it's not possible to create a view without any columns
|
|
for field_key in resp.forms['listing-settings'].fields:
|
|
if not field_key:
|
|
continue
|
|
if field_key.startswith('filter'):
|
|
continue
|
|
if resp.forms['listing-settings'][field_key].attrs.get('type') != 'checkbox':
|
|
continue
|
|
resp.forms['listing-settings'][field_key].checked = False
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['save-custom-view']['title'] = 'custom test view'
|
|
resp = resp.forms['save-custom-view'].submit().follow()
|
|
assert 'Views must have at least one column.' in resp.text
|
|
|
|
|
|
def test_backoffice_custom_view_unknown_filter(pub):
|
|
create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
formdef.store()
|
|
|
|
formdef.data_class().wipe()
|
|
for i in range(10):
|
|
formdata = formdef.data_class()()
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert resp.text.count('<tr') == 10 + 1
|
|
|
|
custom_view = pub.custom_view_class()
|
|
custom_view.title = 'custom test view'
|
|
custom_view.formdef = formdef
|
|
custom_view.visibility = 'any'
|
|
custom_view.columns = {'list': [{'id': 'id'}]}
|
|
custom_view.filters = {'filter-42': 'on', 'filter-42-value': 'foo', 'filter-foobar': 'baz'}
|
|
custom_view.store()
|
|
|
|
resp = app.get('/backoffice/management/form-title/custom-test-view/')
|
|
assert resp.text.count('<tr') == 1
|
|
assert 'Invalid filters "42", "foobar"' in resp
|
|
|
|
|
|
def test_backoffice_custom_view_bad_filter_type(pub):
|
|
create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [
|
|
fields.ItemField(
|
|
id='1',
|
|
label='field',
|
|
type='item',
|
|
items=['foo', 'bar', 'baz'],
|
|
),
|
|
]
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
formdef.store()
|
|
|
|
formdef.data_class().wipe()
|
|
for i in range(3):
|
|
formdata = formdef.data_class()()
|
|
formdata.data = {}
|
|
if i == 0:
|
|
formdata.data['1'] = 'foo'
|
|
formdata.data['1_display'] = 'foo'
|
|
else:
|
|
formdata.data['1'] = 'baz'
|
|
formdata.data['1_display'] = 'baz'
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert resp.text.count('<tr') == 3 + 1
|
|
|
|
custom_view = pub.custom_view_class()
|
|
custom_view.title = 'custom test view'
|
|
custom_view.formdef = formdef
|
|
custom_view.visibility = 'any'
|
|
custom_view.columns = {'list': [{'id': 'id'}]}
|
|
custom_view.filters = {
|
|
'filter-1-value': ['', 'foo'],
|
|
'filter-1': 'on',
|
|
}
|
|
custom_view.store()
|
|
|
|
resp = app.get('/backoffice/management/form-title/custom-test-view/')
|
|
assert resp.text.count('<tr') == 1
|
|
|
|
|
|
def test_backoffice_custom_view_user_filter(pub):
|
|
superuser = create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [
|
|
fields.ItemField(
|
|
id='1',
|
|
label='field',
|
|
type='item',
|
|
items=['foo', 'bar', 'baz'],
|
|
display_locations=['validation', 'summary', 'listings'],
|
|
),
|
|
]
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
formdef.store()
|
|
|
|
user1 = pub.user_class(name='userA')
|
|
user1.store()
|
|
user2 = pub.user_class(name='userB')
|
|
user2.store()
|
|
|
|
formdef.data_class().wipe()
|
|
for i in range(10):
|
|
formdata = formdef.data_class()()
|
|
formdata.data = {'1': 'foo', '1_display': 'foo'}
|
|
if i < 1:
|
|
formdata.user_id = user1.id
|
|
elif i < 3:
|
|
formdata.user_id = user2.id
|
|
else:
|
|
formdata.user_id = superuser.id
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert resp.text.count('<tr') == 10 + 1
|
|
|
|
# No value selected, no filtering
|
|
resp.forms['listing-settings']['filter-user'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['listing-settings']['filter-user-value'] = ''
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 10 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 1
|
|
assert resp.text.count('"cell-user">userB<') == 2
|
|
assert resp.text.count('"cell-user">admin<') == 7
|
|
resp.forms['save-custom-view']['title'] = 'custom test view'
|
|
resp = resp.forms['save-custom-view'].submit().follow()
|
|
assert resp.text.count('<tr') == 10 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 1
|
|
assert resp.text.count('"cell-user">userB<') == 2
|
|
assert resp.text.count('"cell-user">admin<') == 7
|
|
|
|
# filter on current user
|
|
resp.forms['listing-settings']['filter-user-value'] = '__current__'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.text.count('<tr') == 7 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 0
|
|
assert resp.text.count('"cell-user">userB<') == 0
|
|
assert resp.text.count('"cell-user">admin<') == 7
|
|
resp = resp.forms['save-custom-view'].submit().follow()
|
|
assert resp.text.count('<tr') == 7 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 0
|
|
assert resp.text.count('"cell-user">userB<') == 0
|
|
assert resp.text.count('"cell-user">admin<') == 7
|
|
|
|
# filter on userA
|
|
resp = app.get(
|
|
'/backoffice/management/form-title/user-custom-test-view/?filter-user=on&filter-user-value=%s'
|
|
% user1.id
|
|
)
|
|
assert resp.text.count('<tr') == 1 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 1
|
|
assert resp.text.count('"cell-user">userB<') == 0
|
|
assert resp.text.count('"cell-user">admin<') == 0
|
|
assert '<option value="%s" selected="selected">userA</option>' % user1.id in resp
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp = resp.forms['save-custom-view'].submit().follow()
|
|
assert resp.text.count('<tr') == 1 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 1
|
|
assert resp.text.count('"cell-user">userB<') == 0
|
|
assert resp.text.count('"cell-user">admin<') == 0
|
|
|
|
# filter on unknown
|
|
resp = app.get(
|
|
'/backoffice/management/form-title/user-custom-test-view/?filter-user=on&filter-user-value=unknown'
|
|
)
|
|
assert resp.text.count('<tr') == 0 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 0
|
|
assert resp.text.count('"cell-user">userB<') == 0
|
|
assert resp.text.count('"cell-user">admin<') == 0
|
|
assert '<option value="unknown" selected="selected">Unknown</option>' in resp
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp = resp.forms['save-custom-view'].submit().follow()
|
|
assert resp.text.count('<tr') == 0 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 0
|
|
assert resp.text.count('"cell-user">userB<') == 0
|
|
assert resp.text.count('"cell-user">admin<') == 0
|
|
|
|
# filter on uuid - userB
|
|
user2.name_identifiers = ['0123456789']
|
|
user2.store()
|
|
resp = app.get('/backoffice/management/form-title/user-custom-test-view/?filter-user-uuid=0123456789')
|
|
assert resp.text.count('<tr') == 2 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 0
|
|
assert resp.text.count('"cell-user">userB<') == 2
|
|
assert resp.text.count('"cell-user">admin<') == 0
|
|
assert '<option value="%s" selected="selected">userB</option>' % user2.id in resp
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp = resp.forms['save-custom-view'].submit().follow()
|
|
assert resp.text.count('<tr') == 2 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 0
|
|
assert resp.text.count('"cell-user">userB<') == 2
|
|
assert resp.text.count('"cell-user">admin<') == 0
|
|
|
|
# filter on uuid - current
|
|
resp = app.get('/backoffice/management/form-title/user-custom-test-view/?filter-user-uuid=__current__')
|
|
assert resp.text.count('<tr') == 7 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 0
|
|
assert resp.text.count('"cell-user">userB<') == 0
|
|
assert resp.text.count('"cell-user">admin<') == 7
|
|
assert '<option value="__current__" selected="selected">Current user</option>' in resp
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp = resp.forms['save-custom-view'].submit().follow()
|
|
assert resp.text.count('<tr') == 7 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 0
|
|
assert resp.text.count('"cell-user">userB<') == 0
|
|
assert resp.text.count('"cell-user">admin<') == 7
|
|
|
|
# filter on uuid - unknown
|
|
resp = app.get('/backoffice/management/form-title/user-custom-test-view/?filter-user-uuid=unknown')
|
|
assert resp.text.count('<tr') == 0 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 0
|
|
assert resp.text.count('"cell-user">userB<') == 0
|
|
assert resp.text.count('"cell-user">admin<') == 0
|
|
assert '<option value="-1" selected="selected">Unknown</option>' in resp
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp = resp.forms['save-custom-view'].submit().follow()
|
|
assert resp.text.count('<tr') == 0 + 1
|
|
assert resp.text.count('"cell-user">userA<') == 0
|
|
assert resp.text.count('"cell-user">userB<') == 0
|
|
assert resp.text.count('"cell-user">admin<') == 0
|
|
|
|
|
|
def test_backoffice_custom_view_status_filter(pub):
|
|
create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [
|
|
fields.ItemField(
|
|
id='1',
|
|
label='field',
|
|
type='item',
|
|
items=['foo', 'bar', 'baz'],
|
|
display_locations=['validation', 'summary', 'listings'],
|
|
),
|
|
]
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
formdef.store()
|
|
|
|
formdef.data_class().wipe()
|
|
for i in range(3):
|
|
formdata = formdef.data_class()()
|
|
formdata.data = {}
|
|
if i == 0:
|
|
formdata.data['1'] = 'foo'
|
|
formdata.data['1_display'] = 'foo'
|
|
else:
|
|
formdata.data['1'] = 'baz'
|
|
formdata.data['1_display'] = 'baz'
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
# change status of latest
|
|
formdata.jump_status('rejected')
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert resp.pyquery('tbody tr').length == 2
|
|
|
|
# filters
|
|
resp.forms['listing-settings']['filter'].value = 'rejected'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
assert resp.pyquery('tbody tr').length == 1
|
|
|
|
resp.forms['save-custom-view']['title'] = 'custom test view'
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert resp.location.endswith('/user-custom-test-view/')
|
|
resp = resp.follow()
|
|
assert resp.pyquery('tbody tr').length == 1
|
|
|
|
resp.forms['listing-settings']['filter-operator'] = 'ne'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.pyquery('tbody tr').length == 2
|
|
assert resp.forms['save-custom-view']['update'].checked is True
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert pub.custom_view_class.select()[0].filters == {
|
|
'filter-operator': 'ne',
|
|
'filter': 'rejected',
|
|
'filter-status': 'on',
|
|
}
|
|
assert resp.location.endswith('/user-custom-test-view/')
|
|
resp = resp.follow()
|
|
assert resp.forms['listing-settings']['filter-operator'].value == 'ne'
|
|
assert resp.pyquery('tbody tr').length == 2
|
|
|
|
|
|
def test_backoffice_custom_view_delete(pub):
|
|
user = create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
custom_view = pub.custom_view_class()
|
|
custom_view.title = 'custom test view'
|
|
custom_view.formdef = formdef
|
|
custom_view.visibility = 'any'
|
|
custom_view.columns = {'list': [{'id': 'id'}]}
|
|
custom_view.filters = {}
|
|
custom_view.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/custom-test-view/')
|
|
|
|
resp = resp.click('Delete')
|
|
resp = resp.form.submit()
|
|
assert resp.location.endswith('/management/form-title/')
|
|
resp = resp.follow()
|
|
assert 'custom test view' not in resp.text
|
|
|
|
CardDef.wipe()
|
|
carddef = CardDef()
|
|
carddef.name = 'foo'
|
|
carddef.fields = [
|
|
fields.StringField(id='1', label='Test', type='string', varname='foo'),
|
|
]
|
|
carddef.backoffice_submission_roles = user.roles
|
|
carddef.workflow_roles = {'_editor': user.roles[0]}
|
|
carddef.digest_templates = {
|
|
'default': 'plop',
|
|
'custom-view:custom-test-view': 'FOO {{ form_var_foo }}',
|
|
'custom-view:another-view': '{{ form_var_foo }}',
|
|
}
|
|
carddef.store()
|
|
|
|
custom_view = pub.custom_view_class()
|
|
custom_view.title = 'custom test view'
|
|
custom_view.formdef = carddef
|
|
custom_view.visibility = 'datasource'
|
|
custom_view.columns = {'list': [{'id': 'id'}]}
|
|
custom_view.filters = {}
|
|
custom_view.store()
|
|
|
|
resp = app.get('/backoffice/data/foo/custom-test-view/')
|
|
resp = resp.click('Delete')
|
|
resp = resp.form.submit()
|
|
assert resp.location.endswith('/data/foo/')
|
|
resp = resp.follow()
|
|
assert 'custom test view' not in resp.text
|
|
|
|
carddef.refresh_from_storage()
|
|
assert carddef.digest_templates == {
|
|
'default': 'plop',
|
|
'custom-view:another-view': '{{ form_var_foo }}',
|
|
}
|
|
|
|
|
|
def test_backoffice_custom_map_view(pub):
|
|
user = create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [
|
|
fields.StringField(
|
|
id='1', label='1st field', type='string', display_locations=['validation', 'summary', 'listings']
|
|
),
|
|
]
|
|
formdef.geolocations = {'base': 'Geolocafoobar'}
|
|
formdef.store()
|
|
|
|
custom_view = pub.custom_view_class()
|
|
custom_view.title = 'custom test view'
|
|
custom_view.formdef = formdef
|
|
custom_view.visibility = 'any'
|
|
custom_view.columns = {'list': [{'id': '1'}]}
|
|
custom_view.filters = {'filter-1': True, 'filter-1-value': 'baz'}
|
|
custom_view.user = user
|
|
custom_view.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/custom-test-view/')
|
|
resp = resp.click('Plot on a Map')
|
|
assert resp.forms['listing-settings']['filter-1-value'].value == 'baz'
|
|
|
|
|
|
def test_backoffice_custom_view_reserved_slug(pub):
|
|
create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
|
|
resp.forms['listing-settings']['user-label'].checked = False
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['save-custom-view']['title'] = 'user custom test view'
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
# check slug not created with "user" as prefix
|
|
assert resp.location.endswith('/user-userx-custom-test-view/')
|
|
resp = resp.follow()
|
|
|
|
for view_slug in ('Export', 'Geojson', 'ics'):
|
|
# check slug not created with view name
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp.forms['listing-settings']['user-label'].checked = False
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['save-custom-view']['title'] = view_slug
|
|
resp.forms['save-custom-view']['visibility'] = 'any'
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert resp.location.endswith('/x-%s/' % view_slug.lower())
|
|
resp = resp.follow()
|
|
|
|
|
|
def test_backoffice_custom_view_visibility(pub):
|
|
create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
formdef.store()
|
|
|
|
agent = pub.user_class(name='agent')
|
|
agent.roles = [formdef.workflow_roles['_receiver']]
|
|
agent.store()
|
|
|
|
account = PasswordAccount(id='agent')
|
|
account.set_password('agent')
|
|
account.user_id = agent.id
|
|
account.store()
|
|
|
|
app = login(get_app(pub), username='agent', password='agent')
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
|
|
# columns
|
|
resp.forms['listing-settings']['user-label'].checked = False
|
|
resp = resp.forms['listing-settings'].submit()
|
|
|
|
assert resp.text.count('<span>User Label</span>') == 0
|
|
|
|
resp.forms['save-custom-view']['title'] = 'custom test view'
|
|
assert 'visibility' not in resp.forms['save-custom-view'].fields
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert resp.location.endswith('/user-custom-test-view/')
|
|
resp = resp.follow()
|
|
assert resp.text.count('<span>User Label</span>') == 0
|
|
|
|
# second agent
|
|
agent2 = pub.user_class(name='agent2')
|
|
agent2.roles = [formdef.workflow_roles['_receiver']]
|
|
agent2.store()
|
|
|
|
account = PasswordAccount(id='agent2')
|
|
account.set_password('agent2')
|
|
account.user_id = agent2.id
|
|
account.store()
|
|
|
|
app = login(get_app(pub), username='agent2', password='agent2')
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert 'custom test view' not in resp
|
|
|
|
# shared custom view
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['save-custom-view']['title'] = 'shared view'
|
|
resp.forms['save-custom-view']['visibility'] = 'any'
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
|
|
app = login(get_app(pub), username='agent2', password='agent2')
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.click('shared view')
|
|
|
|
# don't allow a second "any" view with same slug
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['save-custom-view']['title'] = 'shared view'
|
|
resp.forms['save-custom-view']['visibility'] = 'any'
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert {(x.slug, x.visibility) for x in get_publisher().custom_view_class.select()} == {
|
|
('custom-test-view', 'owner'),
|
|
('shared-view', 'any'),
|
|
('shared-view-2', 'any'),
|
|
}
|
|
|
|
|
|
def test_backoffice_custom_view_is_default(pub):
|
|
create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
formdef.store()
|
|
|
|
# private custom view
|
|
agent = pub.user_class(name='agent')
|
|
agent.roles = [formdef.workflow_roles['_receiver']]
|
|
agent.store()
|
|
account = PasswordAccount(id='agent')
|
|
account.set_password('agent')
|
|
account.user_id = agent.id
|
|
account.store()
|
|
app = login(get_app(pub), username='agent', password='agent')
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['save-custom-view']['title'] = 'view 1'
|
|
resp.forms['save-custom-view']['is_default'] = True
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
|
|
# other private custom view
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['save-custom-view']['title'] = 'view 2'
|
|
resp.forms['save-custom-view']['visibility'] = 'owner'
|
|
resp.forms['save-custom-view']['is_default'] = True
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
|
|
# shared custom view
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['save-custom-view']['title'] = 'view 3'
|
|
resp.forms['save-custom-view']['visibility'] = 'any'
|
|
resp.forms['save-custom-view']['is_default'] = True
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
|
|
assert pub.custom_view_class.count() == 3
|
|
assert pub.custom_view_class.get(1).is_default is True # simple user - private
|
|
assert pub.custom_view_class.get(2).is_default is True # super user - private
|
|
assert pub.custom_view_class.get(3).is_default is True # super user - shared
|
|
|
|
# not possible to define more than one default private view
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['save-custom-view']['title'] = 'view 4'
|
|
resp.forms['save-custom-view']['visibility'] = 'owner'
|
|
resp.forms['save-custom-view']['is_default'] = True
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert pub.custom_view_class.count() == 4
|
|
assert pub.custom_view_class.get(1).is_default is True # simple user - private
|
|
assert pub.custom_view_class.get(2).is_default is False # super user - private
|
|
assert pub.custom_view_class.get(3).is_default is True # super user - shared
|
|
assert pub.custom_view_class.get(4).is_default is True # super user - private 2
|
|
|
|
# not possible to define more than one default shared view
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['save-custom-view']['title'] = 'view 5'
|
|
resp.forms['save-custom-view']['visibility'] = 'any'
|
|
resp.forms['save-custom-view']['is_default'] = True
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert pub.custom_view_class.count() == 5
|
|
assert pub.custom_view_class.get(1).is_default is True # simple user - private
|
|
assert pub.custom_view_class.get(2).is_default is False # super user - private
|
|
assert pub.custom_view_class.get(3).is_default is False # super user - shared
|
|
assert pub.custom_view_class.get(4).is_default is True # super user - private 2
|
|
assert pub.custom_view_class.get(5).is_default is True # super user - shared 2
|
|
|
|
|
|
def test_backoffice_default_custom_view(pub):
|
|
user = create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [
|
|
fields.ItemField(
|
|
id='1',
|
|
label='field 1',
|
|
type='item',
|
|
items=['foo', 'bar', 'baz'],
|
|
display_locations=['validation', 'summary', 'listings'],
|
|
),
|
|
]
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
formdef.store()
|
|
|
|
formdef.data_class().wipe()
|
|
for i in range(4):
|
|
formdata = formdef.data_class()()
|
|
formdata.data = {}
|
|
if i == 0:
|
|
formdata.data['1'] = 'foo'
|
|
formdata.data['1_display'] = 'foo'
|
|
else:
|
|
formdata.data['1'] = 'baz'
|
|
formdata.data['1_display'] = 'baz'
|
|
if i < 3:
|
|
formdata.jump_status('new')
|
|
else:
|
|
formdata.status = 'draft'
|
|
formdata.store()
|
|
|
|
app = login(get_app(pub))
|
|
# define a shared default view
|
|
custom_view = pub.custom_view_class()
|
|
custom_view.title = 'shared custom test view'
|
|
custom_view.formdef = formdef
|
|
custom_view.visibility = 'any'
|
|
custom_view.columns = {'list': [{'id': 'id'}]}
|
|
custom_view.filters = {
|
|
'filter-1-value': 'foo',
|
|
'filter-1-operator': 'ne',
|
|
'filter': 'all',
|
|
'filter-1': 'on',
|
|
'filter-status': 'on',
|
|
}
|
|
custom_view.user = user
|
|
custom_view.is_default = True
|
|
custom_view.store()
|
|
resp = app.get('/backoffice/management/form-title/shared-custom-test-view/')
|
|
assert resp.text.count('<span>User Label</span>') == 0
|
|
assert resp.text.count('<span>field 1</span>') == 0
|
|
assert resp.text.count('<tr') == 3
|
|
|
|
# check that default view is applied
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert resp.text.count('<span>User Label</span>') == 0
|
|
assert resp.text.count('<span>field 1</span>') == 0
|
|
assert resp.text.count('<tr') == 3
|
|
|
|
# define a user default view
|
|
custom_view = pub.custom_view_class()
|
|
custom_view.title = 'private custom test view'
|
|
custom_view.formdef = formdef
|
|
custom_view.visibility = 'owner'
|
|
custom_view.columns = {'list': [{'id': '1'}]}
|
|
custom_view.filters = {'filter-1-value': 'foo', 'filter': 'all', 'filter-1': 'on', 'filter-status': 'on'}
|
|
custom_view.user = user
|
|
custom_view.is_default = True
|
|
custom_view.store()
|
|
resp = app.get('/backoffice/management/form-title/user-private-custom-test-view/')
|
|
assert resp.text.count('<span>User Label</span>') == 0
|
|
assert resp.text.count('<span>field 1</span>') == 1
|
|
assert resp.text.count('<tr') == 2
|
|
|
|
# check that private default view is applied, and not shared default view
|
|
resp = app.get('/backoffice/management/form-title/')
|
|
assert resp.text.count('<span>User Label</span>') == 0
|
|
assert resp.text.count('<span>field 1</span>') == 1
|
|
assert resp.text.count('<tr') == 2
|
|
|
|
|
|
@pytest.mark.parametrize('klass', [FormDef, CardDef])
|
|
def test_backoffice_missing_custom_view(pub, klass):
|
|
create_superuser(pub)
|
|
|
|
klass.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = klass()
|
|
formdef.name = 'form title'
|
|
formdef.fields = []
|
|
formdef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get(formdef.get_url(backoffice=True) + 'user-plop/')
|
|
assert resp.location == formdef.get_url(backoffice=True)
|
|
resp = resp.follow()
|
|
assert 'A missing or invalid custom view was referenced' in resp
|
|
|
|
resp = app.get(formdef.get_url(backoffice=True) + 'user-plop/1/')
|
|
assert resp.location == formdef.get_url(backoffice=True) + '1/'
|
|
|
|
resp = app.get(formdef.get_url(backoffice=True) + 'user-plop/1/?plop')
|
|
assert resp.location == formdef.get_url(backoffice=True) + '1/?plop'
|
|
|
|
|
|
def test_backoffice_custom_view_columns(pub):
|
|
create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [
|
|
fields.ItemField(
|
|
id='1',
|
|
label='field 1',
|
|
type='item',
|
|
items=['foo', 'bar', 'baz'],
|
|
display_locations=['validation', 'summary', 'listings'],
|
|
),
|
|
]
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
formdef.store()
|
|
|
|
custom_view = pub.custom_view_class()
|
|
custom_view.title = 'shared custom test view'
|
|
custom_view.formdef = formdef
|
|
custom_view.visibility = 'any'
|
|
custom_view.columns = {'list': [{'id': 'id'}]}
|
|
custom_view.filters = {}
|
|
custom_view.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/shared-custom-test-view/')
|
|
assert '<span>Number</span></th>' in resp
|
|
|
|
custom_view.columns = {'list': [{'id': 'unknown'}]}
|
|
custom_view.store()
|
|
resp = app.get('/backoffice/management/form-title/shared-custom-test-view/')
|
|
assert '<th></th>' in resp # columns not found
|
|
|
|
|
|
def test_backoffice_custom_view_sort_field(pub):
|
|
create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [
|
|
fields.ItemField(
|
|
id='1',
|
|
label='field 1',
|
|
type='item',
|
|
items=['foo', 'bar', 'baz'],
|
|
display_locations=['validation', 'summary', 'listings'],
|
|
),
|
|
]
|
|
formdef.workflow_roles = {'_receiver': 1}
|
|
formdef.store()
|
|
|
|
formdef.data_class().wipe()
|
|
formdata = formdef.data_class()()
|
|
formdata.data = {'1': 'foo', '1_display': 'foo'}
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
formdata = formdef.data_class()()
|
|
formdata.data = {'1': 'bar', '1_display': 'bar'}
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
formdata = formdef.data_class()()
|
|
formdata.data = {'1': 'baz', '1_display': 'baz'}
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
custom_view = pub.custom_view_class()
|
|
custom_view.title = 'shared custom test view'
|
|
custom_view.formdef = formdef
|
|
custom_view.visibility = 'any'
|
|
custom_view.columns = {'list': [{'id': 'id'}]}
|
|
custom_view.filters = {}
|
|
custom_view.order_by = 'f1'
|
|
custom_view.is_default = True
|
|
custom_view.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/shared-custom-test-view/')
|
|
assert resp.text.count('<tr') == 4
|
|
# bar, baz, foo
|
|
assert re.findall(r'<a href="(\d)/">1-(\d)</a>', resp.text) == [('2', '2'), ('3', '3'), ('1', '1')]
|
|
|
|
custom_view.order_by = '-f1'
|
|
custom_view.store()
|
|
resp = app.get('/backoffice/management/form-title/shared-custom-test-view/')
|
|
assert resp.text.count('<tr') == 4
|
|
# foo, baz, bar
|
|
assert re.findall(r'<a href="(\d)/">1-(\d)</a>', resp.text) == [('1', '1'), ('3', '3'), ('2', '2')]
|
|
|
|
custom_view.order_by = 'unknown'
|
|
custom_view.store()
|
|
# unknown sort field, ignore it
|
|
resp = app.get('/backoffice/management/form-title/shared-custom-test-view/')
|
|
assert resp.text.count('<tr') == 4
|
|
|
|
|
|
def test_carddata_custom_view(pub):
|
|
user = create_user(pub)
|
|
|
|
CardDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
carddef = CardDef()
|
|
carddef.name = 'foo'
|
|
carddef.fields = [
|
|
fields.StringField(id='1', label='Test', type='string', varname='foo'),
|
|
]
|
|
carddef.backoffice_submission_roles = user.roles
|
|
carddef.workflow_roles = {'_editor': user.roles[0]}
|
|
carddef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/data/foo/')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['save-custom-view']['title'] = 'card view'
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert resp.location.endswith('/user-card-view/')
|
|
resp = resp.follow()
|
|
|
|
|
|
def test_carddata_custom_view_is_default(pub):
|
|
user = create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='foobar')
|
|
role.store()
|
|
user.roles = [role.id]
|
|
user.store()
|
|
|
|
CardDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
carddef = CardDef()
|
|
carddef.name = 'foo'
|
|
carddef.fields = [
|
|
fields.StringField(id='1', label='Test', type='string', varname='foo'),
|
|
]
|
|
carddef.backoffice_submission_roles = user.roles
|
|
carddef.digest_templates = {'default': '{{ form_var_foo }}'}
|
|
carddef.store()
|
|
carddef.data_class().wipe()
|
|
|
|
# datasource custom view
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/data/foo/')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
resp.forms['save-custom-view']['title'] = 'view 3'
|
|
resp.forms['save-custom-view']['visibility'] = 'datasource'
|
|
resp.forms['save-custom-view']['is_default'] = True
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert pub.custom_view_class.get(1).is_default is False # not for datasource
|
|
|
|
|
|
def test_carddata_custom_view_digest_template(pub):
|
|
user = create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
role = pub.role_class(name='foobar')
|
|
role.store()
|
|
user.roles = [role.id]
|
|
user.store()
|
|
|
|
CardDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
carddef = CardDef()
|
|
carddef.name = 'foo'
|
|
carddef.fields = [
|
|
fields.StringField(id='1', label='Test', type='string', varname='foo'),
|
|
]
|
|
carddef.backoffice_submission_roles = user.roles
|
|
carddef.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/data/foo/')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.forms['save-custom-view']['digest_template'].value == ''
|
|
resp.forms['save-custom-view']['title'] = 'some view'
|
|
resp.forms['save-custom-view']['visibility'] = 'any'
|
|
resp.forms['save-custom-view']['digest_template'] = 'FOO {{ form_var_foo }} bar'
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert CardDef.get(1).digest_templates == {'custom-view:some-view': 'FOO {{ form_var_foo }} bar'}
|
|
assert resp.location.endswith('/some-view/')
|
|
|
|
resp = resp.follow()
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.forms['save-custom-view']['digest_template'].value == 'FOO {{ form_var_foo }} bar'
|
|
assert resp.forms['save-custom-view']['update'].checked is True
|
|
resp.forms['save-custom-view']['digest_template'] = 'FOO {{ form_var_foo }}'
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert CardDef.get(1).digest_templates == {'custom-view:some-view': 'FOO {{ form_var_foo }}'}
|
|
|
|
carddef = CardDef.get(1)
|
|
carddef.digest_templates['default'] = 'plop'
|
|
carddef.store()
|
|
resp = app.get('/backoffice/data/foo/')
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert resp.forms['save-custom-view']['digest_template'].value == 'plop'
|
|
resp.forms['save-custom-view']['title'] = 'another view'
|
|
resp.forms['save-custom-view']['visibility'] = 'any'
|
|
resp.forms['save-custom-view']['digest_template'] = '{{ form_var_foo }}'
|
|
resp = resp.forms['save-custom-view'].submit()
|
|
assert CardDef.get(1).digest_templates == {
|
|
'default': 'plop',
|
|
'custom-view:some-view': 'FOO {{ form_var_foo }}',
|
|
'custom-view:another-view': '{{ form_var_foo }}',
|
|
}
|
|
|
|
|
|
def test_backoffice_custom_view_keep_filters(pub):
|
|
user = create_superuser(pub)
|
|
|
|
datasource = {
|
|
'type': 'jsonvalue',
|
|
'value': '[{"id": "A", "text": "aa"}, {"id": "B", "text": "bb"}, {"id": "C", "text": "cc"}]',
|
|
}
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [
|
|
fields.StringField(
|
|
id='1', label='1st field', type='string', display_locations=['validation', 'summary', 'listings']
|
|
),
|
|
fields.ItemField(id='2', label='2nd field', type='item', data_source=datasource, varname='foo'),
|
|
]
|
|
formdef.store()
|
|
|
|
custom_view = pub.custom_view_class()
|
|
custom_view.title = 'custom test view'
|
|
custom_view.formdef = formdef
|
|
custom_view.visibility = 'owner'
|
|
custom_view.columns = {'list': [{'id': '1'}]}
|
|
custom_view.filters = {'filter-1': True, 'filter-1-value': 'baz', 'filter-1-operator': 'lte'}
|
|
custom_view.user = user
|
|
custom_view.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/user-custom-test-view/')
|
|
assert 'filter-1-value' in resp.forms['listing-settings'].fields
|
|
assert 'filter-1-operator' in resp.forms['listing-settings'].fields
|
|
assert 'filter-2-value' not in resp.forms['listing-settings'].fields
|
|
assert 'filter-2-operator' not in resp.forms['listing-settings'].fields
|
|
|
|
resp = app.get('/backoffice/management/form-title/user-custom-test-view/?filter-foo=A')
|
|
assert 'filter-1-value' not in resp.forms['listing-settings'].fields
|
|
assert 'filter-1-operator' not in resp.forms['listing-settings'].fields
|
|
assert 'filter-2-value' in resp.forms['listing-settings'].fields
|
|
assert 'filter-2-operator' in resp.forms['listing-settings'].fields
|
|
|
|
resp = app.get(
|
|
'/backoffice/management/form-title/user-custom-test-view/?filter-foo=A&keep-view-filters=on'
|
|
)
|
|
assert 'filter-1-value' in resp.forms['listing-settings'].fields
|
|
assert 'filter-1-operator' in resp.forms['listing-settings'].fields
|
|
assert 'filter-2-value' in resp.forms['listing-settings'].fields
|
|
assert 'filter-2-operator' in resp.forms['listing-settings'].fields
|
|
|
|
|
|
def test_backoffice_custom_view_boolean_filters(pub):
|
|
user = create_superuser(pub)
|
|
|
|
FormDef.wipe()
|
|
pub.custom_view_class.wipe()
|
|
formdef = FormDef()
|
|
formdef.name = 'form title'
|
|
formdef.fields = [
|
|
fields.BoolField(
|
|
id='1', label='1st field', type='bool', display_locations=['validation', 'summary', 'listings']
|
|
),
|
|
]
|
|
formdef.store()
|
|
formdef.data_class().wipe()
|
|
for value in [True] * 5 + [False] * 2:
|
|
formdata = formdef.data_class()()
|
|
formdata.data = {'1': value}
|
|
formdata.jump_status('new')
|
|
formdata.store()
|
|
|
|
custom_view = pub.custom_view_class()
|
|
custom_view.title = 'custom test view'
|
|
custom_view.formdef = formdef
|
|
custom_view.visibility = 'owner'
|
|
custom_view.columns = {'list': [{'id': '1'}]}
|
|
custom_view.filters = {'filter-1': True, 'filter-1-value': 'true', 'filter': 'all'}
|
|
custom_view.user = user
|
|
custom_view.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/management/form-title/user-custom-test-view/')
|
|
assert resp.forms['listing-settings']['filter-1-value'].value == 'true'
|
|
assert resp.forms['listing-settings']['filter-1-operator'].value == 'eq'
|
|
assert resp.text.count('data-link=') == 5
|
|
|
|
custom_view.filters = {'filter-1': True, 'filter-1-value': 'false', 'filter': 'all'}
|
|
custom_view.store()
|
|
resp = app.get('/backoffice/management/form-title/user-custom-test-view/')
|
|
assert resp.forms['listing-settings']['filter-1-value'].value == 'false'
|
|
assert resp.forms['listing-settings']['filter-1-operator'].value == 'eq'
|
|
assert resp.text.count('data-link=') == 2
|
|
|
|
custom_view.filters = {
|
|
'filter-1': True,
|
|
'filter-1-value': 'false',
|
|
'filter-1-operator': 'ne',
|
|
'filter': 'all',
|
|
}
|
|
custom_view.store()
|
|
resp = app.get('/backoffice/management/form-title/user-custom-test-view/')
|
|
assert resp.forms['listing-settings']['filter-1-value'].value == 'false'
|
|
assert resp.forms['listing-settings']['filter-1-operator'].value == 'ne'
|
|
assert resp.text.count('data-link=') == 5
|
|
|
|
|
|
def test_item_options_in_dynamic_view(pub):
|
|
pub.user_class.wipe()
|
|
create_superuser(pub)
|
|
pub.role_class.wipe()
|
|
pub.custom_view_class.wipe()
|
|
role = pub.role_class(name='test')
|
|
role.store()
|
|
|
|
CardDef.wipe()
|
|
carddef = CardDef()
|
|
carddef.name = 'card-title'
|
|
carddef.digest_templates = {'default': '{{ form_var_foo }}'}
|
|
carddef.fields = [
|
|
fields.StringField(
|
|
id='1',
|
|
label='1st field',
|
|
type='string',
|
|
),
|
|
fields.ItemField(
|
|
id='4',
|
|
label='4th field',
|
|
type='item',
|
|
items=['â', 'b', 'c', 'd'],
|
|
display_locations=['validation', 'summary', 'listings'],
|
|
),
|
|
]
|
|
carddef.workflow_roles = {'_editor': role.id}
|
|
carddef.store()
|
|
|
|
data_class = carddef.data_class()
|
|
data_class.wipe()
|
|
|
|
for i in range(0, 12):
|
|
carddata = data_class()
|
|
carddata.data = {
|
|
'1': 'plop%s' % (i % 2),
|
|
'4': 'a%s' % (i % 4),
|
|
'4_display': 'a%s' % (i % 4),
|
|
}
|
|
carddata.just_created()
|
|
carddata.store()
|
|
|
|
custom_view = pub.custom_view_class()
|
|
custom_view.title = 'custom test view'
|
|
custom_view.formdef = carddef
|
|
custom_view.visibility = 'datasource'
|
|
custom_view.columns = {'list': [{'id': '1'}]}
|
|
custom_view.filters = {}
|
|
custom_view.store()
|
|
|
|
app = login(get_app(pub))
|
|
resp = app.get('/backoffice/data/card-title/custom-test-view/')
|
|
|
|
# enable both filters
|
|
resp.forms['listing-settings']['filter-1'].checked = True
|
|
resp.forms['listing-settings']['filter-4'].checked = True
|
|
resp = resp.forms['listing-settings'].submit()
|
|
# all used options are listed ({} is "custom value")
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-value'].options] == [
|
|
'',
|
|
'a0',
|
|
'a1',
|
|
'a2',
|
|
'a3',
|
|
'{}',
|
|
]
|
|
|
|
# plain filter, only used options are listed
|
|
resp.forms['listing-settings']['filter-1-value'].value = 'plop0'
|
|
resp.forms['listing-settings']['filter-4-value'].value = 'a0'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-value'].options] == ['', 'a0', 'a2', '{}']
|
|
|
|
# template filter, all options are listed
|
|
resp.forms['listing-settings']['filter-1-value'].value = '{{ test }}'
|
|
resp = resp.forms['listing-settings'].submit()
|
|
assert [x[0] for x in resp.forms['listing-settings']['filter-4-value'].options] == [
|
|
'',
|
|
'a0',
|
|
'a1',
|
|
'a2',
|
|
'a3',
|
|
'{}',
|
|
]
|