diff --git a/gestion/gest_crans.py b/gestion/gest_crans.py index 88b03687..e825873a 100644 --- a/gestion/gest_crans.py +++ b/gestion/gest_crans.py @@ -1,7 +1,7 @@ #! /usr/bin/env python # -*- coding: utf-8 -*- -""" +u""" Interface utilisateur du système de gestion des machines et adhérents du crans @@ -67,7 +67,7 @@ def dialog(arg): ## Fonctions de remplissage ou modification des paramètres d'un adhérent def set_bases(adher): - """ + u""" Définition des paramètres de bases d'un adhérent : * Nom * Prenom @@ -117,7 +117,7 @@ def set_bases(adher): return set_bases(adher) def _set_chbre(adher, chbre): - """ Attribution de la chambre chbre à l'adhérent fourni + u""" Attribution de la chambre chbre à l'adhérent fourni Retourne une chaine (unicode) avec l'erreur éventuelle """ if chbre == '????': @@ -145,7 +145,7 @@ def _set_chbre(adher, chbre): return u'' def set_addr_ext(adher): - """ Définition de l'adresse extérieure d'un adhérent + u""" Définition de l'adresse extérieure d'un adhérent La chambre de cet adhérent doit être EXT, sinon erreur """ arg = u'--title "Adresse extérieure de %s" ' % adher.Nom() arg += u'--form "" 0 0 0 ' @@ -166,7 +166,7 @@ def set_addr_ext(adher): return set_addr_ext(adher) def set_etudes(adher): - """ + u""" Définition des études en 3 questions : * établissement * année administrative @@ -364,7 +364,7 @@ def set_etudes(adher): return set_etudes(adher) def set_mail(adher): - """ + u""" Choix d'une adresse mail crans ou extérieure. Retourne ensuite le résultat de : * set_mail_ext si adresse ext @@ -400,7 +400,7 @@ def set_mail(adher): if not set_mail_ext(adher): break def set_mail_ext(adher): - """ + u""" Demande l'adresse mail extérieure d'un adhérent """ default = adher.mail() @@ -479,7 +479,7 @@ def set_etat_civil(adher): return set_etat_civil(adher) def set_compte(adher): - """ + u""" Créé un compte sur vert pour un adhérent. """ @@ -548,7 +548,7 @@ def set_compte(adher): dialog(arg) def set_droits(adher): - """ Définition des droits de l'adhérent """ + u""" Définition des droits de l'adhérent """ arg = u'--title "Droits de %s" ' % adher.Nom() arg += u'--separate-output ' arg += u'--checklist "" 0 0 0 ' @@ -575,7 +575,7 @@ def set_droits(adher): adher.droits(result) def del_adher(adher): - """ + u""" Destruction adhérent """ quoi = u'Toutes les machines associées à cet adhérent seront détruites' @@ -638,7 +638,7 @@ def del_adher(adher): ## Fonctions de remplissage ou modification des paramètres club def set_responsable(club): - """ Modifie le responsable d'un club """ + u""" Modifie le responsable d'un club """ arg = u'--title "Responsable du club" ' arg += u'--msgbox "Séléctionnez l\'adhérent responsable du club\n\n\n" 0 0' dialog(arg) @@ -648,7 +648,7 @@ def set_responsable(club): club.responsable(resp) def set_imprimeurs(club): - """ Modifie les imprimeurs d'un club """ + u""" Modifie les imprimeurs d'un club """ while 1: arg = u'--title "Imprimeurs de %s" ' % club.Nom() if len(club.imprimeurs()) > 0: @@ -669,7 +669,7 @@ def set_imprimeurs(club): while 1: os.system('clear') choix = None - print "Ce club a plusieurs imprimeurs :" + print u"Ce club a plusieurs imprimeurs :" aff(liste) i = affich_tools.prompt(u'Votre choix ? (0 pour annuler) aid =') if i == '0': break @@ -699,7 +699,7 @@ def set_imprimeurs(club): arg += u'--msgbox "Cet adhérent n\'est pas imprimeur du club !\n\n\n" 0 0' dialog(arg) - elif res[0] == 'Ajouter': + elif res[0] == u'Ajouter': newimp = select(club, u'd\'un nouvel imprimeur a', 'ro') if newimp: if club.imprimeurs(ajouter=str(newimp.id())): @@ -713,6 +713,7 @@ def set_imprimeurs(club): continue def set_club_nom(club): + u"""Définit le nom du club""" # Nom du club arg = u'--title "Nom" ' arg += u'--inputbox "Nom du club ?" 0 0 "%s"' % club.Nom() @@ -727,7 +728,7 @@ def set_club_nom(club): dialog(arg) def set_local(club): - """ Défini le local d'un club """ + u""" Définit le local d'un club """ try: club.chbre('&é"') # Fait une erreur except ValueError, c: @@ -750,7 +751,7 @@ def set_local(club): def set_club_compte(club): - """ + u""" Créé un compte sur vert pour un club. """ @@ -791,7 +792,7 @@ def set_club_compte(club): ## (suivant la classe fournie) def set_rque(clas): - """Définit le commentaire (méthode info de clas)""" + u"""Définit le commentaire (méthode info de clas)""" return __prompt_input_menu(clas.info, u'Remarque', u"Ajouter ou modifier une remarque\nPour ajouter une remarque modifier la dernière de la liste.") def __prompt_input_menu(method, titre, prompt): @@ -841,7 +842,7 @@ def __prompt_input_menu(method, titre, prompt): return __prompt_input_menu(method, titre, prompt) def set_solde(clas): - """ Débit ou crédit d'un compte """ + u""" Débit ou crédit d'un compte """ while 1: arg = u'--title "Crédit / débit du compte de %s" ' % clas.Nom() arg += u'--inputbox "Solde actuel : %s\n Opération à effectuer (+ pour crédits et - pour débit) ?" 0 0 "" ' % clas.solde() @@ -869,7 +870,7 @@ def set_solde(clas): dialog(arg) def confirm(clas): - """ Demande confirmation avant enregistrement""" + u""" Demande confirmation avant enregistrement""" # On va faire en texte, les couleurs ne passent pas en curses os.system('clear') aff(clas) @@ -891,7 +892,7 @@ def confirm(clas): affich_tools.prompt(u"Appuyez sur ENTREE pour continuer") def set_blackliste(clas): - """ Édite ou ajoute un item de la blackliste """ + u""" Édite ou ajoute un item de la blackliste """ bl = clas.blacklist() if not bl: # Pas d'entrée à éditer @@ -1005,7 +1006,7 @@ def set_blackliste(clas): ## Fonction de remplissage ou modification des paramètres club ou adhérent def on_off(condition): - """ + u""" Renvoie 'on' ou 'off' selon la condition (pour dialog). """ if condition: @@ -1014,7 +1015,7 @@ def on_off(condition): return 'off' def set_type_de_connexion(adherent): - """ + u""" Définition du type de connexion: gratuite limité ou normale. """ if isinstance(adherent, Club): return @@ -1026,7 +1027,7 @@ def set_type_de_connexion(adherent): adherent.adherentPayant(result == "1") def set_admin(proprio): - """ + u""" Définition de l'état administratif : carte d'étudiant, paiement et caution. """ @@ -1186,7 +1187,7 @@ def new_club(club): else: break def modif_club(club): - """ + u""" Modification du club fourni (instance de club) Retourne 1 si annulation. """ @@ -1235,7 +1236,7 @@ def modif_club(club): return confirm(club) def select_club(clas): - """ Choix d'un club """ + u""" Choix d'un club """ arg = u'--title "Recherche d\'un club" ' clubs = clas.search('cid=*')['club'] @@ -1252,8 +1253,8 @@ def select_club(clas): return clas.search('cid=%s' % res[0], 'w')['club'][0] def del_club(club): - """ Destruction club """ - quoi = 'Toutes les machines associées à cet adhérent seront détruites' + u""" Destruction club """ + quoi = u'Toutes les machines associées à cet adhérent seront détruites' while 1: arg = u'--title "Destruction club " --colors ' arg += u'--inputbox "\Zr\Z1ATTENTION\Zn : la destruction est définitive\n\nToutes les machines de ce club seront également détruites.\n\nCommentaire à insérer ?" 0 0' @@ -1333,7 +1334,7 @@ def set_wifi(machine): elif result[4].lower().strip() == "non": machine.hotspot(False) else: - err += "Les valeurs possibles pour le parametre hotspot\n sont \"oui\" ou \"non\"\n" + err += u"Les valeurs possibles pour le parametre hotspot\n sont \"oui\" ou \"non\"\n" try: #On vérifie toutes les variables avant de sauvegarder @@ -1361,7 +1362,7 @@ def set_wifi(machine): return set_wifi(machine) def set_machine(machine): - """ + u""" Définition des paramètres d'une machine : * Nom de machine * Adresse MAC @@ -1465,19 +1466,19 @@ def set_machine(machine): return set_machine(machine) def set_machine_exemption(machine): - """Définit les réseau exemptés de comptage d'upload pour la machine""" + u"""Définit les réseau exemptés de comptage d'upload pour la machine""" if __prompt_input_menu(machine.exempt, u'Exemption', u"Ajouter ou modifier un réseau/une ip vers lequel on ne compte pas l'upload (format x.y.z.t[/m])\nPour ajouter un réseau modifier la fin de la liste.") or confirm(machine): machine.restore() return 1 def set_machine_alias(machine): - """Définit la liste des alias d'une machine""" + u"""Définit la liste des alias d'une machine""" if __prompt_input_menu(machine.alias, 'Alias machine', "Entrez ou modifier un alias machine.\nPour ajouter un alias modifier le dernier de la liste.") or confirm(machine): machine.restore() return 1 def del_machine(machine): - """ + u""" Destruction machine """ while 1: @@ -1507,7 +1508,7 @@ def del_machine(machine): ## Fonctions principales d'interface def new_adher(adher): - """ + u""" Définition des propriétés d'un adhérent 4 etapes : * set_bases @@ -1542,7 +1543,7 @@ def new_adher(adher): adher.services_to_restart('ML_ens', [mail]) def modif_adher(adher): - """ + u""" Modification de l'adhérent fourni (instance de adhérent) Retourne 1 si annulation. """ @@ -1712,7 +1713,7 @@ def modif_adher(adher): return confirm(adher) def modif_machine(machine): - """ + u""" Modification de la machine fournie (instance de machine) Retourne 1 si annulation. """ @@ -1768,7 +1769,7 @@ def modif_machine(machine): ## Fonction de sélection (adhérent ou machine) def select(clas, quoi, mde=''): - """ + u""" Interface de choix d'un adhérent, d'une machine ou d'un club Retourne une instance de la classe choisie. quoi est la chaine utilisée pour la demande (%sid=?) @@ -1929,7 +1930,7 @@ def select(clas, quoi, mde=''): # Sinon retour interface de sélection def menu_principal(): - """ + u""" Affiche le menu de choix initial """ @@ -2122,8 +2123,8 @@ def menu_principal(): elif choix == 'Wifi': becane = MachineWifi(proprio) except ValueError, c: - arg = '--title "Nouvelle machine" ' - arg += '--msgbox "%s\n\n\n" 0 0' % c.args[0] + arg = u'--title "Nouvelle machine" ' + arg += u'--msgbox "%s\n\n\n" 0 0' % c.args[0] dialog(arg) continue if set_machine(becane): @@ -2196,16 +2197,16 @@ if __name__ == '__main__': exit = 0 except KeyboardInterrupt: os.system('clear') - print "Interruption par l'utilisateur." + print u"Interruption par l'utilisateur." exit = 255 except SystemExit, c: if c.__str__() == '254': os.system('reset') - print "Votre session d'édition a été tuée." + print u"Votre session d'édition a été tuée." exit = c except: if not debug: os.system('clear') - print """Une erreur fatale s'est produite durant l'exécution.""" + print u"""Une erreur fatale s'est produite durant l'exécution.""" # Report de bug import traceback @@ -2234,13 +2235,13 @@ Subject: Bugreport %s conn.quit() sys.stderr.write("Un rapport de bug à été automatiquement envoyé.\n") else: - print "Merci de faire parvenir un rapport de bug à nounou" + print u"Merci de faire parvenir un rapport de bug à nounou" except: sys.stderr.write("Impossible d'envoyer le rapport de bug.\n") if debug: print '-'*40 - print 'Détails techniques :' + print u'Détails techniques :' sys.stderr.write(traceback) print '-'*40 exit = 1 @@ -2259,9 +2260,9 @@ Subject: Bugreport %s # Restart toutes les 10 min : 03, 13, 23, 33, 43, 53 t = (13 - mn % 10) % 10 + 1 # Certaines machines le font -Aà 4-b if t == 0: t = 10 - print "Les modifications apportées à la base seront prises en compte dans %i min environ." % t + print u"Les modifications apportées à la base seront prises en compte dans %i min environ." % t if debug: - print "Les services suivants seront redémarrés: " + print u"Les services suivants seront redémarrés: " for s in serv: print '\t%s' % s diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index e87765cf..870f03db 100644 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -122,7 +122,7 @@ script_utilisateur = cur_user ################################################################################## ### Fonctions utiles def decode(s): - """ + u""" Retourne un unicode à partir de s s doit être en utf-8 """ @@ -134,12 +134,12 @@ def decode(s): return s.decode('utf-8', 'ignore') # On ignore les erreurs def strip_accents(a): - """ Supression des accents de la chaîne fournie """ + u""" Supression des accents de la chaîne fournie """ res = normalize('NFKD', decode(a)).encode('ASCII', 'ignore') return res.replace(' ', '_').replace("'", '') def mailexist(mail): - """ + u""" Vérifie si une adresse mail existe ou non grace à la commande vrfy du serveur mail """ @@ -157,7 +157,7 @@ def mailexist(mail): return r def preattr(val): - """ + u""" val est : * un entier * une chaîne @@ -184,7 +184,7 @@ def preattr(val): def is_actif(sanction): - """ + u""" Retourne True ou False suivant si la sanction fournie (chaîne venant de blacklist) est active ou non """ @@ -199,7 +199,7 @@ def is_actif(sanction): def format_mac(mac): - """ + u""" Formatage des adresses mac Transforme une adresse pour obtenir la forme xx:xx:xx:xx:xx:xx Le séparateur original peut être :, - ou rien @@ -230,7 +230,7 @@ def format_mac(mac): ### Définition des classes class Service: - """ Définit un service à redémarrer """ + u""" Définit un service à redémarrer """ def __init__(self, nom, args=[], start=[]): """ Nom du service @@ -338,7 +338,7 @@ class CransLdap: self.remove_lock(lock) def connect(self, readonly=False): - """ Initialisation la connexion vers le serveur LDAP """ + u""" Initialisation la connexion vers le serveur LDAP """ if readonly: self.conn = ldap.initialize(ro_uri) return @@ -358,7 +358,7 @@ class CransLdap: time.sleep(0.3) def exist(self, arg): - """ + u""" Vérifie l'existence d'une entrée dans la base et que cette entrée n'appartient pas à l'objet en cours. @@ -405,7 +405,7 @@ class CransLdap: return r def lock(self, item, valeur): - """ + u""" Lock un item avec la valeur valeur, les items possibles peuvent être : @@ -450,7 +450,7 @@ class CransLdap: self._locks.append(lock_dn) def remove_lock(self, lockdn): - """ + u""" Destruction d'un lock Destruction de tous les locks si lockdn=* """ @@ -470,11 +470,11 @@ class CransLdap: self.conn.delete_s(l[0]) def list_locks(self): - """ Liste les locks """ + u""" Liste les locks """ return self.conn.search_s(self.base_lock, 1, 'objectClass=lock') def services_to_restart(self, new=None, args=[], start=0): - """ + u""" start indique la date (en secondes depuis epoch) à partir du moment où cette action sera effectuée. @@ -581,7 +581,7 @@ class CransLdap: def make(self, entry, mode=''): - """ + u""" Crée le bon objet à partir de entry. mode a la même signification que dans search. """ @@ -597,7 +597,7 @@ class CransLdap: def search(self, expression, mode=''): - """ + u""" Recherche dans la base LDAP, expression est une chaîne : * soit une expression : champ1=expr1&champ2=expr2&champ3!=expr3... * soit un seul terme, dans ce cas cherche sur les champs de @@ -632,7 +632,7 @@ class CransLdap: # Fonction utile def build_filtre(champ, expr, neg=False): - """ + u""" Retourne une chaine pour recherche dans la base LDAP du style (champ=expr) en adaptant les valeurs de expr au champ. Si neg = True, retourne le négatif : (!(champ=expr)) @@ -830,7 +830,7 @@ class CransLdap: return result def getProprio(self, uid, mode=''): - """ + u""" Renvoie un proprietaire ou un adherent correspondant au login/ mot de passe (mot de passe facultatif) """ @@ -848,7 +848,7 @@ class CransLdap: __machines = () def all_machines(self, graphic=False): - """ + u""" Renvoie toutes les machines autorisées. Cela affiche des trucs et des bidules si graphic est à True. @@ -878,15 +878,15 @@ class CransLdap: ############################################################################# class BaseClasseCrans(CransLdap): - """ Méthodes de base des classes machines, et BaseProprietaire """ + u""" Méthodes de base des classes machines, et BaseProprietaire """ def __eq__(self, autre): - """ Test d'égalité de deux instances de club/adhérent/machine, + u""" Test d'égalité de deux instances de club/adhérent/machine, retourne True s'il s'agit du même club/adhérent/machine, False sinon """ return self.__class__ == autre.__class__ and self.id() == autre.id() def id(self): - """ Retourne la valeur de l'attribu caractéristique de la classe (aid,mid,cid)""" + u""" Retourne la valeur de l'attribu caractéristique de la classe (aid,mid,cid)""" try: s = self.dn.split(',')[0].split('=') if s[0] == self.idn: @@ -895,11 +895,11 @@ class BaseClasseCrans(CransLdap): return '' def __str__(self): - """ Chainde identifiant l'objet de la forme 'uid=1245' """ + u""" Chainde identifiant l'objet de la forme 'uid=1245' """ return '%s=%s' % (self.idn, self.id()) def blacklist_actif(self): - """ + u""" Vérifie si l'instance courante est blacklistée. Retourne les sanctions en cours (liste). Retourne une liste vide si aucune sanction en cours. @@ -907,7 +907,7 @@ class BaseClasseCrans(CransLdap): return self.blacklist_all()[0].keys() def blacklist_all(self): - """ + u""" Vérifie si l'instance courante est blacklistée ou a été blacklistée. Retourne les sanctions en cours sous la forme d'un couple de deux dictionnaires (l'un pour les sanctions @@ -938,7 +938,7 @@ class BaseClasseCrans(CransLdap): return (actifs, inactifs) def blacklist(self, new=None): - """ + u""" Blacklistage de la ou de toutes la machines du propriétaire * new est une liste de 4 termes : [debut_sanction, fin_sanction, sanction, commentaire] @@ -1014,16 +1014,16 @@ class BaseClasseCrans(CransLdap): return liste def restore(self): - """ Restore les données à l'état initial (ou pas) """ + u""" Restore les données à l'état initial (ou pas) """ self._data = self._init_data.copy() self.modifs = {} def historique(self): - """ Retourne l'historique de l'objet """ + u""" Retourne l'historique de l'objet """ return map(decode, self._data.get('historique', [])) def info(self, new=None): - """ + u""" Pour ajouter une remarque new doit être la chaîne représentant la remarque à ajouter Pour modifier new doit être une liste de la forme: @@ -1060,7 +1060,7 @@ class BaseClasseCrans(CransLdap): return liste def _save(self): - """ Sauvegarde dans la base LDAP """ + u""" Sauvegarde dans la base LDAP """ if not self.modifs: # Rien à faire return [] @@ -1237,7 +1237,7 @@ class BaseClasseCrans(CransLdap): self._init_data = self._data.copy() def _delete(self, dn, comment=''): - """ Sauvegarde puis destruction du dn (et des sous-dn) fourni """ + u""" Sauvegarde puis destruction du dn (et des sous-dn) fourni """ # Commentaires comment = preattr(comment)[1] self.modifs.setdefault('destruction (%s)' % comment, None) @@ -1271,7 +1271,7 @@ class BaseClasseCrans(CransLdap): pass def _set(self, champ, val, comment=None): - """ + u""" Met à jour les données de _data et modifie modifs si besoin. Si val=[] ou None, supprime le champ. """ @@ -1301,10 +1301,10 @@ class BaseClasseCrans(CransLdap): ############################################################################# class BaseProprietaire(BaseClasseCrans): - """ Méthodes de bases pour les classes Adherent et Club """ + u""" Méthodes de bases pour les classes Adherent et Club """ def __init__(self, data=(), mode='', conn=None): - """ + u""" Si data est fourni initialise l'adhérent avec les valeurs données Format de data : tuple comme retourné par une recherche dans la base ldap: ( dn, { donnée }) @@ -1344,7 +1344,7 @@ class BaseProprietaire(BaseClasseCrans): self._modifiable = 'w' def chsh(self, new=None): - """ Retourne ou change le shell de l'adhérent """ + u""" Retourne ou change le shell de l'adhérent """ if new == None: try: return decode(self._data.get('loginShell', [''])[0]) except: return '' @@ -1354,7 +1354,7 @@ class BaseProprietaire(BaseClasseCrans): return new def alias(self, new=None): - """ + u""" Création ou visualisation des alias mail Même sytème d'argument que la méthode info. """ @@ -1402,7 +1402,7 @@ class BaseProprietaire(BaseClasseCrans): return liste def homepageAlias(self, new=None): - """ + u""" Creation ou visualisation des alias de page perso. Meme systeme d'arguments que pour info. """ @@ -1450,7 +1450,7 @@ class BaseProprietaire(BaseClasseCrans): return liste def machines(self): - """ Retourne les machines (instances) appartenant à la classe """ + u""" Retourne les machines (instances) appartenant à la classe """ # Le champ id n'est pas initialisé lorsque le proprio est en cours # de création if self.id(): @@ -1462,7 +1462,7 @@ class BaseProprietaire(BaseClasseCrans): return [] def machines_fixes(self): - """ Retourne les machines fixes appartenant à l'instance """ + u""" Retourne les machines fixes appartenant à l'instance """ if self.id(): res = [] for r in self.conn.search_s('%s=%s,%s' % (self.idn, self.id(), self.base_dn), 1, 'objectClass=machineFixe'): @@ -1472,7 +1472,7 @@ class BaseProprietaire(BaseClasseCrans): return [] def machines_wifi(self): - """ Retourne les machines wifi appartenant à l'instance """ + u""" Retourne les machines wifi appartenant à l'instance """ if self.id(): res = [] for r in self.conn.search_s('%s=%s,%s' % (self.idn, self.id(), self.base_dn), 1, 'objectClass=machineWifi'): @@ -1482,7 +1482,7 @@ class BaseProprietaire(BaseClasseCrans): return [] def factures(self): - """ Retourne les factures (instances) appartenant à la classe """ + u""" Retourne les factures (instances) appartenant à la classe """ # Le champ id n'est pas initialisé lorsque le proprio est en cours # de création if self.id(): @@ -1494,7 +1494,7 @@ class BaseProprietaire(BaseClasseCrans): return [] def solde(self, operation=None, comment=None): - """ Retourne ou modifie le solde d'un propriétaire + u""" Retourne ou modifie le solde d'un propriétaire operation doit être un nombre positif ou négatif (string ou int ou float) comment est un commentaire à rajouter dans l'historique @@ -1518,7 +1518,7 @@ class BaseProprietaire(BaseClasseCrans): return new def controle(self, new=None): - """ + u""" Controle du tresorier New est de la forme [+-][pck] (p pour le paiement, c pour la carte, k pour la caution) @@ -1556,7 +1556,7 @@ class BaseProprietaire(BaseClasseCrans): return actuel def contourneGreylist(self, contourneGreylist=None): - """ + u""" Retourne ou change la greylist pour le compte * True : contourne le GreyListing * False : ne contourne pas le greylisting @@ -1584,7 +1584,7 @@ class BaseProprietaire(BaseClasseCrans): return bool(self._data.get('contourneGreylist', [])) def verifyPasswd(self, passwd): - """ + u""" Retourne True si le mot de passe est bon, ou False si le mot de passe n'est pas bon. """ @@ -1593,7 +1593,7 @@ class BaseProprietaire(BaseClasseCrans): return ldap_passwd.checkpwd(passwd, self._data['userPassword'][0]) def changePasswd(self, passwd): - """ + u""" Modifie le mot de passe de l'adhérent """ if not self.compte(): @@ -1601,7 +1601,7 @@ class BaseProprietaire(BaseClasseCrans): self._set('userPassword', [ldap_passwd.mkpasswd(passwd)]) def forward(self, new = None): - """ + u""" Modifie ou retourne l'adresse de forward de l'adhérent NB : il faut avoir un sudo sur /usr/scripts/gestion/mail_config.py sinon cette metode ne fonctionnera pas @@ -1611,7 +1611,7 @@ class BaseProprietaire(BaseClasseCrans): return config_mail.MailConfig(uid=self._data['uid'][0], forward = new)['forward'] def spam(self, new = None): - """ + u""" Modifie ou retourne le traitement des spams de l'adhérent new doit être 'accepte', 'marque' ou 'supprime' NB : il faut avoir un sudo sur /usr/scripts/gestion/mail_config.py @@ -1622,14 +1622,14 @@ class BaseProprietaire(BaseClasseCrans): return config_mail.MailConfig(uid=self._data['uid'][0], spam = new)['spam'] def home(self): - """ Retourne le home de l'adhérent """ + u""" Retourne le home de l'adhérent """ if not self.compte(): raise NotImplementedError, u"L'adhérent na pas de compte" return self._data['homeDirectory'][0] def uidNumber(self, new=None): - """ Retourne ou change l'uidNumber de l'adhérent """ + u""" Retourne ou change l'uidNumber de l'adhérent """ if not self.compte(): raise NotImplementedError, u"L'adhérent na pas de compte" if new == None: @@ -1640,7 +1640,7 @@ class BaseProprietaire(BaseClasseCrans): return new def paiement(self, action=None): - """ + u""" Action est un entier représentant une année si positif ajoute l'année à la liste si négatif le supprime @@ -1648,7 +1648,7 @@ class BaseProprietaire(BaseClasseCrans): return self._an('paiement', action) def delete(self, comment=''): - """Destruction du proprietaire""" + u"""Destruction du propriétaire""" for m in self.machines(): # Destruction machines @@ -1670,7 +1670,7 @@ class BaseProprietaire(BaseClasseCrans): pass def save(self): - """ + u""" Enregistre l'adhérent ou le club courant dans la base LDAP Ajoute le mail de bienvenue à la liste des services à redémarrer Retourne une chaîne indiquant les opération effectuées. @@ -1768,7 +1768,7 @@ class BaseProprietaire(BaseClasseCrans): return ret def _an(self, champ, action): - """ + u""" Champ est un champ contenant une liste d'entiers Action est un entier représentant une année si positif ajoute l'année à la liste @@ -1803,7 +1803,7 @@ class BaseProprietaire(BaseClasseCrans): ############################################################################# class Adherent(BaseProprietaire): - """ Classe de définition d'un adhérent """ + u""" Classe de définition d'un adhérent """ objectClass = 'adherent' idn = 'aid' filtre_idn = '(objectClass=adherent)' @@ -1811,7 +1811,7 @@ class Adherent(BaseProprietaire): ### Méthodes Nom utilisée lors de l'affichage des propriétés ### (commune avec les classes AssociationCrans et Club) def Nom(self): - """ Retourne prenom nom """ + u""" Retourne prenom nom """ return "%s %s" % ( self.prenom() , self.nom() ) def nom(self, new=None): @@ -1853,7 +1853,7 @@ class Adherent(BaseProprietaire): return new def chbre(self, new=None): - """ + u""" Défini la chambre d'un adhérent, EXT pour personne extérieure au campus """ if new == None: @@ -1922,7 +1922,7 @@ class Adherent(BaseProprietaire): return new def adresse(self, new=None): - """ Défini l'adresse pour les personnes extérieures (dont la chambre = EXT) + u""" Défini l'adresse pour les personnes extérieures (dont la chambre = EXT) L'adresse est une liste de 4 éléments : numero, rue, code postal, ville """ if new == None: @@ -1993,7 +1993,7 @@ class Adherent(BaseProprietaire): return new def email(self, new=None): - """ Retourne l'adresse mail, ajoute le @crans.org si nécessaire """ + u""" Retourne l'adresse mail, ajoute le @crans.org si nécessaire """ # pour la compatibilité entre les fonctions if new: self.mail(new) @@ -2005,7 +2005,7 @@ class Adherent(BaseProprietaire): return mail def mail_invalide(self, valeur=None): - """ + u""" L'adresse est invalide. Au niveau de la base, on considère l'absence ou la présence de mailInvalide=TRUE. @@ -2023,7 +2023,7 @@ class Adherent(BaseProprietaire): return bool(self._data.get('mailInvalide', [])) def charteMA(self, valeur=None): - """ + u""" La charte des membres actifs est signee. False par defaut. """ @@ -2039,7 +2039,7 @@ class Adherent(BaseProprietaire): return bool(self._data.get('charteMA', [])) def adherentPayant(self, valeur = None): - """ + u""" L'adhérent paie sa cotisation (a droit au WiFi, à un compte Crans, ... True par défaut """ @@ -2056,7 +2056,7 @@ class Adherent(BaseProprietaire): return not bool(self._data.get('adherentPayant', [])) def supprimer_compte(self): - """ + u""" Supprime le compte sur zamok. Penser à définir l'adresse mail après. """ self._set('mail', ['']) @@ -2072,7 +2072,7 @@ class Adherent(BaseProprietaire): except: pass def etudes(self, index_or_new): - """ + u""" Retourne l'un des 3 champs études (selon index_or_new si entier) """ if type(index_or_new) == int: @@ -2103,7 +2103,7 @@ class Adherent(BaseProprietaire): return new def carteEtudiant(self, action=None): - """ + u""" Action est un entier représentant une année si positif ajoute l'année à la liste si négatif le supprime @@ -2111,7 +2111,7 @@ class Adherent(BaseProprietaire): return self._an('carteEtudiant', action) def checkPassword(self, password): - """Vérifie le mot de passe de l'adhérent""" + u"""Vérifie le mot de passe de l'adhérent""" anon = ldap.initialize(uri) try: r = anon.simple_bind(self.dn, password) @@ -2124,7 +2124,7 @@ class Adherent(BaseProprietaire): def compte(self, login=None, uidNumber=0, hash_pass='', shell=config.login_shell): - """ + u""" Création d'un compte à un adhérent (la création se fait après l'écriture dans la base par la méthode save) Si login = None, retourne le compte de l'adhérent @@ -2225,7 +2225,7 @@ class Adherent(BaseProprietaire): return decode(login) def canonical_alias(self, new=None): - """ Retourne ou défini l'alias canonique""" + u""" Retourne ou défini l'alias canonique""" if new == None: try: return decode(self._data['canonicalAlias'][0]) except: return '' @@ -2244,8 +2244,8 @@ class Adherent(BaseProprietaire): return a def droits(self, droits=None): - """ droits est la liste des droits à donner à l'utilisateur """ - """ ATTENTION : il y a une autre fonction droits_lights derrière celle-çi, + u""" droits est la liste des droits à donner à l'utilisateur """ + u""" ATTENTION : il y a une autre fonction droits_lights derrière celle-çi, pensez à faire vos modifs sur les deux """ if droits != None and 'cransAccount' not in self._data.get('objectClass', []): @@ -2279,7 +2279,7 @@ class Adherent(BaseProprietaire): return new def droits_light(self, droits=None): - """ droits_light ne verifie pas isadm et ne touche pas aux droits critiques """ + u""" droits_light ne verifie pas isadm et ne touche pas aux droits critiques """ if droits != None and 'cransAccount' not in self._data.get('objectClass', []): raise EnvironmentError(u'Il faut avoir un compte pour avoir des droits.') @@ -2333,7 +2333,7 @@ class Adherent(BaseProprietaire): return reponse def rewriteMailHeaders(self, rewrite=None): - """ + u""" Réécriture des entêtes mail avec l'alias canonique * True : réécrit les en-têtes * False : ne réécrit pas les en-têtes @@ -2357,7 +2357,7 @@ class Adherent(BaseProprietaire): return bool(self._data.get('rewriteMailHeaders', [])) def derniereConnexion(self, new=False): - """ + u""" Date de dernière connexion. Le format est le nombre de secondes écoulées depuis Epoch. Si new est donné, met à jour la valeur si elle est plus récente. @@ -2379,7 +2379,7 @@ class Adherent(BaseProprietaire): return current def dateInscription(self): - """Renvoie la date d'inscription.""" + u"""Renvoie la date d'inscription.""" # En théorie, c'est la date de la première entrée dans l'historique if self.historique(): h = self.historique()[0] @@ -2395,13 +2395,13 @@ class Adherent(BaseProprietaire): class Club(BaseProprietaire): - """ Classe de définition d'un club """ + u""" Classe de définition d'un club """ idn = 'cid' filtre_idn = '(objectClass=club)' objectClass = 'club' def Nom(self, new=None): - """ Défini ou retourne le nom du club """ + u""" Définit ou retourne le nom du club """ if new == None: return decode(self._data.get('nom', [''])[0]) @@ -2414,18 +2414,18 @@ class Club(BaseProprietaire): return new def etudes(*args): - """ Etudes bidon pour club """ + u""" Etudes bidon pour club """ return u'N/A' def nom(self): - """ Retourne le nom du club, utilisé lors de la destruction """ + u""" Retourne le nom du club, utilisé lors de la destruction """ return strip_accents(self.Nom()) def carteEtudiant(self, pd=None): return [ ann_scol ] def responsable(self, adher=None): - """ Responsable du club, adher doit être une instance de la classe adhérent """ + u""" Responsable du club, adher doit être une instance de la classe adhérent """ if adher == None: aid = decode(self._data.get('responsable', [''])[0]) if aid: @@ -2442,7 +2442,7 @@ class Club(BaseProprietaire): return adher def imprimeurs(self, ajouter=None, retirer=None): - """Retourne la liste des aid des personnes autorisees a imprimer avec + u"""Retourne la liste des aid des personnes autorisees a imprimer avec le compte *@club-*, ou ajoute/retire un aid a cette liste.""" if self._data.has_key('imprimeurClub'): liste = list(self._data['imprimeurClub']) @@ -2466,7 +2466,7 @@ class Club(BaseProprietaire): return liste def chbre(self, new=None): - """ Défini le local du club + u""" Définit le local du club new doit être une des clefs de l'annuaire locaux_clubs""" if new == None: return decode(self._data.get('chbre', [''])[0]) @@ -2479,13 +2479,13 @@ class Club(BaseProprietaire): return new def local(self): - """ Retourne le local à partir de la chambre enregistrée et + u""" Retourne le local à partir de la chambre enregistrée et de la conversion avec l'annuaire locaux_clubs """ annu = annuaires.locaux_clubs() return decode(annu.get(self.chbre(), '')) def compte(self, login=None): - """ Créé un compte au club sur vert""" + u""" Créé un compte au club sur vert""" if login == None: return self._data.get('uid', [''])[0] @@ -2543,17 +2543,17 @@ class Club(BaseProprietaire): return decode(login) def email(self): - """ Retourne l'adresse mail du responsable """ + u""" Retourne l'adresse mail du responsable """ return self.responsable().email() class Machine(BaseClasseCrans): - """ Classe de définition d'une machine """ + u""" Classe de définition d'une machine """ idn = 'mid' filtre_idn = '(|(objectClass=machineFixe)(objectClass=machineWifi)' filtre_idn += '(objectClass=machineCrans)(objectClass=borneWifi))' def __init__(self, parent_or_tuple, mode='', conn=None): - """ + u""" parent_or_tuple est : * soit une instance d'une classe pouvant posséder une machine (Adherent, Club ou AssociationCrans), la nouvelle machine lui @@ -2616,11 +2616,11 @@ class Machine(BaseClasseCrans): raise TypeError(u'Arguments invalides') def Nom(self): - """ Retourne le nom de la machine """ + u""" Retourne le nom de la machine """ return self.nom() def mac(self, mac=None, multi_ok=0): - """ + u""" Défini ou retourne l'adresse mac de la machine Adresse valide si: 12 caractères hexa avec - ou : comme séparateurs @@ -2669,7 +2669,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) return mac def __host_alias(self, champ, new): - """ Vérification de la validité d'un nom de machine """ + u""" Vérification de la validité d'un nom de machine """ # Supression des accents new = strip_accents(unicode(new, 'iso-8859-15')) @@ -2712,7 +2712,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) return new def nom(self, new=None): - """ + u""" Défini ou retourne le nom de machine. Un nom de machine valide ne comporte que des caractères alphabétiques minuscules et le - @@ -2725,7 +2725,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) return new.split('.')[0] def prise(self, new=None): - """ Retourne ou défini la prise associée à la machine + u""" Retourne ou défini la prise associée à la machine La définition n'est possible que si la machine est une machine de l'assoce. Si la prise est inconne retourne N/A @@ -2755,7 +2755,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) return new def alias(self, new=None): - """ + u""" Création ou visualisation des alias d'une machine. Même sytème d'argument que la méthode info. """ @@ -2788,7 +2788,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) return liste def ip(self, ip=None): - """ + u""" Défini ou retourne l'IP de la machine. Les IP sont stoquées sous forme xxx.xxx.xxx.xxx et doivent être fournies ainsi. Si l'IP n'est pas définie retourne . @@ -2862,7 +2862,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) return ip def exempt(self, new=None): - """ + u""" Liste des réseaux vers lesquels on ne compte pas l'upload Cette liste est transférée dans la base postgres de komaz Pour ajouter un réseau new doit être la chaîne @@ -2901,7 +2901,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) return liste def proprietaire(self): - """ + u""" retroune le propriétaire de la machine (classe Adherent, Club ou AssociationCrans) """ if not self.__proprietaire: @@ -2916,7 +2916,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) return self.__proprietaire def save(self): - """ + u""" Enregistre la machine courante dans la base LDAP Retourne une chaîne indiquant les opération effectuées. """ @@ -3007,7 +3007,7 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) return ret def delete(self, comment=''): - """ Destruction de la machines """ + u""" Destruction de la machine""" from user_tests import isadm if self.proprietaire().__class__ == AssociationCrans and not isadm(): raise EnvironmentError(u'Il faut être administrateur pour effectuer cette opération.') @@ -3035,19 +3035,19 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) self.services_to_restart('classify', [self.ip()]) def portTCPin(self, ports=None): - """ Ports TCP ouverts depuis l'extérieur pour la machine """ + u""" Ports TCP ouverts depuis l'extérieur pour la machine """ return self.__port(ports, 'portTCPin') def portTCPout(self, ports=None): - """ Ports TCP ouverts vers l'extérieur pour la machine """ + u""" Ports TCP ouverts vers l'extérieur pour la machine """ return self.__port(ports, 'portTCPout') def portUDPin(self, ports=None): - """ Ports UDP ouverts vers l'extérieur pour la machine """ + u""" Ports UDP ouverts vers l'extérieur pour la machine """ return self.__port(ports, 'portUDPin') def portUDPout(self, ports=None): - """ Ports UDP ouverts vers l'extérieur pour la machine """ + u""" Ports UDP ouverts vers l'extérieur pour la machine """ return self.__port(ports, 'portUDPout') def __port(self, ports, champ): @@ -3069,18 +3069,18 @@ Contactez nounou si la MAC est bien celle d'une carte.""", 3) self._set(champ, map(lambda x: ':'.join(map(str, x)), ports)) def __hash__(self): - """Retourne un hash de l'objet Machine""" + u"""Retourne un hash de l'objet Machine""" return hash(self.nom()) class MachineFixe(Machine): - """ Classe de définition d'une machine fixe """ + u""" Classe de définition d'une machine fixe """ def __init__(self, parent_or_tuple, typ='fixe', conn=None): Machine.__init__(self, parent_or_tuple, typ, conn) class MachineWifi(Machine): - """ Classe de définition d'une machine wifi """ + u""" Classe de définition d'une machine wifi """ def __init__(self, parent_or_tuple, typ='wifi', conn=None): Machine.__init__(self, parent_or_tuple, typ, conn) @@ -3089,7 +3089,7 @@ class MachineWifi(Machine): self.ipsec(True) def ipsec(self, clef=None): - """ + u""" Affichage (clef=None), génération (clef=True) ou définition de la clef IPsec de la machine. Si clef différent de True et None: prend la clef fournie. """ @@ -3109,13 +3109,13 @@ class MachineWifi(Machine): class MachineCrans(Machine): - """ Classe de définition d'une machine du Crans """ + u""" Classe de définition d'une machine du Crans """ def __init__(self, parent_or_tuple, typ='fixe', conn=None): Machine.__init__(self, parent_or_tuple, typ, conn) def nombrePrises(self, new=None): - """ Nombre de prises, pour les switchs """ + u""" Nombre de prises, pour les switchs """ if not new: return int(self._data.get('nombrePrises', [-1])[0]) @@ -3131,7 +3131,7 @@ class MachineCrans(Machine): return new class BorneWifi(Machine): - """ Classe de définition d'une borne wifi """ + u"""Classe de définition d'une borne wifi""" def __init__(self, parent_or_tuple, typ='borne', conn=None): Machine.__init__(self, parent_or_tuple, typ, conn) @@ -3142,13 +3142,13 @@ class BorneWifi(Machine): self._data['hotspot'] = ['FALSE'] def mac2(self): - """ Retourne l'adresse MAC + 2 """ + u"""Retourne l'adresse MAC + 2""" mac = self.mac().split(":") mac[-1] = "%0.2x" % (int(mac[-1], 16) + 2) return ":".join(mac) def hotspot(self, new=None): - """ Cette borne est-elle partagée avec l'ENS ? """ + u"""Cette borne est-elle partagée avec l'ENS ?""" if new == None: # Le schéma nous assure que ce champ existe toujours return self._data['hotspot'][0] == "TRUE" @@ -3159,7 +3159,7 @@ class BorneWifi(Machine): self._set('hotspot', ['FALSE']) def canal(self, new=None, raw=False): - """ Attribution ou visualisation du canal d'une borne wifi """ + u"""Attribution ou visualisation du canal d'une borne wifi""" if not new: canaux = self._data.get('canal', [''])[0] if raw: @@ -3219,7 +3219,7 @@ class BorneWifi(Machine): return new def puissance(self, new=None): - """ Attribution ou visualisation de la puissance d'une borne wifi """ + u"""Attribution ou visualisation de la puissance d'une borne wifi""" if not new: return self._data.get('puissance', [''])[0] @@ -3233,7 +3233,7 @@ class BorneWifi(Machine): return new def position(self, new=False): - """ + u""" Attribution ou visualisation de la position d'une borne wifi. Renvoie un couple de coordonnées (en strings) si elles existent, None sinon. new doit être un couple de coordonnées (en strings), @@ -3257,7 +3257,7 @@ class BorneWifi(Machine): return new def nvram(self, champ=None, new=False): - """ + u""" Définit et renvoie un champ nvram d'une borne wifi. Si champ=None, renvoie sous forme de liste key=value tous les champs. On peut aussi définir tous les champs en @@ -3304,13 +3304,13 @@ class BorneWifi(Machine): return new class Facture(BaseClasseCrans): - """ Classe de définition d'une facture """ + u""" Classe de définition d'une facture """ objectClass = 'facture' idn = 'fid' filtre_idn = '(objectClass=facture)' def __init__(self, parent_or_tuple, mode='', conn=None): - """ + u""" parent_or_tuple est : * soit une instance d'une classe pouvant posséder une facture (Adherent, Club), la nouvelle facture lui sera alors associée. @@ -3362,20 +3362,20 @@ class Facture(BaseClasseCrans): raise TypeError(u'Arguments invalides') def numero(self): - """ Retourne le numéro de facture """ + u""" Retourne le numéro de facture """ fid = self._data.get('fid', [None])[0] if fid == None: raise NotImplementedError, u'Il faut enregistrer une facture pour connaitre son numero' return fid def nom(self): - """ Utilisé pour la fonction delete() """ + u""" Utilisé pour la fonction delete() """ return "Facture%s" % self.numero() Nom = nom def proprietaire(self): - """ + u""" retroune le propriétaire de la facture (classe Adherent ou Club) """ # si la facture est en mode w mais pas le proprio, on tente de prendre @@ -3396,7 +3396,7 @@ class Facture(BaseClasseCrans): return self.__proprietaire def modePaiement(self, new=None): - """ + u""" Définit ou retourne le mode de paiement. Le mode de paiement doit être une chaine de caractère """ @@ -3417,7 +3417,7 @@ class Facture(BaseClasseCrans): return decode(self._data.get('modePaiement', [None])[0]) def recuPaiement(self, new=None): - """ + u""" Définit ou retourne qui a recu le paiement """ @@ -3445,12 +3445,12 @@ class Facture(BaseClasseCrans): return self._data.get("recuPaiement", [None])[0] def _del_recu_paiement(self): - """ Pour test """ + u""" Pour test """ self._set("recuPaiement", []) def _crediter(self): - """ - Credite les articles à son propriétaire + u""" + Crédite les articles à son propriétaire """ # si la facture n'existe pas encore, on la sauve pour générer un numéro @@ -3470,7 +3470,7 @@ class Facture(BaseClasseCrans): proprio.save() def _frais(self): - """ + u""" Retourne une liste d'articles correspondants aux divers frais """ @@ -3498,7 +3498,7 @@ class Facture(BaseClasseCrans): return arts def _articles(self, arts = None): - """ Retourne ou modifie la liste des articles de la base """ + u"""Retourne ou modifie la liste des articles de la base""" # modifie la liste des articles if arts != None: @@ -3520,7 +3520,7 @@ class Facture(BaseClasseCrans): return arts def ajoute(self, ajoute): - """ Ajoute un/des article(s) à la facture + u"""Ajoute un/des article(s) à la facture ajoute est un article ou une liste d'articles """ # on ne eut pas modifier une facture payée @@ -3548,7 +3548,7 @@ class Facture(BaseClasseCrans): self._articles(arts) def supprime(self, supprime): - """ Supprime un/des article(s) à la facture + u"""Supprime un/des article(s) à la facture arts est un article ou une liste d'articles """ # on ne eut pas modifier une facture payée @@ -3569,7 +3569,7 @@ class Facture(BaseClasseCrans): self._articles(arts) def articles(self): - """ + u""" Retourne la liste des articles. Un article est un dictionnaire de la forme : { 'code' : string, @@ -3580,7 +3580,7 @@ class Facture(BaseClasseCrans): return self._articles() + self._frais() def total(self): - """ + u""" Calcule le total de la facture, frais compris """ s = 0 @@ -3590,7 +3590,7 @@ class Facture(BaseClasseCrans): def urlPaypal(self, useSandbox = False, businessMail = "paypal@crans.org", return_page=None, cancel_return_page=None): - """ + u""" Retourne l'url paypal pour le paiement de cette facture """ if useSandbox: @@ -3618,7 +3618,7 @@ class Facture(BaseClasseCrans): return url def save(self): - """ + u""" Enregistre la facture dans la base LDAP Retourne une chaîne indiquant les opération effectuées. """ @@ -3630,12 +3630,12 @@ class Facture(BaseClasseCrans): return coul(u"Facture n°%s enregistrée avec succès." % self.numero(), 'vert') def delete(self, comment=''): - """ Suppression de la facture """ + u"""Suppression de la facture""" self.__proprietaire = None self._delete(self.dn, comment) class _FakeProprio(CransLdap): - """ Définitions de base d'un propriétaire virtuel """ + u"""Définitions de base d'un propriétaire virtuel""" idn = '' def __init__(self, conn=None): self.conn = conn @@ -3662,7 +3662,7 @@ class _FakeProprio(CransLdap): return m class AssociationCrans(_FakeProprio): - """ Classe définissant l'assoce (pour affichage de ses machines) """ + u""" Classe définissant l'assoce (pour affichage de ses machines) """ def __init__(self, conn=None): _FakeProprio.__init__(self, conn) def Nom(self): @@ -3675,7 +3675,7 @@ class AssociationCrans(_FakeProprio): db = None def crans_ldap(readonly=False): - """ Renvoie un objet CransLdap """ + u""" Renvoie un objet CransLdap """ global db if readonly: return CransLdap(readonly) @@ -3687,7 +3687,7 @@ def crans_ldap(readonly=False): if __name__ == '__main__': import sys - usage = """Usage %s [ACTION] + usage = u"""Usage %s [ACTION] --lock : donne la liste des locks actifs --purgelock : supprime tous les locks de la base LDAP --menage : supprime les machines des anciens adhérents""" % sys.argv[0] @@ -3697,20 +3697,20 @@ if __name__ == '__main__': sys.exit(1) elif '--lock' in sys.argv: - print "Liste des locks" + print u"Liste des locks" for lock in crans_ldap().list_locks(): print "%s\t %s" % (lock[1]["lockid"][0], lock[0].split(',')[0]) elif '--purgelock' in sys.argv: - print "Suppression de tous les locks" + print u"Suppression de tous les locks" crans_ldap().remove_lock('*') elif '--menage' in sys.argv: - print "Ménage des machines des adhérents partis..." + print u"Ménage des machines des adhérents partis..." machines = crans_ldap().search('paiement!=%s&host=*.crans.org' % ann_scol , 'w')['machine'] - print "Destruction de %i machines" % len(machines) + print u"Destruction de %i machines" % len(machines) for m in machines: - print 'Destruction de %s' % m.nom() + print u'Destruction de %s' % m.nom() m.delete('Ménage') else: