diff --git a/combo/apps/dataviz/models.py b/combo/apps/dataviz/models.py index a4f36dcc..8e4a1b53 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 @@ -312,10 +311,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, @@ -324,9 +323,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() @@ -386,8 +385,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': @@ -424,11 +423,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( @@ -437,18 +436,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 @@ -457,15 +456,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): @@ -719,9 +717,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 1b9292d8..ebc325c5 100644 --- a/combo/apps/dataviz/views.py +++ b/combo/apps/dataviz/views.py @@ -69,11 +69,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.'))