f24955d95985b6f9a868678792f32534bdc09f82
[auf_savoirs_en_partage_django.git] / auf_savoirs_en_partage / savoirs / forms.py
1 # -*- encoding: utf-8 -*-
2 import re, datetime
3 from django import forms
4 from django import db
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
12 import settings
13
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):
20 super(SEPDateField, self).__init__(self, *args, **kwargs)
21
22 # La classe "date" active le datepicker dans sep.js
23 # Nous recevons les dates en format français
24 format = '%d/%m/%Y'
25 self.widget = forms.DateInput(attrs={'class': 'date'}, format=format)
26 self.input_formats = [format,]
27
28 # Formulaires de recherche
29
30 class RecordSearchForm(forms.Form):
31 """Formulaire de recherche pour les ressources."""
32
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()
39 cursor.execute("SELECT DISTINCT REPLACE(REPLACE(type, ', PeerReviewed', ''), ', NonPeerReviewed', '') FROM savoirs_record")
40 for result in cursor.fetchall():
41 type = result[0].strip()
42 if type:
43 yield (type, type)
44
45 TYPE_CHOICES = TypeChoices()
46
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)
52
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()
57 if self.is_valid():
58 query = self.cleaned_data['q']
59 if query:
60 records = records.search(query)
61 auteur = self.cleaned_data['auteur']
62 if auteur:
63 records = records.search_auteur(auteur)
64 titre = self.cleaned_data['titre']
65 if titre:
66 records = records.search_titre(titre)
67 sujet = self.cleaned_data['sujet']
68 if sujet:
69 records = records.search_sujet(sujet)
70 type = self.cleaned_data['type']
71 if type:
72 records = records.filter(type__icontains=type)
73 return records
74
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."""
78 if self.is_valid():
79 return build_search_regexp(self.cleaned_data['q'])
80
81 class ActualiteSearchForm(forms.Form):
82 """Formulaire de recherche pour les actualités."""
83
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")
87
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)
92 if self.is_valid():
93 query = self.cleaned_data['q']
94 if query:
95 actualites = actualites.search(query)
96 date_min = self.cleaned_data['date_min']
97 if date_min:
98 actualites = actualites.filter(date__gte=date_min)
99 date_max = self.cleaned_data['date_max']
100 if date_max:
101 actualites = actualites.filter(date__lte=date_max)
102 return actualites
103
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."""
107 if self.is_valid():
108 return build_search_regexp(self.cleaned_data['q'])
109
110 class EvenementSearchForm(forms.Form):
111 """Formulaire de recherche pour les événements."""
112
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")
120
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)
125 if self.is_valid():
126 query = self.cleaned_data['q']
127 if query:
128 evenements = evenements.search(query)
129 titre = self.cleaned_data['titre']
130 if titre:
131 evenements = evenements.search_titre(titre)
132 type = self.cleaned_data['type']
133 if type:
134 evenements = evenements.filter(type=type)
135 discipline = self.cleaned_data['discipline']
136 if discipline:
137 evenements = evenements.filter(Q(discipline=discipline) | Q(discipline_secondaire=discipline))
138 date_min = self.cleaned_data['date_min']
139 if date_min:
140 evenements = evenements.filter(debut__gte=date_min)
141 date_max = self.cleaned_data['date_max']
142 if date_max:
143 evenements = evenements.filter(debut__lte=date_max)
144 return evenements
145
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."""
149 if self.is_valid():
150 return build_search_regexp(self.cleaned_data['q'])
151
152 ###
153
154 class FrontEndSplitDateTime(widgets.AdminSplitDateTime):
155 class Media:
156 extend=False
157 js = ("/jsi18n/",
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', )}
163
164 class EvenementForm(EvenementAdminForm):
165 debut = forms.DateTimeField(widget=FrontEndSplitDateTime)
166 fin = forms.DateTimeField(widget=FrontEndSplitDateTime)
167
168 class Meta:
169 model = Evenement
170 exclude = ('approuve', 'uid')
171
172 # Admin views pour les associations par lots
173
174 class PaysForm(forms.Form):
175 values = [(p.id, p.nom) for p in Pays.objects.all()]
176 pays = forms.MultipleChoiceField(choices=values)
177
178 class RegionsForm(forms.Form):
179 values = [(r.id, r.nom) for r in Region.objects.all()]
180 regions = forms.MultipleChoiceField(choices=values)
181
182 class ThematiquesForm(forms.Form):
183 values = [(t.id, t.nom) for t in Thematique.objects.all()]
184 thematiques = forms.MultipleChoiceField(choices=values)
185
186 class DisciplinesForm(forms.Form):
187 values = [(t.id, t.nom) for t in Discipline.objects.all()]
188 disciplines = forms.MultipleChoiceField(choices=values)
189
190 class ConfirmationForm(forms.Form):
191 pass
192