ma conso added
This commit is contained in:
parent
0c3c41a812
commit
ccf7c4a484
5 changed files with 284 additions and 14 deletions
|
@ -52,7 +52,7 @@ def daynames(dates):
|
|||
|
||||
# Pareil mais pour une liste de dates
|
||||
# dans un dico ordonné
|
||||
def weeksnames(dates):
|
||||
def weeknames(dates):
|
||||
names = {}
|
||||
for i in dates:
|
||||
names[i] = weekname(dates[i])
|
||||
|
@ -89,11 +89,18 @@ def lastweeks(nb):
|
|||
return mondays
|
||||
|
||||
|
||||
# def lastmonths(nb):
|
||||
# first_month_day = this_first_month_day()
|
||||
# fisrt_days = {}
|
||||
# for i in range(1, nb+1):
|
||||
# days[i] =
|
||||
def lastmonths(nb):
|
||||
first_month_day = this_first_month_day()
|
||||
first_days = {}
|
||||
this_year = first_month_day.year
|
||||
this_month = first_month_day.month
|
||||
for i in range(1, nb+1):
|
||||
month = this_month - (nb - i) % 12
|
||||
year = this_year + (nb - i) // 12
|
||||
first_days[i] = timezone.datetime(year=year,
|
||||
month=month,
|
||||
day=1)
|
||||
return first_days
|
||||
|
||||
|
||||
def this_first_month_day():
|
||||
|
|
|
@ -10,6 +10,30 @@
|
|||
<script type="text/javascript" src="{% static 'kfet/js/moment-timezone-with-data-2010-2020.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'kfet/js/kfet.js' %}"></script>
|
||||
<script type="text/javascript" src="{% static 'kfet/js/history.js' %}"></script>
|
||||
{% if account.user == request.user %}
|
||||
<script src="{% static 'kfet/js/Chart.bundle.js' %}"></script>
|
||||
<script>
|
||||
jQuery(document).ready(function() {
|
||||
var stat_last = $("#stat_last");
|
||||
var stat_last_url = "{% url 'kfet.account.stat.last' trigramme=account.trigramme %}";
|
||||
get_thing(stat_last_url, stat_last, "Stat non trouvées :(");
|
||||
// FONCTIONS
|
||||
// Permet de raffraichir un champ, étant donné :
|
||||
// thing_url : l'url contenant le contenu
|
||||
// thing_div : le div où le mettre
|
||||
// empty_... : le truc à dire si on a un contenu vide
|
||||
function get_thing(thing_url, thing_div, empty_thing_message) {
|
||||
$.get(thing_url, function(data) {
|
||||
if(jQuery.trim(data).length==0) {
|
||||
thing_div.html(empty_thing_message);
|
||||
} else {
|
||||
thing_div.html(data);
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
</script>
|
||||
{% endif %}
|
||||
{% endblock %}
|
||||
|
||||
{% block title %}
|
||||
|
@ -51,6 +75,19 @@
|
|||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% if account.user == request.user %}
|
||||
<div class="content-right-block">
|
||||
<h2>Statistiques</h2>
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-md-6 nopadding">
|
||||
<div class="panel-md-margin">
|
||||
<h3>Ma consommation</h3>
|
||||
<div id="stat_last"></div>
|
||||
</div>
|
||||
</div>
|
||||
</div><!-- /row -->
|
||||
</div>
|
||||
{% endif %}
|
||||
<div class="content-right-block">
|
||||
<h2>Historique</h2>
|
||||
<div id="history">
|
||||
|
|
52
kfet/templates/kfet/account_stat_last.html
Normal file
52
kfet/templates/kfet/account_stat_last.html
Normal file
|
@ -0,0 +1,52 @@
|
|||
<!doctype html>
|
||||
|
||||
<body>
|
||||
<canvas id="{{ chart_id }}"></canvas>
|
||||
|
||||
<script>
|
||||
jQuery(document).ready(function() {
|
||||
var ctx1 = $({{ chart_id }});
|
||||
var myChart = new Chart(ctx1, {
|
||||
type: 'line',
|
||||
data: {
|
||||
labels: [
|
||||
{% for k,label in labels.items %}
|
||||
{% if forloop.last %}
|
||||
"{{ label }}"
|
||||
{% else %}
|
||||
"{{ label }}",
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
],
|
||||
datasets: [{
|
||||
label: 'Nb items achetés',
|
||||
borderColor: 'rgb(255, 99, 132)',
|
||||
backgroundColor: 'rgb(255, 99, 132)',
|
||||
data: [
|
||||
{% for k,nb in nb_ventes.items %}
|
||||
{% if forloop.last %}
|
||||
"{{ nb }}"
|
||||
{% else %}
|
||||
"{{ nb }}",
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
],
|
||||
fill: false,
|
||||
lineTension: 0,
|
||||
}]
|
||||
},
|
||||
options: {
|
||||
responsive: true,
|
||||
tooltips: {
|
||||
mode: 'index',
|
||||
intersect: false,
|
||||
},
|
||||
hover: {
|
||||
mode: 'nearest',
|
||||
intersect: false,
|
||||
},
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</body>
|
17
kfet/urls.py
17
kfet/urls.py
|
@ -64,6 +64,20 @@ urlpatterns = [
|
|||
permission_required('kfet.view_negs')(views.AccountNegativeList.as_view()),
|
||||
name = 'kfet.account.negative'),
|
||||
|
||||
# Account - Statistics
|
||||
url('^accounts/(?P<trigramme>.{3})/stat/last/$',
|
||||
views.AccountStatLastAll.as_view(),
|
||||
name = 'kfet.account.stat.last'),
|
||||
url('^accounts/(?P<trigramme>.{3})/stat/last/month/$',
|
||||
views.AccountStatLastMonth.as_view(),
|
||||
name = 'kfet.account.stat.last.month'),
|
||||
url('^accounts/(?P<trigramme>.{3})/stat/last/week/$',
|
||||
views.AccountStatLastWeek.as_view(),
|
||||
name = 'kfet.account.stat.last.week'),
|
||||
url('^accounts/(?P<trigramme>.{3})/stat/last/day/$',
|
||||
views.AccountStatLastDay.as_view(),
|
||||
name = 'kfet.account.stat.last.day'),
|
||||
|
||||
# -----
|
||||
# Checkout urls
|
||||
# -----
|
||||
|
@ -124,6 +138,9 @@ urlpatterns = [
|
|||
url('^articles/(?P<pk>\d+)/stat/last/$',
|
||||
views.ArticleStatLastAll.as_view(),
|
||||
name = 'kfet.article.stat.last'),
|
||||
url('^articles/(?P<pk>\d+)/stat/last/month/$',
|
||||
views.ArticleStatLastMonth.as_view(),
|
||||
name = 'kfet.article.stat.last.month'),
|
||||
url('^articles/(?P<pk>\d+)/stat/last/week/$',
|
||||
views.ArticleStatLastWeek.as_view(),
|
||||
name = 'kfet.article.stat.last.week'),
|
||||
|
|
173
kfet/views.py
173
kfet/views.py
|
@ -37,8 +37,10 @@ import django_cas_ng
|
|||
import hashlib
|
||||
import heapq
|
||||
import statistics
|
||||
from .statistic import lastdays, daynames, this_morning,\
|
||||
tot_ventes, weeksnames, this_monday_morning, lastweeks
|
||||
from .statistic import daynames, monthnames, weeknames, \
|
||||
lastdays, lastweeks, lastmonths, \
|
||||
this_morning, this_monday_morning, this_first_month_day, \
|
||||
tot_ventes
|
||||
|
||||
@login_required
|
||||
def home(request):
|
||||
|
@ -2023,6 +2025,8 @@ class ObjectResumeStat(DetailView):
|
|||
stat_labels = ['stat_1', 'stat_2']
|
||||
stat_urls = ['url_1', 'url_2']
|
||||
|
||||
def get_object_url_kwargs(self, **kwargs):
|
||||
return {'pk': self.object.id}
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
# On hérite
|
||||
|
@ -2038,7 +2042,7 @@ class ObjectResumeStat(DetailView):
|
|||
object_id,
|
||||
i),
|
||||
'url': reverse_lazy(self.stat_urls[i],
|
||||
args=[object_id]),
|
||||
kwargs=self.get_object_url_kwargs()),
|
||||
}
|
||||
prefix = "%s_%d" % (self.id_prefix, object_id)
|
||||
context['id_prefix'] = prefix
|
||||
|
@ -2049,12 +2053,151 @@ class ObjectResumeStat(DetailView):
|
|||
return context
|
||||
|
||||
|
||||
# ------------------------
|
||||
# Consommation personnelle
|
||||
# ------------------------
|
||||
ID_PREFIX_ACC_LAST = "last_acc"
|
||||
ID_PREFIX_ACC_LAST_DAYS = "last_days_acc"
|
||||
ID_PREFIX_ACC_LAST_WEEKS = "last_weeks_acc"
|
||||
ID_PREFIX_ACC_LAST_MONTHS = "last_months_acc"
|
||||
|
||||
|
||||
# Un résumé de toutes les vues ArticleStatLast
|
||||
# NE REND PAS DE JSON
|
||||
class AccountStatLastAll(ObjectResumeStat):
|
||||
model = Account
|
||||
context_object_name = 'account'
|
||||
trigramme_url_kwarg = 'trigramme'
|
||||
id_prefix = ID_PREFIX_ACC_LAST
|
||||
nb_stat = 3
|
||||
nb_default = 2
|
||||
stat_labels = ["Derniers mois", "Dernières semaines", "Derniers jours"]
|
||||
stat_urls = ['kfet.account.stat.last.month',
|
||||
'kfet.account.stat.last.week',
|
||||
'kfet.account.stat.last.day']
|
||||
|
||||
def get_object(self, **kwargs):
|
||||
trigramme = self.kwargs.get(self.trigramme_url_kwarg)
|
||||
return get_object_or_404(Account, trigramme=trigramme)
|
||||
|
||||
def get_object_url_kwargs(self, **kwargs):
|
||||
return {'trigramme': self.object.trigramme}
|
||||
|
||||
|
||||
class AccountStatLast(HybridDetailView):
|
||||
model = Account
|
||||
trigramme_url_kwarg = 'trigramme'
|
||||
template_name = 'kfet/account_stat_last.html'
|
||||
context_object_name = 'account'
|
||||
end_date = timezone.now()
|
||||
id_prefix = "lol"
|
||||
|
||||
# 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_object(self, **kwargs):
|
||||
trigramme = self.kwargs.get(self.trigramme_url_kwarg)
|
||||
return get_object_or_404(Account, trigramme=trigramme)
|
||||
|
||||
def sort_operations(self, **kwargs):
|
||||
# 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(group__on_acc=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])
|
||||
)
|
||||
return operations
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
# On hérite
|
||||
# en fait non, pas besoin et c'est chiant à dumper
|
||||
# context = super(AccountStat, self).get_context_data(**kwargs)
|
||||
context = {}
|
||||
nb_ventes = {}
|
||||
# On récupère les labels des dates
|
||||
context['labels'] = self.get_labels().copy()
|
||||
# On compte les opérations
|
||||
operations = self.sort_operations()
|
||||
for i in operations:
|
||||
nb_ventes[i] = tot_ventes(operations[i])
|
||||
context['nb_ventes'] = nb_ventes
|
||||
# ID unique
|
||||
context['chart_id'] = "%s_%d" % (self.id_prefix,
|
||||
self.object.id)
|
||||
return context
|
||||
|
||||
|
||||
# Rend les achats pour ce compte des 7 derniers jours
|
||||
# Aujourd'hui non compris
|
||||
class AccountStatLastDay(AccountStatLast):
|
||||
end_date = this_morning()
|
||||
id_prefix = ID_PREFIX_ACC_LAST_DAYS
|
||||
|
||||
def get_dates(self, **kwargs):
|
||||
return lastdays(7)
|
||||
|
||||
def get_labels(self, **kwargs):
|
||||
days = lastdays(7)
|
||||
return daynames(days)
|
||||
|
||||
|
||||
# Rend les achats de ce compte des 7 dernières semaines
|
||||
# La semaine en cours n'est pas comprise
|
||||
class AccountStatLastWeek(AccountStatLast):
|
||||
end_date = this_monday_morning()
|
||||
id_prefix = ID_PREFIX_ACC_LAST_WEEKS
|
||||
|
||||
def get_dates(self, **kwargs):
|
||||
return lastweeks(7)
|
||||
|
||||
def get_labels(self, **kwargs):
|
||||
weeks = lastweeks(7)
|
||||
return weeknames(weeks)
|
||||
|
||||
|
||||
# Rend les achats de ce compte des 7 derniers mois
|
||||
# Le mois en cours n'est pas compris
|
||||
class AccountStatLastMonth(AccountStatLast):
|
||||
end_date = this_monday_morning()
|
||||
id_prefix = ID_PREFIX_ACC_LAST_MONTHS
|
||||
|
||||
def get_dates(self, **kwargs):
|
||||
return lastmonths(7)
|
||||
|
||||
def get_labels(self, **kwargs):
|
||||
months = lastmonths(7)
|
||||
return monthnames(months)
|
||||
|
||||
|
||||
# ------------------------
|
||||
# Article Satistiques Last
|
||||
# ------------------------
|
||||
ID_PREFIX_ART_LAST = "last_art"
|
||||
ID_PREFIX_ART_LAST_DAYS = "last_days_art"
|
||||
ID_PREFIX_ART_LAST_WEEKS = "last_weeks_art"
|
||||
ID_PREFIX_ART_LAST_MONTHS = "last_months_art"
|
||||
|
||||
|
||||
# Un résumé de toutes les vues ArticleStatLast
|
||||
|
@ -2063,10 +2206,11 @@ class ArticleStatLastAll(ObjectResumeStat):
|
|||
model = Article
|
||||
context_object_name = 'article'
|
||||
id_prefix = ID_PREFIX_ART_LAST
|
||||
nb_stat = 2
|
||||
nb_default = 1
|
||||
stat_labels = ["Dernières semaines", "Derniers jours"]
|
||||
stat_urls = ['kfet.article.stat.last.week',
|
||||
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']
|
||||
|
||||
|
||||
|
@ -2172,7 +2316,20 @@ class ArticleStatLastWeek(ArticleStatLast):
|
|||
|
||||
def get_labels(self, **kwargs):
|
||||
weeks = lastweeks(7)
|
||||
return weeksnames(weeks)
|
||||
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)
|
||||
|
||||
# ------------------------------
|
||||
# Article Statistique Catégories
|
||||
|
|
Loading…
Reference in a new issue