api: handle block fields in geojson (#89831)
gitea/wcs/pipeline/head This commit looks good Details

This commit is contained in:
Frédéric Péters 2024-04-21 08:51:52 +02:00
parent b6c83cca37
commit 4e0b3469f1
2 changed files with 66 additions and 4 deletions

View File

@ -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')

View File

@ -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()