Nouvelles options de recherche dans l'agenda (#561)
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / savoirs / forms.py
CommitLineData
544b4522 1# -*- encoding: utf-8 -*-
f61e4846 2import re
544b4522 3from django import forms
7bbf600c 4from django.db.models import Q
0a77a7d6 5from datamaster_modeles.models import Thematique, Pays, Region
c9cbc784 6from models import Evenement, Discipline, Record, Actualite
0b72ebef 7from savoirs.lib.recherche import build_search_regexp
da44ce68 8
7bbf600c
EMS
9# Modifications custom aux champs Django
10
11class SEPDateField(forms.DateField):
12 """Un champ de date avec des valeurs par défaut un peu modifiées."""
13
14 def __init__(self, *args, **kwargs):
15
16 # La classe "date" active le datepicker dans sep.js
17 kwargs.setdefault('widget', forms.DateInput(*args, attrs={'class': 'date'}))
18
19 # Nous recevons les dates en format français
20 kwargs.setdefault('input_formats', ['%d/%m/%Y'])
21
22 forms.DateField.__init__(self, *args, **kwargs)
23
da44ce68 24# Formulaires de recherche
544b4522
CR
25
26class RechercheAvancee (forms.Form):
27 creator = forms.CharField (max_length=60, required=False, \
28 label = "Auteur ou contributeur") # + contributor
29 title = forms.CharField (max_length=100, required=False, \
30 label = "Titre") # + alt_title
31 description = forms.CharField (max_length=100, required=False, \
32 label = "Description ou résumé") # + abstract
33 subject = forms.CharField (max_length=100, required=False, label = "Sujet")
34 operator = forms.ChoiceField (choices = (('or', 'ou'), ('and', 'et')), label = "Operateur")
35 type = forms.CharField (initial='avancee', required=False, widget=forms.HiddenInput)
36
da44ce68
EMS
37class RecordSearchForm(forms.Form):
38 """Formulaire de recherche pour les ressources."""
39
40 q = forms.CharField(required=False, label="Mots-clés")
f12cc7fb
EMS
41 auteur = forms.CharField(required=False, label="Auteur ou contributeur")
42 titre = forms.CharField(required=False, label="Titre")
43 sujet = forms.CharField(required=False, label="Sujet")
da44ce68
EMS
44
45 def get_query_set(self):
46 """Retourne l'ensemble des ressources qui correspondent aux valeurs
47 entrées dans le formulaire."""
f153be1b 48 records = Record.objects.validated()
da44ce68
EMS
49 if self.is_valid():
50 query = self.cleaned_data['q']
51 if query:
52 records = records.search(query)
f12cc7fb
EMS
53 auteur = self.cleaned_data['auteur']
54 if auteur:
55 records = records.search_auteur(auteur)
56 titre = self.cleaned_data['titre']
57 if titre:
58 records = records.search_titre(titre)
59 sujet = self.cleaned_data['sujet']
60 if sujet:
61 records = records.search_sujet(sujet)
da44ce68
EMS
62 return records
63
f61e4846
EMS
64 def get_search_regexp(self):
65 """Retourne une expression régulière compilée qui peut servir à
66 chercher les mot-clés recherchés dans un texte."""
67 if self.is_valid():
0b72ebef 68 return build_search_regexp(self.cleaned_data['q'])
f61e4846 69
c9cbc784
EMS
70class ActualiteSearchForm(forms.Form):
71 """Formulaire de recherche pour les actualités."""
72
73 q = forms.CharField(required=False, label="Mots-clés")
7bbf600c
EMS
74 date_min = SEPDateField(required=False, label="Depuis le")
75 date_max = SEPDateField(required=False, label="Jusqu'au")
c9cbc784
EMS
76
77 def get_query_set(self):
78 """Retourne l'ensemble des actualités qui correspondent aux valeurs
79 entrées dans le formulaire."""
f153be1b 80 actualites = Actualite.objects.filter(visible=True)
c9cbc784
EMS
81 if self.is_valid():
82 query = self.cleaned_data['q']
83 if query:
84 actualites = actualites.search(query)
85 date_min = self.cleaned_data['date_min']
86 if date_min:
c9cbc784
EMS
87 actualites = actualites.filter(date__gte=date_min)
88 date_max = self.cleaned_data['date_max']
89 if date_max:
90 actualites = actualites.filter(date__lte=date_max)
91 return actualites
92
93 def get_search_regexp(self):
94 """Retourne une expression régulière compilée qui peut servir à
95 chercher les mot-clés recherchés dans un texte."""
96 if self.is_valid():
97 return build_search_regexp(self.cleaned_data['q'])
4101cfc0
EMS
98
99class EvenementSearchForm(forms.Form):
100 """Formulaire de recherche pour les événements."""
101
102 q = forms.CharField(required=False, label="Mots-clés")
7bbf600c
EMS
103 titre = forms.CharField(required=False, label="Intitulé")
104 type = forms.ChoiceField(required=False, choices=(('', 'Tous'),)+Evenement.TYPE_CHOICES)
105 discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(),
106 required=False, label="Discipline", empty_label="Toutes")
107 date_min = SEPDateField(required=False, label="Depuis le")
108 date_max = SEPDateField(required=False, label="Jusqu'au")
4101cfc0
EMS
109
110 def get_query_set(self):
111 """Retourne l'ensemble des événements qui correspondent aux valeurs
112 entrées dans le formulaire."""
113 evenements = Evenement.objects.filter(approuve=True)
114 if self.is_valid():
115 query = self.cleaned_data['q']
116 if query:
117 evenements = evenements.search(query)
7bbf600c
EMS
118 titre = self.cleaned_data['titre']
119 if titre:
120 evenements = evenements.search_titre(titre)
121 type = self.cleaned_data['type']
122 if type:
123 evenements = evenements.filter(type=type)
124 discipline = self.cleaned_data['discipline']
125 if discipline:
126 evenements = evenements.filter(Q(discipline=discipline) | Q(discipline_secondaire=discipline))
127 date_min = self.cleaned_data['date_min']
128 if date_min:
129 evenements = evenements.filter(debut__gte=date_min)
130 date_max = self.cleaned_data['date_max']
131 if date_max:
132 evenements = evenements.filter(debut__lte=date_max)
4101cfc0
EMS
133 return evenements
134
135 def get_search_regexp(self):
136 """Retourne une expression régulière compilée qui peut servir à
137 chercher les mot-clés recherchés dans un texte."""
138 if self.is_valid():
139 return build_search_regexp(self.cleaned_data['q'])
140
da44ce68 141###
544b4522 142
92c7413b
CR
143class EvenementForm(forms.ModelForm):
144 class Meta:
145 model = Evenement
b7a741ad 146 exclude = ('approuve', 'uid')
0a77a7d6 147
148# Admin views pour les associations par lots
149
150class PaysForm(forms.Form):
151 values = [(p.id, p.nom) for p in Pays.objects.all()]
152 pays = forms.MultipleChoiceField(choices=values)
153
154class RegionsForm(forms.Form):
155 values = [(r.id, r.nom) for r in Region.objects.all()]
156 regions = forms.MultipleChoiceField(choices=values)
157
158class ThematiquesForm(forms.Form):
159 values = [(t.id, t.nom) for t in Thematique.objects.all()]
160 thematiques = forms.MultipleChoiceField(choices=values)
161
162class DisciplinesForm(forms.Form):
163 values = [(t.id, t.nom) for t in Discipline.objects.all()]
164 disciplines = forms.MultipleChoiceField(choices=values)
165
166class ConfirmationForm(forms.Form):
167 pass
168