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 REPLACE(REPLACE(type, ', PeerReviewed', ''), ', NonPeerReviewed', '') FROM savoirs_record")
40 for result
in cursor
.fetchall():
41 type = result
[0].strip()
45 TYPE_CHOICES
= TypeChoices()
47 q
= forms
.CharField(required
=False, label
="Mots-clés")
48 auteur
= forms
.CharField(required
=False, label
="Auteur ou contributeur")
49 titre
= forms
.CharField(required
=False, label
="Titre")
50 sujet
= forms
.CharField(required
=False, label
="Sujet")
51 type = forms
.ChoiceField(required
=False, label
="Type de document", choices
= TYPE_CHOICES
)
53 def get_query_set(self
):
54 """Retourne l'ensemble des ressources qui correspondent aux valeurs
55 entrées dans le formulaire."""
56 records
= Record
.objects
.validated()
58 query
= self
.cleaned_data
['q']
60 records
= records
.search(query
)
61 auteur
= self
.cleaned_data
['auteur']
63 records
= records
.search_auteur(auteur
)
64 titre
= self
.cleaned_data
['titre']
66 records
= records
.search_titre(titre
)
67 sujet
= self
.cleaned_data
['sujet']
69 records
= records
.search_sujet(sujet
)
70 type = self
.cleaned_data
['type']
72 records
= records
.filter(type__icontains
=type)
75 def get_search_regexp(self
):
76 """Retourne une expression régulière compilée qui peut servir à
77 chercher les mot-clés recherchés dans un texte."""
79 return build_search_regexp(self
.cleaned_data
['q'])
81 class ActualiteSearchForm(forms
.Form
):
82 """Formulaire de recherche pour les actualités."""
84 q
= forms
.CharField(required
=False, label
="Mots-clés")
85 date_min
= SEPDateField(required
=False, label
="Depuis le")
86 date_max
= SEPDateField(required
=False, label
="Jusqu'au")
88 def get_query_set(self
):
89 """Retourne l'ensemble des actualités qui correspondent aux valeurs
90 entrées dans le formulaire."""
91 actualites
= Actualite
.objects
.filter(visible
=True)
93 query
= self
.cleaned_data
['q']
95 actualites
= actualites
.search(query
)
96 date_min
= self
.cleaned_data
['date_min']
98 actualites
= actualites
.filter(date__gte
=date_min
)
99 date_max
= self
.cleaned_data
['date_max']
101 actualites
= actualites
.filter(date__lte
=date_max
)
104 def get_search_regexp(self
):
105 """Retourne une expression régulière compilée qui peut servir à
106 chercher les mot-clés recherchés dans un texte."""
108 return build_search_regexp(self
.cleaned_data
['q'])
110 class EvenementSearchForm(forms
.Form
):
111 """Formulaire de recherche pour les événements."""
113 q
= forms
.CharField(required
=False, label
="Mots-clés")
114 titre
= forms
.CharField(required
=False, label
="Intitulé")
115 type = forms
.ChoiceField(required
=False, choices
=(('', 'Tous'),)+Evenement
.TYPE_CHOICES
)
116 discipline
= forms
.ModelChoiceField(queryset
=Discipline
.objects
.all(),
117 required
=False, label
="Discipline", empty_label
="Toutes")
118 date_min
= SEPDateField(required
=False, label
="Depuis le")
119 date_max
= SEPDateField(required
=False, label
="Jusqu'au")
121 def get_query_set(self
):
122 """Retourne l'ensemble des événements qui correspondent aux valeurs
123 entrées dans le formulaire."""
124 evenements
= Evenement
.objects
.filter(approuve
=True)
126 query
= self
.cleaned_data
['q']
128 evenements
= evenements
.search(query
)
129 titre
= self
.cleaned_data
['titre']
131 evenements
= evenements
.search_titre(titre
)
132 type = self
.cleaned_data
['type']
134 evenements
= evenements
.filter(type=type)
135 discipline
= self
.cleaned_data
['discipline']
137 evenements
= evenements
.filter(Q(discipline
=discipline
) |
Q(discipline_secondaire
=discipline
))
138 date_min
= self
.cleaned_data
['date_min']
140 evenements
= evenements
.filter(debut__gte
=date_min
)
141 date_max
= self
.cleaned_data
['date_max']
143 evenements
= evenements
.filter(debut__lte
=date_max
)
146 def get_search_regexp(self
):
147 """Retourne une expression régulière compilée qui peut servir à
148 chercher les mot-clés recherchés dans un texte."""
150 return build_search_regexp(self
.cleaned_data
['q'])
154 class FrontEndSplitDateTime(widgets
.AdminSplitDateTime
):
158 settings
.ADMIN_MEDIA_PREFIX
+ "js/core.js",
159 settings
.ADMIN_MEDIA_PREFIX
+ "js/calendar.js",
160 settings
.ADMIN_MEDIA_PREFIX
+ "js/admin/DateTimeShortcuts.js",
161 'js/calendrier.js', )
162 css
= {'all' : ('css/calendrier.css', )}
164 class EvenementForm(EvenementAdminForm
):
165 debut
= forms
.DateTimeField(widget
=FrontEndSplitDateTime
)
166 fin
= forms
.DateTimeField(widget
=FrontEndSplitDateTime
)
170 exclude
= ('approuve', 'uid')
172 # Admin views pour les associations par lots
174 class PaysForm(forms
.Form
):
175 values
= [(p
.id, p
.nom
) for p
in Pays
.objects
.all()]
176 pays
= forms
.MultipleChoiceField(choices
=values
)
178 class RegionsForm(forms
.Form
):
179 values
= [(r
.id, r
.nom
) for r
in Region
.objects
.all()]
180 regions
= forms
.MultipleChoiceField(choices
=values
)
182 class ThematiquesForm(forms
.Form
):
183 values
= [(t
.id, t
.nom
) for t
in Thematique
.objects
.all()]
184 thematiques
= forms
.MultipleChoiceField(choices
=values
)
186 class DisciplinesForm(forms
.Form
):
187 values
= [(t
.id, t
.nom
) for t
in Discipline
.objects
.all()]
188 disciplines
= forms
.MultipleChoiceField(choices
=values
)
190 class ConfirmationForm(forms
.Form
):