Nouvelles options de recherche dans l'agenda (#561)
authorEric Mc Sween <eric.mcsween@gmail.com>
Fri, 29 Oct 2010 15:16:54 +0000 (11:16 -0400)
committerEric Mc Sween <eric.mcsween@gmail.com>
Fri, 29 Oct 2010 15:16:54 +0000 (11:16 -0400)
Les nouvelles options sont: titre, type, discipline, date.

auf_savoirs_en_partage/savoirs/forms.py
auf_savoirs_en_partage/savoirs/models.py

index b126abd..cfca6e4 100644 (file)
@@ -1,10 +1,26 @@
 # -*- encoding: utf-8 -*-
 import re
 from django import forms
+from django.db.models import Q
 from datamaster_modeles.models import Thematique, Pays, Region
 from models import Evenement, Discipline, Record, Actualite
 from savoirs.lib.recherche import build_search_regexp
 
+# Modifications custom aux champs Django
+
+class SEPDateField(forms.DateField):
+    """Un champ de date avec des valeurs par défaut un peu modifiées."""
+
+    def __init__(self, *args, **kwargs):
+
+        # La classe "date" active le datepicker dans sep.js
+        kwargs.setdefault('widget', forms.DateInput(*args, attrs={'class': 'date'}))
+
+        # Nous recevons les dates en format français
+        kwargs.setdefault('input_formats', ['%d/%m/%Y'])
+
+        forms.DateField.__init__(self, *args, **kwargs)
+
 # Formulaires de recherche
 
 class RechercheAvancee (forms.Form):
@@ -55,12 +71,8 @@ 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'])
+    date_min = SEPDateField(required=False, label="Depuis le")
+    date_max = SEPDateField(required=False, label="Jusqu'au") 
 
     def get_query_set(self):
         """Retourne l'ensemble des actualités qui correspondent aux valeurs
@@ -88,6 +100,12 @@ class EvenementSearchForm(forms.Form):
     """Formulaire de recherche pour les événements."""
 
     q = forms.CharField(required=False, label="Mots-clés")
+    titre = forms.CharField(required=False, label="Intitulé")
+    type = forms.ChoiceField(required=False, choices=(('', 'Tous'),)+Evenement.TYPE_CHOICES)
+    discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), 
+                                        required=False, label="Discipline", empty_label="Toutes")
+    date_min = SEPDateField(required=False, label="Depuis le") 
+    date_max = SEPDateField(required=False, label="Jusqu'au") 
     
     def get_query_set(self):
         """Retourne l'ensemble des événements qui correspondent aux valeurs
@@ -97,6 +115,21 @@ class EvenementSearchForm(forms.Form):
             query = self.cleaned_data['q']
             if query:
                 evenements = evenements.search(query)
+            titre = self.cleaned_data['titre']
+            if titre:
+                evenements = evenements.search_titre(titre)
+            type = self.cleaned_data['type']
+            if type:
+                evenements = evenements.filter(type=type)
+            discipline = self.cleaned_data['discipline']
+            if discipline:
+                evenements = evenements.filter(Q(discipline=discipline) | Q(discipline_secondaire=discipline))
+            date_min = self.cleaned_data['date_min']
+            if date_min:
+                evenements = evenements.filter(debut__gte=date_min)
+            date_max = self.cleaned_data['date_max']
+            if date_max:
+                evenements = evenements.filter(debut__lte=date_max)
         return evenements
 
     def get_search_regexp(self):
index 2eee6fa..0d3d8d7 100644 (file)
@@ -86,7 +86,19 @@ class EvenementQuerySet(models.query.QuerySet):
                            Q(contact__icontains=word))
         return qs
 
+    def search_titre(self, text):
+        qs = self
+        for word in text.split():
+            qs = qs.filter(titre__icontains=word)
+        return qs
+
 class Evenement(models.Model):
+    TYPE_CHOICES = ((u'Colloque', u'Colloque'),
+                    (u'Conférence', u'Conférence'),
+                    (u'Appel à contribution', u'Appel à contribution'),
+                    (u'Journée d\'étude', u'Journée d\'étude'),
+                    (None, u'Autre'))
+                   
     uid = models.CharField(max_length = 255, default = str(uuid.uuid1()))
     approuve = models.BooleanField(default = False)
     titre = models.CharField(max_length=255)
@@ -98,13 +110,7 @@ class Evenement(models.Model):
                                               "Discipline secondaire", 
                                               blank = True, null = True)
     mots_cles = models.TextField('Mots-Clés', blank = True, null = True)
-    type = models.CharField(max_length = 255, choices = \
-                            (('Colloque', 'Colloque'),
-                             ('Conférence', 'Conférence'),
-                             ('Appel à contribution', 'Appel à contribution'),
-                             ('Journée d\'étude', 'Journée d\'étude'),
-                             (None, 'Autre')
-                            )) #TODO: choices
+    type = models.CharField(max_length=255, choices=TYPE_CHOICES)
     fuseau = TimeZoneField(verbose_name = 'Fuseau horaire')
     debut = models.DateTimeField(default = datetime.datetime.now)
     fin = models.DateTimeField(default = datetime.datetime.now)