Ajout des sites à la recherche transversale.
authorEric Mc Sween <eric.mcsween@gmail.com>
Thu, 28 Oct 2010 19:03:47 +0000 (15:03 -0400)
committerEric Mc Sween <eric.mcsween@gmail.com>
Thu, 28 Oct 2010 19:03:47 +0000 (15:03 -0400)
auf_savoirs_en_partage/savoirs/templatetags/search.py
auf_savoirs_en_partage/savoirs/views.py
auf_savoirs_en_partage/sitotheque/forms.py
auf_savoirs_en_partage/sitotheque/models.py
auf_savoirs_en_partage/sitotheque/views.py
auf_savoirs_en_partage/templates/container_base.html
auf_savoirs_en_partage/templates/savoirs/recherche.html
auf_savoirs_en_partage/templates/sites/index.html
auf_savoirs_en_partage/templates/sites/rechercher.html [deleted file]
auf_savoirs_en_partage/templates/sites/resultat.html [new file with mode: 0644]

index a3fb31b..f973f52 100644 (file)
@@ -1,6 +1,7 @@
 #coding: utf-8
 
 from django import template
+from django.template.defaultfilters import stringfilter
 from django.utils.html import conditional_escape
 from django.utils.safestring import mark_safe
 
@@ -9,6 +10,7 @@ register = template.Library()
 EXCERPT_LENGTH = 200
 
 @register.filter
+@stringfilter
 def highlight(text, regexp=None, autoescape=None):
     """Met en évidence les parties du texte qui correspondent à l'expression
        régulière passée en argument."""
@@ -19,6 +21,7 @@ def highlight(text, regexp=None, autoescape=None):
     return mark_safe(text)
 
 @register.filter
+@stringfilter
 def excerpt(text, regexp=None):
     """Tronque le texte autour de la première correspondance de l'expression
        régulière."""
index 48cd265..6148bc3 100644 (file)
@@ -56,14 +56,16 @@ def recherche(request):
     actualites = Actualite.objects.filter(visible=1).search(query)
     evenements = Evenement.objects.filter(approuve=1).search(query)
     chercheurs = Chercheur.objects.search(query)
+    sites = Site.objects.search(query)
     search_regexp = build_search_regexp(query)
     return render_to_response(
         "savoirs/recherche.html",
-        dict(q=query, ressources=ressources[:5], actualites=actualites[:5],
-             evenements=evenements[:5], total_evenements=len(evenements),
-             chercheurs=chercheurs[:10], total_chercheurs=len(chercheurs),
-             total_ressources=len(ressources), total_actualites=len(actualites),
-             search_regexp=search_regexp),
+        dict(q=query, search_regexp=search_regexp,
+             ressources=ressources[:5], total_ressources=ressources.count(), 
+             evenements=evenements[:5], total_evenements=evenements.count(),
+             chercheurs=chercheurs[:10], total_chercheurs=chercheurs.count(),
+             actualites=actualites[:5], total_actualites=actualites.count(),
+             sites=sites[:5], total_sites=sites.count()),
         context_instance = RequestContext(request)
     )
 
@@ -110,12 +112,12 @@ def conseils (request):
 def ressource_index(request):
     search_form = RecordSearchForm(request.GET)
     ressources = search_form.get_query_set()
-    nb_resultats = len(ressources)
+    nb_resultats = ressources.count()
     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},
+         'nb_resultats': nb_resultats, 'search_regexp': search_regexp},
         context_instance = RequestContext(request)
     )
 
@@ -149,7 +151,7 @@ def actualite_index(request):
                               dict(actualites=actualites,
                                    search_form=search_form,
                                    search_regexp=search_regexp,
-                                   nb_resultats=len(actualites)),
+                                   nb_resultats=actualites.count()),
                               context_instance = RequestContext(request))
 
 # agenda
@@ -161,7 +163,7 @@ def evenement_index(request):
                               dict(evenements=evenements,
                                    search_form=search_form,
                                    search_regexp=search_regexp,
-                                   nb_resultats=len(evenements)),
+                                   nb_resultats=evenements.count()),
                               context_instance=RequestContext(request))
 
 def evenement(request, id):
index 423188e..930826f 100644 (file)
@@ -1,12 +1,31 @@
 # -*- encoding: utf-8 -*-
 from django import forms
 from models import *
+from savoirs.lib.recherche import build_search_regexp
 
 class SiteSearchForm(forms.Form):
-      mots_cles = forms.CharField (required = False, label="Mots-clés")
-      discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Tous")
-      
-      # On ne veut pas la thématique pour l'instant
-      # thematique = forms.ModelChoiceField(queryset=Thematique.objects.all(), required=False, label="Thématique", empty_label="Tous")
-      pays = forms.ModelChoiceField(queryset=Pays.objects.all(), required=False, label="Pays", empty_label="Tous")
+    mots_cles = forms.CharField (required = False, label="Mots-clés")
+    discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Tous")
+    pays = forms.ModelChoiceField(queryset=Pays.objects.all(), required=False, label="Pays", empty_label="Tous")
 
