7f8e77b08314721c2b3c8983d8d1645e45316299
1 # -*- encoding: utf-8 -*-
3 from django
import forms
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
16 # Modifications custom aux champs Django
18 class SEPDateField(forms
.DateField
):
19 """Un champ de date avec des valeurs par défaut un peu modifiées."""
21 def __init__(self
, *args
, **kwargs
):
22 super(SEPDateField
, self
).__init__(self
, *args
, **kwargs
)
24 # La classe "date" active le datepicker dans sep.js
25 # Nous recevons les dates en format français
27 self
.widget
= forms
.DateInput(attrs
={'class': 'date'}, format
=format
)
28 self
.input_formats
= [format
]
30 class SEPSplitDateTimeWidget(forms
.MultiWidget
):
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
)
39 def decompress(self
, value
):
41 return [value
.date(), value
.time().replace(microsecond
=0)]
44 def format_output(self
, rendered_widgets
):
45 return mark_safe(u
'Date: %s Heure: %s' % (rendered_widgets
[0], rendered_widgets
[1]))
47 class SEPDateTimeField(forms
.DateTimeField
):
48 widget
= SEPSplitDateTimeWidget
50 def __init__(self
, *args
, **kwargs
):
51 super(SEPDateTimeField
, self
).__init__(input_formats
=['%d/%m/%Y %H:%M'])
53 # Formulaires de recherche
55 class RessourceSearchForm(forms
.ModelForm
):
56 """Formulaire de recherche pour les ressources."""
59 model
= RessourceSearch
60 fields
= ['q', 'auteur', 'titre', 'sujet', 'publisher', 'discipline', 'region']
62 class RessourceSearchEditForm(RessourceSearchForm
):
63 """Formulaire d'édition de recherche sauvegardée."""
65 class Meta(RessourceSearchForm
.Meta
):
66 fields
= ['nom', 'alerte_courriel'] + RessourceSearchForm
.Meta
.fields
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")
74 model
= ActualiteSearch
75 fields
= ['q', 'date_min', 'date_max', 'discipline', 'region']
77 class ActualiteSearchEditForm(ActualiteSearchForm
):
79 class Meta(ActualiteSearchForm
.Meta
):
80 fields
= ['nom', 'alerte_courriel'] + ActualiteSearchForm
.Meta
.fields
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")
89 fields
= ['q', 'date_min', 'date_max', 'discipline', 'region']
91 class AppelSearchEditForm(AppelSearchForm
):
93 class Meta(AppelSearchForm
.Meta
):
94 fields
= ['nom', 'alerte_courriel'] + AppelSearchForm
.Meta
.fields
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")
102 model
= EvenementSearch
103 fields
= ['q', 'type', 'date_min', 'date_max', 'discipline', 'region']
105 class EvenementSearchEditForm(EvenementSearchForm
):
107 class Meta(EvenementSearchForm
.Meta
):
108 fields
= ['nom', 'alerte_courriel'] + EvenementSearchForm
.Meta
.fields
110 class SearchEditForm(forms
.ModelForm
):
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
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."
132 exclude
= ('contact', 'approuve', 'uid', 'regions')
134 # Admin views pour les associations par lots
136 class CategorieForm(forms
.Form
):
137 values
= [(c
.id, c
.nom
) for c
in RecordCategorie
.objects
.all()]
138 categorie
= forms
.ChoiceField(choices
=values
)
140 class PaysForm(forms
.Form
):
141 values
= [(p
.id, p
.nom
) for p
in Pays
.objects
.all()]
142 pays
= forms
.MultipleChoiceField(choices
=values
)
144 class RegionsForm(forms
.Form
):
145 regions
= forms
.ModelMultipleChoiceField(queryset
=Region
.objects
.all())
147 class ThematiquesForm(forms
.Form
):
148 values
= [(t
.id, t
.nom
) for t
in Thematique
.objects
.all()]
149 thematiques
= forms
.MultipleChoiceField(choices
=values
)
151 class DisciplinesForm(forms
.Form
):
152 disciplines
= forms
.ModelMultipleChoiceField(queryset
=Discipline
.objects
.all())
154 class ConfirmationForm(forms
.Form
):