Commit | Line | Data |
---|---|---|
544b4522 | 1 | # -*- encoding: utf-8 -*- |
73309469 | 2 | import re, datetime |
544b4522 | 3 | from django import forms |
6cdb7d49 | 4 | from django import db |
7bbf600c | 5 | from django.db.models import Q |
73309469 | 6 | from django.db import models |
7 | from django.contrib.admin import widgets | |
0a95ac89 | 8 | from django.utils.safestring import mark_safe |
0a77a7d6 | 9 | from datamaster_modeles.models import Thematique, Pays, Region |
c9cbc784 | 10 | from models import Evenement, Discipline, Record, Actualite |
0b72ebef | 11 | from savoirs.lib.recherche import build_search_regexp |
73309469 | 12 | from savoirs.admin import EvenementAdminForm |
60d2095f | 13 | import settings |
da44ce68 | 14 | |
7bbf600c EMS |
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): | |
0a8666f8 | 21 | super(SEPDateField, self).__init__(self, *args, **kwargs) |
7bbf600c EMS |
22 | |
23 | # La classe "date" active le datepicker dans sep.js | |
7bbf600c | 24 | # Nous recevons les dates en format français |
0a8666f8 | 25 | format = '%d/%m/%Y' |
26 | self.widget = forms.DateInput(attrs={'class': 'date'}, format=format) | |
27 | self.input_formats = [format,] | |
7bbf600c | 28 | |
0a95ac89 EMS |
29 | class SEPSplitDateTimeWidget(forms.MultiWidget): |
30 | ||
31 | def __init__(self): | |
32 | self.date_format = '%d/%m/%Y' | |
a9e7bae1 | 33 | self.time_format = '%H:%M' |
0a95ac89 EMS |
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 | ||
a9e7bae1 EMS |
49 | def __init__(self, *args, **kwargs): |
50 | super(SEPDateTimeField, self).__init__(input_formats=['%d/%m/%Y %H:%M']) | |
51 | ||
da44ce68 | 52 | # Formulaires de recherche |
544b4522 | 53 | |
da44ce68 EMS |
54 | class RecordSearchForm(forms.Form): |
55 | """Formulaire de recherche pour les ressources.""" | |
56 | ||
c56d992d | 57 | q = forms.CharField(required=False, label="Rechercher dans tous les champs") |
f12cc7fb EMS |
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") | |
d27f539e | 61 | publisher = forms.CharField(required=False, label="Éditeur") |
f0692c02 | 62 | discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Toutes") |
bc415771 EMS |
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.") | |
da44ce68 EMS |
65 | |
66 | def get_query_set(self): | |
67 | """Retourne l'ensemble des ressources qui correspondent aux valeurs | |
68 | entrées dans le formulaire.""" | |
5212238e | 69 | records = Record.objects |
da44ce68 | 70 | if self.is_valid(): |
5212238e EMS |
71 | q = self.cleaned_data['q'] |
72 | if q: | |
73 | records = records.search(q) | |
f12cc7fb EMS |
74 | auteur = self.cleaned_data['auteur'] |
75 | if auteur: | |
5212238e | 76 | records = records.add_to_query('@(creator,contributor) ' + auteur) |
f12cc7fb EMS |
77 | titre = self.cleaned_data['titre'] |
78 | if titre: | |
5212238e | 79 | records = records.add_to_query('@title ' + titre) |
f12cc7fb EMS |
80 | sujet = self.cleaned_data['sujet'] |
81 | if sujet: | |
5212238e | 82 | records = records.add_to_query('@subject ' + sujet) |
0e5d5bc9 EMS |
83 | publisher = self.cleaned_data['publisher'] |
84 | if publisher: | |
5212238e | 85 | records = records.add_to_query('@publisher ' + publisher) |
f0692c02 EMS |
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) | |
2e37be2b EMS |
92 | |
93 | if not q: | |
7020ea3d EMS |
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') | |
5212238e | 97 | return records.all() |
f61e4846 | 98 | |
c9cbc784 EMS |
99 | class ActualiteSearchForm(forms.Form): |
100 | """Formulaire de recherche pour les actualités.""" | |
101 | ||
c56d992d | 102 | q = forms.CharField(required=False, label="Rechercher dans tous les champs") |
7bbf600c EMS |
103 | date_min = SEPDateField(required=False, label="Depuis le") |
104 | date_max = SEPDateField(required=False, label="Jusqu'au") | |
f0692c02 | 105 | discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Toutes") |
bc415771 EMS |
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.") | |
c9cbc784 EMS |
108 | |
109 | def get_query_set(self): | |
110 | """Retourne l'ensemble des actualités qui correspondent aux valeurs | |
111 | entrées dans le formulaire.""" | |
5212238e | 112 | actualites = Actualite.objects |
c9cbc784 | 113 | if self.is_valid(): |
5212238e EMS |
114 | q = self.cleaned_data['q'] |
115 | if q: | |
116 | actualites = actualites.search(q) | |
f0692c02 EMS |
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) | |
5212238e EMS |
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() | |
c9cbc784 | 130 | |
4101cfc0 | 131 | class EvenementSearchForm(forms.Form): |
b5e81cfb | 132 | """Formulaire de recherche pour les évènements.""" |
4101cfc0 | 133 | |
c56d992d | 134 | q = forms.CharField(required=False, label="Rechercher dans tous les champs") |
7bbf600c EMS |
135 | titre = forms.CharField(required=False, label="Intitulé") |
136 | type = forms.ChoiceField(required=False, choices=(('', 'Tous'),)+Evenement.TYPE_CHOICES) | |
7bbf600c EMS |
137 | date_min = SEPDateField(required=False, label="Depuis le") |
138 | date_max = SEPDateField(required=False, label="Jusqu'au") | |
f0692c02 | 139 | discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), required=False, label="Discipline", empty_label="Toutes") |
bc415771 EMS |
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.") | |
4101cfc0 EMS |
142 | |
143 | def get_query_set(self): | |
b5e81cfb | 144 | """Retourne l'ensemble des évènements qui correspondent aux valeurs |
4101cfc0 | 145 | entrées dans le formulaire.""" |
5212238e | 146 | evenements = Evenement.objects |
4101cfc0 EMS |
147 | if self.is_valid(): |
148 | query = self.cleaned_data['q'] | |
149 | if query: | |
150 | evenements = evenements.search(query) | |
7bbf600c EMS |
151 | titre = self.cleaned_data['titre'] |
152 | if titre: | |
5212238e | 153 | evenements = evenements.add_to_query('@titre ' + titre) |
116db1fd EMS |
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) | |
5212238e EMS |
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() | |
4101cfc0 | 170 | |
da44ce68 | 171 | ### |
544b4522 | 172 | |
73309469 | 173 | class EvenementForm(EvenementAdminForm): |
0a95ac89 EMS |
174 | debut = SEPDateTimeField() |
175 | fin = SEPDateTimeField() | |
69ad0029 EMS |
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 | ) | |
73309469 | 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 | ||
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): | |
264a3210 | 193 | regions = forms.ModelMultipleChoiceField(queryset=Region.objects.all()) |
0a77a7d6 | 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): | |
264a3210 | 200 | disciplines = forms.ModelMultipleChoiceField(queryset=Discipline.objects.all()) |
0a77a7d6 | 201 | |
202 | class ConfirmationForm(forms.Form): | |
203 | pass | |
204 |