#! /usr/bin/env python # -*- encoding: utf-8 -*- # Stats sur les historiques import sys sys.path.append("/usr/scripts/gestion") import types from ldap_crans import crans_ldap from pysqlite2 import dbapi2 as sqlite import re from time import mktime, strptime def plat(chose): """Applatit une liste de liste. Hautement récursif.""" if type(chose) != types.ListType: return [chose] return sum(map(lambda x: plat(x), chose), []) def hist(): """Récupère l'historique dans une base SQLite dont la connexion est returnée.""" # On récupèr les adhérents adherents = crans_ldap().search("nom=*")['adherent'] # Et les historiques rattachés à eux et à leurs machines historiques = map(lambda x: [x.historique(), map(lambda y: y.historique(), x.machines())], adherents) historiques = plat(historiques) # On va maintenant coller les historiques dans une structure plus # sympa, style une base SQL que l'on garde en mémoire con = sqlite.connect("historiques") cur = con.cursor() cur.execute("CREATE TABLE historique (date INTEGER, nom TEXT, action TEXT)") # On doit maintenant mettre ce qu'il faut dans la table... regex = re.compile("([^,]*), ([^ ]*) : (.*)") for h in historiques: mo = regex.match(h) if not mo: print "Hummm ? Ligne bizarre : %s" % h else: date = int(mktime(strptime(mo.group(1), "%d/%m/%Y %H:%M"))) utilisateur = mo.group(2) # Il peut y avoir plusieurs raisons ! raisons = mo.group(3).split(", ") # On garde les raisons courtes raisons = map(lambda x: x.split(" ")[0].strip(), raisons) for r in raisons: cur.execute("INSERT INTO historique VALUES (?, ?, ?)", (date, utilisateur, r)) con.commit() return con hist() # Exemple de requete : # select nom, count(nom) as combien from historique # where date>1093950403 group by nom order by combien ; # select action,count(action) from historique where nom='bernat' and # date>1093950403 group by action order by count(action);