1 |
957da834
|
Benjamin Dauvergne
|
# -*- coding: utf-8 -*-
|
2 |
32486db7
|
Benjamin Dauvergne
|
from django import forms
|
3 |
f69ae8a2
|
Benjamin Dauvergne
|
from django.forms.models import (inlineformset_factory, modelformset_factory,
|
4 |
57212b18
|
Benjamin Dauvergne
|
BaseInlineFormSet, BaseModelFormSet)
|
5 |
32486db7
|
Benjamin Dauvergne
|
from django.utils.translation import gettext_lazy as _
|
6 |
1f724c01
|
Benjamin Dauvergne
|
from django.contrib.auth.models import User
|
7 |
|
|
|
8 |
6fd524bc
|
Mikaël Ates
|
from calebasse.ressources.models import WorkerType, Service, HolidayType
|
9 |
957da834
|
Benjamin Dauvergne
|
|
10 |
6c1bf4ad
|
Jérôme Schneider
|
from models import Worker, UserWorker, TimeTable, Holiday, ExternalTherapist, ExternalWorker
|
11 |
1f724c01
|
Benjamin Dauvergne
|
|
12 |
957da834
|
Benjamin Dauvergne
|
|
13 |
32486db7
|
Benjamin Dauvergne
|
class UserForm(forms.ModelForm):
|
14 |
8ad901c7
|
Benjamin Dauvergne
|
error_messages = {
|
15 |
|
|
'duplicate_username': _("A user with that username already exists."),
|
16 |
|
|
'password_mismatch': _("The two password fields didn't match."),
|
17 |
|
|
}
|
18 |
|
|
|
19 |
32486db7
|
Benjamin Dauvergne
|
worker = forms.ModelChoiceField(label=_('Personnel'),
|
20 |
c0f82cd1
|
Frédéric Péters
|
queryset=Worker.objects.filter(enabled=True), empty_label=_('None'),
|
21 |
32486db7
|
Benjamin Dauvergne
|
required=False)
|
22 |
|
|
password1 = forms.CharField(label=_("Password"),
|
23 |
b478e27e
|
Benjamin Dauvergne
|
widget=forms.PasswordInput, required=False)
|
24 |
32486db7
|
Benjamin Dauvergne
|
password2 = forms.CharField(label=_("Password confirmation"),
|
25 |
|
|
widget=forms.PasswordInput,
|
26 |
b478e27e
|
Benjamin Dauvergne
|
help_text=_("Enter the same password as above, for verification."),
|
27 |
|
|
required=False)
|
28 |
1f724c01
|
Benjamin Dauvergne
|
|
29 |
32486db7
|
Benjamin Dauvergne
|
def __init__(self, service=None, *args, **kwargs):
|
30 |
|
|
self.service = service
|
31 |
|
|
super(UserForm, self).__init__(*args, **kwargs)
|
32 |
|
|
self.fields['worker'].queryset = Worker.objects.for_service(service)
|
33 |
|
|
self.fields['username'].label = _('Identifiant')
|
34 |
|
|
if self.instance:
|
35 |
|
|
try:
|
36 |
|
|
worker = self.instance.userworker.worker
|
37 |
|
|
self.fields['worker'].initial = worker.pk
|
38 |
|
|
except UserWorker.DoesNotExist:
|
39 |
|
|
pass
|
40 |
1f724c01
|
Benjamin Dauvergne
|
|
41 |
32486db7
|
Benjamin Dauvergne
|
def clean_username(self):
|
42 |
|
|
# Since User.username is unique, this check is redundant,
|
43 |
|
|
# but it sets a nicer error message than the ORM. See #13147.
|
44 |
|
|
username = self.cleaned_data["username"]
|
45 |
1b19a9e4
|
Benjamin Dauvergne
|
if self.instance is None:
|
46 |
|
|
try:
|
47 |
|
|
User.objects.get(username=username)
|
48 |
|
|
raise forms.ValidationError(self.error_messages['duplicate_username'])
|
49 |
|
|
except User.DoesNotExist:
|
50 |
|
|
pass
|
51 |
|
|
return username
|
52 |
1f724c01
|
Benjamin Dauvergne
|
|
53 |
32486db7
|
Benjamin Dauvergne
|
def clean_password2(self):
|
54 |
|
|
password1 = self.cleaned_data.get("password1")
|
55 |
|
|
password2 = self.cleaned_data.get("password2")
|
56 |
|
|
if password1 and password2 and password1 != password2:
|
57 |
|
|
raise forms.ValidationError(
|
58 |
|
|
self.error_messages['password_mismatch'])
|
59 |
|
|
return password2
|
60 |
1f724c01
|
Benjamin Dauvergne
|
|
61 |
|
|
class Meta:
|
62 |
32486db7
|
Benjamin Dauvergne
|
model = User
|
63 |
fa494312
|
Mikaël Ates
|
fields = ('username', 'email', 'password1', 'password2', 'worker', 'groups')
|
64 |
|
|
widgets = {
|
65 |
|
|
'groups': forms.CheckboxSelectMultiple,
|
66 |
|
|
}
|
67 |
32486db7
|
Benjamin Dauvergne
|
|
68 |
|
|
def save(self, commit=True):
|
69 |
|
|
instance = super(UserForm, self).save(commit=False)
|
70 |
|
|
if self.cleaned_data['password1']:
|
71 |
|
|
instance.set_password(self.cleaned_data['password1'])
|
72 |
|
|
worker = self.cleaned_data.get('worker')
|
73 |
|
|
if worker is not None:
|
74 |
65141e8b
|
Benjamin Dauvergne
|
instance.first_name = worker.first_name
|
75 |
|
|
instance.last_name = worker.last_name
|
76 |
b478e27e
|
Benjamin Dauvergne
|
def save_m2m():
|
77 |
65141e8b
|
Benjamin Dauvergne
|
qs = UserWorker.objects.filter(user=instance)
|
78 |
|
|
if qs.exists():
|
79 |
|
|
qs.update(worker=worker)
|
80 |
b478e27e
|
Benjamin Dauvergne
|
else:
|
81 |
65141e8b
|
Benjamin Dauvergne
|
UserWorker.objects.create(user=instance, worker=worker)
|
82 |
32486db7
|
Benjamin Dauvergne
|
self.save_m2m = save_m2m
|
83 |
fa494312
|
Mikaël Ates
|
if instance.pk:
|
84 |
|
|
instance.groups = self.cleaned_data['groups']
|
85 |
32486db7
|
Benjamin Dauvergne
|
if commit:
|
86 |
|
|
instance.save()
|
87 |
b478e27e
|
Benjamin Dauvergne
|
self.save_m2m()
|
88 |
32486db7
|
Benjamin Dauvergne
|
return instance
|
89 |
e3c5afd2
|
Jérôme Schneider
|
|
90 |
957da834
|
Benjamin Dauvergne
|
class WorkerSearchForm(forms.Form):
|
91 |
|
|
last_name = forms.CharField(label=u'Nom', required=False)
|
92 |
|
|
first_name = forms.CharField(label=u'Prénom', required=False)
|
93 |
|
|
profession = forms.ModelChoiceField(label=u'Profession',
|
94 |
|
|
queryset=WorkerType.objects.all(), required=False)
|
95 |
|
|
|
96 |
|
|
INTERVENE_STATUS_CHOICES = {
|
97 |
951c324b
|
Mikaël Ates
|
'a': u'Actifs',
|
98 |
957da834
|
Benjamin Dauvergne
|
}
|
99 |
|
|
|
100 |
|
|
intervene_status = forms.MultipleChoiceField(
|
101 |
|
|
choices=INTERVENE_STATUS_CHOICES.iteritems(),
|
102 |
|
|
widget=forms.CheckboxSelectMultiple,
|
103 |
|
|
initial=INTERVENE_STATUS_CHOICES.keys(),
|
104 |
|
|
required=False)
|
105 |
04022fee
|
Benjamin Dauvergne
|
|
106 |
|
|
class WorkerIdForm(forms.ModelForm):
|
107 |
|
|
class Meta:
|
108 |
|
|
model = Worker
|
109 |
97bee351
|
Jérôme Schneider
|
fields = ('last_name', 'first_name', 'initials', 'gender', 'type', 'enabled')
|
110 |
|
|
widgets = {
|
111 |
|
|
'initials': forms.TextInput(attrs={'size': 6}),
|
112 |
|
|
}
|
113 |
04022fee
|
Benjamin Dauvergne
|
|
114 |
|
|
class WorkerServiceForm(forms.ModelForm):
|
115 |
|
|
class Meta:
|
116 |
|
|
model = Worker
|
117 |
|
|
fields = ('services',)
|
118 |
|
|
widgets = {
|
119 |
|
|
'services': forms.CheckboxSelectMultiple,
|
120 |
|
|
}
|
121 |
|
|
|
122 |
eaf1d7af
|
Mikaël Ates
|
PERIOD_LIST_TO_FIELDS = [(1, None, None),
|
123 |
|
|
(2, None, None),
|
124 |
|
|
(3, None, None),
|
125 |
|
|
(4, None, None),
|
126 |
|
|
(5, None, None),
|
127 |
|
|
(None, 0, None),
|
128 |
|
|
(None, 1, None),
|
129 |
|
|
(None, 2, None),
|
130 |
|
|
(None, 3, None),
|
131 |
|
|
(None, 4, None),
|
132 |
|
|
(None, None, 0),
|
133 |
|
|
(None, None, 1)
|
134 |
|
|
]
|
135 |
f69ae8a2
|
Benjamin Dauvergne
|
|
136 |
52d3b722
|
Benjamin Dauvergne
|
class BaseTimeTableForm(forms.ModelForm):
|
137 |
|
|
class Meta:
|
138 |
|
|
model = TimeTable
|
139 |
|
|
widgets = {
|
140 |
|
|
'services': forms.CheckboxSelectMultiple,
|
141 |
eaf1d7af
|
Mikaël Ates
|
'week_period': forms.HiddenInput(),
|
142 |
|
|
'week_parity': forms.HiddenInput(),
|
143 |
|
|
'week_rank': forms.HiddenInput(),
|
144 |
52d3b722
|
Benjamin Dauvergne
|
}
|
145 |
|
|
|
146 |
eaf1d7af
|
Mikaël Ates
|
def clean(self):
|
147 |
|
|
cleaned_data = super(BaseTimeTableForm, self).clean()
|
148 |
|
|
msg = None
|
149 |
|
|
if not cleaned_data.get('periodicity'):
|
150 |
|
|
msg = u"Périodicité manquante."
|
151 |
|
|
else:
|
152 |
|
|
try:
|
153 |
|
|
periodicity = int(cleaned_data.get('periodicity'))
|
154 |
|
|
if periodicity:
|
155 |
|
|
if periodicity < 1 or periodicity > 12:
|
156 |
|
|
msg = u"Périodicité inconnue."
|
157 |
|
|
else:
|
158 |
|
|
cleaned_data['week_period'], \
|
159 |
bc7fa41d
|
Mikaël Ates
|
cleaned_data['week_rank'], \
|
160 |
|
|
cleaned_data['week_parity'] = PERIOD_LIST_TO_FIELDS[periodicity - 1]
|
161 |
eaf1d7af
|
Mikaël Ates
|
except:
|
162 |
|
|
msg = u"Périodicité invalide."
|
163 |
|
|
if msg:
|
164 |
|
|
self._errors["periodicity"] = self.error_class([msg])
|
165 |
|
|
return cleaned_data
|
166 |
|
|
|
167 |
04022fee
|
Benjamin Dauvergne
|
TimetableFormSet = inlineformset_factory(Worker, TimeTable,
|
168 |
52d3b722
|
Benjamin Dauvergne
|
form=BaseTimeTableForm,
|
169 |
f8f903c3
|
Benjamin Dauvergne
|
fields=('start_time', 'end_time', 'start_date', 'end_date',
|
170 |
eaf1d7af
|
Mikaël Ates
|
'services', 'periodicity', 'week_period', 'week_parity', 'week_rank'))
|
171 |
04022fee
|
Benjamin Dauvergne
|
|
172 |
a39c35ec
|
Benjamin Dauvergne
|
class BaseHolidayForm(forms.ModelForm):
|
173 |
6fd524bc
|
Mikaël Ates
|
def __init__(self, *args, **kwargs):
|
174 |
|
|
super(BaseHolidayForm, self).__init__(*args, **kwargs)
|
175 |
|
|
self.fields['holiday_type'].queryset = \
|
176 |
|
|
HolidayType.objects.filter(for_group=False)
|
177 |
a39c35ec
|
Benjamin Dauvergne
|
class Meta:
|
178 |
|
|
widgets = {
|
179 |
|
|
'comment': forms.Textarea(attrs={'rows': 3}),
|
180 |
|
|
}
|
181 |
|
|
|
182 |
c029f285
|
Serghei MIHAI
|
class HolidayForm(forms.ModelForm):
|
183 |
|
|
|
184 |
2b777f8f
|
Serghei MIHAI
|
def __init__(self, *args, **kwargs):
|
185 |
|
|
super(HolidayForm, self).__init__(*args, **kwargs)
|
186 |
cb647183
|
Serghei MIHAI
|
self.fields['holiday_type'].queryset = \
|
187 |
|
|
HolidayType.objects.filter(for_group=False)
|
188 |
2b777f8f
|
Serghei MIHAI
|
|
189 |
c029f285
|
Serghei MIHAI
|
class Meta:
|
190 |
|
|
model = Holiday
|
191 |
|
|
widgets = {
|
192 |
|
|
'comment': forms.Textarea(attrs = {'rows': 3, 'cols': 18}),
|
193 |
c0052b0f
|
Serghei MIHAI
|
'start_date': forms.DateInput(format = '%d/%m/%Y',
|
194 |
|
|
attrs = {'size': 10}),
|
195 |
|
|
'end_date': forms.DateInput(format = '%d/%m/%Y',
|
196 |
2b777f8f
|
Serghei MIHAI
|
attrs = {'size': 10}),
|
197 |
c029f285
|
Serghei MIHAI
|
}
|
198 |
|
|
|
199 |
|
|
def clean(self):
|
200 |
|
|
cleaned_data = super(HolidayForm, self).clean()
|
201 |
|
|
if cleaned_data.get('start_date') and cleaned_data.get('end_date'):
|
202 |
|
|
if cleaned_data['start_date'] > cleaned_data['end_date']:
|
203 |
|
|
raise forms.ValidationError(u'La date de début doit être supérieure à la date de fin')
|
204 |
|
|
return cleaned_data
|
205 |
|
|
|
206 |
04022fee
|
Benjamin Dauvergne
|
HolidayFormSet = inlineformset_factory(
|
207 |
724131cb
|
Benjamin Dauvergne
|
Worker, Holiday,
|
208 |
a39c35ec
|
Benjamin Dauvergne
|
form=BaseHolidayForm,
|
209 |
6fd524bc
|
Mikaël Ates
|
fields=('start_date', 'end_date', 'start_time', 'end_time', 'holiday_type', 'comment'))
|
210 |
f69ae8a2
|
Benjamin Dauvergne
|
|
211 |
|
|
class HolidaySearchForm(forms.Form):
|
212 |
86f4d2f2
|
Benjamin Dauvergne
|
start_date = forms.DateField(required=False, localize=True)
|
213 |
|
|
end_date = forms.DateField(required=False, localize=True)
|
214 |
f69ae8a2
|
Benjamin Dauvergne
|
|
215 |
|
|
def clean(self):
|
216 |
|
|
cleaned_data = super(HolidaySearchForm, self).clean()
|
217 |
84614733
|
Benjamin Dauvergne
|
if cleaned_data.get('start_date') and cleaned_data.get('end_date'):
|
218 |
f69ae8a2
|
Benjamin Dauvergne
|
if cleaned_data['start_date'] > cleaned_data['end_date']:
|
219 |
|
|
raise forms.ValidationError(u'La date de début doit être supérieure à la date de fin')
|
220 |
|
|
return cleaned_data
|
221 |
|
|
|
222 |
6fd524bc
|
Mikaël Ates
|
class GroupHolidayBaseFormSet(BaseModelFormSet):
|
223 |
57212b18
|
Benjamin Dauvergne
|
def __init__(self, *args, **kwargs):
|
224 |
|
|
self.service = kwargs.pop('service', None)
|
225 |
|
|
old_form = self.form
|
226 |
|
|
self.form = lambda *args, **kwargs: old_form(*args, service=self.service, **kwargs)
|
227 |
6fd524bc
|
Mikaël Ates
|
super(GroupHolidayBaseFormSet, self).__init__(*args, **kwargs)
|
228 |
57212b18
|
Benjamin Dauvergne
|
|
229 |
6fd524bc
|
Mikaël Ates
|
class GroupHolidayForm(forms.ModelForm):
|
230 |
f69ae8a2
|
Benjamin Dauvergne
|
|
231 |
57212b18
|
Benjamin Dauvergne
|
def __init__(self, *args, **kwargs):
|
232 |
|
|
self.service = kwargs.pop('service', None)
|
233 |
6fd524bc
|
Mikaël Ates
|
super(GroupHolidayForm, self).__init__(*args, **kwargs)
|
234 |
|
|
self.fields['holiday_type'].queryset = \
|
235 |
|
|
HolidayType.objects.filter(for_group=True)
|
236 |
57212b18
|
Benjamin Dauvergne
|
|
237 |
f69ae8a2
|
Benjamin Dauvergne
|
class Meta:
|
238 |
3ade90b9
|
Serghei MIHAI
|
model = Holiday
|
239 |
6fd524bc
|
Mikaël Ates
|
widgets = {
|
240 |
3ade90b9
|
Serghei MIHAI
|
'comment': forms.Textarea(attrs = {'rows': 3, 'cols': 18}),
|
241 |
5b90c12e
|
Serghei MIHAI
|
'services': forms.CheckboxSelectMultiple()
|
242 |
6fd524bc
|
Mikaël Ates
|
}
|
243 |
f69ae8a2
|
Benjamin Dauvergne
|
|
244 |
6fd524bc
|
Mikaël Ates
|
GroupHolidayFormSet = modelformset_factory(Holiday,
|
245 |
f69ae8a2
|
Benjamin Dauvergne
|
can_delete=True,
|
246 |
6fd524bc
|
Mikaël Ates
|
form=GroupHolidayForm,
|
247 |
|
|
formset=GroupHolidayBaseFormSet,
|
248 |
|
|
fields=('start_date', 'end_date', 'start_time', 'end_time', 'holiday_type', 'comment'))
|