This commit is contained in:
parent
b6c83cca37
commit
4e0b3469f1
|
@ -3048,6 +3048,65 @@ def test_api_geojson_formdata_related_field(pub, local_user):
|
|||
assert properties['item - foobar'] == 'test.txt'
|
||||
|
||||
|
||||
def test_api_geojson_formdata_file_in_block_field(pub, local_user):
|
||||
pub.role_class.wipe()
|
||||
role = pub.role_class(name='test')
|
||||
role.store()
|
||||
|
||||
# add role to user
|
||||
local_user.roles = [role.id]
|
||||
local_user.store()
|
||||
|
||||
BlockDef.wipe()
|
||||
block = BlockDef()
|
||||
block.name = 'foobar'
|
||||
block.fields = [
|
||||
fields.FileField(id='123', label='file', varname='foo'),
|
||||
]
|
||||
block.store()
|
||||
|
||||
FormDef.wipe()
|
||||
formdef = FormDef()
|
||||
formdef.name = 'test'
|
||||
formdef.workflow_roles = {'_receiver': role.id}
|
||||
formdef.fields = [
|
||||
fields.BlockField(id='1', label='test', varname='blockdata', block_slug='foobar', max_items=3),
|
||||
]
|
||||
formdef.geolocations = {'base': 'Location'}
|
||||
formdef.store()
|
||||
|
||||
data_class = formdef.data_class()
|
||||
data_class.wipe()
|
||||
upload = PicklableUpload('test.txt', 'text/plain', 'ascii')
|
||||
upload.receive([b'base64me'])
|
||||
|
||||
formdata = formdef.data_class()()
|
||||
formdata.data = {'1': {'data': [{'123': upload}], 'schema': {'123': 'file'}}, '1_display': 'test.txt'}
|
||||
formdata.geolocations = {'base': {'lat': 48, 'lon': 2}}
|
||||
formdata.just_created()
|
||||
formdata.store()
|
||||
|
||||
# get with blockfield
|
||||
resp = get_app(pub).get(sign_uri('/api/forms/test/geojson?filter=all&1=on', user=local_user))
|
||||
assert len(resp.json['features']) == 1
|
||||
assert resp.json['features'][0]['properties']['id'] == '1-1'
|
||||
assert resp.json['features'][0]['properties']['display_fields'][0]['value'] == 'test.txt'
|
||||
|
||||
# get with file field in block as property
|
||||
resp = get_app(pub).get(sign_uri('/api/forms/test/geojson?filter=all&1-123=on', user=local_user))
|
||||
assert len(resp.json['features']) == 1
|
||||
assert resp.json['features'][0]['properties']['id'] == '1-1'
|
||||
assert resp.json['features'][0]['properties']['display_fields'][0]['value'] == 'test.txt'
|
||||
assert 'download?f=1$0$123' in resp.json['features'][0]['properties']['display_fields'][0]['html_value']
|
||||
|
||||
# check full=on
|
||||
resp = get_app(pub).get(sign_uri('/api/forms/test/geojson?filter=all&full=on', user=local_user))
|
||||
assert len(resp.json['features']) == 1
|
||||
properties = {x['label']: x['value'] for x in resp.json['features'][0]['properties']['display_fields']}
|
||||
assert properties['test'] == 'test.txt'
|
||||
assert 'file' not in properties
|
||||
|
||||
|
||||
def test_api_distance_filter(pub, local_user):
|
||||
pub.role_class.wipe()
|
||||
role = pub.role_class(name='test')
|
||||
|
|
|
@ -124,6 +124,9 @@ def geojson_formdatas(formdatas, geoloc_key='base', fields=None):
|
|||
if hasattr(html_value, 'replace'):
|
||||
html_value = html_value.replace('[download]', '%sdownload' % formdata_backoffice_url)
|
||||
value = formdata.get_field_view_value(field)
|
||||
if field.key == 'block':
|
||||
# return display value for block fields, not the internal structure
|
||||
value = formdata.data.get(f'{field.id}_display')
|
||||
if not html_value and not value:
|
||||
continue
|
||||
|
||||
|
@ -133,7 +136,7 @@ def geojson_formdatas(formdatas, geoloc_key='base', fields=None):
|
|||
'value': str(value),
|
||||
'html_value': str(htmlescape(html_value)),
|
||||
}
|
||||
if field.key == 'file':
|
||||
if field.key == 'file' and not getattr(field, 'block_field', None):
|
||||
raw_value = formdata.data.get(field.id)
|
||||
if raw_value.has_redirect_url():
|
||||
geojson_infos['file_url'] = field.get_download_url(file_value=raw_value)
|
||||
|
@ -1724,7 +1727,7 @@ class FormPage(Directory, TempfileDirectoryMixin):
|
|||
self.view.remove_self()
|
||||
return redirect('..')
|
||||
|
||||
def get_formdef_fields(self, include_block_items_fields=False):
|
||||
def get_formdef_fields(self, include_block_fields=True, include_block_items_fields=False):
|
||||
yield filter_fields.IdFilterField(formdef=self.formdef)
|
||||
if self.formdef.default_digest_template:
|
||||
yield filter_fields.DigestFilterField(formdef=self.formdef)
|
||||
|
@ -1744,7 +1747,7 @@ class FormPage(Directory, TempfileDirectoryMixin):
|
|||
field.has_relations = True
|
||||
yield filter_fields.UserRelatedField(field)
|
||||
|
||||
for field in self.formdef.iter_fields(include_block_fields=True):
|
||||
for field in self.formdef.iter_fields(include_block_fields=include_block_fields):
|
||||
if getattr(field, 'block_field', None):
|
||||
if field.key == 'items' and not include_block_items_fields:
|
||||
# not yet
|
||||
|
@ -2689,7 +2692,7 @@ class FormPage(Directory, TempfileDirectoryMixin):
|
|||
selected_filter = self.get_filter_from_query()
|
||||
selected_filter_operator = self.get_filter_operator_from_query()
|
||||
if get_request().form.get('full') == 'on':
|
||||
fields = list(self.get_formdef_fields())
|
||||
fields = list(self.get_formdef_fields(include_block_fields=False))
|
||||
else:
|
||||
fields = self.get_fields_from_query()
|
||||
criterias = self.get_criterias_from_query()
|
||||
|
|
Loading…
Reference in New Issue