diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index b63a8101..c5b0ab52 100644 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -13,12 +13,13 @@ from socket import gethostname import smtplib, re, os, random, string, time, sys, pwd import ldap, ldap.modlist, ldap_passwd -import config, annuaires, iptools, chgpass, cPickle, config_mail +import config, annuaires, iptools, cPickle, config_mail from chgpass import chgpass from affich_tools import coul, prompt, cprint from email_tools import send_email -from syslog import * +from syslog import openlog, closelog, syslog from numeros_disponibles import lister_ip_dispo +from unicodedata import normalize date_format = '%d/%m/%Y %H:%M' hostname = gethostname().split(".")[0] @@ -113,17 +114,10 @@ def decode(s): else: return s.decode('utf-8', 'ignore') # On ignore les erreurs -accents = "êëèéÉÈÀÙâäàûüôöÖÔîïÎÏ'çÇÿßæÆøØ" # Si modif ici modifier aussi la fonction def strip_accents(a): """ Supression des accents de la chaîne fournie """ - a = a.replace(u'ê','e').replace(u'ë','e').replace(u'è','e').replace(u'é','e').replace(u'É','e').replace(u'È','e') - a = a.replace(u'â','a').replace(u'ä','a').replace(u'à','a').replace(u'À','a') - a = a.replace(u'û','u').replace(u'ü','u').replace(u'ù','u').replace(u'Ù','u') - a = a.replace(u'ô','o').replace(u'ö','o').replace(u'Ö','o').replace(u'Ô','o') - a = a.replace(u'î','i').replace(u'ï','i').replace(u'Ï','i').replace(u'Î','i') - a = a.replace(' ','_').replace(u"'",'').replace(u'ç','c').replace(u'Ç','c') - a = a.replace(u'ÿ','y').replace(u'ß','ss').replace(u'æ','ae').replace(u'Æ','ae').replace(u'ø','o').replace(u'Ø','o') - return a + res = normalize('NFKD', decode(a)).encode('ASCII', 'ignore') + return res.replace(' ', '_').replace("'", '') def mailexist(mail): """ @@ -148,7 +142,7 @@ def preattr(val): val est : * un entier * une chaîne - * une liste avec un seul entier ou une seule cha-Aîne-b + * une liste avec un seul entier ou une seule chaîne Retourne [ len(str(val).strip), str(val).strip en utf-8 ] """ @@ -507,7 +501,8 @@ class CransLdap: if time.time() < int(date): keep_date.append(date) if keep_date: - self.conn.modify_s(remove_dn, ldap.modlist.modifyModlist({'start': serv_dates[new[1:]]}, { 'start': keep_date })) + mods = [{'start': serv_dates[new[1:]]}, { 'start': keep_date }] + self.conn.modify_s(remove_dn, ldap.modlist.modifyModlist(*mods)) remove_dn = None if remove_dn: @@ -646,7 +641,7 @@ class CransLdap: # considéré non ok s'il n'a pas fourni sa carte d'etudiant # alors que l'on est desormais en periode de bloquage # définifif (cf config.py). - if time.localtime()[1] in (8,9): + if time.localtime()[1] in (8, 9): # Pour septembre paiement année précédente ok el = "(|(paiement=%d)(paiement=%d))" % (ann_scol, ann_scol-1) else: @@ -820,7 +815,7 @@ class CransLdap: Renvoie un proprietaire ou un adherent correspondant au login/ mot de passe (mot de passe facultatif) """ - recherche = self.search(("uid=%s" % uid),mode) + recherche = self.search(("uid=%s" % uid), mode) proprio = None if len(recherche['club']) > 0: @@ -1231,11 +1226,15 @@ class BaseClasseCrans(CransLdap): # Sauvegarde t = str(self.__class__).split('.')[-1] - fd = open('%s/%s/%s_%s' % (config.cimetiere, t, time.strftime('%Y-%m-%d-%H:%M'), self.nom()), 'wb') + fd = open('%s/%s/%s_%s' % (config.cimetiere, t, + time.strftime('%Y-%m-%d-%H:%M'), + self.nom()), 'wb') self.conn = None # Fermeture des connexions à la base sinon cPickle ne marchera pas cPickle.dump(self, fd, 2) fd.close() - index = u"%s, %s : %s %s # %s\n" % (time.strftime(date_format), script_utilisateur, t, self.Nom() , decode(comment)) + index = u"%s, %s : %s %s # %s\n" % (time.strftime(date_format), + script_utilisateur, t, + self.Nom(), decode(comment)) self.connect() # Reconnexion à la base # Destruction @@ -1808,11 +1807,11 @@ class Adherent(BaseProprietaire): new = new.capitalize() for c in new[:]: if c not in (string.letters + '- ' + preattr(accents)[1] ): - raise ValueError(u"Seuls les caractères alphabétiques, l'espace et le - sont permis dans %s." % champ.replace(u'e', u'é') ) + raise ValueError(u"Seuls les caractères alphabétiques, l'espace et le - sont permis dans %s." % champ) if l<2: - raise ValueError(u"%s trop court." % champ.capitalize().replace(u'e', u'é')) + raise ValueError(u"%s trop court." % champ) if new[0] not in string.letters: - raise ValueError(u"Le premier caractère du %s doit être une lettre" % champ.replace(u'e', u'é') ) + raise ValueError(u"Le premier caractère du %s doit être une lettre" % champ) self._set(champ, [new]) if self._data.has_key('gecos'): @@ -2249,7 +2248,7 @@ class Adherent(BaseProprietaire): raise ValueError(u'Droit %s incorrect' % droit) new.append(droit.encode('utf-8')) - ancien = self._data.get('droits',[]) + ancien = self._data.get('droits', []) for droit in new: if droit not in ancien: db.services_to_restart("mail_ajout_droits", self.compte().encode('latin-1') + ":" + droit) @@ -2278,7 +2277,7 @@ class Adherent(BaseProprietaire): raise ValueError(u'Droit %s incorrect' % droit) new.append(droit.encode('utf-8')) - ancien = self._data.get('droits',[]) + ancien = self._data.get('droits', []) for droit in new: if droit not in ancien: db.services_to_restart("mail_ajout_droits", self.compte().encode('latin-1') + ":" + droit) @@ -2637,7 +2636,10 @@ class Machine(BaseClasseCrans): raise RuntimeError(u"Fichier de fabriquants de MAC non trouvé !") if not multi_ok and not vendor: - raise ValueError(u"Le constructeur correspondant à cette adresse MAC ne peut être trouvé.\nL'adresse MAC correspond peut-être à un pont réseau, désactivez ce pont réseau.\nContactez nounou si la MAC est bien celle d'une carte.", 3) + raise ValueError( + u"""Le constructeur correspondant à cette adresse MAC ne peut être trouvé. +L'adresse MAC correspond peut-être à un pont réseau, désactivez ce pont réseau. +Contactez nounou si la MAC est bien celle d'une carte.""", 3) # Lock de la mac self.lock('macAddress', mac) @@ -3336,7 +3338,7 @@ class Facture(BaseClasseCrans): def numero(self): """ Retourne le numéro de facture """ - fid = self._data.get('fid',[None])[0] + fid = self._data.get('fid', [None])[0] if fid == None: raise NotImplementedError, u'Il faut enregistrer une facture pour connaitre son numero' return fid @@ -3382,7 +3384,7 @@ class Facture(BaseClasseCrans): if not self._modifiable: raise NotImplementedError, "La facture n'est pas modifiable" - if new not in ['liquide','cheque','paypal']: + if new not in ['liquide', 'cheque', 'paypal']: raise ValueError, u'Mode de paiement non accepté' self._set('modePaiement', [new]) @@ -3412,14 +3414,14 @@ class Facture(BaseClasseCrans): self.ajoute(self._frais()) # modifie la base ldap - self._set("recuPaiement",[new]) + self._set("recuPaiement", [new]) # renvoie la valeur trouvée dans la base - return self._data.get("recuPaiement",[None])[0] + return self._data.get("recuPaiement", [None])[0] def _del_recu_paiement(self): """ Pour test """ - self._set("recuPaiement",[]) + self._set("recuPaiement", []) def _crediter(self): """ @@ -3439,7 +3441,7 @@ class Facture(BaseClasseCrans): # solde impression if art["code"] == "SOLDE": proprio = self.proprietaire() - proprio.solde(operation=art['nombre']*art["pu"], comment="Facture n°%s : %s" % (self.numero(),art['designation'])) + proprio.solde(operation=art['nombre']*art["pu"], comment="Facture n°%s : %s" % (self.numero(), art['designation'])) proprio.save() def _frais(self): @@ -3466,7 +3468,7 @@ class Facture(BaseClasseCrans): s = float(int(s*100)/100.0) # ajoute à la liste d'articles de frais - arts.append( {'code':'FRAIS','designation':'Frais de tansaction PayPal','nombre':1,'pu':round(s,2)} ) + arts.append( {'code':'FRAIS', 'designation':'Frais de tansaction PayPal', 'nombre':1, 'pu':round(s, 2)} ) return arts @@ -3475,11 +3477,14 @@ class Facture(BaseClasseCrans): # modifie la liste des articles if arts != None: - self._set('article',['%s~~%s~~%s~~%s' % (art['code'],art['designation'],str(art['nombre']),str(art['pu'])) for art in arts]) + self._set('article', + ['%s~~%s~~%s~~%s' % (art['code'], art['designation'], + str(art['nombre']), str(art['pu'])) + for art in arts]) # charge la liste des articles arts = [] - for art in self._data.get("article",[]): + for art in self._data.get("article", []): art = art.split('~~') art = { 'code' : art[0], 'designation' : art[1], @@ -3558,7 +3563,8 @@ class Facture(BaseClasseCrans): s += art['nombre'] * art['pu'] return s - def urlPaypal(self, useSandbox = False, businessMail = "paypal@crans.org", return_page=None, cancel_return_page=None): + def urlPaypal(self, useSandbox = False, businessMail = "paypal@crans.org", + return_page=None, cancel_return_page=None): """ Retourne l'url paypal pour le paiement de cette facture """ @@ -3659,7 +3665,7 @@ if __name__ == '__main__': usage = """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] + --menage : supprime les machines des anciens adhérents""" % sys.argv[0] if len(sys.argv) != 2: print usage