#!/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)