Project

General

Profile

Download (9.17 KB) Statistics
| Branch: | Tag: | Revision:

calebasse / calebasse / personnes / forms.py @ 05a6bb20

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'))