8d20e09339e462693a5e65f3e6322d41126d8992
[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 django.utils.safestring import mark_safe
9 from datamaster_modeles.models import Thematique, Pays, Region
10 from models import Evenement, Discipline, Record, Actualite
11 from savoirs.lib.recherche import build_search_regexp
12 from savoirs.admin import EvenementAdminForm
13 import settings
14
15 # Modifications custom aux champs Django
16
17 class SEPDateField(forms.DateField):
18 """Un champ de date avec des valeurs par défaut un peu modifiées."""
19
20 def __init__(self, *args, **kwargs):
21 super(SEPDateField, self).__init__(self, *args, **kwargs)
22
23 # La classe "date" active le datepicker dans sep.js
24 # Nous recevons les dates en format français
25 format = '%d/%m/%Y'
26 self.widget = forms.DateInput(attrs={'class': 'date'}, format=format)
27 self.input_formats = [format,]
28
29 class SEPSplitDateTimeWidget(forms.MultiWidget):
30
31 def __init__(self):
32 self.date_format = '%d/%m/%Y'
33 self.time_format = '%H:%M'
34 widgets = (forms.DateInput(attrs={'class': 'date'}, format=self.date_format),
35 forms.TimeInput(attrs={'class': 'time'}, format=self.time_format))
36 super(SEPSplitDateTimeWidget, self).__init__(widgets)
37
38 def decompress(self, value):
39 if value:
40 return [value.date(), value.time().replace(microsecond=0)]
41 return [None, None]
42
43 def format_output(self, rendered_widgets):
44 return mark_safe(u'Date: %s Heure: %s' % (rendered_widgets[0], rendered_widgets[1]))
45
46 class SEPDateTimeField(forms.DateTimeField):
47 widget = SEPSplitDateTimeWidget
48
49 def __init__(self, *args, **kwargs):
50 super(SEPDateTimeField, self).__init__(input_formats=['%d/%m/%Y %H:%M'])
51
52 # Formulaires de recherche
53
54 class RecordSearchForm(forms.Form):
55 """Formulaire de recherche pour les ressources."""
56
57 q = forms.CharField(required=False, label="Rechercher dans tous les champs")
58 auteur = forms.CharField(required=False, label="Auteur ou contributeur")
59 titre = forms.CharField(required=False, label="Titre")
60 sujet = forms.CharField(required=False, label="Sujet")
61 publisher = forms.CharField(required=False, label="Éditeur")
62 discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Toutes")
63 region = forms.ModelChoiceField(queryset=Region.objects.all(), required=False, label="Région", empty_label="Toutes",
64 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.")
65
66 def get_query_set(self):
67 """Retourne l'ensemble des ressources qui correspondent aux valeurs
68 entrées dans le formulaire."""
69 records = Record.objects
70 if self.is_valid():
71 q = self.cleaned_data['q']
72 if q:
73 records = records.search(q)
74 auteur = self.cleaned_data['auteur']
75 if auteur:
76 records = records.add_to_query('@(creator,contributor) ' + auteur)
77 titre = self.cleaned_data['titre']
78 if titre:
79 records = records.add_to_query('@title ' + titre)
80 sujet = self.cleaned_data['sujet']
81 if sujet:
82 records = records.add_to_query('@subject ' + sujet)
83 publisher = self.cleaned_data['publisher']
84 if publisher:
85 records = records.add_to_query('@publisher ' + publisher)
86 discipline = self.cleaned_data['discipline']
87 if discipline:
88 records = records.filter_discipline(discipline)
89 region = self.cleaned_data['region']
90 if region:
91 records = records.filter_region(region)
92
93 if not q:
94 """Montrer les résultats les plus récents si on n'a pas fait
95 une recherche par mots-clés."""
96 records = records.order_by('-id')
97 return records.all()
98
99 class ActualiteSearchForm(forms.Form):
100 """Formulaire de recherche pour les actualités."""
101
102 q = forms.CharField(required=False, label="Rechercher dans tous les champs")
103 date_min = SEPDateField(required=False, label="Depuis le")
104 date_max = SEPDateField(required=False, label="Jusqu'au")
105 discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Toutes")
106 region = forms.ModelChoiceField(queryset=Region.objects.all(), required=False, label="Région", empty_label="Toutes",
107 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.")
108
109 def get_query_set(self):
110 """Retourne l'ensemble des actualités qui correspondent aux valeurs
111 entrées dans le formulaire."""
112 actualites = Actualite.objects
113 if self.is_valid():
114 q = self.cleaned_data['q']
115 if q:
116 actualites = actualites.search(q)
117 discipline = self.cleaned_data['discipline']
118 if discipline:
119 actualites = actualites.filter_discipline(discipline)
120 region = self.cleaned_data['region']
121 if region:
122 actualites = actualites.filter_region(region)
123 date_min = self.cleaned_data['date_min']
124 if date_min:
125 actualites = actualites.filter_date(min=date_min)
126 date_max = self.cleaned_data['date_max']
127 if date_max:
128 actualites = actualites.filter_date(max=date_max)
129 return actualites.all()
130
131 class EvenementSearchForm(forms.Form):
132 """Formulaire de recherche pour les évènements."""
133
134 q = forms.CharField(required=False, label="Rechercher dans tous les champs")
135 titre = forms.CharField(required=False, label="Intitulé")
136 type = forms.ChoiceField(required=False, choices=(('', 'Tous'),)+Evenement.TYPE_CHOICES)
137 date_min = SEPDateField(required=False, label="Depuis le")
138 date_max = SEPDateField(required=False, label="Jusqu'au")
139 discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Toutes")
140 region = forms.ModelChoiceField(queryset=Region.objects.all(), required=False, label="Région", empty_label="Toutes",
141 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.")
142
143 def get_query_set(self):
144 """Retourne l'ensemble des évènements qui correspondent aux valeurs
145 entrées dans le formulaire."""
146 evenements = Evenement.objects
147 if self.is_valid():
148 query = self.cleaned_data['q']
149 if query:
150 evenements = evenements.search(query)
151 titre = self.cleaned_data['titre']
152 if titre:
153 evenements = evenements.add_to_query('@titre ' + titre)
154 discipline = self.cleaned_data['discipline']
155 if discipline:
156 evenements = evenements.filter_discipline(discipline)
157 region = self.cleaned_data['region']
158 if region:
159 evenements = evenements.filter_region(region)
160 type = self.cleaned_data['type']
161 if type:
162 evenements = evenements.filter_type(type)
163 date_min = self.cleaned_data['date_min']
164 if date_min:
165 evenements = evenements.filter_debut(min=date_min)
166 date_max = self.cleaned_data['date_max']
167 if date_max:
168 evenements = evenements.filter_debut(max=date_max)
169 return evenements.all()
170
171 ###
172
173 class EvenementForm(EvenementAdminForm):
174 debut = SEPDateTimeField()
175 fin = SEPDateTimeField()
176 description = forms.CharField(
177 label='Description', required=False,
178 help_text="Présenter les thématiques de l'évènement et donner toutes les informations utiles aux futurs participants.",
179 widget=forms.Textarea
180 )
181 pays = forms.ModelChoiceField(
182 queryset=Pays.objects.all(), required=False, label='Pays',
183 help_text="La sélection du pays entraine la saisie automatique du fuseau horaire."
184 )
185
186 class Meta:
187 model = Evenement
188 exclude = ('approuve', 'uid', 'regions')
189
190 # Admin views pour les associations par lots
191
192 class PaysForm(forms.Form):
193 values = [(p.id, p.nom) for p in Pays.objects.all()]
194 pays = forms.MultipleChoiceField(choices=values)
195
196 class RegionsForm(forms.Form):
197 regions = forms.ModelMultipleChoiceField(queryset=Region.objects.all())
198
199 class ThematiquesForm(forms.Form):
200 values = [(t.id, t.nom) for t in Thematique.objects.all()]
201 thematiques = forms.MultipleChoiceField(choices=values)
202
203 class DisciplinesForm(forms.Form):
204 disciplines = forms.ModelMultipleChoiceField(queryset=Discipline.objects.all())
205
206 class ConfirmationForm(forms.Form):
207 pass
208