Commit 804d16bf authored by Gabriel Detraz's avatar Gabriel Detraz
Browse files

Meilleure gestion de la prédiction du login crans

parent 83bc2401
......@@ -15,6 +15,7 @@ import sys
import copy
import ldap
import time
import unicodedata
if '/usr/scripts' not in sys.path:
sys.path.append('/usr/scripts')
......@@ -38,7 +39,7 @@ class Dialog(machine.Dialog, blacklist.Dialog):
"""Juste un raccourci vers edit_attributs spécifique aux proprios"""
return self.edit_attributs(obj=proprio, update_obj='proprio', attr=attr, title="Modification de %s %s" % (proprio.get('prenom', [''])[0], proprio['nom'][0]), cont=cont)
@tailcaller
def proprio_compte_create(self, proprio, cont, warning=True, guess_login=True, guess_pass=0, return_obj=False, update_obj='proprio'):
def proprio_compte_create(self, proprio, cont, warning=True, return_obj=False, update_obj='proprio'):
"""Permet de créer un compte crans à un proprio (club ou adhérent)"""
def box_warning(warning, proprio, cont):
# Affiche-t-on le warning sur la consutation de l'adresse crans
......@@ -51,38 +52,39 @@ class Dialog(machine.Dialog, blacklist.Dialog):
colors=True, timeout=self.timeout) != self.dialog.DIALOG_OK:
raise Continue(cont)
def get_login(guess_login, guess_pass, proprio, self_cont, cont):
# Essaye-t-on de deviner le login à utiliser
if not guess_login:
(code, login) = self.dialog.inputbox(
def get_login(proprio, self_cont, cont):
# Essaye-t-on de forcer le login à utiliser
nom = unicode(unicodedata.normalize('NFKD', unicode(proprio['nom'][0])).encode('ascii', 'ignore')).lower().replace(' ', '-')
login_crans=nom
if proprio.get('prenom', [False])[0]:
prenom = unicode(unicodedata.normalize('NFKD', unicode(proprio['prenom'][0])).encode('ascii', 'ignore')).lower().replace(' ', '-')
baselogin = nom
for rang,let in enumerate(prenom):
if self.conn.search(u'uid=%s' % login_crans) == []:
break
else:
login_crans = prenom[:rang] + baselogin
(code, login) = self.dialog.inputbox(
text="Le login doit faire au maximum %s caractères\nIl ne doit pas être un pseudo ou prénom mais doit être relié au nom de famille\nSeuls les caractères alphabétiques et le trait d'union sont autorisés" % config.maxlen_login,
title="Choix du login pour %s %s" % (proprio.get('prenom', [''])[0], proprio["nom"][0]),
init=str(proprio['nom'][0]).lower(),
init=login_crans,
width=60,
height=10, timeout=self.timeout)
if code != self.dialog.DIALOG_OK:
raise Continue(cont)
else:
# Si oui, de quelle manière
if guess_pass == 0:
login = str(proprio['nom'][0])
elif guess_pass == 1 and proprio.get('prenom', [''])[0]:
login = "%s%s" % (str(proprio['prenom'][0])[0], proprio['nom'][0])
# Si toutes les manières ont échoués, la prochaine fois, ça on n'essaye pas de deviner
else:
raise Continue(self_cont(warning=False, guess_login=False, guess_pass=2))
if code != self.dialog.DIALOG_OK:
raise Continue(cont)
return login
def create_compte(proprio, login, guess_login, self_cont, cont):
def create_compte(proprio, login, self_cont, cont, return_obj=False):
try:
proprio.compte(login=unicode(login, 'utf-8'))
except ValueError:
# Il y a eu une erreur, si on essaye de deviner, on essaye la manière suivante
if guess_login:
raise Continue(self_cont(warning=False, guess_login=True, guess_pass=guess_pass+1))
# Sinon on propage l'erreur pour l'afficher à l'utilisateur
else:
raise
self.dialog.msgbox(
text=u'Ce login est déjà utilisé',
title="Création du compte de %s %s" % (proprio.get('prenom', [''])[0], proprio["nom"][0]),
width=75,
height=12, timeout=self.timeout,
)
raise Continue(self_cont(return_obj=return_obj))
if isinstance(proprio, objets.adherent):
titre = "Le compte ne sera créé que lors de l'enregistrement des données\n\nL'adresse mail de l'adhérent est : %s\nL'adhérent possède également l'alias : \n%s\n" % (proprio['mail'][0], proprio['canonicalAlias'][0])
......@@ -112,15 +114,15 @@ class Dialog(machine.Dialog, blacklist.Dialog):
else:
raise Continue(cont(**{update_obj:proprio}))
def todo(proprio, warning, guess_login, guess_pass, return_obj, self_cont, cont):
def todo(proprio, warning, return_obj, self_cont, cont):
box_warning(warning, proprio, cont)
login = get_login(guess_login, guess_pass, proprio, self_cont, cont)
login = get_login(proprio, self_cont, cont)
if return_obj:
proprio = create_compte(proprio, login, guess_login, self_cont, cont)
proprio = create_compte(proprio, login, self_cont, cont, return_obj)
return set_password(proprio, update_obj, cont)
else:
with self.conn.search(dn=proprio.dn, scope=0, mode='rw')[0] as proprio:
proprio = create_compte(proprio, login, guess_login, self_cont, cont)
proprio = create_compte(proprio, login, self_cont, cont)
if not self.confirm_item(item=proprio, title="Création du compte crans pour l'adhérent ?"):
raise Continue(cont)
else:
......@@ -134,13 +136,13 @@ class Dialog(machine.Dialog, blacklist.Dialog):
)
return set_password(proprio, update_obj, cont)
self_cont = TailCall(self.proprio_compte_create, proprio=proprio, cont=cont, warning=warning, guess_login=guess_login, guess_pass=guess_pass)
self_cont = TailCall(self.proprio_compte_create, proprio=proprio, cont=cont, warning=warning)
return self.handle_dialog_result(
code=self.dialog.DIALOG_OK,
output="",
cancel_cont=cont,
error_cont=self_cont,
codes_todo=[([self.dialog.DIALOG_OK], todo, [proprio, warning, guess_login, guess_pass, return_obj, self_cont, cont])]
codes_todo=[([self.dialog.DIALOG_OK], todo, [proprio, warning, return_obj, self_cont, cont])]
)
@tailcaller
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment