New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Refactorise la fonction "login_view()" et rend les messages d'erreurs plus précis #4822
Conversation
J'ai relu rapidement depuis mon téléphone et j'ai l'impression qu'il manque les tests qui vont bien pour les différents cas. Note: ce n'est pas la faute de cette PR en particulier, mais ne faudrait-il pas gérer ces erreurs dans la validation du formulaire plutôt que dans la vue ? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍
zds/member/views.py
Outdated
messages.error(request, _('Mot de passe incorrect.')) | ||
else: | ||
messages.error(request, _('Nom d\'utilisateur inconnu.')) | ||
else: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ça serait mieux avec un return
ici pour éviter d’indenter tout le else
: https://softwareengineering.stackexchange.com/a/18459
zds/member/views.py
Outdated
if User.objects.filter(username=username).exists(): | ||
messages.error(request, _('Mot de passe incorrect.')) | ||
else: | ||
messages.error(request, _('Nom d\'utilisateur inconnu.')) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ça serait mieux avec une apostrophe : _('Nom d’utilisateur inconnu.')
Merci pour cette PR ! Je pense que ce serait bien d'utiliser des phrases un peu moins "brutales". Je pense à quelque chose comme :
|
ee77703
to
ccbc458
Compare
zds/member/views.py
Outdated
@@ -913,48 +913,85 @@ def login_view(request): | |||
next_page = request.GET['next'] | |||
else: | |||
next_page = None | |||
|
|||
if request.method == 'POST': | |||
form = LoginForm(request.POST) | |||
username = request.POST['username'] | |||
password = request.POST['password'] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pour éviter les erreurs 500, remplace ces deux lignes par quelque chose comme :
- username = request.POST['username']
- password = request.POST['password']
+ username = request.POST.get('username', '')
+ password = request.POST.get('password', '')
Toutefois, je pense que le plus propre est d'utiliser une vraie validation de formulaire pour éviter ces problèmes (avec form.is_valid
), qui vérifiera que le contenu des champs est normal (pas que les identifiants sont corrects). Le tutoriel Django fait les choses assez bien, même s'il faut ensuite l'adapter à notre code.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
+1 pour l'utilisation de form.is_valid() et form.cleaned_data['username']
J'ai essayé de réécrire la fonction en utilisant Est-ce que l'un d'entre-vous aurait une idée de ce qui peut causer ça ? |
Est ce que tu es sur que ton formulaire contient des données, cf. ce cas particulier ? |
@Anto59290 : Bonne idée, ça semble correspondre. Pourtant, quand je fais Même quand je fais |
ccbc458
to
74e27f8
Compare
@rezemika : Si tu inspecte le contenu de form tu verra qu'il est bien vide pas de données : In [10]: form.__dict__
Out[10]:
{'_bound_fields_cache': {},
'_errors': {},
'auto_id': 'id_%s',
'data': {},
'empty_permitted': False,
'error_class': django.forms.utils.ErrorList,
'fields': OrderedDict([('username',
<django.forms.fields.CharField at 0x7f16326f4160>),
('password', <django.forms.fields.CharField at 0x7f16325f75c0>),
('remember',
<django.forms.fields.BooleanField at 0x7f16325f7668>)]),
'files': {},
'helper': <crispy_forms.helper.FormHelper at 0x7f16325f7898>,
'initial': {},
'is_bound': False,
'label_suffix': '\xa0:'} Pour l'initialiser je dirais qu'il faut faire |
@Anto59290 : tu as raison, il suffisait d'un (C'est quand même bizarre, ça n'apparait même pas sur la page de doc de Django...) J'en ai aussi profité pour ajouter un lien vers la page d'inscription dans le message "[...] vous pouvez vous inscrire.". ;) |
74e27f8
to
58d00c9
Compare
Je ne suis pas 100% sur, mais je pense que c'est à cause de la signature de cette méthode. Je me demande si ton request.POST n'était pas assigné au paramètre next. En nommant le paramètre on contourne le problème. |
Ah, bien vu ! Je pense que tu as raison. Du coup, on pourrait peut-être faire quelque chose comme ça, vu que le paramètre def __init__(self, *args, **kwargs):
kwargs.pop('next', None)
super(LoginForm, self).__init__(*args, **kwargs)
# etc |
Je ne voit pas de bonne raison de garder le paramètre next, je ne voit pas trop son utilité. Il me semble que ça a été introduit ici. |
zds/member/views.py
Outdated
response = redirect(next_page) | ||
set_old_smileys_cookie(response, profile) | ||
return response | ||
except: |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Alors quitte a refactorer du code dans le coin je propose de revoir aussi ce bout de code. Pour moi les problèmes sont les suivants:
- except générique
- duplication de code entre le try/except
- trop de ligne dans le try, on ne sait pas quelle ligne va lever une exception.
Je propose quelque chose du genre:
try:
response = redirect(next_page)
except: # Ajouter l'exception en question
response = redirect(reverse('homepage'))
set_old_smileys_cookie(response, profile)
return response
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Bien vu ! C'est fait. :)
… plus précis Ce commit change la manière dont la fonction gère les erreurs pour la rendre un peu plus lisible. Il rend aussi les messages d'erreur plus précis. Avant, quand les identifiants fournis étaient invalides, seul "Les identifiants fournis ne sont pas valides." était indiqué. Désormais, le message est soit "Ce nom d’utilisateur est inconnu. Si vous ne possédez pas de compte, vous pouvez vous inscrire.", soit "Le mot de passe saisi est incorrect. Cliquez sur le lien « Mot de passe oublié ? » si vous ne vous en souvenez plus.". Cela évite aux utilisateurs distraits de s'acharner à écrire leur mot de passe quand leur pseudo comporte une erreur.
81d8ca1
to
67ef304
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ça me paraît bon, merci de ton travail !
\o/ Merci ! |
Cette modif' a été discutée sur le forum mais le topic semble au point mort. Je propose donc cette PR, à débattre pour savoir si on la garde ou pas. :)
Ce commit change la manière dont la fonction gère les erreurs pour la rendre un peu plus lisible.
Il rend aussi les messages d'erreur plus précis.
Avant, quand les identifiants fournis étaient invalides, seul "Les identifiants fournis ne sont pas valides." était indiqué. Désormais, le message est soit "Nom d’utilisateur inconnu.", soit "Mot de passe incorrect.".
Contrôle qualité