f1ff3b007bc9b79f3ce9b371dc51030ebf547e01
[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 RecordSearchForm(forms.Form):
30 """Formulaire de recherche pour les ressources."""
31
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")
36
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()
41 if self.is_valid():
42 query = self.cleaned_data['q']
43 if query:
44 records = records.search(query)
45 auteur = self.cleaned_data['auteur']
46 if auteur:
47 records = records.search_auteur(auteur)
48 titre = self.cleaned_data['titre']
49 if titre:
50 records = records.search_titre(titre)
51 sujet = self.cleaned_data['sujet']
52 if sujet:
53 records = records.search_sujet(sujet)
54 return records
55
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."""
59 if self.is_valid():
60 return build_search_regexp(self.cleaned_data['q'])
61
62 class ActualiteSearchForm(forms.Form):
63 """Formulaire de recherche pour les actualités."""
64
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")
68
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)
73 if self.is_valid():
74 query = self.cleaned_data['q']
75 if query:
76 actualites = actualites.search(query)
77 date_min = self.cleaned_data['date_min']
78 if date_min:
79 actualites = actualites.filter(date__gte=date_min)
80 date_max = self.cleaned_data['date_max']
81 if date_max:
82 actualites = actualites.filter(date__lte=date_max)
83 return actualites
84
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."""
88 if self.is_valid():
89 return build_search_regexp(self.cleaned_data['q'])
90
91 class EvenementSearchForm(forms.Form):
92 """Formulaire de recherche pour les événements."""
93
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")
101
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)
106 if self.is_valid():
107 query = self.cleaned_data['q']
108 if query:
109 evenements = evenements.search(query)
110 titre = self.cleaned_data['titre']
111 if titre:
112 evenements = evenements.search_titre(titre)
113 type = self.cleaned_data['type']
114 if type:
115 evenements = evenements.filter(type=type)
116 discipline = self.cleaned_data['discipline']
117 if discipline:
118 evenements = evenements.filter(Q(discipline=discipline) | Q(discipline_secondaire=discipline))
119 date_min = self.cleaned_data['date_min']
120 if date_min:
121 evenements = evenements.filter(debut__gte=date_min)
122 date_max = self.cleaned_data['date_max']
123 if date_max:
124 evenements = evenements.filter(debut__lte=date_max)
125 return evenements
126
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."""
130 if self.is_valid():
131 return build_search_regexp(self.cleaned_data['q'])
132
133 ###
134
135 class FrontEndSplitDateTime(widgets.AdminSplitDateTime):
136 class Media:
137 extend=False
138 js = ("/jsi18n/",
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', )}
144
145 class EvenementForm(EvenementAdminForm):
146 debut = forms.DateTimeField(widget=FrontEndSplitDateTime)
147 fin = forms.DateTimeField(widget=FrontEndSplitDateTime)
148
149 class Meta:
150 model = Evenement
151 exclude = ('approuve', 'uid')
152
153 # Admin views pour les associations par lots
154
155 class PaysForm(forms.Form):
156 values = [(p.id, p.nom) for p in Pays.objects.all()]
157 pays = forms.MultipleChoiceField(choices=values)
158
159 class RegionsForm(forms.Form):
160 values = [(r.id, r.nom) for r in Region.objects.all()]
161 regions = forms.MultipleChoiceField(choices=values)
162
163 class ThematiquesForm(forms.Form):
164 values = [(t.id, t.nom) for t in Thematique.objects.all()]
165 thematiques = forms.MultipleChoiceField(choices=values)
166
167 class DisciplinesForm(forms.Form):
168 values = [(t.id, t.nom) for t in Discipline.objects.all()]
169 disciplines = forms.MultipleChoiceField(choices=values)
170
171 class ConfirmationForm(forms.Form):
172 pass
173