WIP articleCategory stat

This commit is contained in:
Qwann 2016-12-10 23:06:38 +01:00
parent d19daa04b1
commit 14f021b5b0
6 changed files with 110 additions and 89 deletions

View file

@ -0,0 +1,16 @@
jQuery(document).ready(function() {
// 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);
}
});
}
});

View file

@ -83,13 +83,7 @@
<div class="col-sm-12 col-md-6 nopadding"> <div class="col-sm-12 col-md-6 nopadding">
<div class="panel-md-margin"> <div class="panel-md-margin">
<h3>Ventes de {{ article.name }}</h3> <h3>Ventes de {{ article.name }}</h3>
<canvas id="myChart1" width="200" height="200"></canvas> <div id="stat_last"></div>
</div>
</div>
<div class="col-sm-12 col-md-6 nopadding">
<div class="panel-md-margin">
<h3>Répartition des câlins</h3>
<canvas id="myChart2" width="200" height="200"></canvas>
</div> </div>
</div> </div>
</div><!-- /row --> </div><!-- /row -->
@ -103,43 +97,23 @@
<script src="{% static 'kfet/js/Chart.bundle.js' %}"></script> <script src="{% static 'kfet/js/Chart.bundle.js' %}"></script>
<script> <script>
jQuery(document).ready(function() { jQuery(document).ready(function() {
var ctx1 = $("#myChart1"); var stat_last = $("#stat_last");
var myChart = new Chart(ctx1, { var stat_last_url = "{% url 'kfet.article.stat.last' article.id %}";
type: 'bar', get_thing(stat_last_url, stat_last, "Stat non trouvées :(");
data: { // FONCTIONS
labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], // Permet de raffraichir un champ, étant donné :
datasets: [{ // thing_url : l'url contenant le contenu
label: '# of Votes', // thing_div : le div où le mettre
data: [12, 19, 3, 5, 2, 3], // empty_... : le truc à dire si on a un contenu vide
backgroundColor: [ function get_thing(thing_url, thing_div, empty_thing_message) {
'rgba(255, 99, 132, 0.2)', $.get(thing_url, function(data) {
'rgba(54, 162, 235, 0.2)', if(jQuery.trim(data).length==0) {
'rgba(255, 206, 86, 0.2)', thing_div.html(empty_thing_message);
'rgba(75, 192, 192, 0.2)', } else {
'rgba(153, 102, 255, 0.2)', thing_div.html(data);
'rgba(255, 159, 64, 0.2)' }
], });
borderColor: [ }
'rgba(255,99,132,1)',
'rgba(54, 162, 235, 1)',
'rgba(255, 206, 86, 1)',
'rgba(75, 192, 192, 1)',
'rgba(153, 102, 255, 1)',
'rgba(255, 159, 64, 1)'
],
borderWidth: 1
}]
},
options: {
scales: {
yAxes: [{
ticks: {
beginAtZero:true
}
}]
}
}
});
}); });
</script> </script>
{% endblock %} {% endblock %}

View file

