Recherche d'actualités par date.
authorEric Mc Sween <eric.mcsween@gmail.com>
Wed, 27 Oct 2010 20:15:24 +0000 (16:15 -0400)
committerEric Mc Sween <eric.mcsween@gmail.com>
Wed, 27 Oct 2010 20:15:24 +0000 (16:15 -0400)
Aussi: diverses améliorations à la recherche d'actualités.

auf_savoirs_en_partage/media/js/jquery/jquery.ui.datepicker-fr.js [new file with mode: 0644]
auf_savoirs_en_partage/media/js/sep.js
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/container_base.html
auf_savoirs_en_partage/templates/savoirs/actualite_index.html
auf_savoirs_en_partage/templates/savoirs/actualite_resultat.html

diff --git a/auf_savoirs_en_partage/media/js/jquery/jquery.ui.datepicker-fr.js b/auf_savoirs_en_partage/media/js/jquery/jquery.ui.datepicker-fr.js
new file mode 100644 (file)
index 0000000..134bda6
--- /dev/null
@@ -0,0 +1,23 @@
+/* French initialisation for the jQuery UI date picker plugin. */
+/* Written by Keith Wood (kbwood{at}iinet.com.au) and Stéphane Nahmani (sholby@sholby.net). */
+jQuery(function($){
+       $.datepicker.regional['fr'] = {
+               closeText: 'Fermer',
+               prevText: '&#x3c;Préc',
+               nextText: 'Suiv&#x3e;',
+               currentText: 'Courant',
+               monthNames: ['Janvier','Février','Mars','Avril','Mai','Juin',
+               'Juillet','Août','Septembre','Octobre','Novembre','Décembre'],
+               monthNamesShort: ['Jan','Fév','Mar','Avr','Mai','Jun',
+               'Jul','Aoû','Sep','Oct','Nov','Déc'],
+               dayNames: ['Dimanche','Lundi','Mardi','Mercredi','Jeudi','Vendredi','Samedi'],
+               dayNamesShort: ['Dim','Lun','Mar','Mer','Jeu','Ven','Sam'],
+               dayNamesMin: ['Di','Lu','Ma','Me','Je','Ve','Sa'],
+               weekHeader: 'Sm',
+               dateFormat: 'dd/mm/yy',
+               firstDay: 1,
+               isRTL: false,
+               showMonthAfterYear: false,
+               yearSuffix: ''};
+       $.datepicker.setDefaults($.datepicker.regional['fr']);
+});
\ No newline at end of file
index a4f48bf..9d452c3 100644 (file)
@@ -11,4 +11,7 @@ $(document).ready(function() {
     
     });
 
+    // Activer le datepicker sur les input de classe "date"
+    $.datepicker.setDefaults($.datepicker.regional['fr']);
+    $('input:text.date').datepicker();
 });
index 845e9f1..55ea04f 100644 (file)
@@ -2,7 +2,7 @@
 import re
 from django import forms
 from datamaster_modeles.models import Thematique, Pays, Region
-from models import Evenement, Discipline, Record
+from models import Evenement, Discipline, Record, Actualite
 from savoirs.lib.recherche import build_search_regexp
 
 # Formulaires de recherche
@@ -51,6 +51,39 @@ class RecordSearchForm(forms.Form):
         if self.is_valid():
             return build_search_regexp(self.cleaned_data['q'])
 
+class ActualiteSearchForm(forms.Form):
+    """Formulaire de recherche pour les actualités."""
+
+    q = forms.CharField(required=False, label="Mots-clés")
+    date_min = forms.DateField(required=False, label="Depuis le", 
+                               widget=forms.DateInput(attrs={'class': 'date'}),
+                               input_formats=['%d/%m/%Y'])
+    date_max = forms.DateField(required=False, label="Jusqu'au", 
+                               widget=forms.DateInput(attrs={'class': 'date'}),
+                               input_formats=['%d/%m/%Y'])
+
+    def get_query_set(self):
+        """Retourne l'ensemble des actualités qui correspondent aux valeurs
+           entrées dans le formulaire."""
+        actualites = Actualite.objects.all()
+        if self.is_valid():
+            query = self.cleaned_data['q']
+            if query:
+                actualites = actualites.search(query)
+            date_min = self.cleaned_data['date_min']
+            if date_min:
+                print date_min
+                actualites = actualites.filter(date__gte=date_min)
+            date_max = self.cleaned_data['date_max']
+            if date_max:
+                actualites = actualites.filter(date__lte=date_max)
+        return actualites
+    
+    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['q'])
 ###
 
 class EvenementForm(forms.ModelForm):
index f336f19..3c3ee58 100644 (file)
@@ -41,7 +41,7 @@ class ActualiteManager(models.Manager):
 class ActualiteQuerySet(models.query.QuerySet):
 
     def search(self, text):
