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