Commit | Line | Data |
---|---|---|
544b4522 | 1 | # -*- encoding: utf-8 -*- |
73309469 | 2 | import re, datetime |
544b4522 | 3 | from django import forms |
6cdb7d49 | 4 | from django import db |
7bbf600c | 5 | from django.db.models import Q |
73309469 | 6 | from django.db import models |
7 | from django.contrib.admin import widgets | |
0a77a7d6 | 8 | from datamaster_modeles.models import Thematique, Pays, Region |
c9cbc784 | 9 | from models import Evenement, Discipline, Record, Actualite |
0b72ebef | 10 | from savoirs.lib.recherche import build_search_regexp |
73309469 | 11 | from savoirs.admin import EvenementAdminForm |
60d2095f | 12 | import settings |
da44ce68 | 13 | |
7bbf600c EMS |
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): | |
0a8666f8 | 20 | super(SEPDateField, self).__init__(self, *args, **kwargs) |
7bbf600c EMS |
21 | |
22 | # La classe "date" active le datepicker dans sep.js | |
7bbf600c | 23 | # Nous recevons les dates en format français |
0a8666f8 | 24 | format = '%d/%m/%Y' |
25 | self.widget = forms.DateInput(attrs={'class': 'date'}, format=format) | |
26 | self.input_formats = [format,] | |
7bbf600c | 27 | |
da44ce68 | 28 | # Formulaires de recherche |
544b4522 | 29 | |
da44ce68 EMS |
30 | class RecordSearchForm(forms.Form): |
31 | """Formulaire de recherche pour les ressources.""" | |
32 | ||
6cdb7d49 EMS |
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 | ||
da44ce68 | 47 | q = forms.CharField(required=False, label="Mots-clés") |
f12cc7fb EMS |
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") | |
6cdb7d49 | 51 | type = forms.ChoiceField(required=False, label="Type de document", choices = TYPE_CHOICES) |
da44ce68 EMS |
52 | |
53 | def get_query_set(self): | |
54 | """Retourne l'ensemble des ressources qui correspondent aux valeurs | |
55 | entrées dans le formulaire.""" | |
f153be1b | 56 | records = Record.objects.validated() |
da44ce68 EMS |
57 | if self.is_valid(): |
58 | query = self.cleaned_data['q'] | |
59 | if query: | |
60 | records = records.search(query) | |
f12cc7fb EMS |
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) | |
6cdb7d49 EMS |
70 | type = self.cleaned_data['type'] |
71 | if type: | |
72 | records = records.filter(type__icontains=type) | |
da44ce68 EMS |
73 | return records |
74 | ||
f61e4846 EMS |
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(): | |
0b72ebef | 79 | return build_search_regexp(self.cleaned_data['q']) |
f61e4846 | 80 | |
c9cbc784 EMS |
81 | class ActualiteSearchForm(forms.Form): |
82 | """Formulaire de recherche pour les actualités.""" | |
83 | ||
84 | q = forms.CharField(required=False, label="Mots-clés") | |
7bbf600c EMS |
85 | date_min = SEPDateField(required=False, label="Depuis le") |
86 | date_max = SEPDateField(required=False, label="Jusqu'au") | |
c9cbc784 EMS |
87 | |
88 | def get_query_set(self): | |
89 | """Retourne l'ensemble des actualités qui correspondent aux valeurs | |
90 | entrées dans le formulaire.""" | |
f153be1b | 91 | actualites = Actualite.objects.filter(visible=True) |
c9cbc784 EMS |
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: | |
c9cbc784 EMS |
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']) | |
4101cfc0 EMS |
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") | |
7bbf600c EMS |
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") | |
4101cfc0 EMS |
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) | |
7bbf600c EMS |
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) | |
4101cfc0 EMS |
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 | ||
da44ce68 | 152 | ### |
544b4522 | 153 | |
73309469 | 154 | class FrontEndSplitDateTime(widgets.AdminSplitDateTime): |
155 | class Media: | |
60d2095f | 156 | extend=False |
713e8613 | 157 | js = ("/jsi18n/", |
60d2095f | 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', ) | |
73309469 | 162 | css = {'all' : ('css/calendrier.css', )} |
163 | ||
164 | class EvenementForm(EvenementAdminForm): | |
165 | debut = forms.DateTimeField(widget=FrontEndSplitDateTime) | |
166 | fin = forms.DateTimeField(widget=FrontEndSplitDateTime) | |
167 | ||
92c7413b CR |
168 | class Meta: |
169 | model = Evenement | |
b7a741ad | 170 | exclude = ('approuve', 'uid') |
0a77a7d6 | 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 |