diff --git a/kfet/static/kfet/js/statistic.js b/kfet/static/kfet/js/statistic.js
new file mode 100644
index 00000000..aa2b7842
--- /dev/null
+++ b/kfet/static/kfet/js/statistic.js
@@ -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);
+ }
+ });
+ }
+});
diff --git a/kfet/templates/kfet/article_read.html b/kfet/templates/kfet/article_read.html
index bb852706..250014b7 100644
--- a/kfet/templates/kfet/article_read.html
+++ b/kfet/templates/kfet/article_read.html
@@ -83,13 +83,7 @@
{% for k,stat in stats.items %}
@@ -32,33 +15,33 @@
jQuery(document).ready(function() {
// VARIABLES
// défaut
- content_id = $("#{{content_id}}");
+ {{if_prefix}}_content_id = $("#{{content_id}}");
{% for k,stat in stats.items %}
{% if k == default_stat %}
- default_url_{{id_prefix}} = "{{ stat | get_item:'url' }}";
+ {{id_prefix}}_default_url = "{{ stat | get_item:'url' }}";
{% endif %}
{% endfor %}
// 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 %}
$("#{{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 %}
- // 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);
- }
- });
- }
+ // 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);
+ }
+ });
+ }
});
diff --git a/kfet/urls.py b/kfet/urls.py
index 1904a896..09f16b17 100644
--- a/kfet/urls.py
+++ b/kfet/urls.py
@@ -122,13 +122,13 @@ urlpatterns = [
name = 'kfet.article.update'),
# Article - Statistics
- url('^articles/(?P
\d+)/stat/last/$',
+ url('^articles/(?P\d+)/stat/last$',
views.ArticleStatLastAll.as_view(),
name = 'kfet.article.stat.last'),
- url('^articles/(?P\d+)/stat/last/week/$',
+ url('^articles/(?P\d+)/stat/last/week$',
views.ArticleStatLastWeek.as_view(),
name = 'kfet.article.stat.last.week'),
- url('^articles/(?P\d+)/stat/last/day/$',
+ url('^articles/(?P\d+)/stat/last/day$',
views.ArticleStatLastDay.as_view(),
name = 'kfet.article.stat.last.day'),
diff --git a/kfet/views.py b/kfet/views.py
index b8c47799..1614a27b 100644
--- a/kfet/views.py
+++ b/kfet/views.py
@@ -8,7 +8,7 @@ from django.shortcuts import render, get_object_or_404, redirect
from django.core.exceptions import PermissionDenied, ValidationError
from django.core.cache import cache
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.core.urlresolvers import reverse_lazy
from django.contrib import messages
@@ -1993,6 +1993,19 @@ class HybridDetailView(JSONResponseMixin,
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
# NE REND PAS DE JSON
class ObjectResumeStat(DetailView):
@@ -2157,3 +2170,44 @@ class ArticleStatLastWeek(ArticleStatLast):
def get_labels(self, **kwargs):
weeks = lastweeks(7)
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