Utiliser les mécanismes de Django pour le login, le logout et les changements de
authorEric Mc Sween <eric.mcsween@gmail.com>
Mon, 13 Dec 2010 17:29:03 +0000 (12:29 -0500)
committerEric Mc Sween <eric.mcsween@gmail.com>
Mon, 13 Dec 2010 17:29:03 +0000 (12:29 -0500)
mot de passe.

22 files changed:
auf_savoirs_en_partage/chercheurs/views.py
auf_savoirs_en_partage/development.py
auf_savoirs_en_partage/media/css/global.css
auf_savoirs_en_partage/sql/2010-12-08.sql
auf_savoirs_en_partage/templates/accounts/email_password.html [deleted file]
auf_savoirs_en_partage/templates/accounts/new_password.html [deleted file]
auf_savoirs_en_partage/templates/accounts/send_password.html [deleted file]
auf_savoirs_en_partage/templates/chercheurs/actions.html
auf_savoirs_en_partage/templates/chercheurs/logged_out.html [new file with mode: 0644]
auf_savoirs_en_partage/templates/chercheurs/login.html [new file with mode: 0644]
auf_savoirs_en_partage/templates/chercheurs/password_change_done.html [new file with mode: 0644]
auf_savoirs_en_partage/templates/chercheurs/password_change_form.html [new file with mode: 0644]
auf_savoirs_en_partage/templates/chercheurs/password_reset_complete.html [new file with mode: 0644]
auf_savoirs_en_partage/templates/chercheurs/password_reset_confirm.html [new file with mode: 0644]
auf_savoirs_en_partage/templates/chercheurs/password_reset_done.html [new file with mode: 0644]
auf_savoirs_en_partage/templates/chercheurs/password_reset_email.txt [new file with mode: 0644]
auf_savoirs_en_partage/templates/chercheurs/password_reset_form.html [new file with mode: 0644]
auf_savoirs_en_partage/templates/chercheurs/perso.html
auf_savoirs_en_partage/templates/container_base.html
auf_savoirs_en_partage/templates/registration/logged_out.html [deleted file]
auf_savoirs_en_partage/templates/registration/login.html [deleted file]
auf_savoirs_en_partage/urls.py

index 5bf3e02..1e98053 100644 (file)
@@ -19,7 +19,6 @@ from models import Personne, Groupe, ChercheurGroupe
 
 from django.contrib.auth import authenticate, login
 from django.contrib.auth.decorators import login_required
-from django.contrib.auth.forms import AuthenticationForm as OriginalAuthenticationForm
 from django.contrib.auth.models import User
 
 from django.db.models import Q
@@ -27,73 +26,6 @@ from django.shortcuts import get_object_or_404
 
 from django.utils.translation import ugettext_lazy as _
 
