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 | |
0a77a7d6 | 8 | from datamaster_modeles.models import Thematique, Pays, Region |
c9cbc784 | 9 | from models import Evenement, Discipline, Record, Actualite |
0b72ebef | 10 | from savoirs.lib.recherche import build_search_regexp |
73309469 | 11 | from savoirs.admin import EvenementAdminForm |
60d2095f | 12 | import settings |
da44ce68 | 13 | |
7bbf600c EMS |
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): | |
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 |
30 | class RecordSearchForm(forms.Form): |
31 | """Formulaire de recherche pour les ressources.""" | |
32 | ||
6cdb7d49 EMS |
33 | class TypeChoices(object): |
34 | ||
35 | def __iter__(self): | |
36 | """Génère dynamiquement les choix possibles pour la recherche par type.""" | |
37 | yield ('', '') | |
38 | cursor = db.connection.cursor() | |
0e5d5bc9 EMS |
39 | cursor.execute("""SELECT DISTINCT TRIM(REPLACE(REPLACE(type, ', PeerReviewed', ''), ', NonPeerReviewed', '')) AS clean_type |
40 | FROM savoirs_record ORDER BY clean_type""") | |
6cdb7d49 | 41 | for result in cursor.fetchall(): |
0e5d5bc9 | 42 | type = result[0] |
6cdb7d49 EMS |
43 | if type: |
44 | yield (type, type) | |
6cdb7d49 EMS |
45 | TYPE_CHOICES = TypeChoices() |
46 | ||
0e5d5bc9 EMS |
47 | class PublisherChoices(object): |
48 | ||
49 | def __iter__(self): | |
50 | """Génère dynamiquement les choix possibles pour la recherche par éditeur.""" | |
51 | yield ('', '') | |
52 | cursor = db.connection.cursor() | |
53 | cursor.execute("SELECT DISTINCT publisher AS publisher FROM savoirs_record ORDER BY publisher") | |
54 | for result in cursor.fetchall(): | |
55 | publisher = result[0] | |
56 | if publisher not in ('', '-'): | |
57 | yield (publisher, publisher) | |
58 | PUBLISHER_CHOICES = PublisherChoices() | |
59 | ||
da44ce68 | 60 | q = forms.CharField(required=False, label="Mots-clés") |
f12cc7fb EMS |
61 | auteur = forms.CharField(required=False, label="Auteur ou contributeur") |
62 | titre = forms.CharField(required=False, label="Titre") | |
63 | sujet = forms.CharField(required=False, label="Sujet") | |
0e5d5bc9 EMS |
64 | type = forms.ChoiceField(required=False, label="Type de document", choices=TYPE_CHOICES) |
65 | publisher = forms.ChoiceField(required=False, label="Éditeur", choices=PUBLISHER_CHOICES) | |
da44ce68 EMS |
66 | |
67 | def get_query_set(self): | |
68 | """Retourne l'ensemble des ressources qui correspondent aux valeurs | |
69 | entrées dans le formulaire.""" | |
f153be1b | 70 | records = Record.objects.validated() |
da44ce68 EMS |
71 | if self.is_valid(): |
72 | query = self.cleaned_data['q'] | |
73 | if query: | |
74 | records = records.search(query) | |
f12cc7fb EMS |
75 | auteur = self.cleaned_data['auteur'] |
76 | if auteur: | |
77 | records = records.search_auteur(auteur) | |
78 | titre = self.cleaned_data['titre'] | |
79 | if titre: | |
80 | records = records.search_titre(titre) | |
81 | sujet = self.cleaned_data['sujet'] | |
82 | if sujet: | |
83 | records = records.search_sujet(sujet) | |
6cdb7d49 EMS |
84 | type = self.cleaned_data['type'] |
85 | if type: | |
86 | records = records.filter(type__icontains=type) | |
0e5d5bc9 EMS |
87 | publisher = self.cleaned_data['publisher'] |
88 | if publisher: | |
89 | records = records.filter(publisher=publisher) | |
da44ce68 EMS |
90 | return records |
91 | ||
f61e4846 EMS |
92 | def get_search_regexp(self): |
93 | """Retourne une expression régulière compilée qui peut servir à | |
94 | chercher les mot-clés recherchés dans un texte.""" | |
95 | if self.is_valid(): | |
0b72ebef | 96 | return build_search_regexp(self.cleaned_data['q']) |
f61e4846 | 97 | |
c9cbc784 EMS |
98 | class ActualiteSearchForm(forms.Form): |
99 | """Formulaire de recherche pour les actualités.""" | |
100 | ||
101 | q = forms.CharField(required=False, label="Mots-clés") | |
7bbf600c EMS |
102 | date_min = SEPDateField(required=False, label="Depuis le") |
103 | date_max = SEPDateField(required=False, label="Jusqu'au") | |
c9cbc784 EMS |
104 | |
105 | def get_query_set(self): | |
106 | """Retourne l'ensemble des actualités qui correspondent aux valeurs | |
107 | entrées dans le formulaire.""" | |
f153be1b | 108 | actualites = Actualite.objects.filter(visible=True) |
c9cbc784 EMS |
109 | if self.is_valid(): |
110 | query = self.cleaned_data['q'] | |
111 | if query: | |
112 | actualites = actualites.search(query) | |
113 | date_min = self.cleaned_data['date_min'] | |
114 | if date_min: | |
c9cbc784 EMS |
115 | actualites = actualites.filter(date__gte=date_min) |
116 | date_max = self.cleaned_data['date_max'] | |
117 | if date_max: | |
118 | actualites = actualites.filter(date__lte=date_max) | |
119 | return actualites | |
120 | ||
121 | def get_search_regexp(self): | |
122 | """Retourne une expression régulière compilée qui peut servir à | |
123 | chercher les mot-clés recherchés dans un texte.""" | |
124 | if self.is_valid(): | |
125 | return build_search_regexp(self.cleaned_data['q']) | |
4101cfc0 EMS |
126 | |
127 | class EvenementSearchForm(forms.Form): | |
128 | """Formulaire de recherche pour les événements.""" | |
129 | ||
130 | q = forms.CharField(required=False, label="Mots-clés") | |
7bbf600c EMS |
131 | titre = forms.CharField(required=False, label="Intitulé") |
132 | type = forms.ChoiceField(required=False, choices=(('', 'Tous'),)+Evenement.TYPE_CHOICES) | |
133 | discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(), | |
134 | required=False, label="Discipline", empty_label="Toutes") | |
135 | date_min = SEPDateField(required=False, label="Depuis le") | |
136 | date_max = SEPDateField(required=False, label="Jusqu'au") | |
4101cfc0 EMS |
137 | |
138 | def get_query_set(self): | |
139 | """Retourne l'ensemble des événements qui correspondent aux valeurs | |
140 | entrées dans le formulaire.""" | |
141 | evenements = Evenement.objects.filter(approuve=True) | |
142 | if self.is_valid(): | |
143 | query = self.cleaned_data['q'] | |
144 | if query: | |
145 | evenements = evenements.search(query) | |
7bbf600c EMS |
146 | titre = self.cleaned_data['titre'] |
147 | if titre: | |
148 | evenements = evenements.search_titre(titre) | |
149 | type = self.cleaned_data['type'] | |
150 | if type: | |
151 | evenements = evenements.filter(type=type) | |
152 | discipline = self.cleaned_data['discipline'] | |
153 | if discipline: | |
154 | evenements = evenements.filter(Q(discipline=discipline) | Q(discipline_secondaire=discipline)) | |
155 | date_min = self.cleaned_data['date_min'] | |
156 | if date_min: | |
157 | evenements = evenements.filter(debut__gte=date_min) | |
158 | date_max = self.cleaned_data['date_max'] | |
159 | if date_max: | |
160 | evenements = evenements.filter(debut__lte=date_max) | |
4101cfc0 EMS |
161 | return evenements |
162 | ||
163 | def get_search_regexp(self): | |
164 | """Retourne une expression régulière compilée qui peut servir à | |
165 | chercher les mot-clés recherchés dans un texte.""" | |
166 | if self.is_valid(): | |
167 | return build_search_regexp(self.cleaned_data['q']) | |
168 | ||
da44ce68 | 169 | ### |
544b4522 | 170 | |
73309469 | 171 | class FrontEndSplitDateTime(widgets.AdminSplitDateTime): |
172 | class Media: | |
60d2095f | 173 | extend=False |
713e8613 | 174 | js = ("/jsi18n/", |
60d2095f | 175 | settings.ADMIN_MEDIA_PREFIX + "js/core.js", |
176 | settings.ADMIN_MEDIA_PREFIX + "js/calendar.js", | |
177 | settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js", | |
178 | 'js/calendrier.js', ) | |
73309469 | 179 | css = {'all' : ('css/calendrier.css', )} |
180 | ||
181 | class EvenementForm(EvenementAdminForm): | |
182 | debut = forms.DateTimeField(widget=FrontEndSplitDateTime) | |
183 | fin = forms.DateTimeField(widget=FrontEndSplitDateTime) | |
184 | ||
92c7413b CR |
185 | class Meta: |
186 | model = Evenement | |
b7a741ad | 187 | exclude = ('approuve', 'uid') |
0a77a7d6 | 188 | |
189 | # Admin views pour les associations par lots | |
190 | ||
191 | class PaysForm(forms.Form): | |
192 | values = [(p.id, p.nom) for p in Pays.objects.all()] | |
193 | pays = forms.MultipleChoiceField(choices=values) | |
194 | ||
195 | class RegionsForm(forms.Form): | |
196 | values = [(r.id, r.nom) for r in Region.objects.all()] | |
197 | regions = forms.MultipleChoiceField(choices=values) | |
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 | values = [(t.id, t.nom) for t in Discipline.objects.all()] | |
205 | disciplines = forms.MultipleChoiceField(choices=values) | |
206 | ||
207 | class ConfirmationForm(forms.Form): | |
208 | pass | |
209 |