statistics: allow grouping by form (#73546) #118
|
@ -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'
|
||||
|
|
|
@ -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':
|
||||
|
|
Loading…
Reference in New Issue