scripts/admin/controle_chartes_MA.py
bos 97ab8fb0e4 Mieux
darcs-hash:20071031191345-c992d-6b77f6dfefb7e5a5292ff82c9960272fdbe0bafa.gz
2007-10-31 20:13:45 +01:00

188 lines
5.7 KiB
Python
Executable file

#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# Copyright (C) Stéphane Glondu, Alexandre os
# 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 <adresse>]
L'unique option est :
--debug <adresse> envoyer tous les mails à l'<adresse> 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 = False
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("rouge.crans.org")
print "Envoi des mails de rappel pour les chartes des membres actifs"
for adh in todo_list:
to = adh.email()
print to
if not debug:
data = config.txt_charte_MA % {'From' : u"bureau@crans.org", 'To' : to}
connexion.sendmail("bureau@crans.org",to,data.encode('iso-8859-15'))
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 :-(