+    def get_query_set(self):
+        """Retourne l'ensemble des sites qui correspondent aux valeurs
+           entrées dans le formulaire."""
+        sites = Site.objects.order_by("titre")
+        if self.is_valid ():
+            pays = self.cleaned_data["pays"]
+            if pays:
+                sites = sites.filter(pays=pays.pk)
+            discipline = self.cleaned_data["discipline"]
+            if discipline:
+                sites = sites.filter(discipline=discipline)
+            mots_cles = self.cleaned_data["mots_cles"]
+            if mots_cles:
+                sites = sites.search(mots_cles)
+        return sites
+
+    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():
+            return build_search_regexp(self.cleaned_data['mots_cles'])
index f6ed23a..ba8cc8d 100644 (file)
@@ -1,5 +1,6 @@
 # -*- encoding: utf-8 -*-
 from django.db import models
+from django.db.models import Q
 from datamaster_modeles.models import *
 from savoirs.models import Discipline
 
@@ -16,6 +17,26 @@ TYPE_SITE_CHOICES = (
     ('AU', 'Autre type de site'),
     )
 
+class SiteManager(models.Manager):
+
+    def get_query_set(self):
+        return SiteQuerySet(self.model)
+
+    def search(self, text):
+        return self.get_query_set().search(text)
+
+class SiteQuerySet(models.query.QuerySet):
+
+    def search(self, text):
+        qs = self
+        for word in text.split():
+            qs = qs.filter(Q(titre__icontains=word) |
+                           Q(description__icontains=word) |
+                           Q(editeur__icontains=word) |
+                           Q(auteur__icontains=word) |
+                           Q(mots_cles__icontains=word)) 
+        return qs
+
 class Site(models.Model):
     """Fiche d'info d'un site web"""
     url = models.URLField(verify_exists=False)   # dc:identifier (dc:source?)
@@ -40,6 +61,9 @@ class Site(models.Model):
     # meta
     actif = models.BooleanField()
     date_maj = models.DateField(auto_now=True)
+
+    # Manager
+    objects = SiteManager()
     
     def __unicode__(self):
         return "%s" % (self.titre)
index 687a084..5081668 100644 (file)
@@ -6,45 +6,15 @@ from django.db.models import Q
 from models import Site
 from forms import SiteSearchForm
 
-def search_queryset(request):
-    list = Site.objects.order_by("titre")
-    pays = ""
-
-    simpleForm = SiteSearchForm(request.GET)
-    if simpleForm.is_valid ():
-        pays = simpleForm.cleaned_data["pays"]
-        if pays:
-            list = list.filter(pays = pays.pk)
-        discipline = simpleForm.cleaned_data["discipline"]
-        if discipline:
-            list = list.filter(discipline=discipline)
-
-        # XXX: On ne veut pas chercher par thématique pour l'instant
-        # thematique = simpleForm.cleaned_data["thematique"]
-        # if thematique:
-        #     list = list.filter(thematique=thematique)            
-            
-        mots_cles = simpleForm.cleaned_data["mots_cles"]
-        if mots_cles:
-            list = list.filter( Q(titre__icontains=mots_cles) 
-                               | Q(description__icontains=mots_cles)
-                               | Q(editeur__icontains=mots_cles)
-                               | Q(auteur__icontains=mots_cles)
-                               | Q(mots_cles__icontains=mots_cles) )
-    return list
-
-
 def index(request):
-    sites = search_queryset(request)
-    site_form = SiteSearchForm(request.GET)
+    search_form = SiteSearchForm(request.GET)
+    sites = search_form.get_query_set()
+    search_regexp = search_form.get_search_regexp()
     nb_sites = sites.count()
-    variables = { 'sites': sites,
-                  'site_form': site_form,
-                  'nb_sites': nb_sites,
-                }
-    return render_to_response ("sites/index.html", \
-            Context(variables), 
-            context_instance = RequestContext(request))
+    return render_to_response("sites/index.html",
+                              dict(sites=sites, search_form=search_form, 
+                                   search_regexp=search_regexp, nb_sites=nb_sites), 
+                              context_instance = RequestContext(request))
             
 def retrieve(request, id):
     """Fiche du site"""
index 078d0ee..fc8be4c 100644 (file)
@@ -70,7 +70,7 @@
                     </h2>
 
                     <div class="boite-recherche">
-                        <h3>Recherche <span>dans les ressources scientifiques</span></h3>
+                        <h3>Recherche</h3>
 
                         <form name="fRecherche" id="fRecherche" action="{% url savoirs.views.recherche %}" method="get">
                             <input name="q" id="recherche" type="text" value="{{ q|default:"" }}" />
