9c5b248ebed48996169ae47fef22e1a75bc915e4
1 # -*- encoding: utf-8 -*-
3 from django
import forms
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
14 # Modifications custom aux champs Django
16 class SEPDateField(forms
.DateField
):
17 """Un champ de date avec des valeurs par défaut un peu modifiées."""
19 def __init__(self
, *args
, **kwargs
):
20 super(SEPDateField
, self
).__init__(self
, *args
, **kwargs
)
22 # La classe "date" active le datepicker dans sep.js
23 # Nous recevons les dates en format français
25 self
.widget
= forms
.DateInput(attrs
={'class': 'date'}, format
=format
)
26 self
.input_formats
= [format
,]
28 # Formulaires de recherche
30 class RecordSearchForm(forms
.Form
):
31 """Formulaire de recherche pour les ressources."""
33 class TypeChoices(object):
36 """Génère dynamiquement les choix possibles pour la recherche par type."""
38 cursor
= db
.connection
.cursor()
39 cursor
.execute("""SELECT DISTINCT TRIM(REPLACE(REPLACE(type, ', PeerReviewed', ''), ', NonPeerReviewed', '')) AS clean_type
40 FROM savoirs_record ORDER BY clean_type""")
41 for result
in cursor
.fetchall():
45 TYPE_CHOICES
= TypeChoices()
47 class PublisherChoices(object):
50 """Génère dynamiquement les choix possibles pour la recherche par éditeur."""
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():
56 if publisher
not in ('', '-'):
57 yield (publisher
, publisher
)
58 PUBLISHER_CHOICES
= PublisherChoices()
60 q
= forms
.CharField(required
=False, label
="Mots-clés")
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")
64 type = forms
.ChoiceField(required
=False, label
="Type de document", choices
=TYPE_CHOICES
)
65 publisher
= forms
.ChoiceField(required
=False, label
="Éditeur", choices
=PUBLISHER_CHOICES
)
67 def get_query_set(self
):
68 """Retourne l'ensemble des ressources qui correspondent aux valeurs
69 entrées dans le formulaire."""
70 records
= Record
.objects
.validated()
72 query
= self
.cleaned_data
['q']
74 records
= records
.search(query
)
75 auteur
= self
.cleaned_data
['auteur']
77 records
= records
.search_auteur(auteur
)
78 titre
= self
.cleaned_data
['titre']
80 records
= records
.search_titre(titre
)
81 sujet
= self
.cleaned_data
['sujet']
83 records
= records
.search_sujet(sujet
)
84 type = self
.cleaned_data
['type']
86 records
= records
.filter(type__icontains
=type)
87 publisher
= self
.cleaned_data
['publisher']
89 records
= records
.filter(publisher
=publisher
)
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."""
96 return build_search_regexp(self
.cleaned_data
['q'])
98 class ActualiteSearchForm(forms
.Form
):
99 """Formulaire de recherche pour les actualités."""
101 q
= forms
.CharField(required
=False, label
="Mots-clés")
102 date_min
= SEPDateField(required
=False, label
="Depuis le")
103 date_max
= SEPDateField(required
=False, label
="Jusqu'au")
105 def get_query_set(self
):
106 """Retourne l'ensemble des actualités qui correspondent aux valeurs
107 entrées dans le formulaire."""
108 actualites
= Actualite
.objects
.filter(visible
=True)
110 query
= self
.cleaned_data
['q']
112 actualites
= actualites
.search(query
)
113 date_min
= self
.cleaned_data
['date_min']
115 actualites
= actualites
.filter(date__gte
=date_min
)
116 date_max
= self
.cleaned_data
['date_max']
118 actualites
= actualites
.filter(date__lte
=date_max
)
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."""
125 return build_search_regexp(self
.cleaned_data
['q'])
127 class EvenementSearchForm(forms
.Form
):
128 """Formulaire de recherche pour les événements."""
130 q
= forms
.CharField(required
=False, label
="Mots-clés")
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")
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)
143 query
= self
.cleaned_data
['q']
145 evenements
= evenements
.search(query
)
146 titre
= self
.cleaned_data
['titre']
148 evenements
= evenements
.search_titre(titre
)
149 type = self
.cleaned_data
['type']
151 evenements
= evenements
.filter(type=type)
152 discipline
= self
.cleaned_data
['discipline']
154 evenements
= evenements
.filter(Q(discipline
=discipline
) |
Q(discipline_secondaire
=discipline
))
155 date_min
= self
.cleaned_data
['date_min']
157 evenements
= evenements
.filter(debut__gte
=date_min
)
158 date_max
= self
.cleaned_data
['date_max']
160 evenements
= evenements
.filter(debut__lte
=date_max
)
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."""
167 return build_search_regexp(self
.cleaned_data
['q'])
171 class FrontEndSplitDateTime(widgets
.AdminSplitDateTime
):
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', )
179 css
= {'all' : ('css/calendrier.css', )}
181 class EvenementForm(EvenementAdminForm
):
182 debut
= forms
.DateTimeField(widget
=FrontEndSplitDateTime
)
183 fin
= forms
.DateTimeField(widget
=FrontEndSplitDateTime
)
187 exclude
= ('approuve', 'uid')
189 # Admin views pour les associations par lots
191 class PaysForm(forms
.Form
):
192 values
= [(p
.id, p
.nom
) for p
in Pays
.objects
.all()]
193 pays
= forms
.MultipleChoiceField(choices
=values
)
195 class RegionsForm(forms
.Form
):
196 values
= [(r
.id, r
.nom
) for r
in Region
.objects
.all()]
197 regions
= forms
.MultipleChoiceField(choices
=values
)
199 class ThematiquesForm(forms
.Form
):
200 values
= [(t
.id, t
.nom
) for t
in Thematique
.objects
.all()]
201 thematiques
= forms
.MultipleChoiceField(choices
=values
)
203 class DisciplinesForm(forms
.Form
):
204 values
= [(t
.id, t
.nom
) for t
in Discipline
.objects
.all()]
205 disciplines
= forms
.MultipleChoiceField(choices
=values
)
207 class ConfirmationForm(forms
.Form
):