175 lines
5.3 KiB
Python
Executable file
175 lines
5.3 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()
|
|
|
|
# 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 chartes de membres actifs.
|
|
"""
|
|
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"ca@crans.org", 'To' : to}
|
|
connexion.sendmail("ca@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 :-(
|