statistics: allow grouping by form (#73546) #118

Merged
vdeniaud merged 1 commits from wip/73546-Stats-Pouvoir-faire-un-regroupem into main 2023-04-17 15:08:55 +02:00
2 changed files with 79 additions and 49 deletions

View File

@ -321,55 +321,37 @@ def test_statistics_forms_count(pub):
formdata.store()
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/'))
assert resp.json == {
'data': {
'series': [{'data': [20, 0, 30], 'label': 'Forms Count'}],
'x_labels': ['2021-01', '2021-02', '2021-03'],
'subfilters': [],
},
'err': 0,
}
assert resp.json['data']['series'] == [{'data': [20, 0, 30], 'label': 'Forms Count'}]
assert resp.json['data']['x_labels'] == ['2021-01', '2021-02', '2021-03']
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?time_interval=year'))
assert resp.json == {
'data': {
'series': [{'data': [50], 'label': 'Forms Count'}],
'x_labels': ['2021'],
'subfilters': [],
},
'err': 0,
}
assert resp.json['data']['series'] == [{'data': [50], 'label': 'Forms Count'}]
assert resp.json['data']['x_labels'] == ['2021']
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?time_interval=weekday'))
assert resp.json == {
'data': {
'series': [{'data': [30, 0, 0, 0, 20, 0, 0], 'label': 'Forms Count'}],
'x_labels': ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
'subfilters': [],
},
'err': 0,
}
assert resp.json['data']['series'] == [{'data': [30, 0, 0, 0, 20, 0, 0], 'label': 'Forms Count'}]
assert resp.json['data']['x_labels'] == [
'Monday',
'Tuesday',
'Wednesday',
'Thursday',
'Friday',
'Saturday',
'Sunday',
]
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?time_interval=hour'))
assert resp.json == {
'data': {
'series': [
{
'label': 'Forms Count',
'data': [20, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
}
],
'x_labels': list(range(24)),
'subfilters': [],
},
'err': 0,
}
assert resp.json['data']['series'] == [
{
'data': [20, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
'label': 'Forms Count',
}
]
assert resp.json['data']['x_labels'] == list(range(24))
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?time_interval=none'))
assert resp.json == {
'data': {'series': [{'label': 'Forms Count', 'data': [50]}], 'x_labels': [''], 'subfilters': []},
'err': 0,
}
assert resp.json['data']['series'] == [{'data': [50], 'label': 'Forms Count'}]
assert resp.json['data']['x_labels'] == ['']
# time_interval=day is not supported
get_app(pub).get(sign_uri('/api/statistics/forms/count/?time_interval=day'), status=400)
@ -388,14 +370,8 @@ def test_statistics_forms_count(pub):
# apply period filter
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?end=2021-02-01'))
assert resp.json == {
'data': {
'series': [{'data': [20], 'label': 'Forms Count'}],
'x_labels': ['2021-01'],
'subfilters': [],
},
'err': 0,
}
assert resp.json['data']['series'] == [{'data': [20], 'label': 'Forms Count'}]
assert resp.json['data']['x_labels'] == ['2021-01']
# apply channel filter
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?channel=mail'))
@ -936,6 +912,51 @@ def test_statistics_forms_count_group_by_same_varname(pub, formdef):
assert resp.json['data']['series'] == [{'data': [2], 'label': 'foo'}]
def test_statistics_forms_count_group_by_form(pub):
formdef = FormDef()
formdef.name = 'A'
formdef.store()
for i in range(10):
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = datetime.datetime(2022, 1, 1, 0, 0).timetuple()
formdata.store()
formdef = FormDef()
formdef.name = 'B'
formdef.store()
for i in range(5):
formdata = formdef.data_class()()
formdata.just_created()
formdata.receipt_time = datetime.datetime(2021, 1, 1, 0, 0).timetuple()
formdata.store()
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/'))
assert len(resp.json['data']['subfilters']) == 1
assert resp.json['data']['subfilters'][0] == {
'id': 'group-by',
'label': 'Group by',
'options': [{'id': 'form', 'label': 'Form'}],
}
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?time_interval=year'))
assert resp.json['data']['x_labels'] == ['2021', '2022']
assert resp.json['data']['series'] == [{'data': [5, 10], 'label': 'Forms Count'}]
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?time_interval=year&group-by=form'))
assert resp.json['data']['x_labels'] == ['2021', '2022']
assert resp.json['data']['series'] == [
{'data': [None, 10], 'label': 'A'},
{'data': [5, None], 'label': 'B'},
]
resp = get_app(pub).get(sign_uri('/api/statistics/forms/count/?time_interval=none&group-by=form'))
assert resp.json['data']['x_labels'] == ['A', 'B']
assert resp.json['data']['series'] == [{'data': [10, 5], 'label': 'Forms Count'}]
def test_statistics_cards_count(pub):
carddef = CardDef()
carddef.name = 'test 1'

View File

@ -248,6 +248,15 @@ class FormsCountView(RestrictedView):
totals_kwargs['criterias'].extend(self.get_filters_criterias(formdefs))
self.set_group_by_parameters(group_by, formdefs, totals_kwargs, group_labels)
subfilters = self.get_subfilters(formdefs, group_by)
else:
subfilters = [
{'id': 'group-by', 'label': _('Group by'), 'options': [{'id': 'form', 'label': _('Form')}]}
]
if group_by == 'form':
totals_kwargs['group_by'] = 'formdef_id'
group_labels = {
int(x.id): x.name for x in self.formdef_class.select(lightweight=True, order_by='name')
}
channel = request.GET.get('channel', '_all')
if channel == 'web':