Découpler un peu les chercheurs et l'authentification Django
authorEric Mc Sween <eric.mcsween@gmail.com>
Wed, 15 Dec 2010 19:33:11 +0000 (14:33 -0500)
committerEric Mc Sween <eric.mcsween@gmail.com>
Wed, 15 Dec 2010 19:33:11 +0000 (14:33 -0500)
La relation entre un chercheur et un user Django se fait maintenant seulement
par le courriel.

auf_savoirs_en_partage/authentification.py
auf_savoirs_en_partage/chercheurs/middleware.py
auf_savoirs_en_partage/chercheurs/models.py
auf_savoirs_en_partage/chercheurs/utils.py [new file with mode: 0644]
auf_savoirs_en_partage/chercheurs/views.py
auf_savoirs_en_partage/scripts/sphinx.conf.py.in
auf_savoirs_en_partage/settings.py
auf_savoirs_en_partage/sql/2010-12-15.sql [new file with mode: 0644]

index 82ebd09..4e20735 100644 (file)
@@ -1,35 +1,12 @@
 # -*- encoding: utf-8 -*-
 import re
+from chercheurs.models import Personne
+from chercheurs.utils import get_django_user_for_email
 from datamaster_modeles.models import Authentification as AUFUser, Employe
 from django.conf import settings
 from django.contrib.auth.backends import ModelBackend
-from django.contrib.auth.models import User
 from hashlib import md5
 
-def get_django_user_for_email(email):
-    """Retourne un utilisateur Django avec le courriel donné.
-
-       S'il y a déjà un utilisateur avec ce courriel, on s'assure qu'il est activé.
-
-       Sinon, on crée un nouvel utilisateur."""
-    try:
-        user = User.objects.get(email=email)
-        if not user.is_active:
-            user.is_active = True
-        user.save()
-    except User.DoesNotExist:
-        username = email.split('@')[0]
-        username = re.sub('\W', '_', username)[:30]
-        i = 1
-        while User.objects.filter(username=username).count() > 0:
-            suffix = '_' + str(i)
-            username = username[:30-len(suffix)] + suffix
-            i += 1
-        # XXX: possible race condition here...
-        user = User.objects.create_user(username, email)
-        user.save()
-    return user
-
 class AUFBackend(ModelBackend):
     """Authentifie un employé de l'AUF."""
 
@@ -41,13 +18,14 @@ class AUFBackend(ModelBackend):
         if not settings.AUTH_PASSWORD_REQUIRED or md5(password).hexdigest() == auf_user.motdepasse:
             return get_django_user_for_email(username)
 
-class EmailBackend(ModelBackend):
-    """Authentifie un utilisateur par son courriel."""
+class PersonneBackend(ModelBackend):
+    """Authentifie un chercheur de Savoirs en partage."""
 
     def authenticate(self, username=None, password=None):
         try:
-            user = User.objects.get(email=username, is_active=True)
-        except User.DoesNotExist:
+            personne = Personne.objects.get(courriel=username, actif=True)
+        except Personne.DoesNotExist:
             return None
+        user = get_django_user_for_email(username)
         if not settings.AUTH_PASSWORD_REQUIRED or user.check_password(password):
             return user
index c9975cf..49b7ea3 100644 (file)
@@ -7,7 +7,7 @@ class LazyChercheur(object):
             request._cached_chercheur = None
             if request.user.is_authenticated():
                 try:
-                    request._cached_chercheur = request.user.personne.chercheur
+                    request._cached_chercheur = Chercheur.objects.get(actif=True, courriel=request.user.email)
                 except (Personne.DoesNotExist, Chercheur.DoesNotExist):
                     pass
         return request._cached_chercheur
index 1d0eb0c..2b189e6 100644 (file)
@@ -1,9 +1,7 @@
 # -*- encoding: utf-8 -*-
 import hashlib
-from authentification import get_django_user_for_email
 from datamaster_modeles.models import *
 from django.conf import settings
-from django.contrib.auth.models import User
 from django.db import models
 from django.db.models import Q
 from django.utils.encoding import smart_str
@@ -13,7 +11,6 @@ from savoirs.models import Discipline, SEPManager, SEPSphinxQuerySet, SEPQuerySe
 
 GENRE_CHOICES = (('m', 'Homme'), ('f', 'Femme'))
 class Personne(models.Model):
-    user = models.OneToOneField(User, null=True, editable=False)
     salutation = models.CharField(max_length=128, null=True, blank=True)
     nom = models.CharField(max_length=255)
     prenom = models.CharField(max_length=128, verbose_name='prénom')
@@ -32,22 +29,6 @@ class Personne(models.Model):
     class Meta:
         ordering = ["nom", "prenom"]
 
-    def save(self):
-        if self.actif:
-            if self.user:
-                self.user.username = self.courriel
-                self.user.email = self.courriel
-            else:
-                self.user = get_django_user_for_email(self.courriel)
-            self.user.last_name = self.nom
-            self.user.first_name = self.prenom
-        else:
-            if self.user:
-                self.user.is_active = False
-        if self.user:
-            self.user.save()
-        super(Personne, self).save()
-
 class ChercheurQuerySet(SEPQuerySet):
 
     def filter_groupe(self, groupe):
@@ -119,7 +100,7 @@ class ChercheurSphinxQuerySet(SEPSphinxQuerySet):
 class ChercheurManager(SEPManager):
 
     def get_query_set(self):
