Affichage de la description dans les résultats de recherche de ressources.
authorEric Mc Sween <eric.mcsween@gmail.com>
Wed, 27 Oct 2010 14:14:06 +0000 (10:14 -0400)
committerEric Mc Sween <eric.mcsween@gmail.com>
Wed, 27 Oct 2010 14:14:06 +0000 (10:14 -0400)
Aussi, mise en évidence des mots-clés dans les résultats de recherche.

auf_savoirs_en_partage/savoirs/forms.py
auf_savoirs_en_partage/savoirs/templatetags/search.py [new file with mode: 0644]
auf_savoirs_en_partage/savoirs/views.py
auf_savoirs_en_partage/templates/savoirs/ressource_index.html

index 501519b..bf0bdd5 100644 (file)
@@ -1,4 +1,5 @@
 # -*- encoding: utf-8 -*-
+import re
 from django import forms
 from datamaster_modeles.models import Thematique, Pays, Region
 from models import Evenement, Discipline, Record
@@ -43,6 +44,33 @@ class RecordSearchForm(forms.Form):
                 records = records.search_sujet(sujet)
         return records
 
+    def get_search_regexp(self):
+        """Retourne une expression régulière compilée qui peut servir à
+           chercher les mot-clés recherchés dans un texte."""
+        if self.is_valid():
+            words = self.cleaned_data['q'].split()
+            if not words:
+                return None
+            parts = []
+            for word in words:
+                part = re.escape(word.lower())
+                # Les expressions régulières ne connaissent pas la version
+                # en majuscules des caractères accentués.  :(
+                part = part.replace(u'à', u'[àÀ]')
+                part = part.replace(u'â', u'[âÂ]')
+                part = part.replace(u'é', u'[éÉ]')
+                part = part.replace(u'ê', u'[êÊ]')
+                part = part.replace(u'î', u'[îÎ]')
+
+                # Faire ceci après avoir traité les caractères accentués...
+                part = part.replace('a', u'[aàâÀÂ]')
+                part = part.replace('e', u'[eéèëêÉÊ]')
+                part = part.replace('i', u'[iïîÎ]')
+                part = part.replace('o', u'[oô]')
+                part = part.replace('u', u'[uûüù]')
+
+                parts.append(part)
+            return re.compile('|'.join(parts), re.I) 
 ###
 
 class EvenementForm(forms.ModelForm):
diff --git a/auf_savoirs_en_partage/savoirs/templatetags/search.py b/auf_savoirs_en_partage/savoirs/templatetags/search.py
new file mode 100644 (file)
index 0000000..93877eb
--- /dev/null
@@ -0,0 +1,15 @@
+from django import template
+from django.utils.html import conditional_escape
+from django.utils.safestring import mark_safe
+
+register = template.Library()
+
+@register.filter
+def highlight(text, regexp, autoescape=None):
+    """Met en évidence les parties du texte qui correspondent à l'expression
+       régulière passée en argument."""
+    if autoescape:
+        text = conditional_escape(text)
+    if words:
+        text = words.sub(r'<b>\g<0></b>', text)
+    return mark_safe(text)
index 5776418..736910b 100644 (file)
@@ -113,11 +113,15 @@ 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,
-                               'nb_resultats': len(ressources)},
-                              context_instance = RequestContext(request))
-       
+    nb_resultats = len(ressources)
+    search_regexp = search_form.get_search_regexp()
+    return render_to_response(
+        "savoirs/ressource_index.html", 
+        {'search_form': search_form, 'ressources': ressources,
+         'nb_resultats': len(ressources), 'search_regexp': search_regexp},
+        context_instance = RequestContext(request)
+    )
+
 def ressource_retrieve(request, id):
     """Notice OAI de la ressource"""
     ressource = Record.objects.get(id=id)
index 2b858cc..809e84a 100644 (file)
@@ -1,6 +1,7 @@
 {% extends "container_base.html" %}
 
 {% load pagination_tags %}
+{% load search %}
 
 {% block contenu %}
 <h4>Ressources</h4>
   <div class="centre">{% paginate %}</div>
   <div class="zone-texte">
     {% for r in ressources %}
-    {% include "savoirs/resultat.html" %} 
+    <div class="resultatRecherche">
+      <a class="le-titre" href="{{ r.uri }}">{{ r.title|highlight:search_regexp }}</a>
+      {% if r.creator %}
+      <div><span class="lbl">Auteur:</span> {{ r.creator|highlight:search_regexp }}</div>
+      {% endif %}
+      {% if r.description %}
+      <div class="resultatResume"><span class="lbl">Description:</span> {{ r.description|highlight:search_regexp }}</div>
+      {% endif %}
+    </div>
     {% empty %}
     <div class="resultatRecherche">
       <h2>Aucun résultat trouvé</h2>