From d556b52edd6b74890b36c6b5414a37fcbb6fbb60 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Tue, 13 Dec 2022 12:40:46 +0100 Subject: [PATCH] statistics: add filter to hide "None" labels (#71660) --- tests/api/test_statistics.py | 22 ++++++++++++++++++++++ wcs/statistics/views.py | 33 +++++++++++++++++++++++++-------- 2 files changed, 47 insertions(+), 8 deletions(-) diff --git a/tests/api/test_statistics.py b/tests/api/test_statistics.py index 2b0603c25..2588f34d8 100644 --- a/tests/api/test_statistics.py +++ b/tests/api/test_statistics.py @@ -446,6 +446,7 @@ def test_statistics_forms_count_subfilters(pub, formdef): {'id': 'checkbox', 'label': 'Checkbox'}, {'id': 'status', 'label': 'Status'}, ], + 'has_subfilters': True, } # check item field subfilter @@ -499,6 +500,19 @@ def test_statistics_forms_count_subfilters(pub, formdef): 'required': True, } + # group by triggers new subfilter + new_resp = get_app(pub).get( + sign_uri('/api/statistics/forms/count/?form=%s&group-by=test-item' % formdef.url_name) + ) + assert new_resp.json['data']['subfilters'][1] == { + 'id': 'hide_none_label', + 'label': 'Ignore forms where "Test item" is empty.', + 'options': [{'id': 'true', 'label': 'Yes'}, {'id': 'false', 'label': 'No'}], + 'required': True, + 'default': 'false', + } + assert len(new_resp.json['data']['subfilters']) == len(resp.json['data']['subfilters']) + 1 + # add item field with no formdata, it should not appear item_field = fields.ItemField( id='20', @@ -716,6 +730,14 @@ def test_statistics_forms_count_group_by(pub, formdef, anonymise): {'label': 'None', 'data': [4, None, None, None, None, None, None]}, ] + # hide None label + resp = get_app(pub).get(sign_uri(url + '&group-by=test-item&hide_none_label=true')) + assert resp.json['data']['x_labels'] == ['2021-01'] + assert resp.json['data']['series'] == [ + {'data': [13], 'label': 'Foo'}, + {'data': [3], 'label': 'baz'}, + ] + # group by items field url = '/api/statistics/forms/count/?form=%s' % formdef.url_name resp = get_app(pub).get(sign_uri(url + '&group-by=test-items')) diff --git a/wcs/statistics/views.py b/wcs/statistics/views.py index ae51dfd4e..ebea0a742 100644 --- a/wcs/statistics/views.py +++ b/wcs/statistics/views.py @@ -30,7 +30,7 @@ from wcs.categories import Category from wcs.formdata import FormData from wcs.formdef import FormDef from wcs.qommon import _, misc, pgettext_lazy -from wcs.qommon.storage import Contains, Equal, GreaterOrEqual, Less, Null, Or, StrictNotEqual +from wcs.qommon.storage import Contains, Equal, GreaterOrEqual, Less, NotNull, Null, Or, StrictNotEqual class RestrictedView(View): @@ -244,7 +244,7 @@ class FormsCountView(RestrictedView): totals_kwargs['criterias'].append(Equal('formdef_id', formdef.id)) totals_kwargs['criterias'].extend(self.get_filters_criterias(formdef, form_page)) self.set_group_by_parameters(group_by, formdef, form_page, totals_kwargs, group_labels) - subfilters = self.get_subfilters(form_page) + subfilters = self.get_subfilters(form_page, group_by) else: totals_kwargs['criterias'].append(StrictNotEqual('status', 'draft')) @@ -323,8 +323,7 @@ class FormsCountView(RestrictedView): return criterias - @staticmethod - def get_subfilters(form_page): + def get_subfilters(self, form_page, group_by): subfilters = [] field_choices = [] for field in form_page.get_formdef_fields(): @@ -371,8 +370,7 @@ class FormsCountView(RestrictedView): field_choices.append((field.contextual_varname, field.label)) if field_choices: - subfilters.insert( - 0, + additionnal_filters = [ { 'id': 'group-by', 'label': _('Group by'), @@ -381,8 +379,24 @@ class FormsCountView(RestrictedView): {'id': 'simple-status', 'label': _('Simplified status')}, ] + [{'id': x[0], 'label': x[1]} for x in field_choices], - }, - ) + 'has_subfilters': True, + } + ] + + if group_by not in (None, 'channel', 'simple-status', 'status'): + group_by_field = self.get_group_by_field(form_page, group_by) + if group_by_field: + additionnal_filters.append( + { + 'id': 'hide_none_label', + 'label': _('Ignore forms where "%s" is empty.') % group_by_field.label, + 'options': [{'id': 'true', 'label': _('Yes')}, {'id': 'false', 'label': _('No')}], + 'required': True, + 'default': 'false', + } + ) + + subfilters = additionnal_filters + subfilters return subfilters @@ -441,6 +455,9 @@ class FormsCountView(RestrictedView): else: totals_kwargs['group_by'] = sql.get_field_id(group_by_field) + if self.request.GET.get('hide_none_label') == 'true': + totals_kwargs['criterias'].append(NotNull(totals_kwargs['group_by'])) + group_labels.update(self.get_group_labels(group_by_field, formdef, form_page, group_by)) def get_grouped_time_data(self, totals, group_labels): -- 2.35.1