Project

General

Profile

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

calebasse / calebasse / personnes / forms.py @ b5f052b7

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['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', 'groups')
64
        widgets = {
65
                'groups': forms.CheckboxSelectMultiple,
66
        }
67

    
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
            instance.first_name = worker.first_name
75
            instance.last_name = worker.last_name
76
            def save_m2m():
77
                qs = UserWorker.objects.filter(user=instance)
78
                if qs.exists():
79
                    qs.update(worker=worker)
80
                else:
81
                    UserWorker.objects.create(user=instance, worker=worker)
82
            self.save_m2m = save_m2m
83
        if instance.pk:
84
            instance.groups = self.cleaned_data['groups']
85
        if commit:
86
            instance.save()
87
            self.save_m2m()
88
        return instance
89

    
90
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
            'a': u'Actifs',
98
    }
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

    
106
class WorkerIdForm(forms.ModelForm):
107
    class Meta:
108
        model = Worker
109
        fields = ('last_name', 'first_name', 'gender', 'type', 'enabled')
110

    
111
class WorkerServiceForm(forms.ModelForm):
112
    class Meta:
113
        model = Worker
114
        fields = ('services',)
115
        widgets = {
116
                'services': forms.CheckboxSelectMultiple,
117
        }
118

    
119
PERIOD_LIST_TO_FIELDS = [(1, None, None),
120
(2, None, None),
121
(3, None, None),
122
(4, None, None),
123
(5, None, None),
124
(None, 0, None),
125
(None, 1, None),
126
(None, 2, None),
127
(None, 3, None),
128
(None, 4, None),
129
(None, None, 0),
130
(None, None, 1)
131
]
132

    
133
class BaseTimeTableForm(forms.ModelForm):
134
    class Meta:
135
        model = TimeTable
136
        widgets = {
137
                'services': forms.CheckboxSelectMultiple,
138
                'week_period': forms.HiddenInput(),
139
                'week_parity': forms.HiddenInput(),
140
                'week_rank': forms.HiddenInput(),
141
        }
142

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

    
164
TimetableFormSet = inlineformset_factory(Worker, TimeTable,
165
        form=BaseTimeTableForm,
166
        fields=('start_time', 'end_time', 'start_date', 'end_date',
167
            'services', 'periodicity', 'week_period', 'week_parity', 'week_rank'))
168

    
169
class BaseHolidayForm(forms.ModelForm):
170
    def __init__(self, *args, **kwargs):
171
        super(BaseHolidayForm, self).__init__(*args, **kwargs)
172
        self.fields['holiday_type'].queryset = \
173
                HolidayType.objects.filter(for_group=False)
174
    class Meta:
175
        widgets = {
176
                'comment': forms.Textarea(attrs={'rows': 3}),
177
        }
178

    
179
HolidayFormSet = inlineformset_factory(
180
        Worker, Holiday,
181
        form=BaseHolidayForm,
182
        fields=('start_date', 'end_date', 'start_time', 'end_time', 'holiday_type', 'comment'))
183

    
184
class HolidaySearchForm(forms.Form):
185
    start_date = forms.DateField(required=False, localize=True)
186
    end_date = forms.DateField(required=False, localize=True)
187

    
188
    def clean(self):
189
        cleaned_data = super(HolidaySearchForm, self).clean()
190
        if cleaned_data.get('start_date') and cleaned_data.get('end_date'):
191
            if cleaned_data['start_date'] > cleaned_data['end_date']:
192
                raise forms.ValidationError(u'La date de début doit être supérieure à la date de fin')
193
        return cleaned_data
194

    
195
class GroupHolidayBaseFormSet(BaseModelFormSet):
196
    def __init__(self, *args, **kwargs):
197
        self.service = kwargs.pop('service', None)
198
        old_form = self.form
199
        self.form = lambda *args, **kwargs: old_form(*args, service=self.service, **kwargs)
200
        super(GroupHolidayBaseFormSet, self).__init__(*args, **kwargs)
201

    
202
class GroupHolidayForm(forms.ModelForm):
203
    for_all_services = forms.BooleanField(required=False, initial=True)
204

    
205
    def __init__(self, *args, **kwargs):
206
        self.service = kwargs.pop('service', None)
207
        super(GroupHolidayForm, self).__init__(*args, **kwargs)
208
        if self.instance and self.instance.id:
209
            self.initial['for_all_services'] = self.instance.service is None
210
        self.fields['holiday_type'].queryset = \
211
                HolidayType.objects.filter(for_group=True)
212

    
213

    
214
    def save(self, commit=True):
215
        instance = super(GroupHolidayForm, self).save(commit=False)
216
        if self.cleaned_data.get('for_all_services', False):
217
            instance.service = None
218
        else:
219
            instance.service = self.service
220
        if commit:
221
            instance.save()
222
        return instance
223

    
224
    class Meta:
225
        form = Holiday
226
        widgets = {
227
                'comment': forms.Textarea(attrs={'rows': 3}),
228
        }
229

    
230
GroupHolidayFormSet = modelformset_factory(Holiday,
231
        can_delete=True,
232
        form=GroupHolidayForm,
233
        formset=GroupHolidayBaseFormSet,
234
        fields=('start_date', 'end_date', 'start_time', 'end_time', 'holiday_type', 'comment'))
(3-3/8)