Merge branch 'master' of gitosis@git.auf:auf_savoirs_en_partage_django
[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.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
11 import settings
12
13 # Modifications custom aux champs Django
14
15 class SEPDateField(forms.DateField):
16 """Un champ de date avec des valeurs par défaut un peu modifiées."""
17
18 def __init__(self, *args, **kwargs):
19 super(SEPDateField, self).__init__(self, *args, **kwargs)
20
21 # La classe "date" active le datepicker dans sep.js
22 # Nous recevons les dates en format français
23 format = '%d/%m/%Y'
24 self.widget = forms.DateInput(attrs={'class': 'date'}, format=format)
25 self.input_formats = [format,]
26
27 # Formulaires de recherche
28
29 class RechercheAvancee (forms.Form):
30 creator = forms.CharField (max_length=60, required=False, \
31 label = "Auteur ou contributeur") # + contributor
32 title = forms.CharField (max_length=100, required=False, \
33 label = "Titre") # + alt_title
34 description = forms.CharField (max_length=100, required=False, \
35 label = "Description ou résumé") # + abstract
36 subject = forms.CharField (max_length=100, required=False, label = "Sujet")
37 operator = forms.ChoiceField (choices = (('or', 'ou'), ('and', 'et')), label = "Operateur")
38 type = forms.CharField (initial='avancee', required=False, widget=forms.HiddenInput)
39
40 class RecordSearchForm(forms.Form):
41 """Formulaire de recherche pour les ressources."""
42
43 q = forms.CharField(required=False, label="Mots-clés")
44 auteur = forms.CharField(required=False, label="Auteur ou contributeur")
45 titre = forms.CharField(required=False, label="Titre")
46 sujet = forms.CharField(required=False, label="Sujet")
47
48 def get_query_set(self):
49 """Retourne l'ensemble des ressources qui correspondent aux valeurs
50 entrées dans le formulaire."""
51 records = Record.objects.validated()
52 if self.is_valid():
53 query = self.cleaned_data['q']
54 if query:
55 records = records.search(query)
56 auteur = self.cleaned_data['auteur']
57 if auteur:
58 records = records.search_auteur(auteur)
59 titre = self.cleaned_data['titre']
60 if titre:
61 records = records.search_titre(titre)
62 sujet = self.cleaned_data['sujet']
63 if sujet:
64 records = records.search_sujet(sujet)
65 return records
66
67 def get_search_regexp(self):
68 """Retourne une expression régulière compilée qui peut servir à
69 chercher les mot-clés recherchés dans un texte."""
70 if self.is_valid():
71 return build_search_regexp(self.cleaned_data['q'])
72
73 class ActualiteSearchForm(forms.Form):
74 """Formulaire de recherche pour les actualités."""
75
76 q = forms.CharField(required=False, label="Mots-clés")
77 date_min = SEPDateField(required=False, label="Depuis le")
78 date_max = SEPDateField(required=False, label="Jusqu'au")
79
80 def get_query_set(self):
81 """Retourne l'ensemble des actualités qui correspondent aux valeurs
82 entrées dans le formulaire."""
83 actualites = Actualite.objects.filter(visible=True)
84 if self.is_valid():
85 query = self.cleaned_data['q']
86 if query:
87 actualites = actualites.search(query)
88 date_min = self.cleaned_data['date_min']
89 if date_min:
90 actualites = actualites.filter(date__gte=date_min)
91 date_max = self.cleaned_data['date_max']
92 if date_max:
93 actualites = actualites.filter(date__lte=date_max)
94 return actualites
95
96 def get_search_regexp(self):
97 """Retourne une expression régulière compilée qui peut servir à
98 chercher les mot-clés recherchés dans un texte."""
99 if self.is_valid():
100 return build_search_regexp(self.cleaned_data['q'])
101
102 class EvenementSearchForm(forms.Form):
103 """Formulaire de recherche pour les événements."""
104
105 q = forms.CharField(required=False, label="Mots-clés")
106 titre = forms.CharField(required=False, label="Intitulé")
107 type = forms.ChoiceField(required=False, choices=(('', 'Tous'),)+Evenement.TYPE_CHOICES)
108 discipline = forms.ModelChoiceField(queryset=Discipline.objects.all(),
109 required=False, label="Discipline", empty_label="Toutes")
110 date_min = SEPDateField(required=False, label="Depuis le")
111 date_max = SEPDateField(required=False, label="Jusqu'au")
112
113 def get_query_set(self):
114 """Retourne l'ensemble des événements qui correspondent aux valeurs
115 entrées dans le formulaire."""
116 evenements = Evenement.objects.filter(approuve=True)
117 if self.is_valid():
118 query = self.cleaned_data['q']
119 if query:
120 evenements = evenements.search(query)
121 titre = self.cleaned_data['titre']
122 if titre:
123 evenements = evenements.search_titre(titre)
124 type = self.cleaned_data['type']
125 if type:
126 evenements = evenements.filter(type=type)
127 discipline = self.cleaned_data['discipline']
128 if discipline:
129 evenements = evenements.filter(Q(discipline=discipline) | Q(discipline_secondaire=discipline))
130 date_min = self.cleaned_data['date_min']
131 if date_min:
132 evenements = evenements.filter(debut__gte=date_min)
133 date_max = self.cleaned_data['date_max']
134 if date_max:
135 evenements = evenements.filter(debut__lte=date_max)
136 return evenements
137
138 def get_search_regexp(self):
139 """Retourne une expression régulière compilée qui peut servir à
140 chercher les mot-clés recherchés dans un texte."""
141 if self.is_valid():
142 return build_search_regexp(self.cleaned_data['q'])
143
144 ###
145
146 class FrontEndSplitDateTime(widgets.AdminSplitDateTime):
147 class Media:
148 extend=False
149 js = ("/jsi18n/",
150 settings.ADMIN_MEDIA_PREFIX + "js/core.js",
151 settings.ADMIN_MEDIA_PREFIX + "js/calendar.js",
152 settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js",
153 'js/calendrier.js', )
154 css = {'all' : ('css/calendrier.css', )}
155
156 class EvenementForm(EvenementAdminForm):
157 debut = forms.DateTimeField(widget=FrontEndSplitDateTime)
158 fin = forms.DateTimeField(widget=FrontEndSplitDateTime)
159
160 class Meta:
161 model = Evenement
162 exclude = ('approuve', 'uid')
163
164 # Admin views pour les associations par lots
165
166 class PaysForm(forms.Form):
167 values = [(p.id, p.nom) for p in Pays.objects.all()]
168 pays = forms.MultipleChoiceField(choices=values)
169
170 class RegionsForm(forms.Form):
171 values = [(r.id, r.nom) for r in Region.objects.all()]
172 regions = forms.MultipleChoiceField(choices=values)
173
174 class ThematiquesForm(forms.Form):
175 values = [(t.id, t.nom) for t in Thematique.objects.all()]
176 thematiques = forms.MultipleChoiceField(choices=values)
177
178 class DisciplinesForm(forms.Form):
179 values = [(t.id, t.nom) for t in Discipline.objects.all()]
180 disciplines = forms.MultipleChoiceField(choices=values)
181
182 class ConfirmationForm(forms.Form):
183 pass
184