From 75fa4c3f8301edf3bc2e6955cd6a144066cdd577 Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 4 Feb 2021 10:10:08 +0100 Subject: [PATCH] dataviz: display time_range fields only if relevant (#50836) --- combo/apps/dataviz/forms.py | 46 +++++++++++++++++++------------------ tests/test_dataviz.py | 7 +++++- 2 files changed, 30 insertions(+), 23 deletions(-) diff --git a/combo/apps/dataviz/forms.py b/combo/apps/dataviz/forms.py index a17a79cb..24278f11 100644 --- a/combo/apps/dataviz/forms.py +++ b/combo/apps/dataviz/forms.py @@ -56,35 +56,37 @@ class ChartNgForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - stat_field = self.fields['statistic'] - if not self.instance.statistic: - stat_field.queryset = stat_field.queryset.filter(available=True) - return - - # display current statistic in choices even if unavailable - stat_field.queryset = stat_field.queryset.filter(Q(available=True) | Q(pk=self.instance.statistic.pk)) field_ids = list(self._meta.fields) - if self.instance.statistic.service_slug == 'bijoe': + if not self.instance.statistic or self.instance.statistic.service_slug == 'bijoe': field_ids = [ x for x in field_ids if x not in ('time_range', 'time_range_start', 'time_range_end') ] - field_insert_index = field_ids.index('statistic') + 1 - for filter_ in reversed(self.instance.statistic.filters): - filter_id = filter_['id'] - choices = [(option['id'], option['label']) for option in filter_['options']] - initial = self.instance.filter_params.get(filter_id) or filter_.get('default') - - required = filter_.get('required', False) - if not required: - choices.insert(0, self.blank_choice) - - self.fields[filter_id] = forms.ChoiceField( - label=filter_['label'], choices=choices, required=required, initial=initial + + stat_field = self.fields['statistic'] + if not self.instance.statistic: + stat_field.queryset = stat_field.queryset.filter(available=True) + else: + # display current statistic in choices even if unavailable + stat_field.queryset = stat_field.queryset.filter( + Q(available=True) | Q(pk=self.instance.statistic.pk) ) - field_ids.insert(field_insert_index, filter_id) - # reorder so that filter fields appear after 'statistic' field + field_insert_index = field_ids.index('statistic') + 1 + for filter_ in reversed(self.instance.statistic.filters): + filter_id = filter_['id'] + choices = [(option['id'], option['label']) for option in filter_['options']] + initial = self.instance.filter_params.get(filter_id) or filter_.get('default') + + required = filter_.get('required', False) + if not required: + choices.insert(0, self.blank_choice) + + self.fields[filter_id] = forms.ChoiceField( + label=filter_['label'], choices=choices, required=required, initial=initial + ) + field_ids.insert(field_insert_index, filter_id) + self.fields = OrderedDict((field_id, self.fields[field_id]) for field_id in field_ids) def save(self, *args, **kwargs): diff --git a/tests/test_dataviz.py b/tests/test_dataviz.py index 497a29b3..45188b19 100644 --- a/tests/test_dataviz.py +++ b/tests/test_dataviz.py @@ -921,7 +921,12 @@ def test_chartng_cell_manager(app, admin_user, statistics): app = login(app) - cell = ChartNgCell(page=page, order=1, placeholder='content') + cell = ChartNgCell.objects.create(page=page, order=1, placeholder='content') + resp = app.get('/manage/pages/%s/' % page.id) + assert 'time_range' not in resp.form.fields + assert 'time_range_start' not in resp.form.fields + assert 'time_range_end' not in resp.form.fields + cell.statistic = Statistic.objects.get(slug='example') cell.save() resp = app.get('/manage/pages/%s/' % page.id) -- 2.20.1