# -*- 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."""
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
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
# -*- 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
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')
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):
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')
--- /dev/null
+# 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
# -*- 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
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)
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))
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:
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'],
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/'
--- /dev/null
+ALTER TABLE chercheurs_personne DROP COLUMN user_id;
+
+TRUNCATE django_session;