Prise en charge de l'attribut mailExterieur comme redirection.

This commit is contained in:
Pierre-Elliott Bécue 2015-02-18 19:58:33 +01:00
parent 60d7087c60
commit 962d9df0f3
5 changed files with 100 additions and 54 deletions

View file

@ -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:

View file

@ -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

View file

@ -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,
steps = [
set_etudes,
set_adhesion,
set_connexion,
set_admin,
set_mail,
set_rque]
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':

View file

@ -2043,34 +2043,18 @@ class BaseProprietaire(BaseClasseCrans):
# Faut-il créer un compte sur vert ?
if 'compte' in self.modifs:
compte = self._data.get('uid', [''])[0]
if compte:
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')
# 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 ]

View file

@ -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: