From 962d9df0f3bd8c9b4d82acf0582e35884897bfcd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre-Elliott=20B=C3=A9cue?= Date: Wed, 18 Feb 2015 19:58:33 +0100 Subject: [PATCH] Prise en charge de l'attribut mailExterieur comme redirection. --- gestion/affichage.py | 4 +- gestion/gen_confs/adherents.py | 15 ++++-- gestion/gest_crans.py | 84 ++++++++++++++++++++++++++-------- gestion/ldap_crans.py | 46 +++++++------------ gestion/whos.py | 5 ++ 5 files changed, 100 insertions(+), 54 deletions(-) diff --git a/gestion/affichage.py b/gestion/affichage.py index f05160a1..2cdfa33c 100755 --- a/gestion/affichage.py +++ b/gestion/affichage.py @@ -56,7 +56,9 @@ def try_decode(string): avoir en réception. """ - unicode_str = "" + if isinstance(string, unicode): + return string + try: return string.decode("UTF-8") except UnicodeDecodeError: diff --git a/gestion/gen_confs/adherents.py b/gestion/gen_confs/adherents.py index a7f0da7c..0f63758d 100644 --- a/gestion/gen_confs/adherents.py +++ b/gestion/gen_confs/adherents.py @@ -25,6 +25,7 @@ except: # Machine sans mailman, les ML ne seront pas reconfigurées pass +CONN = crans_ldap() class del_user: """ Suppression des fichiers d'un compte utilisateur """ @@ -114,11 +115,15 @@ class home: for args in self.args: anim('\t' + args) try: - try: - home, uid, login, mail_redirect = args.split(',') - except ValueError: - home, uid, login = args.split(',') - mail_redirect = None + login, oldLogin, oldHome = args.split(",") + if login: + adh = CONN.search("uid=%s" % (uid,))['adherent'][0] + home = adh.home() + uid = adh.uidNumber() + mail_redirect = adh.email_exterieur() + if oldHome and hostname == "zbee": + home_service = del_user([oldLogin, oldHome]) + home_service.delete_zbee() homesplit = home.split("/") symlink = "/home-adh/%s" % (homesplit[-1],) ### Home diff --git a/gestion/gest_crans.py b/gestion/gest_crans.py index 977e0120..5fc476ff 100755 --- a/gestion/gest_crans.py +++ b/gestion/gest_crans.py @@ -392,11 +392,11 @@ def set_etudes(adher): dialog(arg) return set_etudes(adher) -def set_mail(adher): +def set_contact(adher): u""" Choix d'une adresse mail crans ou extérieure. Retourne ensuite le résultat de : - * set_mail_ext si adresse ext + * set_mail si adresse ext * set_compte si compte crans """ if u'Nounou' in adher.droits() and not isadm: @@ -406,7 +406,7 @@ def set_mail(adher): return if not isinstance(adher, Club) and not adher.adherentPayant(): - set_mail_ext(adher) + set_mail(adher) return while 1: @@ -426,31 +426,72 @@ def set_mail(adher): elif result[0].split()[1] == u'un': if not set_compte(adher): break else: - if not set_mail_ext(adher): break + if not set_mail(adher): break -def set_mail_ext(adher): - u""" - Demande l'adresse mail extérieure d'un adhérent +def set_mail(adher): + """Demande l'adresse mail extérieure d'un adhérent """ default = adher.mail() if default.endswith('@crans.org'): # C'était une adresse crans default = '' - arg = u'--title "Adresse mail extérieure pour %s" ' % adher.Nom() + arg = u'--title "Adresse mail pour %s" ' % adher.Nom() arg += u'--inputbox "Adresse : " 0 0 "%s"' % default annul, result = dialog(arg) if annul: return 1 try: adher.mail(result[0]) except ValueError, c: + arg = u'--title "Adresse mail de %s" ' % adher.Nom() + arg += u'--msgbox "%s\n\n\n" 0 0' % to_unicode(c.args[0]) + dialog(arg) + return set_mail(adher) + +def set_mail_ext(adher): + """Récupère une éventuelle adresse de redirection en cas de choix de compte + Crans. Permet en règle générale d'ajouter un mail extérieur au moins pour + les récupérations de mot de passe ou autre. + + """ + if not adher.compte(): + return 0 + + if u'Nounou' in adher.droits() and not isadm: + arg = u'--title "Adresse mail extérieure de %s" ' % adher.Nom() + arg += u'--msgbox "Vous n\'avez pas les droits necessaires pour effectuer cette opération.\n\n\n" 0 0' + dialog(arg) + return + + no = False + + if 'compte' in adher.modifs: + arg = u'--title "Redirection des mails de %s" ' % (adher.Nom(),) + arg += u'--colors --yesno ' + arg += u'"L\'adhérent souhaite-t-il mettre en place une redirection de ses emails vers une autre boîte ?\n' + arg += u'Cette redirection lui permettra aussi de récupérer son mot de passe Crans en cas de perte de celui-ci." ' + arg += u'0 0' + no, _ = dialog(arg) + + if no: + return 0 + + arg = u'--title "Adresse mail extérieure pour %s" ' % adher.Nom() + arg += u'--inputbox "Adresse : " 0 0 "%s"' % default + annul, result = dialog(arg) + if annul: + return 1 + + try: + adher.email_exterieur(result[0]) + except ValueError as c: arg = u'--title "Adresse mail extérieure de %s" ' % adher.Nom() arg += u'--msgbox "%s\n\n\n" 0 0' % to_unicode(c.args[0]) dialog(arg) return set_mail_ext(adher) def set_etat_civil(adher): - u""" + """ Modifie l'état-civil (nom, prénom) d'un adhérent. """ if u'Nounou' in adher.droits() and not isadm: @@ -502,7 +543,7 @@ def set_etat_civil(adher): # L'utilisateur n'utilise pas son compte, on le supprime... adher.supprimer_compte() # ..et on le recrée (ou on met une adresse mail extérieure) - if set_mail(adher): + if set_contact(adher): # Le changement d'adresse a été annulé, on recommence tout adher.restore() return set_etat_civil(adher) @@ -2027,7 +2068,7 @@ def new_adher(adher): * set_bases * set_etudes * set_admin - * set_mail + * set_contact * set_rque Retourne 1 si annulation. """ @@ -2035,12 +2076,15 @@ def new_adher(adher): while True: if set_bases(adher): return 1 - steps = [set_etudes, - set_adhesion, - set_connexion, - set_admin, - set_mail, - set_rque] + steps = [ + set_etudes, + set_adhesion, + set_connexion, + set_admin, + set_contact, + set_mail_ext, + set_rque, + ] step = 0 while step < len(steps): @@ -2084,6 +2128,8 @@ def modif_adher(adher): arg += u'"Telephone" "Changement de numéro de téléphone" ' if payant: arg += u'"Mail" "Créer un compte ou changer l\'adresse mail de contact" ' + if 'cransAccount' in adher._data['objectClass']: + arg += u'"MailExt" "Ajouter une adresse mail de contact extérieur." ' arg += u'"Alias" "Créer ou supprimer un alias mail" ' arg += u'"GPGFingerprint" "Ajouter ou supprimer une empreinte GPG" ' arg += u'"Remarque" "Ajouter ou modifer un commentaire" ' @@ -2111,7 +2157,9 @@ def modif_adher(adher): elif res[0] == 'Administratif': set_admin(adher) elif res[0] == 'Mail': - set_mail(adher) + set_contact(adher) + elif res[0] == 'MailExt': + set_mail_ext(adher) elif res[0] == 'Remarque': set_rque(adher) elif res[0] == 'Droits': diff --git a/gestion/ldap_crans.py b/gestion/ldap_crans.py index 68840c83..c31af4ec 100755 --- a/gestion/ldap_crans.py +++ b/gestion/ldap_crans.py @@ -2043,34 +2043,18 @@ class BaseProprietaire(BaseClasseCrans): # Faut-il créer un compte sur vert ? if 'compte' in self.modifs: - ret += u'\nUn compte a été créé :\n login : %s\n' % self.compte() - args = self._data['homeDirectory'][0] + ',' - args+= self._data['uidNumber'][0] + ',' - args+= self._data['uid'][0] - r = prompt(u"Attribuer tout de suite un mot de passe ? [O/N]", "O") - if r == 'O' or r == 'o': - change_password(login=self.compte()) - else: - ret += coul(u' Il faudra penser à attribuer un mot de passe\n', 'jaune') + compte = self._data.get('uid', [''])[0] + if compte: + ret += u'\nUn compte a été créé :\n login : %s\n' % self.compte() + r = prompt(u"Attribuer tout de suite un mot de passe ? [O/N]", "O") + if r == 'O' or r == 'o': + change_password(login=self.compte()) + else: + ret += coul(u' Il faudra penser à attribuer un mot de passe\n', 'jaune') + # Le deuxième argument est le potentiel chemin de l'ancien compte + # s'il a jamais existé, ça permet de supprimer le home associé. + args = "%s,%s" % (compte, self.modifs.get('compte', '')) - r = prompt(u"Redirection mail ? [O/N]") - mail1 = mail2 = None - if r.lower().startswith('o'): - while True: - mail1 = prompt(u"Adresse mail ? (ANNUL pour annuler la redirection)") - if mail1 == "ANNUL": - mail1 = None - break - try: - validate_mail(mail1) - except ValueError, e: - print coul(e.message.encode('utf-8'), 'rouge') - continue - mail2 = prompt(u"Adresse mail (répéter) ?") - if mail1 == mail2 and mail1: - break - if mail1: - args += ',' + mail1 self.services_to_restart('home', [ args ]) # Modif des droits ? @@ -2269,7 +2253,7 @@ class Adherent(BaseProprietaire): if new == None: email = self._data.get('mail', [''])[0] if not '@' in email: - return decode(email)+'@crans.org' + return decode(email) + '@crans.org' else: return decode(email) @@ -2451,6 +2435,8 @@ class Adherent(BaseProprietaire): raise ValueError(u"Le solde d'un adhérent doit être nul pour supprimer son compte crans.") self._data['objectClass'] = ['adherent'] + if not 'compte' in self.modifs: + self.modifs['compte'] = "%s,%s" % (self.compte(), self.home()) for c in [ 'uid', 'cn', 'shadowLastChange', 'shadowMax', 'shadowWarning', 'loginShell', 'userPassword', 'uidNumber', 'gidNumber', 'homeDirectory', 'gecos', @@ -2567,7 +2553,7 @@ class Adherent(BaseProprietaire): self._data['mail'] = ["%s@crans.org" % (login)] if not 'compte' in self.modifs: - self.modifs.setdefault('compte', None) + self.modifs.setdefault('compte', '') # Création de l'alias canonique if self.nom() and self.prenom(): @@ -2904,7 +2890,7 @@ class Club(BaseProprietaire): self.lock('mail', login) if not 'compte' in self.modifs: - self.modifs.setdefault('compte', None) + self.modifs.setdefault('compte', '') self._data['objectClass'] = ['club', 'cransAccount', 'posixAccount', 'shadowAccount'] self._data['uid'] = [ login ] diff --git a/gestion/whos.py b/gestion/whos.py index 136e6607..07ece5d4 100755 --- a/gestion/whos.py +++ b/gestion/whos.py @@ -547,6 +547,11 @@ def adher_details(adher) : f += GL f += RMH f += u'\n' + if adher.email_exterieur(): + f += coul(u'Mail extérieur : ', 'gras') + f += adher.email_exterieur() + f += u'\n' + # Réservé aux comptes Crans. if len(adher.gpgFingerprint()) > 0: f += u"\n".join([coul(u'Fingerprint GPG : ', 'gras') + u"%s" % (i) for i in adher.gpgFingerprint()])+"\n" try: