52ac747b7e6648699a62bf67b67545b9b71f0be5
[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 import db
5 from django.db.models import Q
6 from django.db import models
7 from django.contrib.admin import widgets
8 from django.utils.safestring import mark_safe
9 from datamaster_modeles.models import Thematique, Pays, Region
10 from savoirs.models import Evenement, Discipline, Record, Actualite, RessourceSearch, ActualiteSearch, \
11 AppelSearch, EvenementSearch, Search, RecordCategorie
12 from savoirs.lib.recherche import build_search_regexp
13 from savoirs.admin import EvenementAdminForm
14 import settings
15
16 # Modifications custom aux champs Django
17
18 class SEPDateField(forms.DateField):
19 """Un champ de date avec des valeurs par défaut un peu modifiées."""
20
21 def __init__(self, *args, **kwargs):
22 super(SEPDateField, self).__init__(self, *args, **kwargs)
23
24 # La classe "date" active le datepicker dans sep.js
25 # Nous recevons les dates en format français
26 format = '%d/%m/%Y'
27 self.widget = forms.DateInput(attrs={'class': 'date'}, format=format)
28 self.input_formats = [format]
29
30 class SEPSplitDateTimeWidget(forms.MultiWidget):
31
32 def __init__(self):
33 self.date_format = '%d/%m/%Y'
34 self.time_format = '%H:%M'
35 widgets = (forms.DateInput(attrs={'class': 'date'}, format=self.date_format),
36 forms.TimeInput(attrs={'class': 'time'}, format=self.time_format))
37 super(SEPSplitDateTimeWidget, self).__init__(widgets)
38
39 def decompress(self, value):
40 if value:
41 return [value.date(), value.time().replace(microsecond=0)]
42 return [None, None]
43
44 def format_output(self, rendered_widgets):
45 return mark_safe(u'Date: %s Heure: %s' % (rendered_widgets[0], rendered_widgets[1]))
46
47 class SEPDateTimeField(forms.DateTimeField):
48 widget = SEPSplitDateTimeWidget
49
50 def __init__(self, *args, **kwargs):
51 super(SEPDateTimeField, self).__init__(input_formats=['%d/%m/%Y %H:%M'])
52
53 # Formulaires de recherche
54
55 class RessourceSearchForm(forms.ModelForm):
56 """Formulaire de recherche pour les ressources."""
57
58 class Meta:
59 model = RessourceSearch
60 fields = ['q', 'auteur', 'titre', 'sujet', 'publisher', 'discipline', 'region']
61
62 class RessourceSearchEditForm(RessourceSearchForm):
63 """Formulaire d'édition de recherche sauvegardée."""
64
65 class Meta(RessourceSearchForm.Meta):
66 fields = ['nom', 'alerte_courriel'] + RessourceSearchForm.Meta.fields
67
68 class ActualiteSearchForm(forms.ModelForm):
69 """Formulaire de recherche pour les actualités."""
70 date_min = SEPDateField(required=False, label="Depuis le")
71 date_max = SEPDateField(required=False, label="Jusqu'au")
72
73 class Meta:
74 model = ActualiteSearch
75 fields = ['q', 'date_min', 'date_max', 'discipline', 'region']
76
77 class ActualiteSearchEditForm(ActualiteSearchForm):
78
79 class Meta(ActualiteSearchForm.Meta):
80 fields = ['nom', 'alerte_courriel'] + ActualiteSearchForm.Meta.fields
81
82 class AppelSearchForm(forms.ModelForm):
83 """Formulaire de recherche pour les actualités."""
84 date_min = SEPDateField(required=False, label="Depuis le")
85 date_max = SEPDateField(required=False, label="Jusqu'au")
86
87 class Meta:
88 model = AppelSearch
89 fields = ['q', 'date_min', 'date_max', 'discipline', 'region']
90
91 class AppelSearchEditForm(AppelSearchForm):
92
93 class Meta(AppelSearchForm.Meta):
94 fields = ['nom', 'alerte_courriel'] + AppelSearchForm.Meta.fields
95
96 class EvenementSearchForm(forms.ModelForm):
97 """Formulaire de recherche pour les évènements."""
98 date_min = SEPDateField(required=False, label="Depuis le")
99 date_max = SEPDateField(required=False, label="Jusqu'au")
100
101 class Meta:
102 model = EvenementSearch
103 fields = ['q', 'type', 'date_min', 'date_max', 'discipline', 'region']
104
105 class EvenementSearchEditForm(EvenementSearchForm):
106
107 class Meta(EvenementSearchForm.Meta):
108 fields = ['nom', 'alerte_courriel'] + EvenementSearchForm.Meta.fields
109
110 class SearchEditForm(forms.ModelForm):
111
112 class Meta:
113 model = Search
114
115 ###
116
117 class EvenementForm(EvenementAdminForm):
118 debut = SEPDateTimeField()
119 fin = SEPDateTimeField()
120 description = forms.CharField(
121 label='Description', required=True,
122 help_text="Présenter les thématiques de l'évènement et donner toutes les informations utiles aux futurs participants.",
123 widget=forms.Textarea
124 )
125 pays = forms.ModelChoiceField(
126 queryset=Pays.objects.all(), required=True, label='Pays',
127 help_text="La sélection du pays entraine la saisie automatique du fuseau horaire."
128 )
129
130 class Meta:
131 model = Evenement
132 exclude = ('contact', 'approuve', 'uid', 'regions')
133
134 # Admin views pour les associations par lots
135
136 class CategorieForm(forms.Form):
137 categorie = forms.ModelChoiceField(queryset=RecordCategorie.objects.all())
138
139 class PaysForm(forms.Form):
140 values = [(p.id, p.nom) for p in Pays.objects.all()]
141 pays = forms.MultipleChoiceField(choices=values)
142
143 class RegionsForm(forms.Form):
144 regions = forms.ModelMultipleChoiceField(queryset=Region.objects.all())
145
146 class ThematiquesForm(forms.Form):
147 values = [(t.id, t.nom) for t in Thematique.objects.all()]
148 thematiques = forms.MultipleChoiceField(choices=values)
149
150 class DisciplinesForm(forms.Form):
151 disciplines = forms.ModelMultipleChoiceField(queryset=Discipline.objects.all())
152
153 class ConfirmationForm(forms.Form):
154 pass
155