diff --git a/maraudes/notes.py b/maraudes/notes.py
index 6d317e0..b6d5c75 100644
--- a/maraudes/notes.py
+++ b/maraudes/notes.py
@@ -5,21 +5,25 @@ from . import managers
# Extends 'notes' module
+
class Observation(Note):
""" Note dans le cadre d'une rencontre """
objects = managers.ObservationManager()
- rencontre = models.ForeignKey( 'maraudes.Rencontre',
- models.CASCADE,
- related_name="observations"
- )
+ rencontre = models.ForeignKey('maraudes.Rencontre',
+ models.CASCADE,
+ related_name="observations")
# Note attributes proxies
- def note_author(self): return self.rencontre.maraude.referent
- def note_date(self): return self.rencontre.date
- def note_time(self): return self.rencontre.heure_debut
- def note_labels(self): return [self.rencontre.lieu, self.rencontre.heure_debut]
- def note_bg_colors(self): return ("info", "info")
+ def note_author(self): return self.rencontre.maraude.referent
+
+ def note_date(self): return self.rencontre.date
+
+ def note_time(self): return self.rencontre.heure_debut
+
+ def note_labels(self): return [self.rencontre.lieu, self.rencontre.heure_debut]
+
+ def note_bg_colors(self): return ("info", "info")
class Appel(Note):
diff --git a/maraudes/views.py b/maraudes/views.py
index addf698..b74fe4f 100644
--- a/maraudes/views.py
+++ b/maraudes/views.py
@@ -2,8 +2,6 @@ import datetime
import calendar
import logging
-logger = logging.getLogger(__name__)
-
from django.utils import timezone
from django.shortcuts import redirect, reverse
from django.views import generic
@@ -13,19 +11,21 @@ from django.contrib import messages
from utilisateurs.mixins import MaraudeurMixin
-from .models import ( Maraude, Maraudeur,
- CompteRendu,
- Rencontre, Lieu,
- Planning, )
+from .models import (Maraude, Maraudeur,
+ CompteRendu,
+ Rencontre, Lieu,
+ Planning,)
from .notes import Signalement
# Forms
-from .forms import ( RencontreForm,
- ObservationInlineFormSet,
- MaraudeHiddenDateForm, MonthSelectForm,
- AppelForm, SignalementForm,
- SendMailForm )
+from .forms import (RencontreForm,
+ ObservationInlineFormSet,
+ MaraudeHiddenDateForm, MonthSelectForm,
+ AppelForm, SignalementForm,
+ SendMailForm)
from notes.mixins import NoteFormMixin
+logger = logging.getLogger(__name__)
+
def derniers_sujets_rencontres():
""" Renvoie le 'set' des sujets rencontrés dans les deux dernières maraudes """
diff --git a/statistiques/charts.py b/statistiques/charts.py
index 786dc34..36aaf31 100644
--- a/statistiques/charts.py
+++ b/statistiques/charts.py
@@ -34,15 +34,15 @@ class PieWrapper(gchart.PieChart):
else:
raise ValueError("Could not guess labels for", field)
- data = ([(field.name, 'count')] + # Headers
+ data = ([(field.name, 'count')] + # Headers
[(labels[item[field.name]],
item['nbr']) for item in queryset.values(
- field.name
- ).annotate(
- nbr=Count('pk')
- ).order_by()
- if (not null_values
- or item[field] not in null_values)
+ field.name
+ ).annotate(
+ nbr=Count('pk')
+ ).order_by()
+ if (not null_values
+ or item[field] not in null_values)
])
super().__init__(
diff --git a/statistiques/templates/statistiques/frequentation.html b/statistiques/templates/statistiques/frequentation.html
index e82f176..7f06234 100644
--- a/statistiques/templates/statistiques/frequentation.html
+++ b/statistiques/templates/statistiques/frequentation.html
@@ -19,5 +19,9 @@
{% endblock %}
{% block page_content %}
- {{ par_heure.as_html }}
+ {{ rencontres_par_heure.as_html }}
+ {{ rencontres_par_mois.as_html }}
+
+ {{ rencontres_par_sujet.as_html }}
+
{% endblock %}
diff --git a/statistiques/templates/statistiques/gchart/pie_chart.html b/statistiques/templates/statistiques/gchart/pie_chart.html
index 6a519aa..db05129 100644
--- a/statistiques/templates/statistiques/gchart/pie_chart.html
+++ b/statistiques/templates/statistiques/gchart/pie_chart.html
@@ -8,6 +8,5 @@
// Wait for the chart to finish drawing before calling the getImageURI() method.
google.visualization.events.addListener(chart, 'ready', function () {
$("#image-{{ chart.get_html_id }}").attr("href", chart.getImageURI());
- $("#wrapper-{{ chart.get_html_id}}").hide();
});
{% endblock %}
diff --git a/statistiques/templates/statistiques/index.html b/statistiques/templates/statistiques/index.html
index 5f1e96c..9750cff 100644
--- a/statistiques/templates/statistiques/index.html
+++ b/statistiques/templates/statistiques/index.html
@@ -15,46 +15,26 @@
{% block breadcrumbs %}
{{ block.super }}
- Tests
+ Données générales
{% endblock %}
{% block page_content %}
-
-
-
Voici les données permettant une analyse statistiques des maraudes.
-
Vous pouvez sélectionner une période particulière ou l'ensemble des données
-
Les données sont réparties en trois catégories, accessibles par le menu sur la gauche
+
+
+
+
+ | ... | Maraudes | Nombre de rencontres moyenne par maraude | Personnes |
+ | Total | {{nbr_maraudes}} | {{nbr_rencontres}} {{nbr_rencontres_moyenne }} | {{nbr_sujets}} |
+ | Soirée | {{nbr_maraudes_nuit}} | {{nbr_rencontres_nuit}} {{nbr_rencontres_nuit_moyenne }} | {{nbr_sujets_nuit}} |
+ | Journée | {{nbr_maraudes_jour}} | {{nbr_rencontres_jour}} {{nbr_rencontres_jour_moyenne }} | {{nbr_sujets_jour}} |
+
-
-
- -
- {{ nbr_maraudes }}
- Nombre de maraudes
-
- -
- {{ nbr_maraudes_jour }}
- dont, Maraudes de journée
-
- -
- {{ nbr_rencontres }}
- Nombre total de rencontres
-
- -
- {{ moy_rencontres }}
- soit, en moyenne par maraude
-
- -
- {{ nbr_sujets_rencontres }}
- Nombre de sujets rencontrés
-
-
+
+
Voici les données permettant une analyse statistiques des maraudes.
+
Vous pouvez sélectionner une période particulière ou l'ensemble des données
+
Les données sont réparties en trois catégories, accessibles par le menu sur la gauche
+
-{% if rencontres_par_mois %}
-
-
- {{ rencontres_par_mois.as_html }}
-
-{% endif %}
{% endblock %}
diff --git a/statistiques/templates/statistiques/typologie.html b/statistiques/templates/statistiques/typologie.html
index 67ec86d..0a1a6c9 100644
--- a/statistiques/templates/statistiques/typologie.html
+++ b/statistiques/templates/statistiques/typologie.html
@@ -6,7 +6,6 @@
{% block sidebar %}
{{ block.super }}
-
{% include "statistiques/filter_form.html" %}
@@ -30,10 +29,6 @@
$("#tab-" + id).attr("class", "active");
$("#wrapper-" + id).show();
}
-
- /*$( function() {
- hideAll();
- });*/
{% for title, graph in graphs %}- {{ title }}
{% endfor %}
diff --git a/statistiques/views.py b/statistiques/views.py
index 27404ac..07ce8b3 100644
--- a/statistiques/views.py
+++ b/statistiques/views.py
@@ -15,7 +15,7 @@ from .forms import StatistiquesForm, SelectRangeForm
from .charts import PieWrapper, ColumnWrapper
from maraudes.notes import Observation
-from maraudes.models import Maraude
+from maraudes.models import Maraude, HORAIRES_APRESMIDI, HORAIRES_SOIREE
from notes.models import Sujet
###
@@ -62,8 +62,10 @@ class FilterMixin(generic.edit.FormMixin):
def get_fichestatistiques_queryset(self):
return FicheStatistique.objects.filter(pk__in=self.get_observations_queryset().values_list('sujet'))
- def get_sujets_queryset(self):
- return Sujet.objects.filter(pk__in=self.get_observations_queryset().values_list('sujet'))
+ def get_sujets_queryset(self, selection=None):
+ if not selection:
+ selection = self.get_observations_queryset()
+ return Sujet.objects.filter(pk__in=selection.values_list('sujet'))
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
@@ -85,50 +87,36 @@ class DashboardView(FilterMixin, generic.TemplateView):
context['nbr_maraudes'] = maraudes.count() or NO_DATA
context['nbr_maraudes_jour'] = maraudes.filter(
- heure_debut=datetime.time(16,00)
+ heure_debut=HORAIRES_APRESMIDI
).count() or NO_DATA
+ context['nbr_maraudes_nuit'] = maraudes.filter(
+ heure_debut=HORAIRES_SOIREE
+ ).count() or NO_DATA
+
context['nbr_rencontres'] = rencontres.count() or NO_DATA
- try:
- context['moy_rencontres'] = int(context['nbr_rencontres'] / context['nbr_maraudes'])
- except (ZeroDivisionError, TypeError):
- context['moy_rencontres'] = NO_DATA
-
- if self.year and not self.month: #Show rencontres_par_mois graph
- par_mois = rencontres.order_by().annotate(
- mois=ExtractMonth('created_date')
- ).values(
- 'mois'
- ).annotate(
- nbr=Count('pk')
+ rencontres_jour = rencontres.filter(
+ rencontre__maraude__heure_debut=HORAIRES_APRESMIDI
)
- context['rencontres_par_mois'] = ColumnWrapper(
- SimpleDataSource(
- [("Mois", "Rencontres")] +
- [(nom_mois[item['mois']], item['nbr']) for item in par_mois]
- ),
- options = {
- "title": "Nombre de rencontres par mois"
- }
- )
+ rencontres_nuit = rencontres.filter(
+ rencontre__maraude__heure_debut=HORAIRES_SOIREE
+ )
+ context['nbr_rencontres_jour'] = rencontres_jour.count() or NO_DATA
+ context['nbr_rencontres_nuit'] = rencontres_nuit.count() or NO_DATA
- # Graph: Fréquence de rencontres par sujet
+ for r, m in [
+ ('nbr_rencontres', 'nbr_maraudes'),
+ ('nbr_rencontres_nuit', 'nbr_maraudes_nuit'),
+ ('nbr_rencontres_jour', 'nbr_maraudes_jour'),
+ ]:
+ try:
+ context['%s_moyenne' % r] = int(context[r] / context[m])
+ except (ZeroDivisionError, TypeError):
+ context['%s_moyenne' % r] = NO_DATA
- nbr_rencontres = rencontres.values('sujet').annotate(nbr=Count('pk')).order_by()
- context['nbr_sujets_rencontres'] = nbr_rencontres.count()
+ context['nbr_sujets'] = self.get_sujets_queryset(selection=rencontres).count()
+ context['nbr_sujets_jour'] = self.get_sujets_queryset(selection=rencontres_jour).count()
+ context['nbr_sujets_nuit'] = self.get_sujets_queryset(selection=rencontres_nuit).count()
-
- categories = (
- ('Rencontre unique', (1,)),
- ('Entre 2 et 5 rencontres', range(2,6)),
- ('Entre 6 et 20 rencontres', range(6,20)),
- ('Plus de 20 rencontres', range(20,999)),
- )
- get_count_for_range = lambda rg: nbr_rencontres.filter(nbr__in=rg).count()
- context['graph_rencontres'] = PieWrapper(
- data= [('Type de rencontre', 'Nombre de sujets')] +
- [(label, get_count_for_range(rg)) for label, rg in categories],
- title= 'Fréquence de rencontres'
- )
return context
@@ -245,7 +233,7 @@ class FrequentationStatsView(FilterMixin, generic.TemplateView):
par_heure = self.calculer_frequentation_par_quart_heure(observations, continu=False)
en_continu = self.calculer_frequentation_par_quart_heure(observations, continu=True)
- context['par_heure'] = gchart.AreaChart(
+ context['rencontres_par_heure'] = gchart.AreaChart(
SimpleDataSource(
[("Heure", "Rencontres démarrées", "Au total (démarré + en cours)")] +
[(heure, par_heure[heure], en_continu[heure]) for heure in sorted(par_heure.keys())]
@@ -254,6 +242,41 @@ class FrequentationStatsView(FilterMixin, generic.TemplateView):
"title": "Fréquentation de la maraude en fonction de l'heure (par quart d'heure)"
}
)
+
+ par_mois = observations.order_by().annotate(
+ mois=ExtractMonth('created_date')
+ ).values(
+ 'mois'
+ ).annotate(
+ nbr=Count('pk')
+ )
+ context['rencontres_par_mois'] = ColumnWrapper(
+ SimpleDataSource(
+ [("Mois", "Rencontres")] +
+ [(nom_mois[item['mois']], item['nbr']) for item in par_mois]
+ ),
+ options = {
+ "title": "Nombre de rencontres par mois"
+ }
+ )
+
+ # Graph: Fréquence de rencontres par sujet
+ nbr_rencontres = observations.values('sujet').annotate(nbr=Count('pk')).order_by()
+ context['rencontres_par_sujet'] = nbr_rencontres.count()
+
+ categories = (
+ ('Rencontre unique', (1,)),
+ ('Entre 2 et 5 rencontres', range(2,6)),
+ ('Entre 6 et 20 rencontres', range(6,20)),
+ ('Plus de 20 rencontres', range(20,999)),
+ )
+ get_count_for_range = lambda rg: nbr_rencontres.filter(nbr__in=rg).count()
+ context['rencontres_par_sujet'] = PieWrapper(
+ data= [('Type de rencontre', 'Nombre de sujets')] +
+ [(label, get_count_for_range(rg)) for label, rg in categories],
+ title= 'Fréquence de rencontres'
+ )
+
return context