Projet

Général

Profil

0001-dataviz-pass-request-explicitly-when-needed-65882.patch

Valentin Deniaud, 07 juin 2022 12:27

Télécharger (6,16 ko)

Voir les différences:

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(-)
combo/apps/dataviz/models.py
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

  
combo/apps/dataviz/views.py
63 63
            except signing.BadSignature:
64 64
                return HttpResponseBadRequest('bad signature')
65 65

  
66
        form.instance._request = request
67 66
        try:
68 67
            chart = form.instance.get_chart(
69 68
                width=int(request.GET['width']) if request.GET.get('width') else None,
70 69
                height=int(request.GET['height']) if request.GET.get('height') else int(self.cell.height),
70
                request=request,
71 71
            )
72 72
        except UnsupportedDataSet:
73 73
            return self.error(_('Unsupported dataset.'))
74
-