Commit a1bf0a45 authored by Pierre-Elliott Bécue's avatar Pierre-Elliott Bécue

[scripts] Going to utf-8

parent c4a19a88
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
# Copyright (C) Stéphane Glondu, Alexandre Bos, Michel Blockelet
# Copyright (C) Stéphane Glondu, Alexandre Bos, Michel Blockelet
# 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.
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 {liste|modif|spam} [--debug <adresse>]
L'unique option est :
--debug <adresse> envoyer tous les mails à l'<adresse> indiquée, plutôt
--debug <adresse> envoyer tous les mails à l'<adresse> indiquée, plutôt
qu'aux vrais destinataires
Les commandes sont :
* liste énumérer les membres n'ayant pas signé la charte
* modif modifier les membres actifs n'ayant pas signé la charte
* liste énumérer les membres n'ayant pas signé la charte
* modif modifier les membres actifs n'ayant pas signé la charte
* spam envoie des mails de rappel pour les chartes
"""
......@@ -29,7 +29,7 @@ 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
# Importation de la base de données
from ldap_crans import crans_ldap, ann_scol
db = crans_ldap()
......@@ -44,12 +44,12 @@ if __name__ == '__main__':
sys.argv.pop()
if debug:
cprint(u'Mode debug, tous les mails seront envoyés à %s.' % 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.
Contrôle interactif des adhérents de la liste.
Retourne (nb_OK, nb_pas_OK).
"""
......@@ -57,10 +57,10 @@ def _controle_interactif_adherents(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'\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
......@@ -81,7 +81,7 @@ def _controle_interactif_adherents(liste):
modifiable.charteMA(True)
cprint(modifiable.save())
else:
cprint(u'Adhérent %s locké, réessayer plus tard' % modifiable.Nom(), 'rouge')
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]
......@@ -89,16 +89,16 @@ def _controle_interactif_adherents(liste):
modifiable.charteMA(False)
cprint(modifiable.save())
else:
cprint(u'Adhérent %s locké, réessayer plus tard' % modifiable.Nom(), 'rouge')
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')
cprint(u'Arrêt du contrôle %s des membres actifs' % explicite, 'rouge')
break
return nb, len(liste)-nb
def liste_charte_nok():
"""Retourne la liste des membres actifs qui n'ont pas signé la charte."""
"""Retourne la liste des membres actifs qui n'ont pas signé la charte."""
liste_actifs = db.search('droits=*')['adherent']
liste_nok = []
for adh in liste_actifs:
......@@ -110,25 +110,25 @@ def liste_charte_nok():
def controle_interactif():
"""
Procédure interactive de contrôle des chartes de membres actifs.
Procédure interactive de contrôle des chartes de membres actifs.
"""
todo_list = liste_charte_nok()
# 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
# 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')
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'],
titre = [u'Catégorie', u'OK', u'pas OK'],
largeur = [15, 10, 10]))
def spammer():
# On envoie un mail à chacun des membres actifs qui n'ont pas donné le papier
# On envoie un mail à chacun des membres actifs qui n'ont pas donné le papier
todo_list = liste_charte_nok()
if todo_list:
......@@ -144,10 +144,10 @@ def spammer():
print to
if not debug:
data = config.mails.txt_charte_MA % {'From' : u"ca@crans.org", 'To' : to}
connexion.sendmail("ca@crans.org",to,data.encode('iso-8859-15'))
connexion.sendmail("ca@crans.org",to,data.encode('utf-8'))
def __usage(message=None):
""" Comment ça marche ? """
""" Comment ça marche ? """
cprint(__doc__ % { 'prog': sys.argv[0] })
if message:
cprint(message)
......@@ -161,7 +161,7 @@ if __name__ == '__main__' :
elif sys.argv[1] == 'liste':
if len(sys.argv) != 2:
__usage(u'Mauvaise utilisation de liste')
print "Liste des membres actifs n'ayant pas signé la charte :"
print "Liste des membres actifs n'ayant pas signé la charte :"
for adh in liste_charte_nok():
print adh.Nom()
elif sys.argv[1] == 'modif':
......
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
# Copyright (C) Stéphane Glondu
# Copyright (C) Stéphane Glondu
# Licence : GPLv2
u"""Ce script permet au trésorier de repérer plus facilement les papiers que
les câbleurs n'ont pas encore rendus.
u"""Ce script permet au trésorier de repérer plus facilement les papiers que
les câbleurs n'ont pas encore rendus.
Utilisations possibles :
* %(prog)s OPTIONS {paiement|carte|list}
* %(prog)s OPTIONS mail <liste>
Les options sont:
-d, --debug <adresse> envoyer tous les mails à l'<adresse> indiquée, plutôt
-d, --debug <adresse> envoyer tous les mails à l'<adresse> indiquée, plutôt
qu'aux vrais destinataires
-h, --help affiche ce message
-t, --tri <champ> trier suivant ce champ. Les champs possibles sont:
id, nom, cableur ou date. Le défaut est ``nom''
id, nom, cableur ou date. Le défaut est ``nom''
-i, --inverse trier par ordre inverse
Les commandes sont :
* paiement contrôle interactif des nouvelles (ré-)adhésions
* carte contrôle interactif des nouvelles cartes d'étudiant
* list affiche le récapitulatif des papiers manquants
* mail <liste> envoyer les mails de rappel aux câbleurs dont le
login est dans la <liste>, 'bureau' désignant le mail
récapitulatif envoyé à bureau ; si la liste est vide
tous les mails nécessaires seront envoyés
* paiement contrôle interactif des nouvelles (ré-)adhésions
* carte contrôle interactif des nouvelles cartes d'étudiant
* list affiche le récapitulatif des papiers manquants
* mail <liste> envoyer les mails de rappel aux câbleurs dont le
login est dans la <liste>, 'bureau' désignant le mail
récapitulatif envoyé à bureau ; si la liste est vide
tous les mails nécessaires seront envoyés
* help affiche ce message
Le modèle du mail envoyé aux câbleurs est lu sur l'entrée standard (typiquement
via une redirection). Les trois premières lignes doivent être :
Le modèle du mail envoyé aux câbleurs est lu sur l'entrée standard (typiquement
via une redirection). Les trois premières lignes doivent être :
Encoding: <encodage du fichier>
Subject: <sujet du mail>
<ligne vide>
Le reste est le corps du message. Il doit contenir une occurrence de '%%s' qui
sera remplacée par la liste des papiers manquants.
sera remplacée par la liste des papiers manquants.
Le mail récapitulatif envoyé à bureau est immuable."""
Le mail récapitulatif envoyé à bureau est immuable."""
import sys, os, re, getopt
......@@ -46,21 +46,21 @@ sys.path.append('/usr/scripts/gestion')
# Fonctions d'affichage
from affich_tools import coul, tableau, prompt, cprint
# Importation de la base de données
# 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
# 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 !")
cprint(u"Impossible de déterminer l'utilisateur !")
sys.exit(1)
cableur = db.search('uid=%s' % uid)['adherent'][0]
# Vérification des droits
# Vérification des droits
if u'Tresorier' not in cableur.droits():
cprint(u"Il faut etre tresorier pour exécuter ce script !")
cprint(u"Il faut etre tresorier pour exécuter ce script !")
sys.exit(1)
# Lors des tests, on m'envoie tous les mails !
......@@ -77,19 +77,19 @@ if gethostname().split(".")[0] == 'egon':
def _controle_interactif_adherents(liste, quoi):
"""
Contrôle interactif des adhérents de la liste (quoi = p ou c).
Contrôle interactif des adhérents de la liste (quoi = p ou c).
Retourne (nb_OK, nb_pas_OK).
"""
if quoi not in 'pc': raise ValueError
explicite = {'p': u'du paiement', 'c': u"de la carte d'étudiant"}[quoi]
explicite = {'p': u'du paiement', 'c': u"de la carte d'étudiant"}[quoi]
restant = len(liste)
if restant == 0:
return 0, 0
cprint(u'\nContrôle %s des adhérents' % explicite, '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'\nContrôle %s des adhérents' % explicite, '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
......@@ -104,9 +104,9 @@ def _controle_interactif_adherents(liste, quoi):
cprint(modifiable.save())
nb += 1
else:
cprint(u'Adhérent %s locké, réessayer plus tard' % modifiable.Nom(), 'rouge')
cprint(u'Adhérent %s locké, réessayer plus tard' % modifiable.Nom(), 'rouge')
elif ok != 'n':
cprint(u'Arrêt du contrôle %s des adhérents' % explicite, 'rouge')
cprint(u'Arrêt du contrôle %s des adhérents' % explicite, 'rouge')
break
return nb, len(liste)-nb
......@@ -114,16 +114,16 @@ def _controle_interactif_adherents(liste, quoi):
def _controle_interactif_clubs(liste):
"""
Contrôle interactif des clubs de la liste (uniquement la charte).
Contrôle interactif des clubs de la liste (uniquement la charte).
Retourne (nb_OK, nb_pas_OK).
"""
restant = len(liste)
if restant == 0:
return 0, 0
cprint(u'\nContrôle de la charte des clubs', 'cyan')
cprint(u"Pour chaque entrée, il faut taper 'o' ou 'n'.")
cprint(u"Une autre réponse entraîne l'interruption du processus.")
cprint(u'\nContrôle de la charte des clubs', 'cyan')
cprint(u"Pour chaque entrée, il faut taper 'o' ou 'n'.")
cprint(u"Une autre réponse entraîne l'interruption du processus.")
cprint(u"Le format est [nb_restant] Nom (cid).")
cprint(u"")
......@@ -139,17 +139,17 @@ def _controle_interactif_clubs(liste):
cprint(modifiable.save())
nb += 1
else:
cprint(u'Club %s locké, réessayer plus tard' % modifiable.Nom(), 'rouge')
cprint(u'Club %s locké, réessayer plus tard' % modifiable.Nom(), 'rouge')
elif ok != 'n':
cprint(u'Arrêt du contrôle de la charte des clubs', 'rouge')
cprint(u'Arrêt du contrôle de la charte des clubs', 'rouge')
break
return nb, len(liste)-nb
def qui(historique, quoi):
"""
Recherche le câbleur qui a effectué la dernière modification quoi
dans l'historique, ou qui a inscrit l'adhérent.
Recherche le câbleur qui a effectué la dernière modification quoi
dans l'historique, ou qui a inscrit l'adhérent.
Retourne le couple (date, cableur) ou ('_inconnu_', '_inconnu_').
"""
regexp = re.compile(r'^([^,]*), ([^ :]*)')
......@@ -166,13 +166,13 @@ def qui(historique, quoi):
def controle_interactif(quoi):
"""
Procédure interactive de contrôle des paiements/chartes (quoi=p) et cartes (quoi=c).
Procédure interactive de contrôle des paiements/chartes (quoi=p) et cartes (quoi=c).
"""
if quoi not in 'pc': raise ValueError
todo_list = db.search('%s=%d&controle!=*%s*'
% ({'p': 'paiement', 'c': 'carteEtudiant'}[quoi], ann_scol, quoi))
# Tri de la liste des adhérents selon nom, prénom
# Tri de la liste des adhérents selon nom, prénom
todo_list['adherent'].sort(key = lambda x: (x.nom(), x.prenom()))
if trier_par == 'id':
......@@ -183,7 +183,7 @@ def controle_interactif(quoi):
champ = { 'date': 0, 'cableur': 1 }[trier_par]
todo_list['adherent'].sort(key = lambda x: qui(x.historique(), r'paiement')[champ])
# Traitement des adhérents
# Traitement des adhérents
oka, noka = _controle_interactif_adherents(todo_list['adherent'], quoi)
if quoi == 'p':
......@@ -193,18 +193,18 @@ def controle_interactif(quoi):
# Traitement des clubs (uniquement la charte)
okc, nokc =_controle_interactif_clubs(todo_list['club'])
cprint(u'\nRécapitulatif des nouveaux contrôles +%s :' % quoi, 'violet')
liste = [[u'adhérents', str(oka), str(noka)]]
cprint(u'\nRécapitulatif des nouveaux contrôles +%s :' % quoi, 'violet')
liste = [[u'adhérents', str(oka), str(noka)]]
if quoi == 'p':
liste.append([u'clubs', str(okc), str(nokc)])
cprint(tableau(liste,
titre = [u'Catégorie', u'OK', u'pas OK'],
titre = [u'Catégorie', u'OK', u'pas OK'],
largeur = [15, 10, 10]))
def formater_pour_cableur(liste):
"""
Formate la liste d'adhérents ou de clubs avec les dates correspondantes.
Formate la liste d'adhérents ou de clubs avec les dates correspondantes.
liste est une liste de couples (date, objet).
"""
lignes = []
......@@ -231,8 +231,8 @@ def formater_pour_cableur(liste):
def formater_pour_bureau(dico):
"""
Formate la liste d'adhérents ou de clubs avec les câbleurs correspondantes
pour le mail récapitulatif envoyé à bureau.
Formate la liste d'adhérents ou de clubs avec les câbleurs correspondantes
pour le mail récapitulatif envoyé à bureau.
"""
lignes = []
total = 0
......@@ -253,15 +253,15 @@ def formater_pour_bureau(dico):
if tri_inverse: lignes.reverse()
return tableau(lignes,
titre = [u'id', u'Nom', u'Câbleur', u'Date'],
titre = [u'id', u'Nom', u'Câbleur', u'Date'],
largeur = [6, 40, 18, 18],
alignement = ['d', 'c', 'c', 'c']) + u'\nTotal : %d' % total
def chercher_cableurs(liste, quoi):
"""
Renvoie un dictionnaire cableur->adherents à partir de liste, quoi
désigne le champ qui sera recherché dans l'historique.
Renvoie un dictionnaire cableur->adherents à partir de liste, quoi
désigne le champ qui sera recherché dans l'historique.
"""
resultat = {}
......@@ -275,21 +275,21 @@ def chercher_cableurs(liste, quoi):
from email_tools import send_email, parse_mail_template
# Mise en application du mémorable cours de Fred sur les objets :-)
# Mise en application du mémorable cours de Fred sur les objets :-)
class ControleMailer:
def __init__(self):
# Recherche des câbleurs possédant des cotisations/chartes
# Recherche des câbleurs possédant des cotisations/chartes
todo_list = db.search('paiement=%d&controle!=*p*' % ann_scol)
self._paiements = chercher_cableurs(todo_list['adherent'], r'(paiement|controle.*\+k)')
self._chartes = chercher_cableurs(todo_list['club'], 'paiement')
# Recherche des câbleurs possédant des cartes d'étudiant
# Recherche des câbleurs possédant des cartes d'étudiant
todo_list = db.search('carteEtudiant=%d&controle!=*c*' % ann_scol)
self._cartes = chercher_cableurs(todo_list['adherent'], 'carteEtudiant')
# Récupère tous les câbleurs qui doivent quelque chose
# Récupère tous les câbleurs qui doivent quelque chose
cableurs = {}
for a in self._paiements.keys():
if a != '_inconnu_': cableurs[a] = None
......@@ -299,14 +299,14 @@ class ControleMailer:
if a != '_inconnu_': cableurs[a] = None
self._cableurs = cableurs.keys()
# Vérification de l'alias pour l'expéditeur
# Vérification de l'alias pour l'expéditeur
if u'tresorier' in cableur.alias():
self._sender = u'%s <tresorier@crans.org>' % cableur.Nom()
else:
self._sender = u'%s <%s@crans.org>' % (cableur.Nom(),
cableur.canonical_alias() or cableur.mail())
# Se connecte au serveur SMTP par défaut
# Se connecte au serveur SMTP par défaut
from smtplib import SMTP
self._server = SMTP()
self._server.connect()
......@@ -317,47 +317,47 @@ class ControleMailer:
def recapitulatif(self):
"""
Renvoie le récapitulatif pour le bureau.
Renvoie le récapitulatif pour le bureau.
"""
msg = u''
if self._paiements:
msg += u"Fiches d'adhésion et cotisations et/ou caution des adhérents :\n"
msg += u"Fiches d'adhésion et cotisations et/ou caution des adhérents :\n"
msg += formater_pour_bureau(self._paiements) + '\n\n'
if self._chartes:
msg += u"Chartes signées des clubs :\n"
msg += u"Chartes signées des clubs :\n"
msg += formater_pour_bureau(self._chartes) + '\n\n'
if self._cartes:
msg += u"Carte d'étudiant des adhérents :\n"
msg += u"Carte d'étudiant des adhérents :\n"
msg += formater_pour_bureau(self._cartes) + '\n\n'
return msg.strip()
def mail_bureau(self):
"""
Envoie le mail récapitulatif à bureau (s'il y a qqch à envoyer).
Envoie le mail récapitulatif à bureau (s'il y a qqch à envoyer).
"""
msg = self.recapitulatif()
if msg:
msg += u"\n\n-- \nScript exécuté par %s\n" % cableur.Nom()
msg += u"\n\n-- \nScript exécuté par %s\n" % cableur.Nom()
send_email(self._sender,
u"Bureau <bureau@crans.org>",
u"Récapitulatif des papiers manquants",
u"Récapitulatif des papiers manquants",
msg,
server = self._server,
debug = debug)
return coul(u'Mail envoyé à bureau avec succès !', 'vert')
return coul(u'Mail envoyé à bureau avec succès !', 'vert')
else:
return coul(u'Tout est à jour, aucun mail envoyé.', 'vert')
return coul(u'Tout est à jour, aucun mail envoyé.', 'vert')
def mail_cableurs(self, subject, body, liste=None):
"""
Envoie un mail aux câbleurs concernés qui figurent dans la liste.
Si liste vaut None, envoie un mail à tous les câbleurs concernés.
Envoie un mail aux câbleurs concernés qui figurent dans la liste.
Si liste vaut None, envoie un mail à tous les câbleurs concernés.
Les arguments subject, body permettent de personnaliser (un peu)
le mail qui sera envoyé.
le mail qui sera envoyé.
"""
nb = 0
if liste == None:
......@@ -367,15 +367,15 @@ class ControleMailer:
msg = u''
if self._paiements.has_key(c):
msg += u"Fiches d'adhésion, cotisations et/ou caution des adhérents :\n"
msg += u"Fiches d'adhésion, cotisations et/ou caution des adhérents :\n"
msg += formater_pour_cableur(self._paiements[c]) + '\n\n'
if self._chartes.has_key(c):
msg += u"Chartes signées des clubs :\n"
msg += u"Chartes signées des clubs :\n"
msg += formater_pour_cableur(self._chartes[c]) + '\n\n'
if self._cartes.has_key(c):
msg += u"Carte d'étudiant des adhérents :\n"
msg += u"Carte d'étudiant des adhérents :\n"
msg += formater_pour_cableur(self._cartes[c]) + '\n\n'
if msg:
......@@ -388,11 +388,11 @@ class ControleMailer:
debug = debug)
nb += 1
return coul(u'%d mail(s) envoyé(s) aux câbleurs avec succès !' % nb, 'vert')
return coul(u'%d mail(s) envoyé(s) aux câbleurs avec succès !' % nb, 'vert')
def __usage(message=None):
""" Comment ça marche ? """
""" Comment ça marche ? """
cprint(__doc__ % { 'prog': sys.argv[0] })
if message:
cprint(message)
......@@ -412,7 +412,7 @@ if __name__ == '__main__' :
elif opt in [ '-d', '--debug' ]:
debug = val
cprint(u'Mode debug, tous les mails seront envoyés à %s.' % debug)
cprint(u'Mode debug, tous les mails seront envoyés à %s.' % debug)
elif opt in [ '-t', '--tri' ]:
if val in [ 'id', 'nom', 'cableur', 'date' ]:
......@@ -424,7 +424,7 @@ if __name__ == '__main__' :
tri_inverse = True
else:
__usage("option inconnue « %s »'" % opt)
__usage("option inconnue « %s »'" % opt)
if len(arg) == 0 or arg[0] == 'help':
__usage()
......@@ -456,14 +456,14 @@ if __name__ == '__main__' :
bureau = True
cableurs = mailer._cableurs
if cableurs:
cprint(u'Des mails vont être envoyés aux câbleurs, lecture du modèle...')
cprint(u'Des mails vont être envoyés aux câbleurs, lecture du modèle...')
subject, body = parse_mail_template(sys.stdin)
try:
body % u''
except TypeError:
cprint(u"Le format du modèle n'est pas correct, arrêt.")
cprint(u"Le format du modèle n'est pas correct, arrêt.")
sys.exit(1)
cprint(u'Modèle OK, on envoie les mails...')
cprint(u'Modèle OK, on envoie les mails...')
cprint(mailer.mail_cableurs(subject, body, cableurs))
if bureau:
cprint(mailer.mail_bureau())
......
......@@ -47,7 +47,7 @@ if u'Tresorier' not in cableur.droits():
dlg = dialog.Dialog()
dlg.setBackgroundTitle('Tresorerie')
encoding = sys.stdin.encoding or 'ISO-8859-15'
encoding = sys.stdin.encoding or 'UTF-8'
########################################################################
# Retrait des accents
......
#! /usr/bin/env python
# -*- coding: iso-8859-15 -*-
# -*- coding: utf-8 -*-
import sys
# Copyright (C) Stéphane Glondu, Alexandre Bos
# Copyright (C) Stéphane Glondu, Alexandre Bos
# Licence : GPLv2
__doc__ = u"""Ce script permet de faire le menages parmis les câbleurs qui ne
sont plus sur le campus, ie ceux qui ne sont plus à jour de cotisation.
__doc__ = u"""Ce script permet de faire le menages parmis les câbleurs qui ne
sont plus sur le campus, ie ceux qui ne sont plus à jour de cotisation.
Utilisation :
%(prog)s {lister|radier} [--debug <adresse>]
Les commandes sont :
* lister afficher la liste des câbleurs succeptibles d'être
radiés
* lister afficher la liste des câbleurs succeptibles d'être
radiés
* radier selectionner, parmis eux, les cableurs que l'on
souhaite radier
"""
......@@ -28,23 +28,23 @@ 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
# Importation de la base de données
from ldap_crans import crans_ldap, ann_scol
db = crans_ldap()
def _controle_interactif_adherents(liste):
"""
Demande ce qu'il faut faire à chaque fois
Demande ce qu'il faut faire à chaque fois
"""
restant = len(liste)
if restant == 0:
return 0, 0
cprint(u'\nRadiation des câbleurs fantômes' , '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'\nRadiation des câbleurs fantômes' , '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
......@@ -58,9 +58,9 @@ def _controle_interactif_adherents(liste):
modifiable.droits([])
cprint(modifiable.save())
else:
cprint(u'Adhérent %s locké, réessayer plus tard' % modifiable.Nom(), 'rouge')
cprint(u'Adhérent %s locké, réessayer plus tard' % modifiable.Nom(), 'rouge')
elif ok != 'n':
cprint(u'Arrêt du contrôle %s des membres actifs' % explicite, 'rouge')
cprint(u'Arrêt du contrôle %s des membres actifs' % explicite, 'rouge')
break