Gestion mot de passe oublié et changement de mdp
authorAli Jetha <ali@U-AJ.(none)>
Wed, 27 Oct 2010 20:38:50 +0000 (16:38 -0400)
committerAli Jetha <ali@U-AJ.(none)>
Wed, 27 Oct 2010 20:38:50 +0000 (16:38 -0400)
13 files changed:
auf_savoirs_en_partage/chercheurs/forms.py
auf_savoirs_en_partage/chercheurs/models.py
auf_savoirs_en_partage/chercheurs/views.py
auf_savoirs_en_partage/context_processors.py
auf_savoirs_en_partage/templates/accounts/email_password.html [new file with mode: 0644]
auf_savoirs_en_partage/templates/accounts/login.html
auf_savoirs_en_partage/templates/accounts/new_password.html
auf_savoirs_en_partage/templates/chercheurs/new_password.html [new file with mode: 0644]
auf_savoirs_en_partage/templates/chercheurs/perso.html
auf_savoirs_en_partage/templates/chercheurs/personne.html [deleted file]
auf_savoirs_en_partage/templates/chercheurs/retrieve.html
auf_savoirs_en_partage/templates/render_field.html
auf_savoirs_en_partage/urls.py

index 4497b99..a7a6c5d 100644 (file)
@@ -70,5 +70,17 @@ class SendPasswordForm(forms.Form):
                 Utilisateur.objects.get(courriel=email)
             except:
                 raise forms.ValidationError("Ce courriel n'existe pas dans notre base de données.")       
-        return email        
+        return email
+
+class NewPasswordForm(forms.Form):
+    password = forms.CharField(widget=forms.PasswordInput(), required=True, label="Mot de passe") 
+    password_repeat = forms.CharField(widget=forms.PasswordInput(), required=True, label="Confirmez mot de passe")
+    def clean_password_repeat(self):
+        cleaned_data = self.cleaned_data
+        password = cleaned_data.get("password")
+        password_repeat = cleaned_data.get("password_repeat")
+        if password and password_repeat:
+            if password != password_repeat:
+                raise forms.ValidationError("Les mots de passe ne concordent pas")
+        return password_repeat   
 
index 8def0f8..35d17a4 100644 (file)
@@ -30,7 +30,7 @@ class Personne(models.Model):
         ordering = ["prenom", "nom"]
 
 class Utilisateur(Personne):
-    password = models.CharField (max_length=35, verbose_name = 'Mot de passe')
+    password = models.CharField(max_length=35, verbose_name = 'Mot de passe')
 
 FONCTION_CHOICES = (('Professeur', 'Professeur'), ('Chercheur', 'Chercheur'), ('Chercheur_independant', 'Chercheur indépendant'), ('Doctorant', 'Doctorant'))
 class Chercheur(models.Model):
@@ -81,6 +81,12 @@ class Chercheur(models.Model):
     
     def __unicode__(self):
         return u"%s %s" % (self.personne.nom.upper(), self.personne.prenom.title())
+        
+    def fonction_display(self):
+        for f in FONCTION_CHOICES:
+            if self.fonction == f[0]:
+                return f[1]
+        return "-"
     
 class Publication(models.Model):
     id = models.AutoField(primary_key=True, db_column='id')
index 8ecef86..f123389 100644 (file)
@@ -3,6 +3,7 @@ import hashlib
 from django.shortcuts import render_to_response
 from django.http import HttpResponseRedirect, HttpResponse
 from django.template import Context, RequestContext
+from django.template.loader import get_template
 from django.core.urlresolvers import reverse
 from django.core.mail import send_mail
 from django.conf import settings
@@ -34,8 +35,16 @@ def send_password(request):
             code = hashlib.md5(u.courriel+u.password).hexdigest()
             code = code[0:6]
             link = "%saccounts/new_password/%s/%s/" % (settings.SITE_ROOT_URL, u.courriel, code)
