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