Flatten scale args in GET params of stats urls

- get_scale_args method of ScaleMixin retrieves useful GET params for
  Scale object instanciation (by default from request.GET)
- it takes into account the type of the scale arg
- prefix used for GET param can be modified in stats_manifest funcs and
  ScaleMixin
This commit is contained in:
Aurélien Delobelle 2017-04-04 20:12:21 +02:00
parent 885e40fd05
commit dc07b072ab
2 changed files with 67 additions and 21 deletions

View file

@ -1,9 +1,9 @@
# -*- coding: utf-8 -*-
import ast
from datetime import date, datetime, time, timedelta
from dateutil.relativedelta import relativedelta
from dateutil.parser import parse as dateutil_parse
from django.utils import timezone
from django.db.models import Sum
@ -114,25 +114,29 @@ class MonthScale(Scale):
return to_kfet_day(dt).replace(day=1)
def stat_manifest(scales_def=None, scale_args=None, **url_params):
def stat_manifest(scales_def=None, scale_args=None, scale_prefix=None,
**other_url_params):
if scale_prefix is None:
scale_prefix = 'scale_'
if scales_def is None:
scales_def = []
if scale_args is None:
scale_args = {}
return [
dict(
manifest = []
for label, cls in scales_def:
url_params = {scale_prefix+'name': cls.name}
url_params.update({scale_prefix+key: value
for key, value in scale_args.items()})
url_params.update(other_url_params)
manifest.append(dict(
label=label,
url_params=dict(
scale=cls.name,
scale_args=scale_args,
**url_params,
),
)
for label, cls in scales_def
]
url_params=url_params,
))
return manifest
def last_stats_manifest(scales_def=None, scale_args=None, **url_params):
def last_stats_manifest(scales_def=None, scale_args=None, scale_prefix=None,
**url_params):
scales_def = [
('Derniers mois', MonthScale, ),
('Dernières semaines', WeekScale, ),
@ -145,7 +149,7 @@ def last_stats_manifest(scales_def=None, scale_args=None, **url_params):
n_steps=7,
))
return stat_manifest(scales_def=scales_def, scale_args=scale_args,
**url_params)
scale_prefix=scale_prefix, **url_params)
# Étant donné un queryset d'operations
@ -156,20 +160,61 @@ def tot_ventes(queryset):
class ScaleMixin(object):
scale_args_prefix = 'scale_'
def get_scale_args(self, params=None, prefix=None):
"""Retrieve scale args from params.
Should search the same args of Scale constructor.
Args:
params (dict, optional): Scale args are searched in this.
Default to GET params of request.
prefix (str, optional): Appended at the begin of scale args names.
Default to `self.scale_args_prefix`.
"""
if params is None:
params = self.request.GET
if prefix is None:
prefix = self.scale_args_prefix
scale_args = {}
name = params.get(prefix+'name', None)
if name is not None:
scale_args['name'] = name
n_steps = params.get(prefix+'n_steps', None)
if n_steps is not None:
scale_args['n_steps'] = int(n_steps)
begin = params.get(prefix+'begin', None)
if begin is not None:
scale_args['begin'] = dateutil_parse(begin)
end = params.get(prefix+'send', None)
if end is not None:
scale_args['end'] = dateutil_parse(end)
last = params.get(prefix+'last', None)
if last is not None:
scale_args['last'] = (
last in ['true', 'True', '1'] and True or False)
return scale_args
def get_context_data(self, *args, **kwargs):
context = super().get_context_data(*args, **kwargs)
scale_name = self.request.GET.get('scale', None)
scale_args = self.get_scale_args()
scale_name = scale_args.pop('name', None)
scale_cls = Scale.by_name(scale_name)
cls = Scale.by_name(scale_name)
if cls is None:
if scale_cls is None:
scale = self.get_default_scale()
else:
scale_args = self.request.GET.get('scale_args', {})
if isinstance(scale_args, str):
scale_args = ast.literal_eval(scale_args)
scale = cls(**scale_args)
scale = scale_cls(**scale_args)
self.scale = scale
context['labels'] = scale.get_labels()

View file

@ -20,3 +20,4 @@ django-widget-tweaks==1.4.1
git+https://git.eleves.ens.fr/cof-geek/django_custommail.git#egg=django_custommail
ldap3
git+https://github.com/Aureplop/channels.git#egg=channels
python-dateutil