Nouvelles options de recherche dans l'agenda (#561)
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / savoirs / forms.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):