Projet

Général

Profil

Télécharger (9,23 ko) Statistiques
| Branche: | Tag: | Révision:

calebasse / calebasse / personnes / forms.py @ 861220e2

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, HolidayType
9

    
10
from models import Worker, UserWorker, TimeTable, Holiday, ExternalTherapist, ExternalWorker
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.filter(enabled=True), 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['username'].label = _('Identifiant')
33
        if self.instance:
34
            try:
35
                worker = self.instance.userworker.worker
36
                self.fields['worker'].initial = worker.pk
37
            except UserWorker.DoesNotExist:
38
                pass
39

    
40
    def clean_username(self):
41
        # Since User.username is unique, this check is redundant,
42
        # but it sets a nicer error message than the ORM. See #13147.
43
        username = self.cleaned_data["username"]
44
        if self.instance is None:
45
            try:
46
                User.objects.get(username=username)
47
                raise forms.ValidationError(self.error_messages['duplicate_username'])
48
            except User.DoesNotExist:
49
                pass
50
        return username
51

    
52
    def clean_password2(self):
53
        password1 = self.cleaned_data.get("password1")
54
        password2 = self.cleaned_data.get("password2")
55
        if password1 and password2 and password1 != password2:
56
            raise forms.ValidationError(
57
                self.error_messages['password_mismatch'])
58
        return password2
59

    
60
    class Meta:
61
        model = User
62
        fields = ('username', 'email', 'password1', 'password2', 'worker', 'groups')
63
        widgets = {
64
                'groups': forms.CheckboxSelectMultiple,
65
        }
66

    
67
    def save(self, commit=True):
68
        instance = super(UserForm, self).save(commit=False)
69
        if self.cleaned_data['password1']:
70
            instance.set_password(self.cleaned_data['password1'])
71
        worker = self.cleaned_data.get('worker')
72
        if worker is not None:
73
            instance.first_name = worker.first_name
74
            instance.last_name = worker.last_name
75
            def save_m2m():
76
                qs = UserWorker.objects.filter(user=instance)
77
                if qs.exists():
78
                    qs.update(worker=worker)
79
                else:
80
                    UserWorker.objects.create(user=instance, worker=worker)
81
            self.save_m2m = save_m2m
82
        else:
83
            try:
84
                instance.userworker.delete()
85
            except UserWorker.DoesNotExist:
86
                pass
87
        if instance.pk:
88
            instance.groups = self.cleaned_data['groups']
89
        if commit:
90
            instance.save()
91
            self.save_m2m()
92
        return instance
93

    
94
class WorkerSearchForm(forms.Form):
95
    last_name = forms.CharField(label=u'Nom', required=False)
96
    first_name = forms.CharField(label=u'Prénom', required=False)
97
    profession = forms.ModelChoiceField(label=u'Profession',
98
            queryset=WorkerType.objects.all(), required=False)
99

    
100
    INTERVENE_STATUS_CHOICES = {
101
            'a': u'Actifs',
102
    }
103

    
104
    intervene_status = forms.MultipleChoiceField(
105
        choices=INTERVENE_STATUS_CHOICES.iteritems(),
106
        widget=forms.CheckboxSelectMultiple,
107
        initial=INTERVENE_STATUS_CHOICES.keys(),
108
        required=False)
109

    
110
class WorkerIdForm(forms.ModelForm):
111
    class Meta:
112
        model = Worker
113
        fields = ('last_name', 'first_name', 'initials', 'gender', 'type', 'enabled')
114
        widgets = {
115
                'initials': forms.TextInput(attrs={'size': 6}),
116
                }
117

    
118
class WorkerServiceForm(forms.ModelForm):
119
    class Meta:
120
        model = Worker
121
        fields = ('services',)
122
        widgets = {
123
                'services': forms.CheckboxSelectMultiple,
124
        }
125

    
126
PERIOD_LIST_TO_FIELDS = [(1, None, None),
127
(2, None, None),
128
(3, None, None),
129
(4, None, None),
130
(5, None, None),
131
(None, 0, None),
132
(None, 1, None),
133
(None, 2, None),
134
(None, 3, None),
135
(None, 4, None),
136
(None, None, 0),
137
(None, None, 1)
138
]
139

    
140
class BaseTimeTableForm(forms.ModelForm):
141
    class Meta:
142
        model = TimeTable
143
        widgets = {
144
                'services': forms.CheckboxSelectMultiple,
145
                'week_period': forms.HiddenInput(),
146
                'week_parity': forms.HiddenInput(),
147
                'week_rank': forms.HiddenInput(),
148
        }
149

    
150
    def clean(self):
151
        cleaned_data = super(BaseTimeTableForm, self).clean()
152
        msg = None
