5530 |
5530 |
assert resp.form['f1'].options == []
|
5531 |
5531 |
if pub.is_using_postgresql():
|
5532 |
5532 |
assert pub.loggederror_class.count() == 1
|
5533 |
5533 |
logged_error = pub.loggederror_class.select()[0]
|
5534 |
5534 |
assert logged_error.formdef_id == formdef.id
|
5535 |
5535 |
assert logged_error.summary == '[DATASOURCE] Unknown custom view "as-data-source" for CardDef "items"'
|
5536 |
5536 |
|
5537 |
5537 |
|
|
5538 |
def test_dynamic_item_field_with_datasource_from_custom_view_on_cards(pub):
|
|
5539 |
if not pub.is_using_postgresql():
|
|
5540 |
pytest.skip('this requires SQL')
|
|
5541 |
return
|
|
5542 |
|
|
5543 |
pub.role_class.wipe()
|
|
5544 |
pub.custom_view_class.wipe()
|
|
5545 |
|
|
5546 |
user = create_user(pub)
|
|
5547 |
role = pub.role_class(name='xxx')
|
|
5548 |
role.store()
|
|
5549 |
user.roles = [role.id]
|
|
5550 |
user.is_admin = True
|
|
5551 |
user.store()
|
|
5552 |
|
|
5553 |
formdef = create_formdef()
|
|
5554 |
formdef.data_class().wipe()
|
|
5555 |
|
|
5556 |
data_source = {
|
|
5557 |
'type': 'formula',
|
|
5558 |
'value': repr(
|
|
5559 |
[
|
|
5560 |
{'id': '0', 'text': 'foo'},
|
|
5561 |
{'id': '1', 'text': 'bar'},
|
|
5562 |
{'id': '2', 'text': 'baz'},
|
|
5563 |
]
|
|
5564 |
),
|
|
5565 |
}
|
|
5566 |
|
|
5567 |
CardDef.wipe()
|
|
5568 |
carddef = CardDef()
|
|
5569 |
carddef.name = 'items'
|
|
5570 |
carddef.digest_templates = {'default': '{{form_var_attr}}'}
|
|
5571 |
carddef.workflow_roles = {'_editor': user.roles[0]}
|
|
5572 |
carddef.fields = [
|
|
5573 |
fields.ItemField(id='0', type='item', label='item', data_source=data_source),
|
|
5574 |
fields.StringField(id='1', type='string', label='string', varname='attr'),
|
|
5575 |
]
|
|
5576 |
carddef.store()
|
|
5577 |
carddef.data_class().wipe()
|
|
5578 |
baz_ids = set()
|
|
5579 |
for key, value in enumerate(['foo', 'bar', 'baz']):
|
|
5580 |
for i in range(0, 10):
|
|
5581 |
carddata = carddef.data_class()()
|
|
5582 |
carddata.data = {
|
|
5583 |
'0': repr(key),
|
|
5584 |
'0_display': value,
|
|
5585 |
'1': 'attr%s%s' % (key, i),
|
|
5586 |
}
|
|
5587 |
carddata.just_created()
|
|
5588 |
carddata.store()
|
|
5589 |
if value == 'baz':
|
|
5590 |
baz_ids.add(str(carddata.id))
|
|
5591 |
|
|
5592 |
# create custom view
|
|
5593 |
app = login(get_app(pub), username='foo', password='foo')
|
|
5594 |
|
|
5595 |
resp = app.get('/backoffice/data/items/')
|
|
5596 |
if pub.is_using_postgresql():
|
|
5597 |
assert resp.text.count('<tr') == 21 # thead + 20 items (max per page)
|
|
5598 |
else:
|
|
5599 |
assert resp.text.count('<tr') == 31 # thead + all items
|
|
5600 |
resp.forms['listing-settings']['filter-0'].checked = True
|
|
5601 |
resp.forms['listing-settings']['filter-status'].checked = True
|
|
5602 |
resp = resp.forms['listing-settings'].submit()
|
|
5603 |
|
|
5604 |
resp.forms['listing-settings']['filter'].value = 'recorded'
|
|
5605 |
resp = resp.forms['listing-settings'].submit()
|
|
5606 |
|
|
5607 |
resp.forms['save-custom-view']['title'] = 'as data source'
|
|
5608 |
resp.forms['save-custom-view']['visibility'] = 'datasource'
|
|
5609 |
resp = resp.forms['save-custom-view'].submit().follow()
|
|
5610 |
|
|
5611 |
assert resp.forms['listing-settings']['filter-0-value'].attrs['data-allow-template']
|
|
5612 |
assert 'custom value' in [x[2] for x in resp.forms['listing-settings']['filter-0-value'].options]
|
|
5613 |
resp.forms['listing-settings']['filter-0-value'].force_value('{{ form_var_blah_raw }}')
|
|
5614 |
|
|
5615 |
resp = resp.forms['listing-settings'].submit()
|
|
5616 |
assert resp.forms['listing-settings']['filter-0-value'].value == '{{ form_var_blah_raw }}'
|
|
5617 |
assert resp.text.count('<tr') == 1 # thead only
|
|
5618 |
|
|
5619 |
# save custom view with filter
|
|
5620 |
resp = resp.forms['save-custom-view'].submit().follow()
|
|
5621 |
|
|
5622 |
custom_view = pub.custom_view_class.select()[0]
|
|
5623 |
|
|
5624 |
# use custom view as source
|
|
5625 |
ds = {'type': 'carddef:%s:%s' % (carddef.url_name, custom_view.slug)}
|
|
5626 |
formdef.fields = [
|
|
5627 |
fields.ItemField(id='0', type='item', label='item', varname='blah', data_source=data_source),
|
|
5628 |
fields.ItemField(id='1', label='string', type='item', data_source=ds, display_disabled_items=True),
|
|
5629 |
]
|
|
5630 |
formdef.store()
|
|
5631 |
|
|
5632 |
resp = get_app(pub).get('/test/')
|
|
5633 |
assert resp.form['f1'].options == [('', False, '---')]
|
|
5634 |
resp.form['f0'] = '2'
|
|
5635 |
live_resp = app.post('/test/live?modified_field_id=0', params=resp.form.submit_fields())
|
|
5636 |
assert len(live_resp.json['result']['1']['items']) == 10
|
|
5637 |
assert {x['id'] for x in live_resp.json['result']['1']['items']} == baz_ids
|
|
5638 |
|
|
5639 |
resp.form['f1'].options = []
|
|
5640 |
for item in live_resp.json['result']['1']['items']:
|
|
5641 |
# simulate javascript filling the <select>
|
|
5642 |
resp.form['f1'].options.append((item['id'], False, item['text']))
|
|
5643 |
|
|
5644 |
resp.form['f1'] = resp.form['f1'].options[0][0]
|
|
5645 |
resp = resp.form.submit('submit') # -> validation page
|
|
5646 |
resp = resp.form.submit('submit') # -> submit
|
|
5647 |
assert formdef.data_class().select()[0].data['1'] in baz_ids
|
|
5648 |
|
|
5649 |
# same in autocomplete mode
|
|
5650 |
formdef.fields[1].display_mode = 'autocomplete'
|
|
5651 |
formdef.store()
|
|
5652 |
app = get_app(pub)
|
|
5653 |
resp = app.get('/test/')
|
|
5654 |
# simulate select2 mode, with qommon.forms.js adding an extra hidden widget
|
|
5655 |
resp.form.fields['f1_display'] = Hidden(form=resp.form, tag='input', name='f1_display', pos=10)
|
|
5656 |
select2_url = resp.pyquery('select:last').attr['data-select2-url']
|
|
5657 |
resp_json = app.get(select2_url + '?q=')
|
|
5658 |
assert len(resp_json.json['data']) == 0
|
|
5659 |
resp.form['f0'] = '2'
|
|
5660 |
|
|
5661 |
live_resp = app.post('/test/live?modified_field_id=0', params=resp.form.submit_fields())
|
|
5662 |
new_select2_url = live_resp.json['result']['1']['source_url']
|
|
5663 |
resp_json = app.get(new_select2_url + '?q=')
|
|
5664 |
assert len(resp_json.json['data']) == 10
|
|
5665 |
assert {str(x['id']) for x in resp_json.json['data']} == baz_ids
|
|
5666 |
|
|
5667 |
resp.form['f1'].force_value(str(resp_json.json['data'][0]['id']))
|
|
5668 |
resp.form.fields['f1_display'].force_value(resp_json.json['data'][0]['text'])
|
|
5669 |
|
|
5670 |
resp = resp.form.submit('submit') # -> validation page
|
|
5671 |
resp = resp.form.submit('submit') # -> submit
|
|
5672 |
assert formdef.data_class().select()[0].data['1'] in baz_ids
|
|
5673 |
|
|
5674 |
|
5538 |
5675 |
def test_item_field_from_cards_check_lazy_live(pub):
|
5539 |
5676 |
create_user(pub)
|
5540 |
5677 |
formdef = create_formdef()
|
5541 |
5678 |
formdef.data_class().wipe()
|
5542 |
5679 |
|
5543 |
5680 |
CardDef.wipe()
|
5544 |
5681 |
carddef = CardDef()
|
5545 |
5682 |
carddef.name = 'items'
|
5546 |
|
-
|