index 4b3587b..ee12d41 100644 (file)
     <li><a href="{% url chercheurs.views.retrieve chercheur.id %}">{{ chercheur.personne.prenom }} {{ chercheur.personne.nom }}</a></li>
     {% endfor %}
   </ul>
+  {% ifnotequal chercheurs|length total_chercheurs %}
+  <p><a href="{% url chercheurs.views.index %}?q={{ q|urlencode }}">Tous les {{ total_chercheurs }} chercheurs correspondant à « {{ q }} »</a></p>
+  {% endifnotequal %}
+
   {% endif %}
   
-  {% if not ressources and not actualites and not evenements and not chercheurs %}
+  {% if sites %}
+  <h4>Sites correspondant à « {{ q }} » ({{ sites|length }} sur {{ total_sites }}):</h4>
+  {% for site in sites %}
+  {% include "sites/resultat.html" %}
+  {% endfor %}
+  {% ifnotequal sites|length total_sites %}
+  <p><a href="{% url sitotheque.views.index %}?mots_cles={{ q|urlencode }}">Tous les {{ total_sites }} sites correspondant à « {{ q }} »</a></p>
+  {% endifnotequal %}
+  {% endif %}
+
+  {% if not ressources and not actualites and not evenements and not chercheurs and not sites %}
   <h4>Aucune ressource ne correspond à « {{ q }} »</h4>
   <p><a href="{% url savoirs.views.index %}">Retour à la page d'accueil</a></p>
   {% endif %}
index 55b5e66..965a247 100644 (file)
@@ -1,5 +1,26 @@
 {% extends "container_base.html" %}
+{% load pagination_tags %}
+{% load sorting_tags %}
 
 {% block contenu %}
-{% include "sites/rechercher.html" %}
+{% autopaginate sites 10 %}
+
+<h4>Sitothèque</h4>
+
+<div class="contenu-wrapper">
+
+  <form method="get" action="">
+    <table id="repertoire_recherche">
+      {{search_form.as_table}}
+      <tr><th></th><td><input type="submit" class="bouton" value="Rechercher" /></td></tr>
+    </table>
+  </form>
+
+  <p><strong>{{nb_sites}} site{{ nb_sites|pluralize }} correspondant à votre recherche :</strong></p>
+  <div class="centre">{% paginate %}</div>
+  {% for site in sites %}
+  {% include "sites/resultat.html" %}
+  {% endfor %}
+  <div class="centre">{% paginate %}</div>
+</div>
 {% endblock %}
diff --git a/auf_savoirs_en_partage/templates/sites/rechercher.html b/auf_savoirs_en_partage/templates/sites/rechercher.html
deleted file mode 100644 (file)
index d1d4007..0000000
+++ /dev/null
@@ -1,39 +0,0 @@
-{% load pagination_tags %}
-{% load sorting_tags %}
-
-{% autosort sites %}
-{% autopaginate sites 20 %}
-
-<h4>Sitothèque</h4>
-
-<div class="contenu-wrapper">
-
-<form method="get" action="">
-  <table id="repertoire_recherche">
-    {{site_form.as_table}}
-    <tr>
-      <td colspan="2" class="Lib">
-        <input type="submit" class="bouton" value="Rechercher" />
-      </td>
-    </tr>
-  </table>
-</form>
-
-<p><strong>{{nb_sites}} site{{ nb_sites|pluralize }} correspondant à votre recherche :</strong></p>
-<div class="centre">{% paginate %}</div>
-<table id="repertoire">
-    <tr>
-        <th>Nom</th>
-        <th></th>
-    </tr>
-{% for s in sites %}
-    <tr class="{% cycle 'odd' 'notodd' %}">
-        <td><a href="{% url sitotheque.views.retrieve s.id %}">{{ s }}</a></td>
-        <td><a href="{{s.url}}"><img src="/media/img/page_white_link.png" /></a></td>
-    </tr>
-{% endfor %}
-</table>
-<div class="centre">{% paginate %}</div>
-</div>
-
-
diff --git a/auf_savoirs_en_partage/templates/sites/resultat.html b/auf_savoirs_en_partage/templates/sites/resultat.html
new file mode 100644 (file)
index 0000000..25f734c
--- /dev/null
@@ -0,0 +1,7 @@
+{% load search %}
+
+<div class="resultatRecherche">
+  <div><a class="le-titre" href="{% url sitotheque.views.retrieve site.id %}">{{ site|highlight:search_regexp }}</a></div>
+  <div class="resultatResume">{{ site.description|excerpt:search_regexp|highlight:search_regexp }}</div>
+  <div><span class="lbl">URL:</span> <a href="{{ site.url }}">{{ site.url }}</a></div>
+</div>