statistics: allow group by field inside block (#62404) #212

Merged
vdeniaud merged 1 commits from wip/62404-API-stats-permettre-le-regroupem into main 2023-04-20 14:32:39 +02:00
2 changed files with 33 additions and 9 deletions

View File

@ -103,7 +103,9 @@ def formdef(pub):
anonymise=False,
)
items_field.display_locations = ['statistics']
block_field = fields.BlockField(id='4', label='Block Data', varname='blockdata', type='block:foobar')
block_field = fields.BlockField(
id='4', label='Block Data', varname='blockdata', type='block:foobar', anonymise=False
)
formdef.fields = [item_field, items_field, block_field]
formdef.store()
formdef.data_class().wipe()
@ -416,6 +418,8 @@ def test_statistics_forms_count_subfilters(pub, formdef):
{'id': 'simple-status', 'label': 'Simplified status'},
{'id': 'test-item', 'label': 'Test item'},
{'id': 'test-items', 'label': 'Test items'},
{'id': 'blockdata_bool', 'label': 'Bool'},
{'id': 'blockdata_block-items', 'label': 'Block items'},
{'id': 'checkbox', 'label': 'Checkbox'},
{'id': 'status', 'label': 'Status'},
],
@ -735,6 +739,12 @@ def test_statistics_forms_count_group_by(pub, formdef, anonymise):
formdata.data['2_display'] = 'Foo'
formdata.data['3'] = ['bar', 'baz']
formdata.data['3_display'] = 'Bar, Baz'
formdata.data['4'] = {
'data': [
{'1': True, '2': ['baz'], '2_display': 'Baz'},
{'1': False, '2': ['foo'], '2_display': 'Foo'},
]
}
# "Web" channel has three equivalent values
if i == 1:
formdata.submission_channel = 'web'
@ -746,6 +756,7 @@ def test_statistics_forms_count_group_by(pub, formdef, anonymise):
formdata.data['1'] = False
formdata.data['2'] = 'baz'
formdata.data['3'] = ['baz']
formdata.data['4'] = {'data': [{'1': False, '2': ['foo', 'bar'], '2_display': 'Foo, Bar'}]}
if i == 3:
formdata.jump_status('3')
elif i == 9:
@ -819,6 +830,25 @@ def test_statistics_forms_count_group_by(pub, formdef, anonymise):
{'data': [None, None, 4], 'label': 'None'},
]
# group by boolean field inside block
resp = get_app(pub).get(sign_uri(url + '&group-by=blockdata_bool'))
assert resp.json['data']['x_labels'] == ['2021-01', '2021-02', '2021-03']
assert resp.json['data']['series'] == [
{'label': 'Yes', 'data': [13, None, None]},
{'label': 'No', 'data': [16, None, None]},
{'label': 'None', 'data': [None, None, 4]},
]
# group by items field inside block
resp = get_app(pub).get(sign_uri(url + '&group-by=blockdata_block-items'))
assert resp.json['data']['x_labels'] == ['2021-01', '2021-02', '2021-03']
assert resp.json['data']['series'] == [
{'label': 'Bar', 'data': [3, None, None]},
{'label': 'Baz', 'data': [13, None, None]},
{'label': 'Foo', 'data': [16, None, None]},
{'label': 'None', 'data': [None, None, 4]},
]
# group by status
resp = get_app(pub).get(sign_uri(url + '&group-by=status'))
assert resp.json['data']['x_labels'] == ['2021-01', '2021-02', '2021-03']
@ -879,10 +909,6 @@ def test_statistics_forms_count_group_by(pub, formdef, anonymise):
assert resp.json['data']['x_labels'] == ['Middle status 2', 'Middle status 1', 'End status', 'New status']
assert resp.json['data']['series'] == [{'data': [1, 1, 1, 17], 'label': 'Forms Count'}]
# group by on block field is not supported
resp = get_app(pub).get(sign_uri(url + '&group-by=blockdata_bool'))
assert resp.json['data']['series'] == [{'data': [16, 0, 4], 'label': 'Forms Count'}]
# invalid field
resp = get_app(pub).get(sign_uri(url + '&group-by=xxx'))
assert resp.json['data']['series'] == [{'data': [16, 0, 4], 'label': 'Forms Count'}]

View File

@ -429,8 +429,7 @@ class FormsCountView(RestrictedView):
filter_description['default'] = field.default_filter_value
subfilters.append(filter_description)
if not hasattr(field, 'block_field'):
field_choices.append((field.contextual_varname, field.label))
field_choices.append((field.contextual_varname, field.label))
if field_choices:
additionnal_filters = [
@ -472,8 +471,7 @@ class FormsCountView(RestrictedView):
and getattr(x, 'include_in_statistics', False)
]
if fields:
if not hasattr(fields[0], 'block_field'): # block fields are not supported
return fields[0]
return fields[0]
def get_group_labels(self, group_by_field, formdef, group_by):
group_labels = {}