+
+            variables = { 'user': u,
+                          'link': link,
+                          'SITE_ROOT_URL': settings.SITE_ROOT_URL
+                }     
+            t = get_template('accounts/email_password.html')
+            content = t.render(Context(variables)) 
+            
             send_mail('Savoirs en partage: changement de mot de passe',
-                    'Bonjour \n. Veuillez acceder a ce lien pour modifier votre mot de passe'+link, settings.CONTACT_EMAIL,
+                    content, settings.CONTACT_EMAIL,
                 [u.courriel], fail_silently=False)
     else:
         form = SendPasswordForm()
@@ -45,33 +54,52 @@ def send_password(request):
     return render_to_response ("accounts/send_password.html", \
             Context (variables), 
             context_instance = RequestContext(request))
-
-def random_password():
-    import string
-    from random import choice
-    chars = string.ascii_letters + string.digits
-    password = "".join(choice(chars) for x in range(0,8))
-    return password
-
-
+            
 def new_password(request, email, code):
     u = Utilisateur.objects.get(courriel=email)
     original_code = hashlib.md5(u.courriel+u.password).hexdigest()
     original_code = original_code[0:6]
+    message=""
     if(code == original_code):
-        new_password = random_password()
-        u.password = hashlib.md5(new_password).hexdigest()
-        u.save()
+        if request.method == "POST":
+            form = NewPasswordForm(data=request.POST)
+            if form.is_valid():
+                new_password = form.cleaned_data['password']
+                u.password = hashlib.md5(new_password).hexdigest()
+                u.save()
+                message = "Votre mot de passe a été modifié."
+        else:
+            form = NewPasswordForm()
     else:
         return HttpResponseRedirect('/')
