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

Merged
merged 25 commits into from Jan 13, 2018

Conversation

Projects
None yet
6 participants
@rezemika
Contributor

rezemika commented Dec 28, 2017

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é

  • Essayer de se connecter avec :
    • un pseudo et un MDP valides ;
    • un pseudo valide et un mauvais MDP ;
    • un pseudo inconnu.

@zestedesavoir zestedesavoir deleted a comment from coveralls Dec 29, 2017

@Anto59290

This comment has been minimized.

Show comment
Hide comment
@Anto59290

Anto59290 Dec 29, 2017

Contributor

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 ?

Contributor

Anto59290 commented Dec 29, 2017

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 ?

@motet-a motet-a added the C-Back label Dec 29, 2017

Show outdated Hide outdated zds/member/views.py Outdated
Show outdated Hide outdated zds/member/views.py Outdated

@motet-a motet-a changed the title from [Feedback] Refactorise la fonction "login_view()" et rend les messages d'erreurs plus précis to Refactorise la fonction "login_view()" et rend les messages d'erreurs plus précis Dec 30, 2017

@motet-a motet-a added the Feedback label Dec 30, 2017

@gcodeur

This comment has been minimized.

Show comment
Hide comment
@gcodeur

gcodeur Jan 1, 2018

Member

Merci pour cette PR !

Je pense que ce serait bien d'utiliser des phrases un peu moins "brutales". Je pense à quelque chose comme :

  • "Ce nom d'utilisateur est inconnu. Si vous ne possédez pas de compte, vous pouvez vous inscrire."
  • "Le mot de passe saisi est incorrect. Cliquez sur le lien « Mot de passe oublié ? » si vous ne vous en souvenez plus."
Member

gcodeur commented Jan 1, 2018

Merci pour cette PR !

Je pense que ce serait bien d'utiliser des phrases un peu moins "brutales". Je pense à quelque chose comme :

  • "Ce nom d'utilisateur est inconnu. Si vous ne possédez pas de compte, vous pouvez vous inscrire."
  • "Le mot de passe saisi est incorrect. Cliquez sur le lien « Mot de passe oublié ? » si vous ne vous en souvenez plus."
Show outdated Hide outdated zds/member/views.py Outdated
@rezemika

This comment has been minimized.

Show comment
Hide comment
@rezemika

rezemika Jan 3, 2018

Contributor

J'ai essayé de réécrire la fonction en utilisant is_valid(), mais pour une raison que j'ignore, cette condition n'est pas validée alors que le dictionnaire form.errors est vide. Voilà le code : https://gist.github.com/rezemika/769685937b726c857fd998a69bca4c5b

Est-ce que l'un d'entre-vous aurait une idée de ce qui peut causer ça ?

Contributor

rezemika commented Jan 3, 2018

J'ai essayé de réécrire la fonction en utilisant is_valid(), mais pour une raison que j'ignore, cette condition n'est pas validée alors que le dictionnaire form.errors est vide. Voilà le code : https://gist.github.com/rezemika/769685937b726c857fd998a69bca4c5b

Est-ce que l'un d'entre-vous aurait une idée de ce qui peut causer ça ?

@Anto59290

This comment has been minimized.

Show comment
Hide comment
@Anto59290

Anto59290 Jan 4, 2018

Contributor

Est ce que tu es sur que ton formulaire contient des données, cf. ce cas particulier ?

Contributor

Anto59290 commented Jan 4, 2018

Est ce que tu es sur que ton formulaire contient des données, cf. ce cas particulier ?

@rezemika

This comment has been minimized.

Show comment
Hide comment
@rezemika

rezemika Jan 4, 2018

Contributor

@Anto59290 : Bonne idée, ça semble correspondre. Pourtant, quand je fais print(request.POST), j'ai ceci qui s'affiche : <QueryDict: {'csrfmiddlewaretoken': ['SAJTAu2TUTVKH3iJ3y13xwsjBiO3AROUI1HdpP9H0iOxcTYpnUcwVHnUzJ65kgGg'], 'password': ['admin'], 'username': ['admin'], 'remember': ['on']}>.

Même quand je fais form = LoginForm({'username':'admin', 'password':'admin', 'remember':'on'}), form.is_valid() renvoie False et form.errors est toujours vide.

Contributor

rezemika commented Jan 4, 2018

