|
1
|
# -*- coding: utf-8 -*-
|
|
2
|
from django import forms
|
|
3
|
from django.forms.models import (inlineformset_factory, modelformset_factory,
|
|
4
|
BaseInlineFormSet, BaseModelFormSet)
|
|
5
|
from django.utils.translation import gettext_lazy as _
|
|
6
|
from django.contrib.auth.models import User
|
|
7
|
|
|
8
|
from calebasse.ressources.models import WorkerType, Service
|
|
9
|
|
|
10
|
from models import Worker, UserWorker, TimeTable, Holiday
|
|
11
|
|
|
12
|
|
|
13
|
class UserForm(forms.ModelForm):
|
|
14
|
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
|
worker = forms.ModelChoiceField(label=_('Personnel'),
|
|
20
|
queryset=Worker.objects.all(), empty_label=_('None'),
|
|
21
|
required=False)
|
|
22
|
password1 = forms.CharField(label=_("Password"),
|
|
23
|
widget=forms.PasswordInput, required=False)
|
|
24
|
password2 = forms.CharField(label=_("Password confirmation"),
|
|
25
|
widget=forms.PasswordInput,
|
|
26
|
help_text=_("Enter the same password as above, for verification."),
|
|
27
|
required=False)
|
|
28
|
|
|
29
|
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
|
|
|
41
|
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
|
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
|
|
|
53
|
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
|
|
|
61
|
class Meta:
|
|
62
|
model = User
|
|
63
|
fields = ('username', 'email', 'password1', 'password2', 'worker')
|
|
64
|
|
|
65
|
def save(self, commit=True):
|
|
66
|
instance = super(UserForm, self).save(commit=False)
|
|
67
|
if self.cleaned_data['password1']:
|
|
68
|
instance.set_password(self.cleaned_data['password1'])
|
|
69
|
worker = self.cleaned_data.get('worker')
|
|
70
|
if worker is not None:
|
|
71
|
instance.first_name = worker.first_name
|
|
72
|
instance.last_name = worker.last_name
|
|
73
|
def save_m2m():
|
|
74
|
qs = UserWorker.objects.filter(user=instance)
|
|
75
|
if qs.exists():
|
|
76
|
qs.update(worker=worker)
|
|
77
|
else:
|
|
78
|
UserWorker.objects.create(user=instance, worker=worker)
|
|
79
|
self.save_m2m = save_m2m
|
|
80
|
if commit:
|
|
81
|
instance.save()
|
|
82
|
self.save_m2m()
|
|
83
|
return instance
|
|
84
|
|
|
85
|
class WorkerSearchForm(forms.Form):
|
|
86
|
last_name = forms.CharField(label=u'Nom', required=False)
|
|
87
|
first_name = forms.CharField(label=u'Prénom', required=False)
|
|
88
|
profession = forms.ModelChoiceField(label=u'Profession',
|
|
89
|
queryset=WorkerType.objects.all(), required=False)
|
|
90
|
|
|
91
|
INTERVENE_STATUS_CHOICES = {
|
|
92
|
'a': u'Thérapeute',
|
|
93
|
'b': u'Non-thérapeute'
|
|
94
|
}
|
|
95
|
|
|
96
|
intervene_status = forms.MultipleChoiceField(
|
|
97
|
choices=INTERVENE_STATUS_CHOICES.iteritems(),
|
|
98
|
widget=forms.CheckboxSelectMultiple,
|
|
99
|
initial=INTERVENE_STATUS_CHOICES.keys(),
|
|
100
|
required=False)
|
|
101
|
|
|
102
|
class WorkerIdForm(forms.ModelForm):
|
|
103
|
class Meta:
|
|
104
|
model = Worker
|
|
105
|
fields = ('last_name', 'first_name', 'gender')
|
|
106
|
|
|
107
|
class WorkerServiceForm(forms.ModelForm):
|
|
108
|
class Meta:
|
|
109
|
model = Worker
|
|
110
|
fields = ('services',)
|
|
111
|
widgets = {
|
|
112
|
'services': forms.CheckboxSelectMultiple,
|
|
113
|
}
|
|
114
|
|
|
115
|
|
|
116
|
class BaseTimeTableForm(forms.ModelForm):
|
|
117
|
class Meta:
|
|
118
|
model = TimeTable
|
|
119
|
widgets = {
|
|
120
|
'services': forms.CheckboxSelectMultiple,
|
|
121
|
'week_rank': forms.SelectMultiple,
|
|
122
|
}
|
|
123
|
|
|
124
|
TimetableFormSet = inlineformset_factory(Worker, TimeTable,
|
|
125
|
form=BaseTimeTableForm,
|
|
126
|
fields=('start_time', 'end_time', 'start_date', 'end_date',
|
|
127
|
'services', 'week_period', 'week_parity', 'week_rank'))
|
|
128
|
|
|
129
|
class BaseHolidayForm(forms.ModelForm):
|
|
130
|
class Meta:
|
|
131
|
widgets = {
|
|
132
|
'comment': forms.Textarea(attrs={'rows': 3}),
|
|
133
|
}
|
|
134
|
|
|
135
|
HolidayFormSet = inlineformset_factory(
|
|
136
|
Worker, Holiday,
|
|
137
|
form=BaseHolidayForm,
|
|
138
|
fields=('start_date', 'end_date', 'start_time', 'end_time', 'comment'))
|
|
139
|
|
|
140
|
class HolidaySearchForm(forms.Form):
|
|
141
|
start_date = forms.DateField(required=False)
|
|
142
|
end_date = forms.DateField(required=False)
|
|
143
|
|
|
144
|
def clean(self):
|
|
145
|
cleaned_data = super(HolidaySearchForm, self).clean()
|
|
146
|
if cleaned_data.get('start_date') or cleaned_data.get('end_date'):
|
|
147
|
if not cleaned_data.get('start_date') \
|
|
148
|
or not cleaned_data.get('end_date'):
|
|
149
|
raise forms.ValidationError(u'Vous devez fournir une date de début et de fin')
|
|
150
|
if cleaned_data['start_date'] > cleaned_data['end_date']:
|
|
151
|
raise forms.ValidationError(u'La date de début doit être supérieure à la date de fin')
|
|
152
|
return cleaned_data
|
|
153
|
|
|
154
|
class YearlyHolidayBaseFormSet(BaseModelFormSet):
|
|
155
|
def __init__(self, *args, **kwargs):
|
|
156
|
self.service = kwargs.pop('service', None)
|
|
157
|
old_form = self.form
|
|
158
|
self.form = lambda *args, **kwargs: old_form(*args, service=self.service, **kwargs)
|
|
159
|
super(YearlyHolidayBaseFormSet, self).__init__(*args, **kwargs)
|
|
160
|
|
|
161
|
class YearlyHolidayForm(forms.ModelForm):
|
|
162
|
for_all_services = forms.BooleanField(required=False)
|
|
163
|
|
|
164
|
def __init__(self, *args, **kwargs):
|
|
165
|
self.service = kwargs.pop('service', None)
|
|
166
|
super(YearlyHolidayForm, self).__init__(*args, **kwargs)
|
|
167
|
if self.instance and self.instance.id:
|
|
168
|
self.initial['for_all_services'] = self.instance.service is None
|
|
169
|
|
|
170
|
|
|
171
|
def save(self, commit=True):
|
|
172
|
instance = super(YearlyHolidayForm, self).save(commit=False)
|
|
173
|
if not self.cleaned_data.get('for_all_services', False):
|
|
174
|
instance.service = self.service
|
|
175
|
if commit:
|
|
176
|
instance.save()
|
|
177
|
return instance
|
|
178
|
|
|
179
|
class Meta:
|
|
180
|
form = Holiday
|
|
181
|
|
|
182
|
YearlyHolidayFormSet = modelformset_factory(Holiday,
|
|
183
|
can_delete=True,
|
|
184
|
form=YearlyHolidayForm,
|
|
185
|
formset=YearlyHolidayBaseFormSet,
|
|
186
|
fields=('start_date', 'end_date'))
|