-        return ChercheurQuerySet(self.model)
+        return ChercheurQuerySet(self.model).filter(actif=True)
 
     def get_sphinx_query_set(self):
         return ChercheurSphinxQuerySet(self.model).order_by('-date_modification')
diff --git a/auf_savoirs_en_partage/chercheurs/utils.py b/auf_savoirs_en_partage/chercheurs/utils.py
new file mode 100644 (file)
index 0000000..149c076
--- /dev/null
@@ -0,0 +1,29 @@
+# coding: utf-8
+
+import re
+from django.contrib.auth.models import User
+
+def get_django_user_for_email(email):
+    """Retourne un utilisateur Django avec le courriel donné.
+
+       S'il y a déjà un utilisateur avec ce courriel, on s'assure qu'il est activé.
+
+       Sinon, on crée un nouvel utilisateur."""
+    candidates = User.objects.filter(email=email)
+    if candidates.count() > 0:
+        user = candidates[0]
+        if not user.is_active:
+            user.is_active = True
+            user.save()
+    else:
+        username = email.split('@')[0]
+        username = re.sub('\W', '_', username)[:30]
+        i = 1
+        while User.objects.filter(username=username).count() > 0:
+            suffix = '_' + str(i)
+            username = username[:30-len(suffix)] + suffix
+            i += 1
+        # XXX: possible race condition here...
+        user = User.objects.create_user(username, email)
+        user.save()
+    return user
index 523dfab..2f1b0ce 100644 (file)
@@ -1,8 +1,8 @@
 # -*- encoding: utf-8 -*-
-import hashlib
 from chercheurs.decorators import chercheur_required
 from chercheurs.forms import RepertoireSearchForm, SetPasswordForm, ChercheurFormGroup 
 from chercheurs.models import Chercheur
+from chercheurs.utils import get_django_user_for_email
 from datamaster_modeles.models import Etablissement
 from django.shortcuts import render_to_response
 from django.http import HttpResponseRedirect, HttpResponse
@@ -10,27 +10,13 @@ from django.template import Context, RequestContext
 from django.template.loader import get_template
 from django.core.urlresolvers import reverse as url
 from django.core.mail import send_mail
-from django.conf import settings
-from django.contrib.auth.tokens import default_token_generator as token_generator
 from django.contrib.sites.models import RequestSite
 from django.utils import simplejson
 from django.utils.http import int_to_base36, base36_to_int
 from django.views.decorators.cache import never_cache
-
-from django.forms.models import inlineformset_factory
-
-from auf_references_client.models import Discipline, TypeImplantation
-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.models import User
-
-from django.db.models import Q
 from django.shortcuts import get_object_or_404
 
-from django.utils.translation import ugettext_lazy as _
-
 def index(request):
     """Répertoire des chercheurs"""
     search_form = RepertoireSearchForm(request.GET)
@@ -87,8 +73,9 @@ def activation(request, id_base36, token):
                 email = chercheur.courriel
                 chercheur.actif = True
                 chercheur.save()
-                chercheur.user.set_password(password)
-                chercheur.user.save()
+                user = get_django_user_for_email(email)
+                user.set_password(password)
+                user.save()
 
                 # Auto-login
                 login(request, authenticate(username=email, password=password))
@@ -109,7 +96,6 @@ def desinscription(request):
         if request.POST.get('confirmer'):
             chercheur.actif = False
             chercheur.save()
-            User.objects.filter(username=chercheur.courriel).delete()
             request.flash['message'] = "Vous avez été désinscrit du répertoire des chercheurs."
             return HttpResponseRedirect(url('django.contrib.auth.views.logout'))
         else:
index 4bd52e6..c5f52f7 100644 (file)
@@ -196,6 +196,7 @@ emit_source('savoirsenpartage_chercheurs',
                LEFT JOIN chercheurs_chercheurgroupe cg ON cg.chercheur = c.personne_ptr_id
                LEFT JOIN chercheurs_groupe g ON g.id = cg.groupe
                LEFT JOIN chercheurs_expertise ex ON ex.chercheur_id = c.personne_ptr_id
+               WHERE p.actif
                GROUP BY c.personne_ptr_id''',
             sql_query_info='SELECT * from chercheurs_chercheur WHERE id=$id',
             sql_attr_multi=['groupe_ids'],
index 1efb645..c736636 100644 (file)
@@ -90,7 +90,11 @@ TEMPLATE_DIRS = (
     os.path.join(os.path.dirname(__file__), "templates"),
 )
 
-AUTHENTICATION_BACKENDS = ('authentification.AUFBackend', 'authentification.EmailBackend')
+AUTHENTICATION_BACKENDS = (
+    'authentification.AUFBackend', 
+    'authentification.PersonneBackend',
+    'django.contrib.auth.backends.ModelBackend',
+)
 LOGIN_URL = '/chercheurs/connexion/'
 LOGIN_REDIRECT_URL = '/chercheurs/perso/'
 
diff --git a/auf_savoirs_en_partage/sql/2010-12-15.sql b/auf_savoirs_en_partage/sql/2010-12-15.sql
new file mode 100644 (file)
index 0000000..49964ae
--- /dev/null
@@ -0,0 +1,3 @@
+ALTER TABLE chercheurs_personne DROP COLUMN user_id;
+
+TRUNCATE django_session;