dataviz: pass request explicitly when needed (#65882)

This commit is contained in:
Valentin Deniaud 2022-06-02 18:20:00 +02:00
parent 6cac60262e
commit 06b4b1dce5
2 changed files with 18 additions and 21 deletions

View File

@ -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

View File

@ -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.'))