Recherche des chercheurs par nom
authorEric Mc Sween <eric.mcsween@gmail.com>
Tue, 2 Nov 2010 15:37:30 +0000 (11:37 -0400)
committerEric Mc Sween <eric.mcsween@gmail.com>
Tue, 2 Nov 2010 15:37:30 +0000 (11:37 -0400)
auf_savoirs_en_partage/chercheurs/forms.py
auf_savoirs_en_partage/chercheurs/models.py
auf_savoirs_en_partage/chercheurs/views.py

index 8eb451e..d47ab0d 100644 (file)
@@ -1,9 +1,8 @@
 # -*- encoding: utf-8 -*-
 from django import forms
+from django.db.models import Q
 from models import *
-from models import Utilisateur
 from savoirs.forms import SEPDateField
-from models import STATUT_CHOICES
 
 class PersonneForm(forms.ModelForm):
     password = forms.CharField(widget=forms.PasswordInput(), label="Mot de passe") 
@@ -70,12 +69,39 @@ class PersonneEditForm(forms.ModelForm):
         fields = ('nom', 'prenom', 'genre') 
 
 class RepertoireSearchForm (forms.Form):
-    mots_cles = forms.CharField (required = False, label="Mots-clés")
+    mots_cles = forms.CharField(required=False, label="Mots-clés")
+    nom = forms.CharField(required=False, label="Nom")
     discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Tous")
     domaine = forms.ModelChoiceField(queryset=Groupe.objects.all(), required=False, label="Domaine de recherche", empty_label="Tous")
     statut = forms.ChoiceField(choices=(('','Tous'),)+STATUT_CHOICES+(('expert','Expert'),), required=False, label="Statut")
     pays = forms.ModelChoiceField(queryset=Pays.objects.all().order_by("nom"), required=False, label="Localisation", empty_label="Tous")
       
+    def get_query_set(self):
+        qs = Chercheur.objects.all()
+        if self.is_valid():
+            nom = self.cleaned_data['nom']
+            if nom:
+                qs = qs.search_nom(nom)
+            pays = self.cleaned_data["pays"]
+            if pays:
+                qs = qs.filter(Q(etablissement__pays = pays.pk) | Q(etablissement_autre_pays = pays.pk))
+            discipline = self.cleaned_data["discipline"]
+            if discipline:
+                qs = qs.filter(discipline=discipline)
+            domaine = self.cleaned_data["domaine"]
+            if domaine:
+                qs = qs.filter(groupes=domaine)
+            mots_cles = self.cleaned_data["mots_cles"]
+            if mots_cles:
+                qs = qs.search(mots_cles)
+            statut = self.cleaned_data["statut"]
+            if statut:
+                if statut == "expert":
+                    qs = qs.exclude(expertise=None)
+                else:
+                    qs = qs.filter(statut=statut)
+        return qs
+    
 class SendPasswordForm(forms.Form):
     email = forms.EmailField(required=True, label="courriel")
     def clean_email(self):
index 193515a..9f2bffb 100644 (file)
@@ -41,6 +41,9 @@ class ChercheurManager(models.Manager):
     def search(self, text):
         return self.get_query_set().search(text)
 
+    def search_nom(self, nom):
+        return self.get_query_set().search_nom(nom)
+
 class ChercheurQuerySet(models.query.QuerySet):
 
     def search(self, text):
@@ -64,6 +67,17 @@ class ChercheurQuerySet(models.query.QuerySet):
                 q = q & part
         return self.filter(q).distinct() if q is not None else self
 
+    def search_nom(self, nom):
+        q = None
+        for word in nom.split():
+            part = Q(personne__nom__icontains=word) | Q(personne__prenom__icontains=word)
+            if q is None:
+                q = part
+            else:
+                q = q & part
+        return self.filter(q) if q is not None else self
+
+
 STATUT_CHOICES = (('enseignant', 'Enseignant-chercheur dans un établissement'), ('etudiant', 'Étudiant-chercheur doctorant'), ('independant', 'Chercheur indépendant docteur'))
 class Chercheur(models.Model):
     id = models.AutoField(primary_key=True, db_column='id')
index 67067f3..1875018 100644 (file)
@@ -124,46 +124,14 @@ def chercheur_login(request, template_name='registration/login.html', redirect_f
     }, context_instance=RequestContext(request))
     
     
-def chercheur_queryset (request):
-    list = Chercheur.objects.order_by("id")
-    pays = ""
-
-    simpleForm = RepertoireSearchForm (request.GET)
-    if simpleForm.is_valid ():
-        pays = simpleForm.cleaned_data["pays"]
-        if pays:
-            list = list.filter(Q(etablissement__pays = pays.pk) | Q(etablissement_autre_pays = pays.pk))
-        discipline = simpleForm.cleaned_data["discipline"]
-        if discipline:
-            list = list.filter(discipline=discipline)
-        domaine = simpleForm.cleaned_data["domaine"]
-        if domaine:
-            list = list.filter(groupes=domaine)
-        mots_cles = simpleForm.cleaned_data["mots_cles"]
-        if mots_cles:
-            list = list.search(mots_cles)
-        statut = simpleForm.cleaned_data["statut"]
-        if statut:
-            if statut == "expert":
-                list = list.exclude(expertise=None)
-            else:
-                list = list.filter(statut=statut)
-    return list
-    
 def index(request):
     """Répertoire des chercheurs"""
-    
-    chercheurs = chercheur_queryset (request)
-    repertoire_form = RepertoireSearchForm (request.GET)
-
+    search_form = RepertoireSearchForm(request.GET)
+    chercheurs = search_form.get_query_set()
     nb_chercheurs = chercheurs.count()
-    variables = { 'chercheurs': chercheurs,
-                  'nb_chercheurs': nb_chercheurs,
-                  'repertoire_form': repertoire_form,
-                }
-    return render_to_response ("chercheurs/index.html", \
-            Context (variables), 
-            context_instance = RequestContext(request))
+    return render_to_response("chercheurs/index.html",
+                              dict(chercheurs=chercheurs, nb_chercheurs=nb_chercheurs, repertoire_form=search_form),
+                              context_instance=RequestContext(request))
 
 def inscription(request):
     if request.method == 'POST':