Script pour vrifier les chartes des membrs actifs
darcs-hash:20071031161210-c992d-d0b0a481089a8671ab6a2e79452d8a318cd7c888.gz
This commit is contained in:
parent
de489eaf01
commit
a191dae397
1 changed files with 187 additions and 0 deletions
187
admin/controle_chartes_MA.py
Executable file
187
admin/controle_chartes_MA.py
Executable file
|
@ -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 <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 = 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 :-(
|
Loading…
Add table
Add a link
Reference in a new issue