From 5b35a9c6aefcb77d7173d4d0bcbd4836cec748bb Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 2 Jun 2022 18:20:00 +0200 Subject: [PATCH 1/2] dataviz: pass request explicitly when needed (#65882) --- combo/apps/dataviz/models.py | 37 +++++++++++++++++------------------- combo/apps/dataviz/views.py | 2 +- 2 files changed, 18 insertions(+), 21 deletions(-) diff --git a/combo/apps/dataviz/models.py b/combo/apps/dataviz/models.py index 0bf8c39a..4f6e9aef 100644 --- a/combo/apps/dataviz/models.py +++ b/combo/apps/dataviz/models.py @@ -32,7 +32,6 @@ from django.urls import reverse from django.utils import timezone from django.utils.dates import WEEKDAYS from django.utils.encoding import force_text -from django.utils.functional import cached_property from django.utils.translation import gettext from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ungettext @@ -309,10 +308,10 @@ class ChartNgCell(CellBase): resp, not_found_code='statistic_data_not_found', invalid_code='statistic_url_invalid' ) - def get_statistic_data(self, raise_if_not_cached=False, invalidate_cache=False): + def get_statistic_data(self, request=None, raise_if_not_cached=False, invalidate_cache=False): return requests.get( self.statistic.url, - params=self.get_filter_params(), + params=self.get_filter_params(request), cache_duration=300, remote_service='auto', without_user=True, @@ -321,9 +320,9 @@ class ChartNgCell(CellBase): invalidate_cache=invalidate_cache, ) - def get_chart(self, width=None, height=None, raise_if_not_cached=False): + def get_chart(self, width=None, height=None, request=None, raise_if_not_cached=False): transaction.on_commit(lambda: spooler.refresh_statistics_data(cell_pk=self.pk)) - response = self.get_statistic_data(raise_if_not_cached) + response = self.get_statistic_data(request=request, raise_if_not_cached=raise_if_not_cached) response.raise_for_status() response = response.json() @@ -383,8 +382,8 @@ class ChartNgCell(CellBase): return chart - def get_filter_params(self): - params = {k: self.evaluate_filter_value(v) for k, v in self.filter_params.items() if v} + def get_filter_params(self, request=None): + params = {k: self.evaluate_filter_value(v, request) for k, v in self.filter_params.items() if v} now = timezone.now().date() if self.time_range == 'current-year': @@ -421,11 +420,11 @@ class ChartNgCell(CellBase): params['end'] = self.time_range_end elif self.time_range == 'range-template': if self.time_range_start_template: - start = self.evaluate_range_template(self.time_range_start_template) + start = self.evaluate_range_template(self.time_range_start_template, request) if start: params['start'] = start if self.time_range_end_template: - end = self.evaluate_range_template(self.time_range_end_template) + end = self.evaluate_range_template(self.time_range_end_template, request) if end: params['end'] = end if 'time_interval' in params and not self.statistic.has_native_support_for_interval( @@ -434,18 +433,18 @@ class ChartNgCell(CellBase): params['time_interval'] = 'day' return params - def evaluate_range_template(self, value): + def evaluate_range_template(self, value, request): if value in self.page.extra_variables: value = self.page.extra_variables[value].strip('{ }') - context = self.request_context + context = self.get_request_context(request) context.update({'now': datetime.now, 'today': datetime.now}) try: return Template('{{ %s|date:"Y-m-d" }}' % value).render(context) except (VariableDoesNotExist, TemplateSyntaxError): return None - def evaluate_filter_value(self, value): + def evaluate_filter_value(self, value, request): if isinstance(value, list) or not value.startswith('variable:'): return value @@ -454,15 +453,14 @@ class ChartNgCell(CellBase): except KeyError: raise MissingVariable - return Template(variable).render(self.request_context) + return Template(variable).render(self.get_request_context(request)) - @cached_property - def request_context(self): - if not getattr(self, '_request', None): + def get_request_context(self, request): + if request is None: raise MissingRequest - ctx = RequestContext(self._request, getattr(self._request, 'extra_context', {})) - ctx['request'] = self._request + ctx = RequestContext(request, getattr(request, 'extra_context', {})) + ctx['request'] = request return ctx def parse_response(self, response, chart): @@ -716,9 +714,8 @@ class ChartNgCell(CellBase): return self.statistic.filters + self.subfilters def update_subfilters(self): - self._request = get_request() try: - response = self.get_statistic_data() + response = self.get_statistic_data(request=get_request()) except (TemplateSyntaxError, VariableDoesNotExist): return diff --git a/combo/apps/dataviz/views.py b/combo/apps/dataviz/views.py index f23e584a..3970e711 100644 --- a/combo/apps/dataviz/views.py +++ b/combo/apps/dataviz/views.py @@ -63,11 +63,11 @@ class DatavizGraphView(DetailView): except signing.BadSignature: return HttpResponseBadRequest('bad signature') - form.instance._request = request try: chart = form.instance.get_chart( width=int(request.GET['width']) if request.GET.get('width') else None, height=int(request.GET['height']) if request.GET.get('height') else int(self.cell.height), + request=request, ) except UnsupportedDataSet: return self.error(_('Unsupported dataset.')) -- 2.30.2