From a191dae397082c0b0e04bf63551221b8970a5169 Mon Sep 17 00:00:00 2001 From: bos Date: Wed, 31 Oct 2007 17:12:10 +0100 Subject: [PATCH] Script pour vrifier les chartes des membrs actifs darcs-hash:20071031161210-c992d-d0b0a481089a8671ab6a2e79452d8a318cd7c888.gz --- admin/controle_chartes_MA.py | 187 +++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100755 admin/controle_chartes_MA.py diff --git a/admin/controle_chartes_MA.py b/admin/controle_chartes_MA.py new file mode 100755 index 00000000..bdf1f542 --- /dev/null +++ b/admin/controle_chartes_MA.py @@ -0,0 +1,187 @@ +#! /usr/bin/env python +# -*- coding: iso-8859-15 -*- + +# Copyright (C) Stéphane Glondu, Alexandre Bos +# Licence : GPLv2 + +u"""Ce script permet au secrétaire de repérer plus facilement les membres +actifs qui n'ont pas signé la charte du même nom. + +Utilisation : +%(prog)s {modif|spam} [--debug ] + +L'unique option est : + --debug envoyer tous les mails à l' indiquée, plutôt + qu'aux vrais destinataires +Les commandes sont : + * modif enumerer et modifier les membres actifs + * spam envoie des mails de rappel à tous les adhérents +""" + + +import sys, os, re +sys.path.append('/usr/scripts/gestion') +import config +from email_tools import send_email, parse_mail_template + +# Fonctions d'affichage +from affich_tools import coul, tableau, prompt, cprint + +# Importation de la base de données +from ldap_crans import crans_ldap, ann_scol +db = crans_ldap() + +# Détermination de l'uid du câbleur +from user_tests import getuser +uid = getuser() +if not uid : + cprint(u"Impossible de déterminer l'utilisateur !") + sys.exit(1) +cableur = db.search('uid=%s' % uid)['adherent'][0] + +# Vérification des droits +if u'Bureau' not in cableur.droits(): + cprint(u"Désolé, il faut etre membre du Bureau pour executer ce script.") + sys.exit(1) + +# Lors des tests, on m'envoie tous les mails ! +from socket import gethostname +debug = True + +if gethostname().split(".")[0] == 'egon': + debug = 'bos@crans.org' + ann_scol = 2007 + +if __name__ == '__main__': + if len(sys.argv) > 3 and sys.argv[-2] == '--debug': + debug = sys.argv[-1] + sys.argv.pop() + sys.argv.pop() + +if debug: + cprint(u'Mode debug, tous les mails seront envoyés à %s.' % debug) + + +def _controle_interactif_adherents(liste): + """ + Contrôle interactif des adhérents de la liste. + Retourne (nb_OK, nb_pas_OK). + """ + + restant = len(liste) + if restant == 0: + return 0, 0 + + cprint(u'\nContrôle des membre actifs' , 'cyan') + cprint(u"Pour chaque entrée, il faut taper 'o' ou 'n' (défaut=n).") + cprint(u"Une autre réponse entraîne l'interruption du processus.") + cprint(u"Le format est [nb_restant] Nom, Prénom (aid).") + cprint(u"") + + nb = 0 + for a in liste: + valeur = a.charteMA() + if valeur: + suggestion = 'o' + else: + suggestion = 'n' + ok = prompt(u'[%3d] %s, %s (%s) ?' + % (restant, a.nom(), a.prenom(), a.id()), suggestion, '').lower() + restant -= 1 + if ok == 'o': + nb += 1 + if a.charteMA() == False : + modifiable = db.search('aid=%s' % a.id(), 'w')['adherent'][0] + if modifiable._modifiable: + modifiable.charteMA(True) + cprint(modifiable.save()) + else: + cprint(u'Adhérent %s locké, réessayer plus tard' % modifiable.Nom(), 'rouge') + elif ok == 'n': + if a.charteMA() == True: + modifiable = db.search('aid=%s' % a.id(), 'w')['adherent'][0] + if modifiable._modifiable: + modifiable.charteMA(False) + cprint(modifiable.save()) + else: + cprint(u'Adhérent %s locké, réessayer plus tard' % modifiable.Nom(), 'rouge') + else: + cprint(u'Arrêt du contrôle %s des membres actifs' % explicite, 'rouge') + break + + return nb, len(liste)-nb + + +def controle_interactif(): + """ + Procédure interactive de contrôle des paiements/chartes (quoi=p) et cartes (quoi=c). + """ + todo_list = db.search('droits=*')['adherent'] + for adh in todo_list: + if adh.droits() == ['MultiMachines']: + todo_list.remove(adh) + + # Tri de la liste des adhérents selon nom, prénom + # Ça peut se faire plus facilement en Python 2.4 avec l'argument key + todo_list.sort(lambda x, y: cmp((x.nom(), x.prenom()), (y.nom(), y.prenom()))) + + # Zou ! + ok, nok = _controle_interactif_adherents(todo_list) + + cprint(u'\nRécapitulatif des nouveaux contrôles :', 'violet') + liste = [[u'membres actifs', str(ok), str(nok)]] + cprint(tableau(liste, + titre = [u'Catégorie', u'OK', u'pas OK'], + largeur = [15, 10, 10])) + +def spammer(): + # Recherche des membres actifs qui n'ont pas donné le papier + todo_list1 = db.search('droits=*')['adherent'] + todo_list = [] + for adh in todo_list1: + if (adh.droits() != ['MultiMachines']) and (adh.charteMA() == False): + todo_list.append(adh) + + print len(todo_list) + + # On envoi un mail à chacun de ces membres actifs + from smtplib import SMTP + connexion = SMTP() + connexion.connect() + print "Envoi des mails de rappel pour les chartes des membres actifs" + + for adh in todo_list: + to = adh.email() + if debug != None: + to = debug + connexion.sendmail("bureau@crans.org",to,config.txt_charte_MA % {'From' : "bureau@crans.org", 'To' : to}) + +def __usage(message=None): + """ Comment ça marche ? """ + cprint(__doc__ % { 'prog': sys.argv[0] }) + if message: + cprint(message) + sys.exit(1) + + +if __name__ == '__main__' : + + if len(sys.argv) <= 1: + __usage() + + elif sys.argv[1] == 'modif': + if len(sys.argv) != 2: + __usage(u'Mauvaise utilisation de paiement') + controle_interactif() + + elif sys.argv[1] == 'spam': + if len(sys.argv) != 2: + __usage(u'Mauvaise utilisation de spam') + spammer() + else: + __usage(u'Commande inconnue : %s' % sys.argv[1]) + + sys.exit(0) + + +# pydoc n'aime pas l'unicode :-(