-    variables = { 'new_password': new_password,
+    variables = { 'form': form,
+                  'message': message,
                 }
     return render_to_response ("accounts/new_password.html", \
             Context (variables), 
             context_instance = RequestContext(request))
-            
-            
 
+@login_required()            
+def change_password(request):
+    context_instance = RequestContext(request)
+    u = context_instance['user_sep']
+    message = ""
+    if request.method == "POST":
+        form = NewPasswordForm(data=request.POST)
+        if form.is_valid():
+            new_password = form.cleaned_data['password']
+            u.password = hashlib.md5(new_password).hexdigest()
+            u.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 chercheur_login(request, template_name='registration/login.html', redirect_field_name='next'):
     "Displays the login form and handles the login action."
     redirect_to = request.REQUEST.get(redirect_field_name, '')
index 90e884e..eaf84bf 100644 (file)
@@ -1,13 +1,16 @@
 # -*- encoding: utf-8 -*-
 
-from chercheurs.models import Chercheur
+from chercheurs.models import Chercheur, Utilisateur
 
     
 def user_chercheur(request):
     user_chercheur = Chercheur.objects.none()
+    user_sep = Utilisateur.objects.none()
     if request.user.is_authenticated():
         try:
             user_chercheur = Chercheur.objects.get(personne__courriel=request.user.email)
+            user_sep = Utilisateur.objects.get(id=user_chercheur.personne_id)
         except:
             pass
-    return {'user_chercheur': user_chercheur}
+    return {'user_chercheur': user_chercheur,
+            'user_sep': user_sep,}
diff --git a/auf_savoirs_en_partage/templates/accounts/email_password.html b/auf_savoirs_en_partage/templates/accounts/email_password.html
new file mode 100644 (file)
index 0000000..4216503
--- /dev/null
@@ -0,0 +1,15 @@
+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.
+
+Bien cordialement,
+
+_____________________________
+Savoirs en partage
+{{SITE_ROOT_URL}}
index c064824..872ba4e 100644 (file)
@@ -2,12 +2,13 @@
 
 {% block contenu %}
 
-{% if form.errors %}
-<p>Login ou mot de passe invalide.</p>
-{% endif %}
-
-  <div class="zone-texte">
+<h4>Connexion</h4>
+<div class="contenu-wrapper">
+    {% if form.errors %}
+    <p class="message">Login ou mot de passe invalide.</p>
+    {% endif %}
     <form method="post" action="{% url chercheurs.views.chercheur_login %}">
+      <fieldset>
       <table>
         <tr>
           <td>{{ form.username.label_tag }}</td>
           <td>{{ form.password }}</td>
         </tr>
       </table>
-
+      <p><a href="{% url chercheurs.views.send_password %}">Mot de passe oublié ?</a></p>
       <input type="submit" value="Connexion" />
       <input type="hidden" name="next" value="{% if next %}{{next}}{% else %}/chercheurs/perso/{% endif %}" />
+      </fieldset>
     </form>
-  </div>
+</div>
 
 {% endblock %}
 
index 72a8891..d30caa8 100644 (file)
@@ -3,6 +3,16 @@
 {% block contenu %}
 <h4>Demande de changement de mot de passe</h4>
 <div class="contenu-wrapper">
-    Mot de passe: <strong>{{new_password}}</strong>
+    {% if message %}
+        <span class="message">{{message}}</span>
+        <p>Cliquez <a href="{% url chercheurs.views.chercheur_login %}">ici</a> pour accéder à votre <a href="{% url chercheurs.views.chercheur_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>
 </div>
 {% endblock %}
diff --git a/auf_savoirs_en_partage/templates/chercheurs/new_password.html b/auf_savoirs_en_partage/templates/chercheurs/new_password.html
new file mode 100644 (file)
index 0000000..72a8891
--- /dev/null
@@ -0,0 +1,8 @@
+{% extends "container_base.html" %}
+
+{% block contenu %}
+<h4>Demande de changement de mot de passe</h4>
+<div class="contenu-wrapper">
+    Mot de passe: <strong>{{new_password}}</strong>
+</div>
+{% endblock %}
index 49c834e..3b3e029 100644 (file)
@@ -16,7 +16,7 @@
             </tr>
             <tr>
                 <td class="label">Fonction:</td>
-                <td>{{chercheur.fonction|default:"-"}}</td>
+                <td>{{chercheur.fonction_display|default:"-"}}</td>
             </tr>
             <tr>
                 <td class="label">Diplôme:</td>
@@ -25,6 +25,7 @@
         </table>
     
     </div>
+    <p><a href="{% url chercheurs.views.change_password %}">Modifier mot de passe</a></p>
 </div>
 
 {% endblock %}
diff --git a/auf_savoirs_en_partage/templates/chercheurs/personne.html b/auf_savoirs_en_partage/templates/chercheurs/personne.html
deleted file mode 100644 (file)
index 8558181..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-{% extends "container_base.html" %}
-
-{% block contenu %}
-{% for d in disciplines %}
-<li>{{d}}</li>
-{% endfor %}
-
-<hr />
-
-{% for p in personnes %}
-<li>{{p}}</li>
-{% endfor %}
-
-
-{% endblock %}
index 91372fb..a53f162 100644 (file)
@@ -27,7 +27,7 @@
             
             <tr>
                 <td class="label">Fonction:</td>
-                <td>{{chercheur.fonction|default:"-"}}</td>
+                <td>{{chercheur.fonction_display|default:"-"}}</td>
             </tr>
             <tr>
                 <td class="label">Diplôme:</td>
index a7ebb23..7dd1dbe 100644 (file)
@@ -3,7 +3,7 @@
         {{ field }}
     {% else %}
         <td{{ field.row_attrs }} class="required" style="width: 150px;">
-            {{ field.label_tag }} {% if field.field.required %}<span style="color:red">*</span>{% endif %}
+            {{ field.label_tag }}&nbsp;{% if field.field.required %}<span style="color:red">*</span>{% endif %}
             {% if field.errors %}
                 {{ field.errors }}
             {% endif %}
index cb6d9c3..c8913f8 100644 (file)
@@ -25,6 +25,7 @@ urlpatterns = patterns(
 
     (r'^accounts/login/$', 'chercheurs.views.chercheur_login', {'template_name': 'accounts/login.html'}),
     (r'^accounts/logout/$', 'django.contrib.auth.views.logout', {'template_name': 'accounts/logout.html'}),
+    (r'^accounts/change_password/$', 'chercheurs.views.change_password'),
     (r'^accounts/send_password/$', 'chercheurs.views.send_password'),
     (r'^accounts/new_password/(.+)/(.+)/$', 'chercheurs.views.new_password'),