8
0
Fork 0
mirror of https://gitlab2.federez.net/re2o/re2o synced 2024-11-27 07:02:26 +00:00

Add optional fields to select password during user creation

This commit is contained in:
Jean-Romain Garnier 2020-04-16 16:58:20 +00:00 committed by Gabriel Detraz
parent f02740189a
commit 07acce2e90
3 changed files with 121 additions and 7 deletions

View file

@ -0,0 +1,24 @@
/** This makes an checkbox toggle the appeareance of the
* password and password confirmations fields.
*/
function toggle_show_password_chkbox() {
var password1 = document.getElementById('id_Adherent-password1');
var password2 = document.getElementById('id_Adherent-password2');
if (show_password_chkbox.checked) {
password1.parentElement.style.display = 'none';
password2.parentElement.style.display = 'none';
password1.required = false;
password2.required = false;
} else {
password1.parentElement.style.display = 'block';
password2.parentElement.style.display = 'block';
password1.required = true;
password2.required = true;
}
}
var show_password_chkbox = document.getElementById('id_Adherent-init_password_by_mail');
show_password_chkbox.onclick = toggle_show_password_chkbox;
toggle_show_password_chkbox();

View file

@ -380,7 +380,28 @@ class AdherentForm(FormRevMixin, FieldPermissionFormMixin, ModelForm):
class AdherentCreationForm(AdherentForm): class AdherentCreationForm(AdherentForm):
"""Formulaire de création d'un user. """Formulaire de création d'un user.
AdherentForm auquel on ajoute une checkbox afin d'éviter les AdherentForm auquel on ajoute une checkbox afin d'éviter les
doublons d'utilisateurs""" doublons d'utilisateurs et, optionnellement,
un champ mot de passe"""
# Champ pour choisir si un lien est envoyé par mail pour le mot de passe
init_password_by_mail = forms.BooleanField(required=False, initial=True)
init_password_by_mail.label = _("Send password reset link by email.")
# Champs pour initialiser le mot de passe
# Validators are handled manually since theses fields aren't always required
password1 = forms.CharField(
required=False,
label=_("Password"),
widget=forms.PasswordInput,
# validators=[MinLengthValidator(8)],
max_length=255,
)
password2 = forms.CharField(
required=False,
label=_("Password confirmation"),
widget=forms.PasswordInput,
# validators=[MinLengthValidator(8)],
max_length=255,
)
# Champ permettant d'éviter au maxium les doublons d'utilisateurs # Champ permettant d'éviter au maxium les doublons d'utilisateurs
former_user_check_info = _( former_user_check_info = _(
@ -422,6 +443,47 @@ class AdherentCreationForm(AdherentForm):
) )
) )
def clean_password1(self):
"""Ignore ce champs si la case init_password_by_mail est décochée"""
send_email = self.cleaned_data.get("init_password_by_mail")
if send_email:
return None
password1 = self.cleaned_data.get("password1")
if len(password1) < 8:
raise forms.ValidationError(_("Password must contain at least 8 characters."))
return password1
def clean_password2(self):
"""Verifie que password1 et 2 sont identiques (si nécessaire)"""
send_email = self.cleaned_data.get("init_password_by_mail")
if send_email:
return None
# Check that the two password entries match
password1 = self.cleaned_data.get("password1")
password2 = self.cleaned_data.get("password2")
if password1 and password2 and password1 != password2:
raise forms.ValidationError(_("The passwords don't match."))
return password2
def save(self, commit=True):
"""Set the user's password, if entered
Returns the user and a bool indicating whether
an email to init the password should be sent"""
# Save the provided password in hashed format
user = super(AdherentForm, self).save(commit=False)
send_email = self.cleaned_data.get("init_password_by_mail")
if not send_email:
user.set_password(self.cleaned_data["password1"])
user.should_send_password_reset_email = send_email
user.save()
return user
class AdherentEditForm(AdherentForm): class AdherentEditForm(AdherentForm):
"""Formulaire d'édition d'un user. """Formulaire d'édition d'un user.

View file

@ -119,15 +119,42 @@ def new_user(request):
user = AdherentCreationForm(request.POST or None, user=request.user) user = AdherentCreationForm(request.POST or None, user=request.user)
GTU_sum_up = GeneralOption.get_cached_value("GTU_sum_up") GTU_sum_up = GeneralOption.get_cached_value("GTU_sum_up")
GTU = GeneralOption.get_cached_value("GTU") GTU = GeneralOption.get_cached_value("GTU")
if user.is_valid(): if user.is_valid():
user = user.save() user = user.save()
user.reset_passwd_mail(request)
messages.success( # Use "is False" so that if None, the email is sent
request, if user.should_send_password_reset_email is False:
_("The user %s was created, an email to set the password was sent.") messages.success(
% user.pseudo, request,
) _("The user %s was created.")
% user.pseudo,
)
else:
user.reset_passwd_mail(request)
messages.success(
request,
_("The user %s was created, an email to set the password was sent.")
% user.pseudo,
)
return redirect(reverse("users:profil", kwargs={"userid": str(user.id)})) return redirect(reverse("users:profil", kwargs={"userid": str(user.id)}))
# Anonymous users are allowed to create new accounts
# but they should be treated differently
params = {
"userform": user,
"GTU_sum_up": GTU_sum_up,
"GTU": GTU,
"showCGU": True,
"action_name": _("Commit"),
}
if request.user.is_anonymous:
params["load_js_file"] = "/static/js/toggle_password_fields.js"
return form(params, "users/user.html", request)
"""
return form( return form(
{ {
"userform": user, "userform": user,
@ -139,6 +166,7 @@ def new_user(request):
"users/user.html", "users/user.html",
request, request,
) )
"""
@login_required @login_required