Tri approprié des briques
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / savoirs / forms.py
1 # -*- encoding: utf-8 -*-
2 import re, datetime
3 from django import forms
4 from django import db
5 from django.db.models import Q
6 from django.db import models
7 from django.contrib.admin import widgets
8 from datamaster_modeles.models import Thematique, Pays, Region
9 from models import Evenement, Discipline, Record, Actualite
10 from savoirs.lib.recherche import build_search_regexp
11 from savoirs.admin import EvenementAdminForm
12 import settings
13
14 # Modifications custom aux champs Django
15
16 class SEPDateField(forms.DateField):
17 """Un champ de date avec des valeurs par défaut un peu modifiées."""
18
19 def __init__(self, *args, **kwargs):
20 super(SEPDateField, self).__init__(self, *args, **kwargs)
21
22 # La classe "date" active le datepicker dans sep.js
23 # Nous recevons les dates en format français
24 format = '%d/%m/%Y'
25 self.widget = forms.DateInput(attrs={'class': 'date'}, format=format)
26 self.input_formats = [format,]
27
28 # Formulaires de recherche
29
30 class RecordSearchForm(forms.Form):
31 """Formulaire de recherche pour les ressources."""
32
33 q = forms.CharField(required=False, label="Rechercher dans tous les champs")
34 auteur = forms.CharField(required=False, label="Auteur ou contributeur")
35 titre = forms.CharField(required=False, label="Titre")
36 sujet = forms.CharField(required=False, label="Sujet")
37 publisher = forms.CharField(required=False, label="Éditeur")
38 discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Toutes")
39 region = forms.ModelChoiceField(queryset=Region.objects.all(), required=False, label="Région", empty_label="Toutes",
40 help_text="La région est ici définie au sens, non strictement géographique, du Bureau régional de l'AUF de référence.")
41
42 def get_query_set(self):
43 """Retourne l'ensemble des ressources qui correspondent aux valeurs
44 entrées dans le formulaire."""
45 records = Record.objects.validated()
46 if self.is_valid():
47 query = self.cleaned_data['q']
48 if query:
49 records = records.search(query)
50 auteur = self.cleaned_data['auteur']
51 if auteur:
52 records = records.search_auteur(auteur)
53 titre = self.cleaned_data['titre']
54 if titre:
55 records = records.search_titre(titre)
56 sujet = self.cleaned_data['sujet']
57 if sujet:
58 records = records.search_sujet(sujet)
59 publisher = self.cleaned_data['publisher']
60 if publisher:
61 for word in publisher.split():
62 records = records.filter(publisher__icontains=word)
63 discipline = self.cleaned_data['discipline']
64 if discipline:
65 records = records.filter_discipline(discipline)
66 region = self.cleaned_data['region']
67 if region:
68 records = records.filter_region(region)
69 if not q:
70 """Montrer les résultats les plus récents si on n'a pas fait
71 une recherche par mots-clés."""
72 records = records.order_by('-id')
73
74 return records
75
76 def get_search_regexp(self):
77 """Retourne une expression régulière compilée qui peut servir à
78 chercher les mot-clés recherchés dans un texte."""
79 if self.is_valid():
80 return build_search_regexp(self.cleaned_data['q'])
81
82 class ActualiteSearchForm(forms.Form):
83 """Formulaire de recherche pour les actualités."""
84
85 q = forms.CharField(required=False, label="Rechercher dans tous les champs")
86 date_min = SEPDateField(required=False, label="Depuis le")
87 date_max = SEPDateField(required=False, label="Jusqu'au")
88 discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Toutes")
89 region = forms.ModelChoiceField(queryset=Region.objects.all(), required=False, label="Région", empty_label="Toutes",
90 help_text="La région est ici définie au sens, non strictement géographique, du Bureau régional de l'AUF de référence.")
91
92 def get_query_set(self):
93 """Retourne l'ensemble des actualités qui correspondent aux valeurs
94 entrées dans le formulaire."""
95 actualites = Actualite.objects.filter(visible=True)
96 if self.is_valid():
97 query = self.cleaned_data['q']
98 if query:
99 actualites = actualites.search(query)
100 date_min = self.cleaned_data['date_min']
101 if date_min:
102 actualites = actualites.filter(date__gte=date_min)
103 date_max = self.cleaned_data['date_max']
104 if date_max:
105 actualites = actualites.filter(date__lte=date_max)
106 discipline = self.cleaned_data['discipline']
107 if discipline:
108 actualites = actualites.filter_discipline(discipline)
109 region = self.cleaned_data['region']
110 if region:
111 actualites = actualites.filter_region(region)
112 return actualites
113
114 def get_search_regexp(self):
115 """Retourne une expression régulière compilée qui peut servir à
116 chercher les mot-clés recherchés dans un texte."""
117 if self.is_valid():
118 return build_search_regexp(self.cleaned_data['q'])
119
120 class EvenementSearchForm(forms.Form):
121 """Formulaire de recherche pour les évènements."""
122
123 q = forms.CharField(required=False, label="Rechercher dans tous les champs")
124 titre = forms.CharField(required=False, label="Intitulé")
125 type = forms.ChoiceField(required=False, choices=(('', 'Tous'),)+Evenement.TYPE_CHOICES)
126 date_min = SEPDateField(required=False, label="Depuis le")
127 date_max = SEPDateField(required=False, label="Jusqu'au")
128 discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Toutes")
129 region = forms.ModelChoiceField(queryset=Region.objects.all(), required=False, label="Région", empty_label="Toutes",
130 help_text="La région est ici définie au sens, non strictement géographique, du Bureau régional de l'AUF de référence.")
131
132 def get_query_set(self):
133 """Retourne l'ensemble des évènements qui correspondent aux valeurs
134 entrées dans le formulaire."""
135 evenements = Evenement.objects.filter(approuve=True)
136 if self.is_valid():
137 query = self.cleaned_data['q']
138 if query:
139 evenements = evenements.search(query)
140 titre = self.cleaned_data['titre']
141 if titre:
142 evenements = evenements.search_titre(titre)
143 type = self.cleaned_data['type']
144 if type:
145 evenements = evenements.filter(type=type)
146 date_min = self.cleaned_data['date_min']
147 if date_min:
148 evenements = evenements.filter(debut__gte=date_min)
149 date_max = self.cleaned_data['date_max']
150 if date_max:
151 evenements = evenements.filter(debut__lte=date_max)
152 discipline = self.cleaned_data['discipline']
153 if discipline:
154 evenements = evenements.filter_discipline(discipline)
155 region = self.cleaned_data['region']
156 if region:
157 evenements = evenements.filter_region(region)
158 return evenements
159
160 def get_search_regexp(self):
161 """Retourne une expression régulière compilée qui peut servir à
162 chercher les mot-clés recherchés dans un texte."""
163 if self.is_valid():
164 return build_search_regexp(self.cleaned_data['q'])
165
166 ###
167
168 class FrontEndSplitDateTime(widgets.AdminSplitDateTime):
169 class Media:
170 extend=False
171 js = ("/jsi18n/",
172 settings.ADMIN_MEDIA_PREFIX + "js/core.js",
173 settings.ADMIN_MEDIA_PREFIX + "js/calendar.js",
174 settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js",
175 'js/calendrier.js', )
176 css = {'all' : ('css/calendrier.css', )}
177
178 class EvenementForm(EvenementAdminForm):
179 debut = forms.DateTimeField(widget=FrontEndSplitDateTime)
180 fin = forms.DateTimeField(widget=FrontEndSplitDateTime)
181
182 class Meta:
183 model = Evenement
184 exclude = ('approuve', 'uid', 'regions')
185
186 # Admin views pour les associations par lots
187
188 class PaysForm(forms.Form):
189 values = [(p.id, p.nom) for p in Pays.objects.all()]
190 pays = forms.MultipleChoiceField(choices=values)
191
192 class RegionsForm(forms.Form):
193 regions = forms.ModelMultipleChoiceField(queryset=Region.objects.all())
194
195 class ThematiquesForm(forms.Form):
196 values = [(t.id, t.nom) for t in Thematique.objects.all()]
197 thematiques = forms.MultipleChoiceField(choices=values)
198
199 class DisciplinesForm(forms.Form):
200 disciplines = forms.ModelMultipleChoiceField(queryset=Discipline.objects.all())
201
202 class ConfirmationForm(forms.Form):
203 pass
204