-#TODO: Migrer tout ce qui a rapport aux users dans une nouvelle app
-
-class AuthenticationForm(OriginalAuthenticationForm):
-    username = forms.CharField(label='Adresse électronique', max_length=255)
-
-def send_password(request):
-    if request.method == "POST":
-        form = SendPasswordForm(data=request.POST)
-        if form.is_valid():
-            u = Personne.objects.get(courriel=form.cleaned_data['email'])
-            code = u.get_new_password_code()
-            link = "%s/accounts/new_password/%s/%s/" % (settings.SITE_ROOT_URL, u.courriel, code)
-
-            variables = { 'user': u,
-                          'link': link,
-                          'SITE_ROOT_URL': settings.SITE_ROOT_URL,
-                          'CONTACT_EMAIL': settings.CONTACT_EMAIL }
-            t = get_template('accounts/email_password.html')
-            content = t.render(variables)
-            
-            send_mail('Savoirs en partage: changement de mot de passe',
-                      content, settings.CONTACT_EMAIL,
-                      [u.courriel], fail_silently=False)
-    else:
-        form = SendPasswordForm()
-
-    return render_to_response("accounts/send_password.html",
-                              dict(form=form), 
-                              context_instance=RequestContext(request))
-            
-def new_password(request, email, code):
-    u = Personne.objects.get(courriel=email)
-    original_code = u.get_new_password_code()
-    message=""
-    if(code == original_code):
-        if request.method == "POST":
-            form = NewPasswordForm(data=request.POST)
-            if form.is_valid():
-                u.set_password(form.cleaned_data['password'])
-                u.save()
-                message = "Votre mot de passe a été modifié."
-        else:
-            form = NewPasswordForm()
-    else:
-        return HttpResponseRedirect('/')
-    return render_to_response("accounts/new_password.html",
-                              dict(form=form, message=message),
-                              context_instance=RequestContext(request))
-
-@login_required          
-def change_password(request):
-    message = ""
-    if request.method == "POST":
-        form = NewPasswordForm(data=request.POST)
-        if form.is_valid():
-            request.user.set_password(form.cleaned_data['password'])
-            request.user.save()
-            message = "Votre mot de passe a été modifié."
-    else:
-        form = NewPasswordForm()
-    variables = { 'form': form,
-                  'message': message,
-                }
-    return render_to_response ("accounts/new_password.html", \
-            Context (variables), 
-            context_instance = RequestContext(request))            
-             
 def index(request):
     """Répertoire des chercheurs"""
     search_form = RepertoireSearchForm(request.GET)
index ce669b3..11e193b 100644 (file)
@@ -3,6 +3,8 @@ from auf_savoirs_en_partage.settings import *
 DEBUG = True
 TEMPLATE_DEBUG = DEBUG
 INTERNAL_IPS = ('127.0.0.1',)
+EMAIL_HOST = 'localhost'
+EMAIL_PORT = 1025
 
 # Debug toolbar
 
