forked from DGNum/gestioCOF
Clean Article stats
kfet.statistic - delete no longer used defs - new mixin - ScaleMixin - get scale args from GET params - chunkify querysets according to a scale Article stats - use SingleResumeStat for manifest - use ScaleMixin for sales - update urls - update permission required: teamkfet Account stats - update permission required: teamkfet - operations use ScaleMixin - fix manifests urls
This commit is contained in:
parent
f585247224
commit
c01de558e1
5 changed files with 132 additions and 221 deletions
229
kfet/views.py
229
kfet/views.py
|
@ -48,10 +48,8 @@ from decimal import Decimal
|
|||
import django_cas_ng
|
||||
import heapq
|
||||
import statistics
|
||||
from kfet.statistic import DayStatScale, MonthStatScale, StatScale, WeekStatScale
|
||||
from .statistic import (
|
||||
this_morning, this_monday_morning, this_first_month_day, tot_ventes,
|
||||
)
|
||||
from kfet.statistic import ScaleMixin, last_stats_manifest, tot_ventes
|
||||
|
||||
|
||||
class Home(TemplateView):
|
||||
template_name = "kfet/home.html"
|
||||
|
@ -2155,10 +2153,8 @@ class AccountStatBalance(PkUrlMixin, JSONDetailView):
|
|||
account = self.object
|
||||
|
||||
# prepare filters
|
||||
if end_date is None:
|
||||
end_date = this_morning()
|
||||
|
||||
if last_days is not None:
|
||||
end_date = timezone.now()
|
||||
begin_date = end_date - timezone.timedelta(days=last_days)
|
||||
|
||||
# prepare querysets
|
||||
|
@ -2289,43 +2285,7 @@ class AccountStatOperationList(PkUrlMixin, SingleResumeStat):
|
|||
pk_url_kwarg = 'trigramme'
|
||||
id_prefix = ID_PREFIX_ACC_LAST
|
||||
nb_default = 2
|
||||
stats = [
|
||||
{
|
||||
'label': 'Derniers mois',
|
||||
'url_params': dict(
|
||||
types=[Operation.PURCHASE],
|
||||
scale=MonthStatScale.name,
|
||||
scale_args=dict(
|
||||
last=True,
|
||||
n_steps=7,
|
||||
),
|
||||
),
|
||||
},
|
||||
{
|
||||
'label': 'Dernières semaines',
|
||||
'url_params': dict(
|
||||
types=[Operation.PURCHASE],
|
||||
last_days=49,
|
||||
scale=WeekStatScale.name,
|
||||
scale_args=dict(
|
||||
last=True,
|
||||
n_steps=7,
|
||||
),
|
||||
),
|
||||
},
|
||||
{
|
||||
'label': 'Derniers jours',
|
||||
'url_params': dict(
|
||||
types=[Operation.PURCHASE],
|
||||
last_days=7,
|
||||
scale=DayStatScale.name,
|
||||
scale_args=dict(
|
||||
last=True,
|
||||
n_steps=7,
|
||||
),
|
||||
),
|
||||
},
|
||||
]
|
||||
stats = last_stats_manifest(types=[Operation.PURCHASE])
|
||||
url_stat = 'kfet.account.stat.operation'
|
||||
|
||||
def get_object(self, *args, **kwargs):
|
||||
|
@ -2339,7 +2299,7 @@ class AccountStatOperationList(PkUrlMixin, SingleResumeStat):
|
|||
return super().dispatch(*args, **kwargs)
|
||||
|
||||
|
||||
class AccountStatOperation(PkUrlMixin, JSONDetailView):
|
||||
class AccountStatOperation(ScaleMixin, PkUrlMixin, JSONDetailView):
|
||||
"""
|
||||
Returns a JSON containing the evolution a the personnal
|
||||
consommation of a trigramme at the diffent dates specified
|
||||
|
@ -2359,38 +2319,24 @@ class AccountStatOperation(PkUrlMixin, JSONDetailView):
|
|||
.filter(group__on_acc=self.object)
|
||||
.filter(canceled_at=None)
|
||||
)
|
||||
operations = []
|
||||
for begin, end in scale:
|
||||
operations.append(all_operations
|
||||
.filter(group__at__gte=begin,
|
||||
group__at__lte=end))
|
||||
return operations
|
||||
chunks = self.chunkify_qs(all_operations, scale, field='group__at')
|
||||
return chunks
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = {}
|
||||
|
||||
scale = self.request.GET.get('scale', None)
|
||||
if scale is None:
|
||||
scale = DayStatScale(n_steps=7, last=True)
|
||||
else:
|
||||
scale_cls = StatScale.by_name(scale)
|
||||
scale_args = self.request.GET.get('scale_args', '{}')
|
||||
scale = scale_cls(**ast.literal_eval(scale_args))
|
||||
print(scale.datetimes)
|
||||
def get_context_data(self, *args, **kwargs):
|
||||
old_ctx = super().get_context_data(*args, **kwargs)
|
||||
context = {'labels': old_ctx['labels']}
|
||||
scale = self.scale
|
||||
|
||||
types = self.request.GET.get('types', None)
|
||||
if types is not None:
|
||||
types = ast.literal_eval(types)
|
||||
|
||||
operations = self.get_operations(types=types, scale=scale)
|
||||
# On récupère les labels des dates
|
||||
context['labels'] = scale.get_labels()
|
||||
# On compte les opérations
|
||||
nb_ventes = []
|
||||
for chunk in operations:
|
||||
nb_ventes.append(tot_ventes(chunk))
|
||||
|
||||
context['labels'] = scale.get_labels()
|
||||
context['charts'] = [{"color": "rgb(255, 99, 132)",
|
||||
"label": "NB items achetés",
|
||||
"values": nb_ventes}]
|
||||
|
@ -2418,141 +2364,66 @@ ID_PREFIX_ART_LAST_MONTHS = "last_months_art"
|
|||
|
||||
# Un résumé de toutes les vues ArticleStatLast
|
||||
# NE REND PAS DE JSON
|
||||
class ArticleStatLastAll(SingleResumeStat):
|
||||
class ArticleStatSalesList(SingleResumeStat):
|
||||
model = Article
|
||||
context_object_name = 'article'
|
||||
id_prefix = ID_PREFIX_ART_LAST
|
||||
nb_stat = 3
|
||||
nb_default = 2
|
||||
stat_labels = ["Derniers mois", "Dernières semaines", "Derniers jours"]
|
||||
stat_urls = ['kfet.article.stat.last.month',
|
||||
'kfet.article.stat.last.week',
|
||||
'kfet.article.stat.last.day']
|
||||
url_stat = 'kfet.article.stat.sales'
|
||||
stats = last_stats_manifest()
|
||||
|
||||
@method_decorator(login_required)
|
||||
@method_decorator(teamkfet_required)
|
||||
def dispatch(self, *args, **kwargs):
|
||||
return super(ArticleStatLastAll, self).dispatch(*args, **kwargs)
|
||||
return super().dispatch(*args, **kwargs)
|
||||
|
||||
|
||||
class ArticleStatLast(JSONDetailView):
|
||||
class ArticleStatSales(ScaleMixin, JSONDetailView):
|
||||
"""
|
||||
Returns a JSON containing the consommation
|
||||
of an article at the diffent dates precised
|
||||
"""
|
||||
model = Article
|
||||
context_object_name = 'article'
|
||||
end_date = timezone.now()
|
||||
id_prefix = ""
|
||||
|
||||
def render_to_response(self, context):
|
||||
# Look for a 'format=json' GET argument
|
||||
if self.request.GET.get('format') == 'json':
|
||||
return self.render_to_json_response(context)
|
||||
else:
|
||||
return super(ArticleStatLast, self).render_to_response(context)
|
||||
def get_context_data(self, *args, **kwargs):
|
||||
old_ctx = super().get_context_data(*args, **kwargs)
|
||||
context = {'labels': old_ctx['labels']}
|
||||
scale = self.scale
|
||||
|
||||
# doit rendre un dictionnaire des dates
|
||||
# la première date correspond au début
|
||||
# la dernière date est la fin de la dernière plage
|
||||
def get_dates(self, **kwargs):
|
||||
pass
|
||||
|
||||
# doit rendre un dictionnaire des labels
|
||||
# le dernier label ne sera pas utilisé
|
||||
def get_labels(self, **kwargs):
|
||||
pass
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = {}
|
||||
# On récupère les labels des dates
|
||||
context['labels'] = self.get_labels().copy()
|
||||
# On récupère les dates
|
||||
dates = self.get_dates()
|
||||
# On ajoute la date de fin
|
||||
extended_dates = dates.copy()
|
||||
extended_dates[len(dates)+1] = self.end_date
|
||||
# On selectionne les opérations qui correspondent
|
||||
# à l'article en question et qui ne sont pas annulées
|
||||
# puis on choisi pour chaques intervalle les opérations
|
||||
# effectuées dans ces intervalles de temps
|
||||
all_operations = (Operation.objects
|
||||
.filter(type='purchase')
|
||||
.filter(article=self.object)
|
||||
.filter(canceled_at=None)
|
||||
)
|
||||
operations = {}
|
||||
for i in dates:
|
||||
operations[i] = (all_operations
|
||||
.filter(group__at__gte=extended_dates[i])
|
||||
.filter(group__at__lte=extended_dates[i+1])
|
||||
)
|
||||
all_operations = (
|
||||
Operation.objects
|
||||
.filter(type=Operation.PURCHASE,
|
||||
article=self.object,
|
||||
canceled_at=None,
|
||||
)
|
||||
)
|
||||
chunks = self.chunkify_qs(all_operations, scale, field='group__at')
|
||||
# On compte les opérations
|
||||
nb_ventes = {}
|
||||
nb_accounts = {}
|
||||
nb_liq = {}
|
||||
for i in operations:
|
||||
nb_ventes[i] = tot_ventes(operations[i])
|
||||
nb_liq[i] = tot_ventes(
|
||||
operations[i]
|
||||
.filter(group__on_acc__trigramme='LIQ')
|
||||
)
|
||||
nb_accounts[i] = tot_ventes(
|
||||
operations[i]
|
||||
.exclude(group__on_acc__trigramme='LIQ')
|
||||
)
|
||||
context['charts'] = [ { "color": "rgb(255, 99, 132)",
|
||||
"label": "Toutes consommations",
|
||||
"values": nb_ventes },
|
||||
{ "color": "rgb(54, 162, 235)",
|
||||
"label": "LIQ",
|
||||
"values": nb_liq },
|
||||
{ "color": "rgb(255, 205, 86)",
|
||||
"label": "Comptes K-Fêt",
|
||||
"values": nb_accounts } ]
|
||||
nb_ventes = []
|
||||
nb_accounts = []
|
||||
nb_liq = []
|
||||
for qs in chunks:
|
||||
nb_ventes.append(
|
||||
tot_ventes(qs))
|
||||
nb_liq.append(
|
||||
tot_ventes(qs.filter(group__on_acc__trigramme='LIQ')))
|
||||
nb_accounts.append(
|
||||
tot_ventes(qs.exclude(group__on_acc__trigramme='LIQ')))
|
||||
context['charts'] = [{"color": "rgb(255, 99, 132)",
|
||||
"label": "Toutes consommations",
|
||||
"values": nb_ventes},
|
||||
{"color": "rgb(54, 162, 235)",
|
||||
"label": "LIQ",
|
||||
"values": nb_liq},
|
||||
{"color": "rgb(255, 205, 86)",
|
||||
"label": "Comptes K-Fêt",
|
||||
"values": nb_accounts}]
|
||||
return context
|
||||
|
||||
@method_decorator(login_required)
|
||||
@method_decorator(teamkfet_required)
|
||||
def dispatch(self, *args, **kwargs):
|
||||
return super(ArticleStatLast, self).dispatch(*args, **kwargs)
|
||||
|
||||
|
||||
# Rend les ventes des 7 derniers jours
|
||||
# Aujourd'hui non compris
|
||||
class ArticleStatLastDay(ArticleStatLast):
|
||||
end_date = this_morning()
|
||||
id_prefix = ID_PREFIX_ART_LAST_DAYS
|
||||
|
||||
def get_dates(self, **kwargs):
|
||||
return lastdays(7)
|
||||
|
||||
def get_labels(self, **kwargs):
|
||||
days = lastdays(7)
|
||||
return daynames(days)
|
||||
|
||||
|
||||
# Rend les ventes de 7 dernières semaines
|
||||
# La semaine en cours n'est pas comprise
|
||||
class ArticleStatLastWeek(ArticleStatLast):
|
||||
end_date = this_monday_morning()
|
||||
id_prefix = ID_PREFIX_ART_LAST_WEEKS
|
||||
|
||||
def get_dates(self, **kwargs):
|
||||
return lastweeks(7)
|
||||
|
||||
def get_labels(self, **kwargs):
|
||||
weeks = lastweeks(7)
|
||||
return weeknames(weeks)
|
||||
|
||||
|
||||
# Rend les ventes des 7 derniers mois
|
||||
# Le mois en cours n'est pas compris
|
||||
class ArticleStatLastMonth(ArticleStatLast):
|
||||
end_date = this_monday_morning()
|
||||
id_prefix = ID_PREFIX_ART_LAST_MONTHS
|
||||
|
||||
def get_dates(self, **kwargs):
|
||||
return lastmonths(7)
|
||||
|
||||
def get_labels(self, **kwargs):
|
||||
months = lastmonths(7)
|
||||
return monthnames(months)
|
||||
return super().dispatch(*args, **kwargs)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue