"""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
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
###
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
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
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):
{% 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>