[stats_cableurs.py] stats_cableurs --efficiency donne les stats sur les 3 derniers mois des c^ableurs

Ignore-this: 42b5ff6a62924ccb8e8a15cd9c5c40bb

darcs-hash:20090327151549-bd074-5a92fb238665eeda419f13f0ae2d51e070785c3c.gz
This commit is contained in:
Antoine Durand-Gasselin 2009-03-27 16:15:49 +01:00
parent e48bff52a6
commit cb4e55ed94

View file

@ -6,9 +6,10 @@
# stats_cableurs.py # stats_cableurs.py
# ----------------- # -----------------
# #
# Copyright (C) 2008 François Bobot <bobot@crans.org>, # Copyright (C) 2008, 2009 François Bobot <bobot@crans.org>,
# Jeremie Dimino <jeremie@dimino.org>, # Jeremie Dimino <jeremie@dimino.org>,
# Michel Blockelet <blockelet@crans.org> # Michel Blockelet <blockelet@crans.org>,
# Antoine Durand-Gasselin <adg@crans.org>
# #
# This file is free software; you can redistribute it and/or modify # 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 # it under the terms of the GNU General Public License as published by
@ -24,20 +25,110 @@
# along with this program; if not, write to the Free Software # along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA. # Foundation, Inc., 59 Temple Street #330, Boston, MA 02111-1307, USA.
import sys import sys, re
sys.path.append("/usr/scripts/gestion/") sys.path.append("/usr/scripts/gestion/")
from ldap_crans import crans_ldap from ldap_crans import crans_ldap
from config import ann_scol from config import ann_scol
from affich_tools import cprint from affich_tools import cprint, anim
import time import time
db = crans_ldap() db = crans_ldap()
date_debut_ann_scol = time.mktime((ann_scol, 8, 1, 0, 0, 0, 0, 0, 0)) date_debut_ann_scol = time.mktime((ann_scol, 8, 1, 0, 0, 0, 0, 0, 0))
paiement_ann_scol = "paiement+%d" % ann_scol paiement_ann_scol = "paiement+%d" % ann_scol
def donne_cableur(mois,adherent):
u""" Cherche le cableur qui a inscrit ou réinscrit un adhérent. """
class ActionsCableurs:
u"""Cette classe s'occupe de recenser l'activité des différents
câbleurs."""
stats = {}
sablier = None
def __init__(self, mois):
self.sablier = anim(u"Récupération de la liste des câbleurs")
ldap_cableurs = db.search("droits=cableur")['adherent']
for i in ldap_cableurs:
self.stats[i.nom()] = []
self.sablier.reinit()
cprint('OK', 'vert')
self.get_stats(mois)
self.print_results()
def ajoute_actions(self, mois, machine):
u"""Ajoute dans les stats la liste des actions effectués par
chacuns des câbleurs sur la machine pendant les mois."""
for hist in machine.historique():
# On decoupe pour avoir un truc utilisable
champ = hist.replace(',', '').replace(': ', '').split(' ')
date = champ[0].split('/')
# On inspecte la date
if (int (date[1]), int(date[2])) in mois:
if self.stats.has_key(champ[2]):
self.stats[champ[2]].append(champ[3])
else:
self.stats[champ[2]] = [champ[3]]
def get_stats(self, mois):
u"""Récupère les statistiques des différents câbleurs sur les
différentes machines"""
self.sablier = anim(u"Récupération de la liste des machines")
all_machines = db.search('host=*')
self.sablier.cycle()
machines = all_machines['machineFixe'] + all_machines['machineWifi']
self.sablier.reinit()
cprint('OK', 'vert')
self.sablier = anim(u"Récupération des actions sur les machines", iter = len (machines))
for becane in machines:
self.ajoute_actions(mois, becane)
self.sablier.cycle()
self.sablier.reinit()
cprint('OK', 'vert')
def print_results(self, nombre= 0):
u"""Affiche les statistiques d'activité des différents câbleurs"""
cableurs = self.stats.keys()
cableurs.sort(lambda x, y : cmp(len (self.stats[x]), len (self.stats[y])), reverse=True)
long_max = reduce(lambda m, c : max(m, len(c)), cableurs, len('cableur'))
colonnes = [('actions', u'Actions'),
('ins', u'Inscription'),
('mac', u'Change MAC'),
('host', u'Change DNS'),
('ip', u'Change IP')]
# Titres des colonnes
ligne = "%-*s" % (long_max, u'Câbleur')
for typ, nom in colonnes:
ligne += " | %s" % nom
cprint(ligne)
# Ligne pour délimiter
ligne = ''.center(long_max, '-')
for typ, nom in colonnes:
ligne += "-+-%s" % ''.center(len(nom), '-')
cprint(ligne)
# Statiqtiques par câbleur
for cableur in cableurs:
acts = self.stats[cableur]
score_cableur = {}
score_cableur['actions'] = len (acts)
for key, chaine in colonnes[1:]:
score_cableur[key] = len ([i for i in acts if re.search(key, i)])
ligne = "%-*s" % (long_max, cableur)
for typ, nom in colonnes:
ligne += " | %*d" % (len(nom), score_cableur[typ])
cprint(ligne)
def donne_cableur(mois, adherent):
u""" Cherche le cableur qui a inscrit ou réinscrit un adhérent. """
cableur = None cableur = None
# Est-ce qu'on recherche une inscription ou une reinscription? # Est-ce qu'on recherche une inscription ou une reinscription?
if adherent.dateInscription() < date_debut_ann_scol: if adherent.dateInscription() < date_debut_ann_scol:
@ -67,7 +158,7 @@ def calcul_score(mois):
score = {} score = {}
for adherent in liste: for adherent in liste:
action, cableur = donne_cableur(mois,adherent) action, cableur = donne_cableur(mois, adherent)
if cableur: if cableur:
if not score.has_key(cableur): if not score.has_key(cableur):
score[cableur] = { 'inscription': 0, score[cableur] = { 'inscription': 0,
@ -83,36 +174,40 @@ def calcul_score(mois):
def classe(score={}): def classe(score={}):
u""" Retourne la liste des câbleurs classé par score total décroisant. """ u""" Retourne la liste des câbleurs classé par score total décroisant. """
cableurs = score.keys() cableurs = score.keys()
cableurs.sort(lambda x,y : cmp(score[x]['total'],score[y]['total']), reverse=True) cableurs.sort(lambda x, y : cmp(score[x]['total'], score[y]['total']), reverse=True)
return cableurs return cableurs
if __name__ == "__main__": if __name__ == "__main__":
nb_affiche = 10 nb_affiche = 10
mois = [8,9,10] mois = range(8, 11)
if len(sys.argv) > 1: if len(sys.argv) > 1:
if sys.argv[1] == '-e': if sys.argv[1] == '-e':
mois = [8,9,10,11] mois = range(8, 13)
if len(sys.argv) > 2: if len(sys.argv) > 2:
try: try:
nb_affiche = int(sys.argv[2]) nb_affiche = int(sys.argv[2])
except: except ValueError:
nb_affiche = 10 nb_affiche = 10
else: else:
try: try:
nb_affiche = int(sys.argv[1]) nb_affiche = int(sys.argv[1])
except: except ValueError:
nb_affiche = 10 nb_affiche = 10
if sys.argv[1] == '--efficiency':
ActionsCableurs([(1, 2009), (2, 2009), (3, 2009)])
sys.exit(0)
score = calcul_score(mois) score = calcul_score(mois)
classement = classe(score) classement = classe(score)
if nb_affiche > 0: if nb_affiche > 0:
classement = classement[0:nb_affiche] classement = classement[0:nb_affiche]
# On cherche les noms des câbleurs parceque c'est quand même mieux # On cherche les noms des câbleurs parceque c'est quand même mieux
nom_reel = {} nom_reel = {}
for cableur in classement: for cableur in classement:
nom_reel[cableur] =db.search('uid=%s' % cableur)['adherent'][0].Nom() nom_reel[cableur] = db.search('uid=%s' % cableur)['adherent'][0].Nom()
# Calcul des statistiques # Calcul des statistiques
total_inscription = 0 total_inscription = 0
@ -132,7 +227,7 @@ if __name__ == "__main__":
'total': total }, newline=False) 'total': total }, newline=False)
# Calcul la longueur du nom le plus long # Calcul la longueur du nom le plus long
long_max = reduce(lambda m,c : max(m, len(c)), nom_reel.values(), len('cableur')) long_max = reduce(lambda m, c : max(m, len(c)), nom_reel.values(), len('cableur'))
colonnes = [('inscription', u'inscription'), colonnes = [('inscription', u'inscription'),
('reinscription', u'réinscription'), ('reinscription', u'réinscription'),
@ -140,18 +235,18 @@ if __name__ == "__main__":
# Titres des colonnes # Titres des colonnes
ligne = "%-*s" % (long_max, u'câbleur') ligne = "%-*s" % (long_max, u'câbleur')
for type, nom in colonnes: for typ, nom in colonnes:
ligne += " | %s" % nom ligne += " | %s" % nom
cprint(ligne) cprint(ligne)
# Ligne pour délimiter # Ligne pour délimiter
ligne = ''.center(long_max, '-') ligne = ''.center(long_max, '-')
for type, nom in colonnes: for typ, nom in colonnes:
ligne += "-+-%s" % ''.center(len(nom), '-') ligne += "-+-%s" % ''.center(len(nom), '-')
cprint(ligne) cprint(ligne)
# Statiqtiques par câbleur # Statiqtiques par câbleur
for cableur in classement: for cableur in classement:
score_cableur = score[cableur] score_cableur = score[cableur]
ligne = "%-*s" % (long_max, nom_reel[cableur]) ligne = "%-*s" % (long_max, nom_reel[cableur])
for type, nom in colonnes: for typ, nom in colonnes:
ligne += " | %*d" % (len(nom), score_cableur[type]) ligne += " | %*d" % (len(nom), score_cableur[typ])
cprint(ligne) cprint(ligne)