@ -1,14 +1,8 @@
<!doctype html> <!doctype html>
{% load staticfiles %}
<body> <body>
<canvas id="{{ chart_id }}"></canvas> <canvas id="{{ chart_id }}"></canvas>
{% comment %}
TODO : supprimer les fichiers script jQuery et Chart.js
{% endcomment %}
<script src="{% static 'kfet/js/Chart.bundle.js' %}"></script>
<script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha256-cCueBR6CsyA4/9szpPfrX3s49M9vUU5BgtiJj06wt/s=" crossorigin="anonymous"></script>
<script> <script>
jQuery(document).ready(function() { jQuery(document).ready(function() {
var ctx1 = $({{ chart_id }}); var ctx1 = $({{ chart_id }});

View file

@ -1,23 +1,6 @@
<!doctype html> <!doctype html>
{% load staticfiles %} {% load staticfiles %}
{% load dictionary_extras %} {% load dictionary_extras %}
<!-- TODO: SUPPRIMER-->
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
{# CSS #}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va+PmSTsz/K68vbdEjh4u" crossorigin="anonymous">
<link href='https://fonts.googleapis.com/css?family=Roboto:400,700|Oswald:400,700|Roboto+Mono:400,700' rel='stylesheet' type='text/css'>
<link rel="stylesheet" type="text/css" href="{% static 'kfet/css/jquery-confirm.css' %}">
<link rel="stylesheet" type="text/css" href="{% static 'kfet/css/index.css' %}">
{# JS #}
<script src="https://code.jquery.com/jquery-3.1.0.min.js" integrity="sha256-cCueBR6CsyA4/9szpPfrX3s49M9vUU5BgtiJj06wt/s=" crossorigin="anonymous"></script>
</head>
<!-- END TODO -->
<body> <body>
<div class="btn-group btn-group-justified" role="group" aria-label="select-period"> <div class="btn-group btn-group-justified" role="group" aria-label="select-period">
{% for k,stat in stats.items %} {% for k,stat in stats.items %}
@ -32,33 +15,33 @@
jQuery(document).ready(function() { jQuery(document).ready(function() {
// VARIABLES // VARIABLES
// défaut // défaut
content_id = $("#{{content_id}}"); {{if_prefix}}_content_id = $("#{{content_id}}");
{% for k,stat in stats.items %} {% for k,stat in stats.items %}
{% if k == default_stat %} {% if k == default_stat %}
default_url_{{id_prefix}} = "{{ stat | get_item:'url' }}"; {{id_prefix}}_default_url = "{{ stat | get_item:'url' }}";
{% endif %} {% endif %}
{% endfor %} {% endfor %}
// INIT // INIT
get_thing(default_url_{{id_prefix}}, content_id, "Ouppss ?"); get_thing({{id_prefix}}_default_url, {{if_prefix}}_content_id, "Ouppss ?");
{% for k,stat in stats.items %} {% for k,stat in stats.items %}
$("#{{stat|get_item:'btn'}}").on('click', function() { $("#{{stat|get_item:'btn'}}").on('click', function() {
get_thing("{{stat|get_item:'url'}}", content_id, "Ouuups ?") get_thing("{{stat|get_item:'url'}}", {{if_prefix}}_content_id, "Ouuups ?")
}); });
{% endfor %} {% endfor %}
// FONCTIONS // FONCTIONS
// Permet de raffraichir un champ, étant donné : // Permet de raffraichir un champ, étant donné :
// thing_url : l'url contenant le contenu // thing_url : l'url contenant le contenu
// thing_div : le div où le mettre // thing_div : le div où le mettre
// empty_... : le truc à dire si on a un contenu vide // empty_... : le truc à dire si on a un contenu vide
function get_thing(thing_url, thing_div, empty_thing_message) { function get_thing(thing_url, thing_div, empty_thing_message) {
$.get(thing_url, function(data) { $.get(thing_url, function(data) {
if(jQuery.trim(data).length==0) { if(jQuery.trim(data).length==0) {
thing_div.html(empty_thing_message); thing_div.html(empty_thing_message);
} else { } else {
thing_div.html(data); thing_div.html(data);
} }
}); });
} }
}); });
</script> </script>
</body> </body>

View file

@ -122,13 +122,13 @@ urlpatterns = [
name = 'kfet.article.update'), name = 'kfet.article.update'),
# Article - Statistics # Article - Statistics
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/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'),
url('^articles/(?P<pk>\d+)/stat/last/day/$', url('^articles/(?P<pk>\d+)/stat/last/day$',
views.ArticleStatLastDay.as_view(), views.ArticleStatLastDay.as_view(),
name = 'kfet.article.stat.last.day'), name = 'kfet.article.stat.last.day'),

View file

@ -8,7 +8,7 @@ from django.shortcuts import render, get_object_or_404, redirect
from django.core.exceptions import PermissionDenied, ValidationError from django.core.exceptions import PermissionDenied, ValidationError
from django.core.cache import cache from django.core.cache import cache
from django.views.generic import ListView, DetailView from django.views.generic import ListView, DetailView
from django.views.generic.detail import BaseDetailView, SingleObjectTemplateResponseMixin from django.views.generic.detail import BaseListView, BaseDetailView, SingleObjectTemplateResponseMixin, MultipleObjectTemplateResponseMixin
from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView from django.views.generic.edit import CreateView, UpdateView, DeleteView, FormView
from django.core.urlresolvers import reverse_lazy from django.core.urlresolvers import reverse_lazy
from django.contrib import messages from django.contrib import messages
@ -1993,6 +1993,19 @@ class HybridDetailView(JSONResponseMixin,
return super(HybridDetailView, self).render_to_response(context) return super(HybridDetailView, self).render_to_response(context)
# Rend un ListView en html sauf si on lui précise dans
# l'appel à get que l'on veut un json auquel cas il en rend un
class HybridListView(JSONResponseMixin,
MultipleObjectTemplateResponseMixin,
BaseListView):
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(HybridListView, self).render_to_response(context)
# Un résume des toutes les vues de stat d'un objet # Un résume des toutes les vues de stat d'un objet
# NE REND PAS DE JSON # NE REND PAS DE JSON
class ObjectResumeStat(DetailView): class ObjectResumeStat(DetailView):
@ -2157,3 +2170,44 @@ class ArticleStatLastWeek(ArticleStatLast):
def get_labels(self, **kwargs): def get_labels(self, **kwargs):
weeks = lastweeks(7) weeks = lastweeks(7)
return weeksnames(weeks) return weeksnames(weeks)
# ------------------------------
# Article Statistique Catégories
# ------------------------------
class DurationStat(HybridListView):
lookup_duration_type = 'day' # 'day' || 'week' || 'month'
lookup_duration_number = 3 # ie ici : 3 jours
def get_end_date(self, **kwargs):
if self.lookup_duration_type == 'day':
return this_morning()
elif self.lookup_duration_type == 'week':
return this_monday_morning()
elif self.lookup_duration_type == 'month':
return this_first_month_day()
else raise ValueError('duration_type invalid')
def get_begining_date(self, **kwargs):
end_date = self.get_end_date(self, **kwargs)
if self.lookup_duration_type == 'day':
days = self.lookup_nb_duration
elif self.lookup_duration_type == 'week':
days = 7*self.lookup_nb_duration
elif self.lookup_duration_type == 'month':
days = 30*self.lookup_nb_duration
else raise ValueError('this should not be happening.')
delta = timezone.timedelta(days=days)
return end_date - delta
#TODO
# class CategoryStatAll(DurationStat):
# model = ArticleCategory
# template_name = 'kfet/category_stat.html'
#
# def get_context_data(self, **kwargs):
# context = {}
# queryset = kwargs.pop('object_list', self.object_list)
#
# return context