-        return self.filter(titre__icontains=text)
+        return self.filter(Q(titre__icontains=text) | Q(texte__icontains=text))
 
 class Actualite(models.Model):
     id = models.AutoField(primary_key=True, db_column='id_actualite')
index 18a8e44..7734388 100644 (file)
@@ -147,14 +147,14 @@ def informations (request):
 
 # actualités
 def actualite_index(request):
-    delta = datetime.timedelta(days=90)
-    oldest = datetime.date.today() - delta
-    actualites = Actualite.objects.filter(visible=True, date__gt=oldest)
-    query = request.GET.get('q')
-    if query:
-        actualites = actualites.search(query)
+    search_form = ActualiteSearchForm(request.GET)
+    actualites = search_form.get_query_set()
+    search_regexp = search_form.get_search_regexp()
     return render_to_response("savoirs/actualite_index.html",
-                              {'actualites': actualites},
+                              dict(actualites=actualites,
+                                   search_form=search_form,
+                                   search_regexp=search_regexp,
+                                   nb_resultats=len(actualites)),
                               context_instance = RequestContext(request))
 
 # agenda
index a696b63..078d0ee 100644 (file)
@@ -5,13 +5,10 @@
         <title>Savoirs en partage - Agence universitaire de la Francophonie</title>
         <script type="text/javascript" src="{{ MEDIA_URL }}js/jquery/jquery.js"></script>
         <script type="text/javascript" src="{{ MEDIA_URL }}js/jquery/jquery-ui.js"></script>
+        <script type="text/javascript" src="{{ MEDIA_URL }}js/jquery/jquery.ui.datepicker-fr.js"></script>
         <script type="text/javascript" src="{{ MEDIA_URL }}js/tabber.js"></script>
         <script type="text/javascript" src="{{ MEDIA_URL }}js/pagination.js"></script>
         <script type="text/javascript" src="{{ MEDIA_URL }}js/sep.js"></script>
-        <script type="text/javascript" src="{{ MEDIA_URL }}js/jquery/jquery.datepicker.js"></script>
-        <script type="text/javascript" src="{{ MEDIA_URL }}js/jquery/jquery.timepicker.js"></script>
-        <link href="{{ MEDIA_URL }}css/jquery/jquery.datepicker.css" rel="stylesheet" type="text/css" />
-        <link href="{{ MEDIA_URL }}css/jquery/jquery.timepicker.css" rel="stylesheet" type="text/css" />
         <link href="{{ MEDIA_URL }}css/global.css" rel="stylesheet" type="text/css" />
         <link href="{{ MEDIA_URL }}css/tabber.css" rel="stylesheet" type="text/css" />
         <link rel="stylesheet" href="{{ MEDIA_URL }}js/jquery/css/smoothness/jquery-ui-1.8rc3.custom.css" type="text/css" media="all" />
index 37d5943..8d46603 100644 (file)
@@ -3,7 +3,7 @@
 {% load pagination_tags %}
 
 {% block contenu %}
-{% autopaginate actualites %}
+{% autopaginate actualites 10 %}
 <h4>Actualités</h4>
 <ul class="actions">
   <li><a href="/rss/actualites"><img src="/media/img/feed.png" /></a></li>
 
 <div class="contenu-wrapper">
   <form action="" method="get">
-    <input type="text" name="q" value="{{ request.GET.q }}" size="50" />
-    <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 }} actualités correspondant à votre recherche :</strong></p>
   <div class="centre">{% paginate %}</div>
-  <table id="repertoire">
-    <tr>
-    <th>Nom</th>
-    <th>Source</th>
-    </tr>
-    {% for actualite in actualites %}
-    <tr class="{% cycle 'odd' 'notodd' %}">
-    <td><a href="{{ actualite.url }}" class="le-titre">{{ actualite.titre|truncatewords:20 }}</a></td>
-    <td>{{ actualite.source.nom }}</td>
-    </tr>
-    {% endfor %}
-  </table>
+  {% for actualite in actualites %}
+  {% include "savoirs/actualite_resultat.html" %}
+  {% endfor %}
   <div class="centre">{% paginate %}</div>
 </div>
 {% endblock %}
index 1c2d2d9..103094f 100644 (file)
@@ -1,7 +1,11 @@
 {% load search %}
 
 <div class="resultatRecherche">
+  <div class="la-date">{{ actualite.date|date:"d F Y" }}</div>
   <a class="le-titre" href="{{ actualite.url }}">{{ actualite.titre|highlight:search_regexp }}</a>
   <div class="resultatResume">{{ actualite.texte|highlight:search_regexp }}</div>
+  {% if actualite.source %}
+  <div><span class="lbl">Source:</span> {{ actualite.source.nom }}</div>
+  {% endif %}
 </div>