153
        if not cleaned_data.get('periodicity'):
154
            msg = u"Périodicité manquante."
155
        else:
156
            try:
157
                periodicity = int(cleaned_data.get('periodicity'))
158
                if periodicity:
159
                    if periodicity < 1 or periodicity > 12:
160
                        msg = u"Périodicité inconnue."
161
                    else:
162
                        cleaned_data['week_period'], \
163
                        cleaned_data['week_rank'], \
164
                        cleaned_data['week_parity'] = PERIOD_LIST_TO_FIELDS[periodicity - 1]
165
            except:
166
                msg = u"Périodicité invalide."
167
        if msg:
168
            self._errors["periodicity"] = self.error_class([msg])
169
        return cleaned_data
170

    
171
TimetableFormSet = inlineformset_factory(Worker, TimeTable,
172
        form=BaseTimeTableForm,
173
        fields=('start_time', 'end_time', 'start_date', 'end_date',
174
            'services', 'periodicity', 'week_period', 'week_parity', 'week_rank'))
175

    
176
class BaseHolidayForm(forms.ModelForm):
177
    def __init__(self, *args, **kwargs):
178
        super(BaseHolidayForm, self).__init__(*args, **kwargs)
179
        self.fields['holiday_type'].queryset = \
180
                HolidayType.objects.filter(for_group=False)
181
    class Meta:
182
        widgets = {
183
                'comment': forms.Textarea(attrs={'rows': 3}),
184
        }
185

    
186
class HolidayForm(forms.ModelForm):
187

    
188
    def __init__(self, *args, **kwargs):
189
        super(HolidayForm, self).__init__(*args, **kwargs)
190
        self.fields['holiday_type'].queryset = \
191
            HolidayType.objects.filter(for_group=False)
192

    
193
    class Meta:
194
        model = Holiday
195
        widgets = {
196
            'comment': forms.Textarea(attrs = {'rows': 3, 'cols': 18}),
197
            'start_date': forms.DateInput(format = '%d/%m/%Y',
198
                                          attrs = {'size': 10}),
199
            'end_date': forms.DateInput(format = '%d/%m/%Y',
200
                                        attrs = {'size': 10}),
201
            }
202

    
203
    def clean(self):
204
        cleaned_data = super(HolidayForm, self).clean()
205
        if cleaned_data.get('start_date') and cleaned_data.get('end_date'):
206
            if cleaned_data['start_date'] > cleaned_data['end_date']:
207
                raise forms.ValidationError(u'La date de début doit être supérieure à la date de fin')
208
        return cleaned_data
209

    
210
HolidayFormSet = inlineformset_factory(
211
        Worker, Holiday,
212
        form=BaseHolidayForm,
213
        fields=('start_date', 'end_date', 'start_time', 'end_time', 'holiday_type', 'comment'))
214

    
215
class HolidaySearchForm(forms.Form):
216
    start_date = forms.DateField(required=False, localize=True)
217
    end_date = forms.DateField(required=False, localize=True)
218

    
219
    def clean(self):
220
        cleaned_data = super(HolidaySearchForm, self).clean()
221
        if cleaned_data.get('start_date') and cleaned_data.get('end_date'):
222
            if cleaned_data['start_date'] > cleaned_data['end_date']:
223
                raise forms.ValidationError(u'La date de début doit être supérieure à la date de fin')
224
        return cleaned_data
225

    
226
class GroupHolidayBaseFormSet(BaseModelFormSet):
227
    def __init__(self, *args, **kwargs):
228
        self.service = kwargs.pop('service', None)
229
        old_form = self.form
230
        self.form = lambda *args, **kwargs: old_form(*args, service=self.service, **kwargs)
231
        super(GroupHolidayBaseFormSet, self).__init__(*args, **kwargs)
232

    
233
class GroupHolidayForm(forms.ModelForm):
234

    
235
    def __init__(self, *args, **kwargs):
236
        self.service = kwargs.pop('service', None)
237
        super(GroupHolidayForm, self).__init__(*args, **kwargs)
238
        self.fields['holiday_type'].queryset = \
239
                HolidayType.objects.filter(for_group=True)
240

    
241
    class Meta:
242
        model = Holiday
243
        widgets = {
244
            'comment': forms.Textarea(attrs = {'rows': 3, 'cols': 18}),
245
            'services': forms.CheckboxSelectMultiple()
246
        }
247

    
248
GroupHolidayFormSet = modelformset_factory(Holiday,
249
        can_delete=True,
250
        form=GroupHolidayForm,
251
        formset=GroupHolidayBaseFormSet,
252
        fields=('start_date', 'end_date', 'start_time', 'end_time', 'holiday_type', 'comment'))
(3-3/8)