index 617f3a3..a81918c 100644 (file)
@@ -166,6 +166,8 @@ ul.actions { font-size: 90%; float: right; text-align: right; list-style: none;
 * html .clearfix { height:1%; }
 .clearfix { display:block; }
 
+/* Cadre */
+
 .cadre { width: 60%; margin: 100px auto; padding: 20px; background: #f9f9f9; border: 1px solid #aaa }
-.souligne { border-bottom: 1px solid #DDD; }
+.cadre h1 { margin: -20px -20px 0 -20px; padding: 5px; background: #aaa; color: white; font-size: 120%; font-weight: bold; text-align: center; }
 
index ae1bb3e..a3b1e03 100644 (file)
@@ -26,3 +26,8 @@ SET p.user_id = u.id
 WHERE p.actif;
 
 ALTER TABLE chercheurs_personne DROP COLUMN password;
+
+-- On a viré le CascadeBackend, alors on doit virer toutes les sessions, car le
+-- backend d'authentification est stocké dans la session.
+
+TRUNCATE django_session;
diff --git a/auf_savoirs_en_partage/templates/accounts/email_password.html b/auf_savoirs_en_partage/templates/accounts/email_password.html
deleted file mode 100644 (file)
index 3e390c8..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-Bonjour {{user.prenom}} {{user.nom}},
-
-Nous avons reçu une demande de changement de mot de passe.
-
-Pour procéder à cette manoeuvre, veuillez vous rendre au lien suivant:
-
-{{link}}
-
-Si vous n'êtes pas l'initiateur de cette demande, merci d'ignorer ce message.
-
-Si vous rencontrez des difficultés, vous pouvez écrire à : {{CONTACT_EMAIL}}
-
-Avec nos meilleures salutations.
-
-_____________________________
-Savoirs en partage
-{{SITE_ROOT_URL}}
-{{CONTACT_EMAIL}}
diff --git a/auf_savoirs_en_partage/templates/accounts/new_password.html b/auf_savoirs_en_partage/templates/accounts/new_password.html
deleted file mode 100644 (file)
index 20b9960..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-{% extends "container_base.html" %}
-
-{% block contenu %}
-<h1>Demande de changement de mot de passe</h1>
-{% if message %}
-<div id="flash-message">{{message}}</div>
-<p>Cliquez <a href="{% url django.contrib.auth.views.login %}">ici</a> 
-pour accéder à votre <a href="{% url django.contrib.auth.views.login %}">espace chercheur.</a> </p>
-{% endif %}
-<form method="post">
-    <fieldset>
-        <span>Veuillez saisir un nouveau mot de passe.</span>
-        {% include "table_form.html" %}
-    </fieldset>
-    <input type="submit" name="Submit" value="Envoyer" class="bouton" />
-</form>
-{% endblock %}
diff --git a/auf_savoirs_en_partage/templates/accounts/send_password.html b/auf_savoirs_en_partage/templates/accounts/send_password.html
deleted file mode 100644 (file)
index 897a173..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-{% extends "container_base.html" %}
-
-{% block contenu %}
-<h1>Demande de changement de mot de passe</h1>
-{% if form.is_valid %}
-<div id="flash-message">Un message a été envoyé à l'adresse électronique spécifiée.</div>
-{% else %}
-<form method="post">
-    <fieldset>
-        {% include "table_form.html" %}
-        <span>Veuillez entrer l'adresse électronique avec laquelle vous avez completé votre inscription.</span>
-    </fieldset>
-    <input type="submit" name="Submit" value="Envoyer" class="bouton" />
-</form>
-{% endif %}
-{% endblock %}
index 76772fb..7160a5e 100644 (file)
@@ -1,6 +1,6 @@
 {% if request.chercheur %}
 <li><a href="{% url chercheurs.views.perso %}">Espace chercheur</a></li>
 {% else %}
-<li><a href="{% url django.contrib.auth.views.login %}">Se connecter</a></li>
+<li><a href="{% url chercheurs-login %}">Se connecter</a></li>
 <li><a href="{% url chercheurs.views.inscription %}">S'inscrire</a></li>
 {% endif %}
diff --git a/auf_savoirs_en_partage/templates/chercheurs/logged_out.html b/auf_savoirs_en_partage/templates/chercheurs/logged_out.html
new file mode 100644 (file)
index 0000000..7d76fad
--- /dev/null
@@ -0,0 +1,9 @@
+{% extends "container_base.html" %}
+
+{% block contenu %}
+<div class="cadre">
+    <p>Vous êtes maintenant déconnecté.</p>
+    <p><a href="{% url savoirs.views.index %}">Retour à l'accueil</a>.</p>
+</div>
+{% endblock %}
+
diff --git a/auf_savoirs_en_partage/templates/chercheurs/login.html b/auf_savoirs_en_partage/templates/chercheurs/login.html
new file mode 100644 (file)
index 0000000..87c1acc
--- /dev/null
@@ -0,0 +1,29 @@
+{% extends "container_base.html" %}
+
+{% block contenu %}
+<div class="cadre">
+    <h1>Connexion</h1>
+    {% if form.errors %}
+    <p class="form-errors">Login ou mot de passe invalide.</p>
+    {% endif %}
+
+    <form method="post">
+        <table>
+            <tr>
+                <td>Adresse électronique</td>
+                <td>{{ form.username }}</td>
+            </tr>
+            <tr>
+                <td>Mot de passe</td>
+                <td>{{ form.password }}</td>
+            </tr>
+        </table>
+        <input type="submit" value="Connexion" />
+    </form>
+    <p><a href="{% url chercheurs-password-reset %}">Mot de passe oublié ?</a></p>
+    <p>Vous n'avez pas encore de compte? 
+    <a href="{% url chercheurs.views.inscription %}">Inscrivez-vous</a>.</p>
+</div>
+
+{% endblock %}
+
diff --git a/auf_savoirs_en_partage/templates/chercheurs/password_change_done.html b/auf_savoirs_en_partage/templates/chercheurs/password_change_done.html
new file mode 100644 (file)
index 0000000..8fab47d
--- /dev/null
@@ -0,0 +1,8 @@
+{% extends "container_base.html" %}
+
+{% block contenu %}
+<div class="cadre">
+    <p>Votre nouveau mot de passe a été enregistré</p>
+    <p>Vous pouvez maintenant <a href="{% url chercheurs.views.perso %}">retourner à votre espace chercheur</a>.</p>
+</div>
+{% endblock %}
diff --git a/auf_savoirs_en_partage/templates/chercheurs/password_change_form.html b/auf_savoirs_en_partage/templates/chercheurs/password_change_form.html
new file mode 100644 (file)
index 0000000..95cea5a
--- /dev/null
@@ -0,0 +1,11 @@
+{% extends "container_base.html" %}
+
+{% block contenu %}
+<div class="cadre">
+    <h1>Changement de mot de passe</h1>
+    <form method="post">
+        {% include "table_form.html" %}
+        <input type="submit" name="Submit" value="Envoyer" class="bouton" />
+    </form>
+</div>
+{% endblock %}
diff --git a/auf_savoirs_en_partage/templates/chercheurs/password_reset_complete.html b/auf_savoirs_en_partage/templates/chercheurs/password_reset_complete.html
new file mode 100644 (file)
index 0000000..a39bc02
--- /dev/null
@@ -0,0 +1,8 @@
+{% extends "container_base.html" %}
+
+{% block contenu %}
+<div class="cadre">
+    <p>Votre nouveau mot de passe a été enregistré.</p>
+    <p>Vous pouvez maintenant vous <a href="{% url chercheurs-login %}">connecter au répertoire</a>.</p>
+</div>
+{% endblock %}
diff --git a/auf_savoirs_en_partage/templates/chercheurs/password_reset_confirm.html b/auf_savoirs_en_partage/templates/chercheurs/password_reset_confirm.html
new file mode 100644 (file)
index 0000000..c3a175a
--- /dev/null
@@ -0,0 +1,18 @@
+{% extends "container_base.html" %}
+
+{% block contenu %}
+<div class="cadre">
+    <h1>Demande de changement de mot de passe</h1>
+    {% if validlink %}
+    <form method="post">
+        <p>Veuillez choisir un nouveau mot de passe.</p>
+        {% include "table_form.html" %}
+        <input type="submit" name="Submit" value="Envoyer" />
+    </form>
+    {% else %}
+    <p>Cette clé est invalide. Assurez-vous de bien copier le lien qui vous a
+    été envoyé par courriel.</p>
+    <p>Vous pouvez aussi essayer d'<a href="{% url chercheurs-password-reset %}">obtenir une nouvelle clé</a>.</p>
+    {% endif %}
+</div>
+{% endblock %}
diff --git a/auf_savoirs_en_partage/templates/chercheurs/password_reset_done.html b/auf_savoirs_en_partage/templates/chercheurs/password_reset_done.html
new file mode 100644 (file)
index 0000000..e7c6117
--- /dev/null
@@ -0,0 +1,8 @@
+{% extends "container_base.html" %}
+
+{% block contenu %}
+<div class="cadre">
+    <p>Un message a été envoyé à l'adresse électronique spécifiée.</p>
+    <p><a href="{% url savoirs.views.index %}">Retour à l'accueil</a></p>
+</div>
+{% endblock %}
diff --git a/auf_savoirs_en_partage/templates/chercheurs/password_reset_email.txt b/auf_savoirs_en_partage/templates/chercheurs/password_reset_email.txt
new file mode 100644 (file)
index 0000000..1a4e39a
--- /dev/null
@@ -0,0 +1,18 @@
+Bonjour {{user.personne.prenom}} {{user.personne.nom}},
+
+Nous avons reçu une demande de changement de mot de passe.
+
+Pour procéder à cette manoeuvre, veuillez vous rendre au lien suivant:
+
+{{ protocol }}://{{ domain }}{% url chercheurs-password-reset-confirm uidb36=uid, token=token %}
+
+Si vous n'êtes pas l'initiateur de cette demande, merci d'ignorer ce message.
+
+Si vous rencontrez des difficultés, vous pouvez écrire à : contact-savoirsenpartage@auf.org
+
+Avec nos meilleures salutations.
+
+-- 
+Savoirs en partage
+{{ protocol }}://{{ domain }}
+contact-savoirsenpartage@auf.org
diff --git a/auf_savoirs_en_partage/templates/chercheurs/password_reset_form.html b/auf_savoirs_en_partage/templates/chercheurs/password_reset_form.html
new file mode 100644 (file)
index 0000000..ebb94fc
--- /dev/null
@@ -0,0 +1,13 @@
+{% extends "container_base.html" %}
+
+{% block contenu %}
+<div class="cadre">
+    <h1>Demande de changement de mot de passe</h1>
+    <form method="post">
+        <p>Veuillez entrer l'adresse électronique avec laquelle vous avez completé votre inscription.</p>
+        {{ form.email }}
+        <input type="submit" name="Submit" value="Envoyer" class="bouton" />
+    </form>
+</div>
+{% endblock %}
+
index 722e730..e95ad29 100644 (file)
@@ -9,9 +9,9 @@
 <ul class="actions">
     <li><a href="{% url chercheurs.views.index %}">Tous les chercheurs</a></li>
     <li><a href="{% url chercheurs.views.edit %}">Éditer votre fiche</a></li>
-    <li><a href="{% url chercheurs.views.change_password %}">Modifier votre mot de passe</a></li>
+    <li><a href="{% url chercheurs-password-change %}">Modifier votre mot de passe</a></li>
     <li><a href="{% url savoirs.views.evenement_ajout %}">Ajouter un événement à l'agenda</a></li>
-    <li><a href="{% url django.contrib.auth.views.logout %}">Vous déconnecter</a></li>
+    <li><a href="{% url chercheurs-logout %}">Vous déconnecter</a></li>
     <li><a href="{% url chercheurs.views.desinscription %}">Vous désinscrire du répertoire</a></li>
 </ul>
 
index 41bc8d1..fc72fcb 100644 (file)
@@ -64,9 +64,9 @@
                         <a href="{% url savoirs.views.nous_contacter %}">Contact</a> |
                         <a href="{% url savoirs.views.legal %}">Légal</a> |
                         {% if user.is_authenticated %}
-                        <a href="{% url django.contrib.auth.views.logout %}">Déconnexion</a>
+                        <a href="{% url chercheurs-logout %}">Déconnexion</a>
                         {% else %}
-                        <a href="{% url django.contrib.auth.views.login %}">Connexion</a>
+                        <a href="{% url chercheurs-login %}">Connexion</a>
                         {% endif %}
                     </div>
                 </div>
diff --git a/auf_savoirs_en_partage/templates/registration/logged_out.html b/auf_savoirs_en_partage/templates/registration/logged_out.html
deleted file mode 100644 (file)
index 7d76fad..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{% extends "container_base.html" %}
-
-{% block contenu %}
-<div class="cadre">
-    <p>Vous êtes maintenant déconnecté.</p>
-    <p><a href="{% url savoirs.views.index %}">Retour à l'accueil</a>.</p>
-</div>
-{% endblock %}
-
diff --git a/auf_savoirs_en_partage/templates/registration/login.html b/auf_savoirs_en_partage/templates/registration/login.html
deleted file mode 100644 (file)
index bffda53..0000000
+++ /dev/null
@@ -1,29 +0,0 @@
-{% extends "container_base.html" %}
-
-{% block contenu %}
-
-<h1>Connexion</h1>
-
-{% if form.errors %}
-<p class="form-errors">Login ou mot de passe invalide.</p>
-{% endif %}
-
-<form method="post" action="{% url django.contrib.auth.views.login %}">
-  <table>
-    <tr>
-      <td>Adresse électronique</td>
-      <td>{{ form.username }}</td>
-    </tr>
-    <tr>
-      <td>Mot de passe</td>
-      <td>{{ form.password }}</td>
-    </tr>
-  </table>
-  <input type="submit" value="Connexion" />
-</form>
-<p><a href="{% url chercheurs.views.send_password %}">Mot de passe oublié ?</a></p>
-<p>Vous n'avez pas encore de compte? 
-<a href="{% url chercheurs.views.inscription %}">Inscrivez-vous</a>.</p>
-
-{% endblock %}
-
index 6acf2c1..c2664bc 100644 (file)
@@ -69,9 +69,33 @@ urlpatterns = sep_patterns + patterns(
     (r'^chercheurs/perso/$', 'chercheurs.views.perso'),
     (r'^chercheurs/edit/$', 'chercheurs.views.edit'),
     (r'^chercheurs/conversion$', 'chercheurs.views.conversion'),
-    (r'^accounts/login/$', 'django.contrib.auth.views.login'),
-    (r'^accounts/change_password/$', 'chercheurs.views.change_password'),
-    (r'^accounts/send_password/$', 'chercheurs.views.send_password'),
+    (r'^chercheurs/connexion/$', 'django.contrib.auth.views.login', dict(
+        template_name='chercheurs/login.html'
+    ), 'chercheurs-login'),
+    (r'^chercheurs/deconnexion/$', 'django.contrib.auth.views.logout', dict(
+        template_name='chercheurs/logged_out.html'
+    ), 'chercheurs-logout'),
+    (r'^chercheurs/changement-mdp/$', 'django.contrib.auth.views.password_change', dict(
+        template_name='chercheurs/password_change_form.html',
+        post_change_redirect='/chercheurs/changement-mdp-fini/'
+    ), 'chercheurs-password-change'),
+    (r'^chercheurs/changement-mdp-fini/$', 'django.contrib.auth.views.password_change_done', dict(
+        template_name='chercheurs/password_change_done.html'
+    ), 'chercheurs-password-change-done'),
+    (r'^chercheurs/oubli-mdp/$', 'django.contrib.auth.views.password_reset', dict(
+        template_name='chercheurs/password_reset_form.html',
+        email_template_name='chercheurs/password_reset_email.txt',
+        post_reset_redirect='/chercheurs/oubli-mdp-envoye/'
+    ), 'chercheurs-password-reset'),
+    (r'^chercheurs/oubli-mdp-envoye/$', 'django.contrib.auth.views.password_reset_done', dict(
+        template_name='chercheurs/password_reset_done.html'
+    ), 'chercheurs-password-reset-done'),
+    (r'^chercheurs/oubli-mdp-retour/(?P<uidb36>.*)/(?P<token>.*)/$', 'django.contrib.auth.views.password_reset_confirm', dict(
+        template_name='chercheurs/password_reset_confirm.html'
+    ), 'chercheurs-password-reset-confirm'),
+    (r'^chercheurs/oubli-mdp-fini/$', 'django.contrib.auth.views.password_reset_complete', dict(
+        template_name='chercheurs/password_reset_complete.html'
+    )),
     (r'^etablissements/autocomplete/$', 'chercheurs.views.etablissements_autocomplete'),
     (r'^etablissements/autocomplete/(?P<pays>.*)/$', 'chercheurs.views.etablissements_autocomplete'),
 
@@ -92,8 +116,6 @@ urlpatterns = sep_patterns + patterns(
     (r'^admin/(?P<app_name>[^/]*)/(?P<model_name>[^/]*)/assigner_disciplines', 'savoirs.admin_views.assigner_disciplines', {}, 'assigner_disciplines'),
     (r'^admin/(.*)', admin.site.root),
 
-    (r'^accounts/logout/$', 'django.contrib.auth.views.logout'),
-    (r'^accounts/new_password/(.+)/(.+)/$', 'chercheurs.views.new_password'),
 
     # rss
     (r'^rss/(.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict':site_feeds}),