dataviz: pass request explicitly when needed (#65882)
This commit is contained in:
parent
6cac60262e
commit
06b4b1dce5
|
@ -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
|
||||
|
||||
|
|
|
@ -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.'))
|
||||
|
|
Loading…
Reference in New Issue