Tri approprié des briques
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / savoirs / forms.py
CommitLineData
544b4522 1# -*- encoding: utf-8 -*-
73309469 2import re, datetime
544b4522 3from django import forms
6cdb7d49 4from django import db
7bbf600c 5from django.db.models import Q
73309469 6from django.db import models
7from django.contrib.admin import widgets
0a77a7d6 8from datamaster_modeles.models import Thematique, Pays, Region
c9cbc784 9from models import Evenement, Discipline, Record, Actualite
0b72ebef 10from savoirs.lib.recherche import build_search_regexp
73309469 11from savoirs.admin import EvenementAdminForm
60d2095f 12import settings
da44ce68 13
7bbf600c
EMS
14# Modifications custom aux champs Django
15
16class 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):
0a8666f8 20 super(SEPDateField, self).__init__(self, *args, **kwargs)
7bbf600c
EMS
21
22 # La classe "date" active le datepicker dans sep.js
7bbf600c 23 # Nous recevons les dates en format français
0a8666f8 24 format = '%d/%m/%Y'
25 self.widget = forms.DateInput(attrs={'class': 'date'}, format=format)
26 self.input_formats = [format,]
7bbf600c 27
da44ce68 28# Formulaires de recherche
544b4522 29
da44ce68
EMS
30class RecordSearchForm(forms.Form):
31 """Formulaire de recherche pour les ressources."""
32
c56d992d 33 q = forms.CharField(required=False, label="Rechercher dans tous les champs")
f12cc7fb
EMS
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")
d27f539e 37 publisher = forms.CharField(required=False, label="Éditeur")
f0692c02 38 discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Toutes")
bc415771
EMS
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.")
da44ce68
EMS
41
42 def get_query_set(self):
43 """Retourne l'ensemble des ressources qui correspondent aux valeurs
44 entrées dans le formulaire."""
116db1fd 45 records = Record.objects.validated()
da44ce68 46 if self.is_valid():
116db1fd
EMS
47 query = self.cleaned_data['q']
48 if query:
49 records = records.search(query)
f12cc7fb
EMS
50 auteur = self.cleaned_data['auteur']
51 if auteur:
116db1fd 52 records = records.search_auteur(auteur)
f12cc7fb
EMS
53 titre = self.cleaned_data['titre']
54 if titre:
116db1fd 55 records = records.search_titre(titre)
f12cc7fb
EMS
56 sujet = self.cleaned_data['sujet']
57 if sujet:
116db1fd 58 records = records.search_sujet(sujet)
0e5d5bc9
EMS
59 publisher = self.cleaned_data['publisher']
60 if publisher:
116db1fd
EMS
61 for word in publisher.split():
62 records = records.filter(publisher__icontains=word)
f0692c02
EMS
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)
7020ea3d
EMS
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
116db1fd
EMS
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'])
f61e4846 81
c9cbc784
EMS
82class ActualiteSearchForm(forms.Form):
83 """Formulaire de recherche pour les actualités."""
84
c56d992d 85 q = forms.CharField(required=False, label="Rechercher dans tous les champs")
7bbf600c
EMS
86 date_min = SEPDateField(required=False, label="Depuis le")
87 date_max = SEPDateField(required=False, label="Jusqu'au")
f0692c02 88 discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Toutes")
bc415771
EMS
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.")
c9cbc784
EMS
91
92 def get_query_set(self):
93 """Retourne l'ensemble des actualités qui correspondent aux valeurs
94 entrées dans le formulaire."""
116db1fd 95 actualites = Actualite.objects.filter(visible=True)
c9cbc784 96 if self.is_valid():
116db1fd
EMS
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)
f0692c02
EMS
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)
116db1fd 112 return actualites
c9cbc784 113
116db1fd
EMS
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
4101cfc0 120class EvenementSearchForm(forms.Form):
b5e81cfb 121 """Formulaire de recherche pour les évènements."""
4101cfc0 122
c56d992d 123 q = forms.CharField(required=False, label="Rechercher dans tous les champs")
7bbf600c
EMS
124 titre = forms.CharField(required=False, label="Intitulé")
125 type = forms.ChoiceField(required=False, choices=(('', 'Tous'),)+Evenement.TYPE_CHOICES)
7bbf600c
EMS
126 date_min = SEPDateField(required=False, label="Depuis le")
127 date_max = SEPDateField(required=False, label="Jusqu'au")
f0692c02 128 discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Toutes")
bc415771
EMS
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.")
4101cfc0
EMS
131
132 def get_query_set(self):
b5e81cfb 133 """Retourne l'ensemble des évènements qui correspondent aux valeurs
4101cfc0 134 entrées dans le formulaire."""
116db1fd 135 evenements = Evenement.objects.filter(approuve=True)
4101cfc0
EMS
136 if self.is_valid():
137 query = self.cleaned_data['q']
138 if query:
139 evenements = evenements.search(query)
7bbf600c
EMS
140 titre = self.cleaned_data['titre']
141 if titre:
116db1fd 142 evenements = evenements.search_titre(titre)
5212238e
EMS
143 type = self.cleaned_data['type']
144 if type:
116db1fd 145 evenements = evenements.filter(type=type)
5212238e
EMS
146 date_min = self.cleaned_data['date_min']
147 if date_min:
116db1fd 148 evenements = evenements.filter(debut__gte=date_min)
5212238e
EMS
149 date_max = self.cleaned_data['date_max']
150 if date_max:
116db1fd
EMS
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'])
4101cfc0 165
da44ce68 166###
544b4522 167
73309469 168class FrontEndSplitDateTime(widgets.AdminSplitDateTime):
169 class Media:
60d2095f 170 extend=False
713e8613 171 js = ("/jsi18n/",
60d2095f 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', )
73309469 176 css = {'all' : ('css/calendrier.css', )}
177
178class EvenementForm(EvenementAdminForm):
179 debut = forms.DateTimeField(widget=FrontEndSplitDateTime)
180 fin = forms.DateTimeField(widget=FrontEndSplitDateTime)
181
92c7413b
CR
182 class Meta:
183 model = Evenement
3a45eb64 184 exclude = ('approuve', 'uid', 'regions')
0a77a7d6 185
186# Admin views pour les associations par lots
187
188class PaysForm(forms.Form):
189 values = [(p.id, p.nom) for p in Pays.objects.all()]
190 pays = forms.MultipleChoiceField(choices=values)
191
192class RegionsForm(forms.Form):
264a3210 193 regions = forms.ModelMultipleChoiceField(queryset=Region.objects.all())
0a77a7d6 194
195class ThematiquesForm(forms.Form):
196 values = [(t.id, t.nom) for t in Thematique.objects.all()]
197 thematiques = forms.MultipleChoiceField(choices=values)
198
199class DisciplinesForm(forms.Form):
264a3210 200 disciplines = forms.ModelMultipleChoiceField(queryset=Discipline.objects.all())
0a77a7d6 201
202class ConfirmationForm(forms.Form):
203 pass
204