Nouvelles options de recherche dans l'agenda (#561)
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / savoirs / forms.py
1 # -*- encoding: utf-8 -*-
2 import re
3 from django import forms
4 from django.db.models import Q
5 from datamaster_modeles.models import Thematique, Pays, Region
6 from models import Evenement, Discipline, Record, Actualite
7 from savoirs.lib.recherche import build_search_regexp
8
9 # Modifications custom aux champs Django
10
11 class 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
24 # Formulaires de recherche
25
26 class 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
37 class RecordSearchForm(forms.Form):
38 """Formulaire de recherche pour les ressources."""
39
40 q = forms.CharField(required=False, label="Mots-clés")
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")
44
45 def get_query_set(self):
46 """Retourne l'ensemble des ressources qui correspondent aux valeurs
47 entrées dans le formulaire."""
48 records = Record.objects.validated()
49 if self.is_valid():
50 query = self.cleaned_data['q']
51 if query:
52 records = records.search(query)
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)
62 return records
63
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():
68 return build_search_regexp(self.cleaned_data['q'])
69
70 class ActualiteSearchForm(forms.Form):
71 """Formulaire de recherche pour les actualités."""
72
73 q = forms.CharField(required=False, label="Mots-clés")
74 date_min = SEPDateField(required=False, label="Depuis le")
75 date_max = SEPDateField(required=False, label="Jusqu'au")
76
77 def get_query_set(self):
78 """Retourne l'ensemble des actualités qui correspondent aux valeurs
79 entrées dans le formulaire."""
80 actualites = Actualite.objects.filter(visible=True)
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:
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'])
98
99 class EvenementSearchForm(forms.Form):
100 """Formulaire de recherche pour les événements."""
101
102 q = forms.CharField(required=False, label="Mots-clés")
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")
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)
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)
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
141 ###
142
143 class EvenementForm(forms.ModelForm):
144 class Meta:
145 model = Evenement
146 exclude = ('approuve', 'uid')
147
148 # Admin views pour les associations par lots
149
150 class PaysForm(forms.Form):
151 values = [(p.id, p.nom) for p in Pays.objects.all()]
152 pays = forms.MultipleChoiceField(choices=values)
153
154 class RegionsForm(forms.Form):
155 values = [(r.id, r.nom) for r in Region.objects.all()]
156 regions = forms.MultipleChoiceField(choices=values)
157
158 class ThematiquesForm(forms.Form):
159 values = [(t.id, t.nom) for t in Thematique.objects.all()]
160 thematiques = forms.MultipleChoiceField(choices=values)
161
162 class DisciplinesForm(forms.Form):
163 values = [(t.id, t.nom) for t in Discipline.objects.all()]
164 disciplines = forms.MultipleChoiceField(choices=values)
165
166 class ConfirmationForm(forms.Form):
167 pass
168