From 7bbf600c7759fd98db8fd6856543ce1197566401 Mon Sep 17 00:00:00 2001 From: Eric Mc Sween Date: Fri, 29 Oct 2010 11:16:54 -0400 Subject: [PATCH] Nouvelles options de recherche dans l'agenda (#561) Les nouvelles options sont: titre, type, discipline, date. --- auf_savoirs_en_partage/savoirs/forms.py | 45 ++++++++++++++++++++++++++---- auf_savoirs_en_partage/savoirs/models.py | 20 ++++++++----- 2 files changed, 52 insertions(+), 13 deletions(-) diff --git a/auf_savoirs_en_partage/savoirs/forms.py b/auf_savoirs_en_partage/savoirs/forms.py index b126abd..cfca6e4 100644 --- a/auf_savoirs_en_partage/savoirs/forms.py +++ b/auf_savoirs_en_partage/savoirs/forms.py @@ -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): diff --git a/auf_savoirs_en_partage/savoirs/models.py b/auf_savoirs_en_partage/savoirs/models.py index 2eee6fa..0d3d8d7 100644 --- a/auf_savoirs_en_partage/savoirs/models.py +++ b/auf_savoirs_en_partage/savoirs/models.py @@ -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) -- 1.7.10.4