Project

General

Profile

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

calebasse / calebasse / personnes / forms.py @ d694f19f

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'))
(3-3/7)