Embryon de recherche pour les ressources.
authorEric Mc Sween <eric.mcsween@gmail.com>
Tue, 26 Oct 2010 18:35:35 +0000 (14:35 -0400)
committerEric Mc Sween <eric.mcsween@gmail.com>
Tue, 26 Oct 2010 18:35:35 +0000 (14:35 -0400)
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 617555a..5e18afd 100644 (file)
@@ -1,7 +1,9 @@
 # -*- encoding: utf-8 -*-
 from django import forms
 from datamaster_modeles.models import Thematique, Pays, Region
-from models import Evenement, Discipline
+from models import Evenement, Discipline, Record
+
+# Formulaires de recherche
 
 class RechercheAvancee (forms.Form):
     creator = forms.CharField (max_length=60, required=False, \
@@ -14,6 +16,22 @@ class RechercheAvancee (forms.Form):
     operator = forms.ChoiceField (choices = (('or', 'ou'), ('and', 'et')), label = "Operateur")
     type = forms.CharField (initial='avancee', required=False, widget=forms.HiddenInput)
 
+class RecordSearchForm(forms.Form):
+    """Formulaire de recherche pour les ressources."""
+
+    q = forms.CharField(required=False, label="Mots-clés")
+
+    def get_query_set(self):
+        """Retourne l'ensemble des ressources qui correspondent aux valeurs
+           entrées dans le formulaire."""
+        records = Record.objects.all()
+        if self.is_valid():
+            query = self.cleaned_data['q']
+            if query:
+                records = records.search(query)
+        return records
+
+###
 
 class EvenementForm(forms.ModelForm):
     class Meta:
index e228634..5b63eba 100644 (file)
@@ -34,6 +34,9 @@ class ActualiteManager(models.Manager):
     def get_query_set(self):
         return ActualiteQuerySet(self.model)
 
+    def search(self, text):
+        return self.get_query_set().search(text)
+
 class ActualiteQuerySet(models.query.QuerySet):
 
     def search(self, text):
@@ -188,6 +191,31 @@ class ListSet(models.Model):
     def __unicode__(self,):
         return self.name
 
+class RecordManager(models.Manager):
+    
+    def get_query_set(self):
+        return RecordQuerySet(self.model)
+
+    def search(self, text):
+        return self.get_query_set().search(text)
+
+class RecordQuerySet(models.query.QuerySet):
+
+    def search(self, text):
+        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')
+
 class Record(models.Model):
     
     #fonctionnement interne
@@ -228,6 +256,9 @@ class Record(models.Model):
     pays = models.ManyToManyField(Pays)
     regions = models.ManyToManyField(Region)
 
+    # Manager
+    objects = RecordManager()
+
     def est_complet(self,):
         """teste si le record à toutes les données obligatoires"""
         return self.disciplines.count() > 0 and \
index afcf518..71fbd01 100644 (file)
@@ -111,10 +111,10 @@ def conseils (request):
 
 # ressources
 def ressource_index(request):
-    ressources = Record.objects.all().order_by('?')
-    return render_to_response ("savoirs/ressource_index.html", \
-            Context ({'ressources':ressources}), \
-            context_instance = RequestContext(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},
+                              context_instance = RequestContext(request))
        
 def ressource_retrieve(request, id):
     """Notice OAI de la ressource"""
index f6a2506..c7a79fa 100644 (file)
@@ -6,19 +6,23 @@
 <h4>Ressources</h4>
 {% autopaginate ressources %}
 <div class="contenu-wrapper">
-<div class="centre">{% paginate %}</div>
-<table id="repertoire">
+  <form action="" method="get">
+    {{ search_form }}
+    <input type="submit" value="Rechercher" />
+  </form>
+  <div class="centre">{% paginate %}</div>
+  <table id="repertoire">
     <tr>
-        <th>Nom</th>
-        <th>Source</th>
+    <th>Nom</th>
+    <th>Source</th>
     </tr>
-{% for r in ressources %}
+    {% for r in ressources %}
     <tr class="{% cycle 'odd' 'notodd' %}">
-        <td><a href="{% url savoirs.views.ressource_retrieve r.id %}" class="le-titre">{{ r.title|truncatewords:11 }}</a></td>
-        <td>{{ r.server }}</td>
+    <td><a href="{% url savoirs.views.ressource_retrieve r.id %}" class="le-titre">{{ r.title|truncatewords:11 }}</a></td>
+    <td>{{ r.server }}</td>
     </tr>
-{% endfor %}
-</table>
-<div class="centre">{% paginate %}</div>
+    {% endfor %}
+  </table>
+  <div class="centre">{% paginate %}</div>
 </div>
 {% endblock %}