32 |
32 |
from django.utils import timezone
|
33 |
33 |
from django.utils.dates import WEEKDAYS
|
34 |
34 |
from django.utils.encoding import force_text
|
35 |
|
from django.utils.functional import cached_property
|
36 |
35 |
from django.utils.translation import gettext
|
37 |
36 |
from django.utils.translation import ugettext_lazy as _
|
38 |
37 |
from django.utils.translation import ungettext
|
... | ... | |
309 |
308 |
resp, not_found_code='statistic_data_not_found', invalid_code='statistic_url_invalid'
|
310 |
309 |
)
|
311 |
310 |
|
312 |
|
def get_statistic_data(self, raise_if_not_cached=False, invalidate_cache=False):
|
|
311 |
def get_statistic_data(self, request=None, raise_if_not_cached=False, invalidate_cache=False):
|
313 |
312 |
return requests.get(
|
314 |
313 |
self.statistic.url,
|
315 |
|
params=self.get_filter_params(),
|
|
314 |
params=self.get_filter_params(request),
|
316 |
315 |
cache_duration=300,
|
317 |
316 |
remote_service='auto',
|
318 |
317 |
without_user=True,
|
... | ... | |
321 |
320 |
invalidate_cache=invalidate_cache,
|
322 |
321 |
)
|
323 |
322 |
|
324 |
|
def get_chart(self, width=None, height=None, raise_if_not_cached=False):
|
|
323 |
def get_chart(self, width=None, height=None, request=None, raise_if_not_cached=False):
|
325 |
324 |
transaction.on_commit(lambda: spooler.refresh_statistics_data(cell_pk=self.pk))
|
326 |
|
response = self.get_statistic_data(raise_if_not_cached)
|
|
325 |
response = self.get_statistic_data(request=request, raise_if_not_cached=raise_if_not_cached)
|
327 |
326 |
response.raise_for_status()
|
328 |
327 |
response = response.json()
|
329 |
328 |
|
... | ... | |
383 |
382 |
|
384 |
383 |
return chart
|
385 |
384 |
|
386 |
|
def get_filter_params(self):
|
387 |
|
params = {k: self.evaluate_filter_value(v) for k, v in self.filter_params.items() if v}
|
|
385 |
def get_filter_params(self, request=None):
|
|
386 |
params = {k: self.evaluate_filter_value(v, request) for k, v in self.filter_params.items() if v}
|
388 |
387 |
|
389 |
388 |
now = timezone.now().date()
|
390 |
389 |
if self.time_range == 'current-year':
|
... | ... | |
421 |
420 |
params['end'] = self.time_range_end
|
422 |
421 |
elif self.time_range == 'range-template':
|
423 |
422 |
if self.time_range_start_template:
|
424 |
|
start = self.evaluate_range_template(self.time_range_start_template)
|
|
423 |
start = self.evaluate_range_template(self.time_range_start_template, request)
|
425 |
424 |
if start:
|
426 |
425 |
params['start'] = start
|
427 |
426 |
if self.time_range_end_template:
|
428 |
|
end = self.evaluate_range_template(self.time_range_end_template)
|
|
427 |
end = self.evaluate_range_template(self.time_range_end_template, request)
|
429 |
428 |
if end:
|
430 |
429 |
params['end'] = end
|
431 |
430 |
if 'time_interval' in params and not self.statistic.has_native_support_for_interval(
|
... | ... | |
434 |
433 |
params['time_interval'] = 'day'
|
435 |
434 |
return params
|
436 |
435 |
|
437 |
|
def evaluate_range_template(self, value):
|
|
436 |
def evaluate_range_template(self, value, request):
|
438 |
437 |
if value in self.page.extra_variables:
|
439 |
438 |
value = self.page.extra_variables[value].strip('{ }')
|
440 |
439 |
|
441 |
|
context = self.request_context
|
|
440 |
context = self.get_request_context(request)
|
442 |
441 |
context.update({'now': datetime.now, 'today': datetime.now})
|
443 |
442 |
try:
|
444 |
443 |
return Template('{{ %s|date:"Y-m-d" }}' % value).render(context)
|
445 |
444 |
except (VariableDoesNotExist, TemplateSyntaxError):
|
446 |
445 |
return None
|
447 |
446 |
|
448 |
|
def evaluate_filter_value(self, value):
|
|
447 |
def evaluate_filter_value(self, value, request):
|
449 |
448 |
if isinstance(value, list) or not value.startswith('variable:'):
|
450 |
449 |
return value
|
451 |
450 |
|
... | ... | |
454 |
453 |
except KeyError:
|
455 |
454 |
raise MissingVariable
|
456 |
455 |
|
457 |
|
return Template(variable).render(self.request_context)
|
|
456 |
return Template(variable).render(self.get_request_context(request))
|
458 |
457 |
|
459 |
|
@cached_property
|
460 |
|
def request_context(self):
|
461 |
|
if not getattr(self, '_request', None):
|
|
458 |
def get_request_context(self, request):
|
|
459 |
if request is None:
|
462 |
460 |
raise MissingRequest
|
463 |
461 |
|
464 |
|
ctx = RequestContext(self._request, getattr(self._request, 'extra_context', {}))
|
465 |
|
ctx['request'] = self._request
|
|
462 |
ctx = RequestContext(request, getattr(request, 'extra_context', {}))
|
|
463 |
ctx['request'] = request
|
466 |
464 |
return ctx
|
467 |
465 |
|
468 |
466 |
def parse_response(self, response, chart):
|
... | ... | |
716 |
714 |
return self.statistic.filters + self.subfilters
|
717 |
715 |
|
718 |
716 |
def update_subfilters(self):
|
719 |
|
self._request = get_request()
|
720 |
717 |
try:
|
721 |
|
response = self.get_statistic_data()
|
|
718 |
response = self.get_statistic_data(request=get_request())
|
722 |
719 |
except (TemplateSyntaxError, VariableDoesNotExist):
|
723 |
720 |
return
|
724 |
721 |
|