forked from DGNum/gestioCOF
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
|
# Pareil mais pour une liste de dates
|
||||||
# dans un dico ordonné
|
# dans un dico ordonné
|
||||||
def weeksnames(dates):
|
def weeknames(dates):
|
||||||
names = {}
|
names = {}
|
||||||
for i in dates:
|
for i in dates:
|
||||||
names[i] = weekname(dates[i])
|
names[i] = weekname(dates[i])
|
||||||
|
@ -89,11 +89,18 @@ def lastweeks(nb):
|
||||||
return mondays
|
return mondays
|
||||||
|
|
||||||
|
|
||||||
# def lastmonths(nb):
|
def lastmonths(nb):
|
||||||
# first_month_day = this_first_month_day()
|
first_month_day = this_first_month_day()
|
||||||
# fisrt_days = {}
|
first_days = {}
|
||||||
# for i in range(1, nb+1):
|
this_year = first_month_day.year
|
||||||
# days[i] =
|
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():
|
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/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/kfet.js' %}"></script>
|
||||||
<script type="text/javascript" src="{% static 'kfet/js/history.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 %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block title %}
|
{% block title %}
|
||||||
|
@ -51,6 +75,19 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endif %}
|
{% 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">
|
<div class="content-right-block">
|
||||||
<h2>Historique</h2>
|
<h2>Historique</h2>
|
||||||
<div id="history">
|
<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()),
|
permission_required('kfet.view_negs')(views.AccountNegativeList.as_view()),
|
||||||
name = 'kfet.account.negative'),
|
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
|
# Checkout urls
|
||||||
# -----
|
# -----
|
||||||
|
@ -124,6 +138,9 @@ urlpatterns = [
|
||||||
url('^articles/(?P<pk>\d+)/stat/last/$',
|
url('^articles/(?P<pk>\d+)/stat/last/$',
|
||||||
views.ArticleStatLastAll.as_view(),
|
views.ArticleStatLastAll.as_view(),
|
||||||
name = 'kfet.article.stat.last'),
|
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/$',
|
url('^articles/(?P<pk>\d+)/stat/last/week/$',
|
||||||
views.ArticleStatLastWeek.as_view(),
|
views.ArticleStatLastWeek.as_view(),
|
||||||
name = 'kfet.article.stat.last.week'),
|
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 hashlib
|
||||||
import heapq
|
import heapq
|
||||||
import statistics
|
import statistics
|
||||||
from .statistic import lastdays, daynames, this_morning,\
|
from .statistic import daynames, monthnames, weeknames, \
|
||||||
tot_ventes, weeksnames, this_monday_morning, lastweeks
|
lastdays, lastweeks, lastmonths, \
|
||||||
|
this_morning, this_monday_morning, this_first_month_day, \
|
||||||
|
tot_ventes
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def home(request):
|
def home(request):
|
||||||
|
@ -2023,6 +2025,8 @@ class ObjectResumeStat(DetailView):
|
||||||
stat_labels = ['stat_1', 'stat_2']
|
stat_labels = ['stat_1', 'stat_2']
|
||||||
stat_urls = ['url_1', 'url_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):
|
def get_context_data(self, **kwargs):
|
||||||
# On hérite
|
# On hérite
|
||||||
|
@ -2038,7 +2042,7 @@ class ObjectResumeStat(DetailView):
|
||||||
object_id,
|
object_id,
|
||||||
i),
|
i),
|
||||||
'url': reverse_lazy(self.stat_urls[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)
|
prefix = "%s_%d" % (self.id_prefix, object_id)
|
||||||
context['id_prefix'] = prefix
|
context['id_prefix'] = prefix
|
||||||
|
@ -2049,12 +2053,151 @@ class ObjectResumeStat(DetailView):
|
||||||
return context
|
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
|
# Article Satistiques Last
|
||||||
# ------------------------
|
# ------------------------
|
||||||
ID_PREFIX_ART_LAST = "last_art"
|
ID_PREFIX_ART_LAST = "last_art"
|
||||||
ID_PREFIX_ART_LAST_DAYS = "last_days_art"
|
ID_PREFIX_ART_LAST_DAYS = "last_days_art"
|
||||||
ID_PREFIX_ART_LAST_WEEKS = "last_weeks_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
|
# Un résumé de toutes les vues ArticleStatLast
|
||||||
|
@ -2063,10 +2206,11 @@ class ArticleStatLastAll(ObjectResumeStat):
|
||||||
model = Article
|
model = Article
|
||||||
context_object_name = 'article'
|
context_object_name = 'article'
|
||||||
id_prefix = ID_PREFIX_ART_LAST
|
id_prefix = ID_PREFIX_ART_LAST
|
||||||
nb_stat = 2
|
nb_stat = 3
|
||||||
nb_default = 1
|
nb_default = 2
|
||||||
stat_labels = ["Dernières semaines", "Derniers jours"]
|
stat_labels = ["Derniers mois", "Dernières semaines", "Derniers jours"]
|
||||||
stat_urls = ['kfet.article.stat.last.week',
|
stat_urls = ['kfet.article.stat.last.month',
|
||||||
|
'kfet.article.stat.last.week',
|
||||||
'kfet.article.stat.last.day']
|
'kfet.article.stat.last.day']
|
||||||
|
|
||||||
|
|
||||||
|
@ -2172,7 +2316,20 @@ class ArticleStatLastWeek(ArticleStatLast):
|
||||||
|
|
||||||
def get_labels(self, **kwargs):
|
def get_labels(self, **kwargs):
|
||||||
weeks = lastweeks(7)
|
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
|
# Article Statistique Catégories
|
||||||
|
|
Loading…
Reference in a new issue