diff --git a/stats_cableurs.py b/stats_cableurs.py new file mode 100755 index 00000000..52346984 --- /dev/null +++ b/stats_cableurs.py @@ -0,0 +1,137 @@ +#!/usr/bin/python +# -*- mode: python; coding: utf-8 -*- +# +# $Id: stats_cableurs.py,v 1.1 2007-09-06 03:37:16 dimino Exp $ +# +# stats_cableurs.py +# ----------------- +# +# Copyright (C) 2007 François Bobot , +# Jeremie Dimino +# +# This file is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This file is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. + +import sys +sys.path.append("/usr/scripts/gestion/") +from ldap_crans import crans_ldap +from config import ann_scol +from affich_tools import cprint +import time + +db = crans_ldap() +date_debut_ann_scol = time.mktime((ann_scol, 8, 1, 0, 0, 0, 0, 0, 0)) +paiement_ann_scol = "paiement+%d" % ann_scol + +def donne_cableur(adherent): + u""" Cherche le cableur qui a inscrit ou réinscrit un adhérent. """ + + cableur = None + # Est-ce qu'on recherche une inscription ou une reinscription? + if adherent.dateInscription() < date_debut_ann_scol: + action = 'reinscription' + action_filtre = paiement_ann_scol + else: + action = 'inscription' + action_filtre = 'inscription' + + for hist in adherent.historique(): + # On decoupe pour avoir un truc utilisable + champ = hist.replace(',', '').replace(': ', '').split(' ') + # On inspecte la date + date = champ[0].split('/') + if int(date[1]) in [8, 9, 10] and int(date[2]) == ann_scol: + # Maintenant on regarde si l'action recherchee est ici + if action_filtre in champ[3:]: + return action, champ[2] + + return action, None + +def calcul_score(): + u""" Calcul le score de tous les cableurs ayant inscrit ou + réinscrit quelqu'un pour l'année en cours. """ + + liste = db.search("paiement=2007")['adherent'] + + score = {} + for adherent in liste: + action, cableur = donne_cableur(adherent) + if cableur: + if not score.has_key(cableur): + score[cableur] = { 'inscription': 0, + 'reinscription': 0 } + score[cableur][action] += 1 + + # On calcul le score total pour chaque cableur + for s in score.values(): + s['total'] = s['inscription'] + s['reinscription'] + + return score + +def classe(score={}): + u""" Retourne la liste des câbleurs classé par score total décroisant. """ + cableurs = score.keys() + cableurs.sort(lambda x,y : cmp(score[x]['total'],score[y]['total']), reverse=True) + return cableurs + +if __name__ == "__main__": + score = calcul_score() + classement = classe(score) + + # On cherche les noms des câbleurs parceque c'est quand même mieux + nom_reel = {} + for cableur in classement: + nom_reel[cableur] =db.search('uid=%s' % cableur)['adherent'][0].Nom() + + # Calcul des statistiques + total_inscription = 0 + total_reinscription = 0 + total = 0 + for s in score.values(): + total_inscription += s['inscription'] + total_reinscription += s['reinscription'] + total += s['total'] + cprint(u"""Statistiques globales: +- inscriptions: %(inscription)d +- réinscription: %(reinscription)d +- total: %(total)d + +""" % { 'inscription': total_inscription, + 'reinscription': total_reinscription, + 'total': total }, newline=False) + + # Calcul la longueur du nom le plus long + long_max = reduce(lambda m,c : max(m, len(c)), nom_reel.values(), len('cableur')) + + colonnes = [('inscription', u'inscription'), + ('reinscription', u'réinscription'), + ('total', u'score total')] + + # Titres des colonnes + ligne = "%-*s" % (long_max, u'câbleur') + for type, nom in colonnes: + ligne += " | %s" % nom + cprint(ligne) + # Ligne pour délimiter + ligne = ''.center(long_max, '-') + for type, nom in colonnes: + ligne += "-+-%s" % ''.center(len(nom), '-') + cprint(ligne) + # Statiqtiques par câbleur + for cableur in classement: + score_cableur = score[cableur] + ligne = "%-*s" % (long_max, nom_reel[cableur]) + for type, nom in colonnes: + ligne += " | %*d" % (len(nom), score_cableur[type]) + cprint(ligne)