@Anto59290 : Bonne idée, ça semble correspondre. Pourtant, quand je fais print(request.POST), j'ai ceci qui s'affiche : <QueryDict: {'csrfmiddlewaretoken': ['SAJTAu2TUTVKH3iJ3y13xwsjBiO3AROUI1HdpP9H0iOxcTYpnUcwVHnUzJ65kgGg'], 'password': ['admin'], 'username': ['admin'], 'remember': ['on']}>.

Même quand je fais form = LoginForm({'username':'admin', 'password':'admin', 'remember':'on'}), form.is_valid() renvoie False et form.errors est toujours vide.

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 6, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 6, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 6, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 6, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 6, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 6, 2018

@rezemika rezemika changed the title from Refactorise la fonction "login_view()" et rend les messages d'erreurs plus précis to [WIP] Refactorise la fonction "login_view()" et rend les messages d'erreurs plus précis Jan 7, 2018

@Anto59290

This comment has been minimized.

Show comment
Hide comment
@Anto59290

Anto59290 Jan 8, 2018

Contributor

@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 form = LoginForm(data=request.POST) à la place de form = LoginForm(request.POST)

Contributor

Anto59290 commented Jan 8, 2018

@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 form = LoginForm(data=request.POST) à la place de form = LoginForm(request.POST)

@rezemika

This comment has been minimized.

Show comment
Hide comment
@rezemika

rezemika Jan 8, 2018

Contributor

@Anto59290 : tu as raison, il suffisait d'un LoginForm(data=request.POST), merci ! :)

(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.". ;)

Contributor

rezemika commented Jan 8, 2018

@Anto59290 : tu as raison, il suffisait d'un LoginForm(data=request.POST), merci ! :)

(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.". ;)

@Anto59290

This comment has been minimized.

Show comment
Hide comment
@Anto59290

Anto59290 Jan 8, 2018

Contributor

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.

Contributor

Anto59290 commented Jan 8, 2018

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.

@rezemika

This comment has been minimized.

Show comment
Hide comment
@rezemika

rezemika Jan 8, 2018

Contributor

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 next n'est pas utilisé dans la méthode. Qu'en pense-tu ?

def __init__(self, *args, **kwargs):
    kwargs.pop('next', None)
    super(LoginForm, self).__init__(*args, **kwargs)
    # etc
Contributor

rezemika commented Jan 8, 2018

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 next n'est pas utilisé dans la méthode. Qu'en pense-tu ?

def __init__(self, *args, **kwargs):
    kwargs.pop('next', None)
    super(LoginForm, self).__init__(*args, **kwargs)
    # etc
@Anto59290

This comment has been minimized.

Show comment
Hide comment
@Anto59290

Anto59290 Jan 8, 2018

Contributor

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.

Contributor

Anto59290 commented Jan 8, 2018

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.

Show outdated Hide outdated zds/member/views.py Outdated

@rezemika rezemika changed the title from [WIP] Refactorise la fonction "login_view()" et rend les messages d'erreurs plus précis to Refactorise la fonction "login_view()" et rend les messages d'erreurs plus précis Jan 11, 2018

rezemika added some commits Dec 23, 2017

Refactorise la fonction "login_view()" et rend les messages d'erreurs…
… 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.
@coveralls

This comment has been minimized.

Show comment
Hide comment
@coveralls

coveralls Jan 13, 2018

Coverage Status

Coverage increased (+0.002%) to 89.636% when pulling 67ef304 on rezemika:improves-login-view into 2960a59 on zestedesavoir:dev.

coveralls commented Jan 13, 2018

Coverage Status

Coverage increased (+0.002%) to 89.636% when pulling 67ef304 on rezemika:improves-login-view into 2960a59 on zestedesavoir:dev.

@gcodeur

Ça me paraît bon, merci de ton travail !

@gcodeur gcodeur added this to the Version de développement milestone Jan 13, 2018

@gcodeur gcodeur merged commit 2afc278 into zestedesavoir:dev Jan 13, 2018

2 checks passed

Codacy/PR Quality Review Good work! A positive pull request.
Details
continuous-integration/travis-ci/pr The Travis CI build passed
Details

@rezemika rezemika deleted the rezemika:improves-login-view branch Jan 13, 2018

@rezemika

This comment has been minimized.

Show comment
Hide comment
@rezemika

rezemika Jan 13, 2018

Contributor

\o/ Merci !

Contributor

rezemika commented Jan 13, 2018

\o/ Merci !

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

@zestedesavoir zestedesavoir deleted a comment from coveralls Jan 19, 2018

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment