Recherche de ressources par auteur, titre, sujet.
authorEric Mc Sween <eric.mcsween@gmail.com>
Tue, 26 Oct 2010 20:25:30 +0000 (16:25 -0400)
committerEric Mc Sween <eric.mcsween@gmail.com>
Tue, 26 Oct 2010 20:25:30 +0000 (16:25 -0400)
Aussi: amélioration de la recherche par mots-clés.

auf_savoirs_en_partage/savoirs/forms.py
auf_savoirs_en_partage/savoirs/models.py
auf_savoirs_en_partage/savoirs/views.py
auf_savoirs_en_partage/templates/savoirs/ressource_index.html

index 5e18afd..501519b 100644 (file)
@@ -20,6 +20,9 @@ class RecordSearchForm(forms.Form):
     """Formulaire de recherche pour les ressources."""
 
     q = forms.CharField(required=False, label="Mots-clés")
+    auteur = forms.CharField(required=False, label="Auteur ou contributeur")
+    titre = forms.CharField(required=False, label="Titre")
+    sujet = forms.CharField(required=False, label="Sujet")
 
     def get_query_set(self):
         """Retourne l'ensemble des ressources qui correspondent aux valeurs
@@ -29,6 +32,15 @@ class RecordSearchForm(forms.Form):
             query = self.cleaned_data['q']
             if query:
                 records = records.search(query)
+            auteur = self.cleaned_data['auteur']
+            if auteur:
+                records = records.search_auteur(auteur)
+            titre = self.cleaned_data['titre']
+            if titre:
+                records = records.search_titre(titre)
+            sujet = self.cleaned_data['sujet']
+            if sujet:
+                records = records.search_sujet(sujet)
         return records
 
 ###
index 574eeb1..f336f19 100644 (file)
@@ -2,6 +2,7 @@
 import simplejson, uuid, datetime, caldav, vobject, uuid
 from django.contrib.auth.models import User
 from django.db import models
+from django.db.models import Q
 from django.db.models.signals import pre_delete
 from timezones.fields import TimeZoneField
 from auf_savoirs_en_partage.backend_config import RESOURCES
@@ -202,20 +203,42 @@ class RecordManager(models.Manager):
 class RecordQuerySet(models.query.QuerySet):
 
     def search(self, text):
+        qs = self
         words = text.split()
-        score_parts = []
-        score_params = []
-        for word in words:
-            score_parts.append('(title LIKE %s)')
-            score_params.append('%' + word + '%')
-        score_expr = ' + '.join(score_parts)
-        return self.extra(
-            select={'relevance': score_expr},
-            select_params=score_params,
-            where=[score_expr],
-            params=score_params
-        ).order_by('-relevance')
 
+        # Ne garder que les ressources qui contiennent tous les mots
+        # demandés.
+        for word in words:
+            qs = qs.filter(Q(title__icontains=word) | Q(description__icontains=word) |
+                           Q(creator__icontains=word) | Q(contributor__icontains=word) |
+                           Q(subject__icontains=word))
+
+        # On donne un point pour chaque mot présent dans le titre.
+        score_expr = ' + '.join(['(title LIKE %s)'] * len(words))
+        score_params = ['%' + word + '%' for word in words]
+        return qs.extra(
+            select={'score': score_expr},
+            select_params=score_params
+        ).order_by('-score')
+
+    def search_auteur(self, text):
+        qs = self
+        for word in text.split():
+            qs = qs.filter(Q(creator__icontains=word) | Q(contributor__icontains=word))
+        return qs
+
+    def search_sujet(self, text):
+        qs = self
+        for word in text.split():
+            qs = qs.filter(subject__icontains=word)
+        return qs
+
+    def search_titre(self, text):
+        qs = self
+        for word in text.split():
+            qs = qs.filter(title__icontains=word)
+        return qs
+            
 class Record(models.Model):
     
     #fonctionnement interne
index 71fbd01..5776418 100644 (file)
@@ -113,7 +113,9 @@ def conseils (request):
 def ressource_index(request):
     search_form = RecordSearchForm(request.GET)
     ressources = search_form.get_query_set()
-    return render_to_response("savoirs/ressource_index.html", {'search_form': search_form, 'ressources': ressources},
+    return render_to_response("savoirs/ressource_index.html", 
+                              {'search_form': search_form, 'ressources': ressources,
+                               'nb_resultats': len(ressources)},
                               context_instance = RequestContext(request))
        
 def ressource_retrieve(request, id):
index c7a79fa..8774363 100644 (file)
@@ -7,9 +7,12 @@
 {% autopaginate ressources %}
 <div class="contenu-wrapper">
   <form action="" method="get">
-    {{ search_form }}
-    <input type="submit" value="Rechercher" />
+    <table>
+      {{ search_form.as_table }}
+      <tr><th></th><td><input type="submit" value="Rechercher" /></td></tr>
+    </table>
   </form>
+  <p><strong>{{ nb_resultats }} ressources correspondant à votre recherche :</strong></p>
   <div class="centre">{% paginate %}</div>
   <table id="repertoire">
     <tr>