stats_cableurs2.py 5.61 KB
Newer Older
1
#!/bin/bash /usr/scripts/python.sh
2 3
# -*- coding: utf-8 -*-
#
4
# stats_cableurs.py
5 6
# -----------------
#
7 8
# Copyright (C) 2013-2015 Raphaël-David Lasseri <lasseri@crans.org>,
#                         Pierre-Elliott Bécue <becue@crans.org>,
9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#
# 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.

24 25 26 27
import sys
import re
import datetime
import string
28
import argparse
29

30
from lc_ldap import shortcuts
31 32 33
import lc_ldap.crans_utils as crans_utils
import gestion.config as config
import gestion.affichage as affichage
34
from config import ann_scol
35

36 37
### Appels à LDAP et tri initial sur l'année en cours
db = shortcuts.lc_ldap_readonly()
38
adherents = db.search(u'(&(debutAdhesion>=%s)(aid=*))' % (crans_utils.to_generalized_time_format(config.debut_periode_transitoire)), sizelimit=2000)
39 40 41
cableurs = db.search(u'(|(droits=cableur)(droits=nounou))')
scores = []
historique = []
42
encoding = sys.stdout.encoding or "UTF-8"
43 44 45

#### On prends les historiques de tout les adhérents
def parse_historique(ligne):
46 47
    """Parse une ligne d'historique et renvoie [ligne parsée],action
    du cableur, date de l'action"""
48
    champ = ligne.value.replace(',','').replace(':','').split(' ',3)
49
    sdate = champ[0].split('/')
50
    date = datetime.date(int(sdate[2]),int(sdate[1]),int(sdate[0]))
51
    champ_action=champ[3]
52
    return champ,champ_action,date
53 54

def actions_cableurs():
55 56 57 58 59 60 61 62
    """Renvoie l'historique de tous les adherents et tri en fonction
    des actions éffectuées."""
    for adherent in adherents:
        histo=adherent.get('historique',None)
        for j in range (0,len(histo)):
            champ=parse_historique(histo[j])[0]
            champ_action=parse_historique(histo[j])[1]
            date=parse_historique(histo[j])[2]
63
            if ((u' inscription' in champ_action or u'Adhesion+' in champ_action) and date > datetime.date(ann_scol,8,1)):
64 65 66 67
                historique.append(champ)
    return historique

#### On parse l'historique et on trie
68
def score_cableurs():
69 70 71 72 73 74 75 76 77
    """Calcul le score de tout les câbleurs en fonction des actions
    effectuées """
    for cableur in cableurs:
        inscriptions = reinscriptions=0
        nom = cableur.get(u'nom',None)[0].value
        prenom = cableur.get(u'prenom',None)[0].value
        uid = cableur.get(u'uid',None)[0].value
        for l in range (0,len(historique)):
            histo_uid = historique[l][2]
78 79
            histo_action = historique[l][3]
            if histo_uid == uid and  histo_action == u' inscription':
80
                inscriptions = inscriptions+1
81
            if histo_uid == uid and (u"debutAdhesion+" in histo_action):
82 83 84 85
                reinscriptions = reinscriptions+1
        score = 2*inscriptions + reinscriptions
        scores.append(["%s %s" % (prenom, nom), score, inscriptions, reinscriptions])
    return scores
86 87 88 89


### Tri par score
def sort_by_score():
90 91
    """Tri la liste des câbleurs par ordre de score décroissant de score"""
    return score_cableurs().sort(key=lambda x:int(x[1]),reverse=True)
92 93

def sort_by_inverse_score():
94 95
    """Tri la liste des câbleurs par ordre de score croissant de score"""
    return score_cableurs().sort(key=lambda x:int(x[1]))
96 97

def cableurs_utiles():
98 99 100 101 102 103
    """Renvoi le nombre de cableurs ayant un score non nul"""
    useless_cableurs=0
    for k in range(0,len(cableurs)):
        if (scores[k][1] == 0):
            useless_cableurs = useless_cableurs+1
    return len(cableurs) - useless_cableurs
104 105 106


#### Affichage ou x est le nombre de câbleurs à afficher
107 108 109 110 111 112
def show_all(limit, swap):
    """Tableau fait main pour un effet plus visuel"""
    titre = [u"Câbleur", u"Score", u"Inscriptions", u"Réinscriptions"]
    largeur = [25, 8, 16, 16]
    alignement = ["c", "c", "c", "c"]
    data = [[elem for elem in scores[index]] for index in xrange(limit)]
113
    print affichage.tableau(data, titre=titre, largeur=largeur, alignement=alignement, swap=swap).encode(encoding)
114 115 116

#### On définit le Parser
if __name__ == "__main__":
117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
    actions_cableurs()

    parser = argparse.ArgumentParser()
    parser.add_argument("-a", "--all", help="Affiche les scores de tout les câbleurs", action="store_true")
    parser.add_argument("-t", "--top", help="Affiche seulement les meilleurs câbleurs", action="store_true")
    parser.add_argument("-s", "--scores", help="Affiche seulement les câbleurs ayant un score non nul", action="store_true")
    parser.add_argument("-m", "--menage", help="Affiche seulement les câbleurs ayant un score nul", action="store_true")
    parser.add_argument("-n", "--nocolour", help="Désactive la couleur", action="store_true")
    args = parser.parse_args()

    if args.nocolour:
        swap = []
    else:
        swap = [None, "vert"]

    if args.all:
        sort_by_score()
        show_all(len(cableurs), swap=swap)
    elif args.scores:
        sort_by_score()
        show_all(cableurs_utiles(), swap=swap)
    elif args.menage:
        sort_by_inverse_score()
        show_all(len(cableurs)-cableurs_utiles(), swap=swap)
    elif args.top:
        sort_by_score()
        show_all(5, swap=swap)
    else:
        sort_by_score()
        show_all(10, swap=swap)