1 # -*- encoding: utf-8 -*-
3 from django
import forms
4 from django
.db
.models
import Q
5 from django
.db
import models
6 from django
.contrib
.admin
import widgets
7 from datamaster_modeles
.models
import Thematique
, Pays
, Region
8 from models
import Evenement
, Discipline
, Record
, Actualite
9 from savoirs
.lib
.recherche
import build_search_regexp
10 from savoirs
.admin
import EvenementAdminForm
13 # Modifications custom aux champs Django
15 class SEPDateField(forms
.DateField
):
16 """Un champ de date avec des valeurs par défaut un peu modifiées."""
18 def __init__(self
, *args
, **kwargs
):
19 super(SEPDateField
, self
).__init__(self
, *args
, **kwargs
)
21 # La classe "date" active le datepicker dans sep.js
22 # Nous recevons les dates en format français
24 self
.widget
= forms
.DateInput(attrs
={'class': 'date'}, format
=format
)
25 self
.input_formats
= [format
,]
27 # Formulaires de recherche
29 class RecordSearchForm(forms
.Form
):
30 """Formulaire de recherche pour les ressources."""
32 q
= forms
.CharField(required
=False, label
="Mots-clés")
33 auteur
= forms
.CharField(required
=False, label
="Auteur ou contributeur")
34 titre
= forms
.CharField(required
=False, label
="Titre")
35 sujet
= forms
.CharField(required
=False, label
="Sujet")
37 def get_query_set(self
):
38 """Retourne l'ensemble des ressources qui correspondent aux valeurs
39 entrées dans le formulaire."""
40 records
= Record
.objects
.validated()
42 query
= self
.cleaned_data
['q']
44 records
= records
.search(query
)
45 auteur
= self
.cleaned_data
['auteur']
47 records
= records
.search_auteur(auteur
)
48 titre
= self
.cleaned_data
['titre']
50 records
= records
.search_titre(titre
)
51 sujet
= self
.cleaned_data
['sujet']
53 records
= records
.search_sujet(sujet
)
56 def get_search_regexp(self
):
57 """Retourne une expression régulière compilée qui peut servir à
58 chercher les mot-clés recherchés dans un texte."""
60 return build_search_regexp(self
.cleaned_data
['q'])
62 class ActualiteSearchForm(forms
.Form
):
63 """Formulaire de recherche pour les actualités."""
65 q
= forms
.CharField(required
=False, label
="Mots-clés")
66 date_min
= SEPDateField(required
=False, label
="Depuis le")
67 date_max
= SEPDateField(required
=False, label
="Jusqu'au")
69 def get_query_set(self
):
70 """Retourne l'ensemble des actualités qui correspondent aux valeurs
71 entrées dans le formulaire."""
72 actualites
= Actualite
.objects
.filter(visible
=True)
74 query
= self
.cleaned_data
['q']
76 actualites
= actualites
.search(query
)
77 date_min
= self
.cleaned_data
['date_min']
79 actualites
= actualites
.filter(date__gte
=date_min
)
80 date_max
= self
.cleaned_data
['date_max']
82 actualites
= actualites
.filter(date__lte
=date_max
)
85 def get_search_regexp(self
):
86 """Retourne une expression régulière compilée qui peut servir à
87 chercher les mot-clés recherchés dans un texte."""
89 return build_search_regexp(self
.cleaned_data
['q'])
91 class EvenementSearchForm(forms
.Form
):
92 """Formulaire de recherche pour les événements."""
94 q
= forms
.CharField(required
=False, label
="Mots-clés")
95 titre
= forms
.CharField(required
=False, label
="Intitulé")
96 type = forms
.ChoiceField(required
=False, choices
=(('', 'Tous'),)+Evenement
.TYPE_CHOICES
)
97 discipline
= forms
.ModelChoiceField(queryset
=Discipline
.objects
.all(),
98 required
=False, label
="Discipline", empty_label
="Toutes")
99 date_min
= SEPDateField(required
=False, label
="Depuis le")
100 date_max
= SEPDateField(required
=False, label
="Jusqu'au")
102 def get_query_set(self
):
103 """Retourne l'ensemble des événements qui correspondent aux valeurs
104 entrées dans le formulaire."""
105 evenements
= Evenement
.objects
.filter(approuve
=True)
107 query
= self
.cleaned_data
['q']
109 evenements
= evenements
.search(query
)
110 titre
= self
.cleaned_data
['titre']
112 evenements
= evenements
.search_titre(titre
)
113 type = self
.cleaned_data
['type']
115 evenements
= evenements
.filter(type=type)
116 discipline
= self
.cleaned_data
['discipline']
118 evenements
= evenements
.filter(Q(discipline
=discipline
) |
Q(discipline_secondaire
=discipline
))
119 date_min
= self
.cleaned_data
['date_min']
121 evenements
= evenements
.filter(debut__gte
=date_min
)
122 date_max
= self
.cleaned_data
['date_max']
124 evenements
= evenements
.filter(debut__lte
=date_max
)
127 def get_search_regexp(self
):
128 """Retourne une expression régulière compilée qui peut servir à
129 chercher les mot-clés recherchés dans un texte."""
131 return build_search_regexp(self
.cleaned_data
['q'])
135 class FrontEndSplitDateTime(widgets
.AdminSplitDateTime
):
139 settings
.ADMIN_MEDIA_PREFIX
+ "js/core.js",
140 settings
.ADMIN_MEDIA_PREFIX
+ "js/calendar.js",
141 settings
.ADMIN_MEDIA_PREFIX
+ "js/admin/DateTimeShortcuts.js",
142 'js/calendrier.js', )
143 css
= {'all' : ('css/calendrier.css', )}
145 class EvenementForm(EvenementAdminForm
):
146 debut
= forms
.DateTimeField(widget
=FrontEndSplitDateTime
)
147 fin
= forms
.DateTimeField(widget
=FrontEndSplitDateTime
)
151 exclude
= ('approuve', 'uid')
153 # Admin views pour les associations par lots
155 class PaysForm(forms
.Form
):
156 values
= [(p
.id, p
.nom
) for p
in Pays
.objects
.all()]
157 pays
= forms
.MultipleChoiceField(choices
=values
)
159 class RegionsForm(forms
.Form
):
160 values
= [(r
.id, r
.nom
) for r
in Region
.objects
.all()]
161 regions
= forms
.MultipleChoiceField(choices
=values
)
163 class ThematiquesForm(forms
.Form
):
164 values
= [(t
.id, t
.nom
) for t
in Thematique
.objects
.all()]
165 thematiques
= forms
.MultipleChoiceField(choices
=values
)
167 class DisciplinesForm(forms
.Form
):
168 values
= [(t
.id, t
.nom
) for t
in Discipline
.objects
.all()]
169 disciplines
= forms
.MultipleChoiceField(choices
=values
)
171 class ConfirmationForm(forms
.Form
):