[scripts] Going to utf-8
This commit is contained in:
parent
c4a19a88ed
commit
a1bf0a4547
54 changed files with 676 additions and 573 deletions
|
@ -1,21 +1,21 @@
|
|||
#! /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':
|
||||
|
|
|
@ -1,43 +1,43 @@
|
|||
#! /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
|
||||
|
|
|
@ -1,20 +1,20 @@
|
|||
#! /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
|
||||
|
||||
def candidats():
|
||||
|
@ -74,10 +74,10 @@ def candidats():
|
|||
|
||||
def lister():
|
||||
"""
|
||||
Afficher les câbleurs fantômes potentiels.
|
||||
Afficher les câbleurs fantômes potentiels.
|
||||
"""
|
||||
todo_list = candidats()
|
||||
print "Liste des câbleur dont la cotisation n'est pas à jour."
|
||||
print "Liste des câbleur dont la cotisation n'est pas à jour."
|
||||
print
|
||||
for adh in todo_list:
|
||||
print adh.prenom() + " " + adh.nom()
|
||||
|
@ -86,7 +86,7 @@ def lister():
|
|||
|
||||
def controle_interactif():
|
||||
"""
|
||||
Procédure interactive de radiations des câbleurs fantômes.
|
||||
Procédure interactive de radiations des câbleurs fantômes.
|
||||
"""
|
||||
todo_list = candidats()
|
||||
|
||||
|
@ -94,7 +94,7 @@ def controle_interactif():
|
|||
_controle_interactif_adherents(todo_list)
|
||||
|
||||
def __usage(message=None):
|
||||
""" Comment ça marche ? """
|
||||
""" Comment ça marche ? """
|
||||
|
||||
cprint(__doc__ % { 'prog': sys.argv[0] })
|
||||
if message:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue