Sites AUF + Amélioration de la performance de la recherche.
authorEric Mc Sween <eric.mcsween@gmail.com>
Fri, 29 Oct 2010 20:07:47 +0000 (16:07 -0400)
committerEric Mc Sween <eric.mcsween@gmail.com>
Fri, 29 Oct 2010 20:07:47 +0000 (16:07 -0400)
14 files changed:
auf_savoirs_en_partage/chercheurs/models.py
auf_savoirs_en_partage/savoirs/forms.py
auf_savoirs_en_partage/savoirs/lib/recherche.py
auf_savoirs_en_partage/savoirs/models.py
auf_savoirs_en_partage/savoirs/views.py
auf_savoirs_en_partage/sitotheque/models.py
auf_savoirs_en_partage/templates/container_base.html
auf_savoirs_en_partage/templates/menu.html
auf_savoirs_en_partage/templates/savoirs/conseils.html [deleted file]
auf_savoirs_en_partage/templates/savoirs/index.html
auf_savoirs_en_partage/templates/savoirs/sites_auf.html [new file with mode: 0644]
auf_savoirs_en_partage/templates/sites/actions.html [new file with mode: 0644]
auf_savoirs_en_partage/templates/sites/index.html
auf_savoirs_en_partage/urls.py

index 4ac6e23..f3351d8 100644 (file)
@@ -44,21 +44,25 @@ class ChercheurManager(models.Manager):
 class ChercheurQuerySet(models.query.QuerySet):
 
     def search(self, text):
-        qs = self
+        q = None
         for word in text.split():
-            qs = qs.filter(Q(personne__nom__icontains=word) |
-                           Q(personne__prenom__icontains=word) |
-                           Q(theme_recherche__icontains=word) |
-                           Q(etablissement_autre_nom__icontains=word) |
-                           Q(etablissement__nom__icontains=word) |
-                           Q(etablissement__pays__nom__icontains=word) |
-                           Q(discipline__nom__icontains=word) |
-                           Q(publication1__titre__icontains=word) |
-                           Q(publication2__titre__icontains=word) |
-                           Q(publication3__titre__icontains=word) |
-                           Q(publication4__titre__icontains=word) |
-                           Q(these__titre__icontains=word)).distinct()
-        return qs
+            part = (Q(personne__nom__icontains=word) |
+                    Q(personne__prenom__icontains=word) |
+                    Q(theme_recherche__icontains=word) |
+                    Q(etablissement_autre_nom__icontains=word) |
+                    Q(etablissement__nom__icontains=word) |
+                    Q(etablissement__pays__nom__icontains=word) |
+                    Q(discipline__nom__icontains=word) |
+                    Q(publication1__titre__icontains=word) |
+                    Q(publication2__titre__icontains=word) |
+                    Q(publication3__titre__icontains=word) |
+                    Q(publication4__titre__icontains=word) |
+                    Q(these__titre__icontains=word))
+            if q is None:
+                q = part
+            else:
+                q = q & part
+        return self.filter(q).distinct() if q is not None else self
 
 FONCTION_CHOICES = (('Professeur', 'Professeur'), ('Chercheur', 'Chercheur'), ('Chercheur_independant', 'Chercheur indépendant'), ('Doctorant', 'Doctorant'))
 class Chercheur(models.Model):
index 31d2c47..f1ff3b0 100644 (file)
@@ -26,17 +26,6 @@ class SEPDateField(forms.DateField):
 
 # Formulaires de recherche
 
-class RechercheAvancee (forms.Form):
-    creator = forms.CharField (max_length=60, required=False, \
-            label = "Auteur ou contributeur") # + contributor
-    title = forms.CharField (max_length=100, required=False, \
-            label = "Titre") # + alt_title
-    description = forms.CharField (max_length=100, required=False, \
-            label = "Description ou résumé") # + abstract
-    subject = forms.CharField (max_length=100, required=False, label = "Sujet")
-    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."""
 
index 9dde30c..c7ef9dc 100644 (file)
@@ -7,7 +7,8 @@ from sep import SEP
 from utils import smart_str
 from savoirs.globals import configuration
 
-def google_search (page, q, data):
+def google_search (page, q):
+    data = {'results': [], 'last_page': 0, 'more_link': ''}
     params = {'q': q,
               'rsz': 'large',
               'v': '1.0',
@@ -37,7 +38,7 @@ def google_search (page, q, data):
                         'title': r['title']} )
 
         data['more_link'] = response['responseData']['cursor']['moreResultsUrl']
-
+    return data
 
 def sep_build_content (regexp, description):
     maxlen = 200
@@ -148,7 +149,7 @@ def cherche (page, q, engin=None):
         engin = configuration['engin_recherche']
 
     if engin == 'google':
-        google_search (page, q, rc)
+        rc = google_search (page, q)
 
     elif engin == 'sep':
         sep_search (page, {'q': q}, rc)
index 093fd08..c0be775 100644 (file)
@@ -74,17 +74,21 @@ class EvenementQuerySet(models.query.QuerySet):
 
     def search(self, text):
         qs = self
-        words = text.split()
-        for word in words:
-            qs = qs.filter(Q(titre__icontains=word) | 
-                           Q(mots_cles__icontains=word) |
-                           Q(discipline__nom__icontains=word) | 
-                           Q(discipline_secondaire__nom__icontains=word) |
-                           Q(type__icontains=word) |
-                           Q(lieu__icontains=word) |
-                           Q(description__icontains=word) |
-                           Q(contact__icontains=word))
-        return qs
+        q = None
+        for word in text.split():
+            part = (Q(titre__icontains=word) | 
+                    Q(mots_cles__icontains=word) |
+                    Q(discipline__nom__icontains=word) | 
+                    Q(discipline_secondaire__nom__icontains=word) |
+                    Q(type__icontains=word) |
+                    Q(lieu__icontains=word) |
+                    Q(description__icontains=word) |
+                    Q(contact__icontains=word))
+            if q is None:
+                q = part
+            else:
+                q = q & part
+        return qs.filter(q)
 
     def search_titre(self, text):
         qs = self
@@ -252,12 +256,18 @@ class RecordQuerySet(models.query.QuerySet):
 
         # Ne garder que les ressources qui contiennent tous les mots
         # demandés.
+        q = None
         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) | Q(disciplines__nom__icontains=word) |
-                           Q(regions__nom__icontains=word) | Q(pays__nom__icontains=word) |
-                           Q(pays__region__nom__icontains=word)).distinct()
+            part = (Q(title__icontains=word) | Q(description__icontains=word) |
+                    Q(creator__icontains=word) | Q(contributor__icontains=word) |
+                    Q(subject__icontains=word) | Q(disciplines__nom__icontains=word) |
+                    Q(regions__nom__icontains=word) | Q(pays__nom__icontains=word) |
+                    Q(pays__region__nom__icontains=word))
+            if q is None:
+                q = part
+            else:
+                q = q & part
+        qs = qs.filter(q).distinct()
 
         # On donne un point pour chaque mot présent dans le titre.
         score_expr = ' + '.join(['(title LIKE %s)'] * len(words))
index 7116607..cb8de2f 100644 (file)
@@ -8,7 +8,7 @@ from django.contrib.auth.decorators import login_required
 from django.core.urlresolvers import reverse
 from django import forms
 from django.conf import settings
-from lib.recherche import cherche, google_search, build_search_regexp
+from lib.recherche import google_search, build_search_regexp
 from lib import sep
 from lib.calendrier import evenements, evenement_info, combine
 from savoirs.globals import configuration
@@ -74,45 +74,16 @@ def recherche(request):
         context_instance = RequestContext(request)
     )
 
-def avancee (request):
-    type = request.GET.get("type", "")
-    page = int(request.GET.get("page", 0))
-
-    r = {'results': [], 'last_page': 0, 'more_link': ''}
-
-    q = request.GET.get("google-q", "")
-    f = RechercheAvancee ()
-
-    if type == 'google':
-        r = cherche (page, q, type)
-        q = {'q': q}
-    elif type == 'avancee':
-        f = RechercheAvancee (request.GET)
-        if f.is_valid():
-            q = {}
-            for k in ['creator', 'title', 'description', 'subject']:
-                tmp = f.cleaned_data[k].strip()
-                if len (tmp) > 0:
-                    q[k] = tmp
-            q['operator'] = '|'
-            if f.cleaned_data['operator'] == 'and':
-                q['operator'] = "&"
-
-            r = cherche (page, q, type)
-
-    return render_to_response ("savoirs/avancee.html", \
-            Context ({'type': type,
-                      'page': page,
-                      'data': r,
-                      'search_regexp': None, # pour pouvoir utiliser la même template de résultat
-                      'form': f,
-                      'q': q}), 
-            context_instance = RequestContext(request))
-
-def conseils (request):
-    return render_to_response ("savoirs/conseils.html", \
-            Context (), \
-            context_instance = RequestContext(request))
+def sites_auf(request):
+    q = request.GET.get('q')
+    page = int(request.GET.get('page', 0))
+    try:
+        data = google_search(page, q) if q else None
+    except:
+        data = None
+    return render_to_response('savoirs/sites_auf.html',
+                              dict(google_q=q, data=data, page=page),
+                              context_instance=RequestContext(request))
 
 # ressources
 def ressource_index(request):
index ae000f5..12cfd1b 100644 (file)
@@ -29,15 +29,21 @@ class SiteQuerySet(models.query.QuerySet):
 
     def search(self, text):
         qs = self
+        q = None
         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) |
-                           Q(discipline__nom__icontains=word) |
-                           Q(pays__nom__icontains=word) |
-                           Q(pays__region__nom__icontains=word)).distinct()
+            part = (Q(titre__icontains=word) |
+                    Q(description__icontains=word) |
+                    Q(editeur__icontains=word) |
+                    Q(auteur__icontains=word) |
+                    Q(mots_cles__icontains=word) |
+                    Q(discipline__nom__icontains=word) |
+                    Q(pays__nom__icontains=word) |
+                    Q(pays__region__nom__icontains=word))
+            if q is None:
+                q = part
+            else:
+                q = q & part
+        qs = qs.filter(q).distinct()
         return qs
 
 class Site(models.Model):
index 36443df..fdecfd4 100644 (file)
                             <button title="Lancer la recherche" type="submit">&nbsp;</button>
                         </form>
 
-                        <p>
-                        <a href="{% url savoirs.views.avancee %}">Recherche avancée</a>
-                        {% comment %} | 
-                        <a href="{% url savoirs.views.conseils %}">Conseils</a>
-                        {% endcomment %}
-                        </p>
                     </div>
                 </div>
                 
index 6a955c5..aefa804 100644 (file)
 <h4><a href="">Régions</a></h4>
 <ul>
     {% for r in regions %}
-    <li><a href="{% url savoirs.views.avancee %}?type=avancee&operator=or&subject={{ r.nom }}">{{ r.nom }}</a></li>
+    <li><a href="{% url savoirs.views.recherche %}?q={{ r.nom|urlencode }}">{{ r.nom }}</a></li>
     {% endfor %}
 </ul>
 
 <h4><a href="">Disciplines</a></h4>
 <ul>
     {% for d in disciplines %}
-    <li><a href="{% url savoirs.views.avancee %}?type=avancee&operator=or&subject={{ d.nom }}">{{ d.nom }}</a></li>
+    <li><a href="{% url savoirs.views.recherche %}?q={{ d.nom|urlencode }}">{{ d.nom }}</a></li>
     {% endfor %}
 </ul>
diff --git a/auf_savoirs_en_partage/templates/savoirs/conseils.html b/auf_savoirs_en_partage/templates/savoirs/conseils.html
deleted file mode 100644 (file)
index 5929fdb..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-{% extends "container_base.html" %}
-
-{% block contenu %}
-<h4>Conseils pour la recherche</h4>
-
-<div class="zone-texte">
-    <p><i>Contenu a réécrire</i></p>
-</div>
-{% endblock %}
index 8b71d5a..5a4467c 100644 (file)
@@ -93,6 +93,7 @@
         
         <ul class="sous-menu">
             <li><a href="{% url sitotheque.views.index %}">Sitothèque</a></li>
+            {% include "sites/actions.html" %}
         </ul>
         
         <ul class="liste-de-l-accueil">
diff --git a/auf_savoirs_en_partage/templates/savoirs/sites_auf.html b/auf_savoirs_en_partage/templates/savoirs/sites_auf.html
new file mode 100644 (file)
index 0000000..4455158
--- /dev/null
@@ -0,0 +1,33 @@
+{% extends "container_base.html" %}
+
+{% block contenu %}
+<script>
+    $(document).ready(function(){
+        makePageLinks ({{ page|default:0 }}, {{ data.last_page|default:0 }}, 
+        '{{ data.more_link }}');
+    });
+</script>
+
+<h4>Sites &#8212; Sites AUF</h4>
+<div class="zone-texte">
+    <form method="get" action="" class="contenu-wrapper">
+        <p style="margin-top: 10px;"><input type="text" size="40" name="q" value="{{ google_q|default:""}}" /><input type="submit" name="" value="Chercher" /></p>
+    </form>
+
+    {% if data %}
+    <div id="results">
+        {% for r in data.results %}
+        {% include "savoirs/resultat.html" %}
+        {% empty %}
+        <div class="resultatRecherche">
+            <h2>Aucun résultat trouvé</h2>
+        </div>
+        {% endfor %}
+    </div>
+    <div class="resultatPages">
+        <span id="pageLinks">
+        </span>
+    </div>
+    {% endif %}
+</div>
+{% endblock %}
diff --git a/auf_savoirs_en_partage/templates/sites/actions.html b/auf_savoirs_en_partage/templates/sites/actions.html
new file mode 100644 (file)
index 0000000..e3463d5
--- /dev/null
@@ -0,0 +1 @@
+<li><a href="{% url savoirs.views.sites_auf %}">Sites AUF</a></li>
index e8dd86b..3fd0e3f 100644 (file)
@@ -5,7 +5,10 @@
 {% block contenu %}
 {% autopaginate sites 10 %}
 
-<h4>Sitothèque</h4>
+<h4>Sites &#8212; Sitothèque</h4>
+<ul class="actions">
+    {% include "sites/actions.html" %}
+</ul>
 
 <h5>Recherche</h5>
 
index 437f465..4a96af0 100644 (file)
@@ -44,8 +44,6 @@ urlpatterns = patterns(
     
     # recherche
     (r'^recherche/$', 'savoirs.views.recherche'),
-    (r'^recherche/avancee/$', 'savoirs.views.avancee'),
-    (r'^recherche/conseils/$', 'savoirs.views.conseils'),
     
     # ressources
     (r'^ressources/$', 'savoirs.views.ressource_index'),
@@ -76,6 +74,9 @@ urlpatterns = patterns(
     (r'^sites/$', 'sitotheque.views.index'),
     (r'^sites/(?P<id>\d+)/$', 'sitotheque.views.retrieve'),
 
+    # sites AUF
+    (r'^sites-auf/$', 'savoirs.views.sites_auf'),
+
     (r'^rss/(.*)/$', 'django.contrib.syndication.views.feed', {'feed_dict':site_feeds}),
     (r'^json/get/$', 'savoirs.views.json_get'),
     (r'^json/set/$', 'savoirs.views.json_set'),