Projet

Général

Profil

Télécharger (11,8 ko) Statistiques
| Branche: | Tag: | Révision:

calebasse / calebasse / agenda / forms.py @ 8c0910ce

1 0a82dcb8 Benjamin Dauvergne
# -*- coding: utf-8 -*-
2
3 8c0910ce Serghei MIHAI
from datetime import datetime, timedelta, time
4 0a82dcb8 Benjamin Dauvergne
5
from django import forms
6 8c0910ce Serghei MIHAI
from django.db.models import Q
7
from django.utils.translation import ugettext_lazy as _
8 0a82dcb8 Benjamin Dauvergne
9 76974b6f Benjamin Dauvergne
from ..dossiers.models import PatientRecord
10
from ..personnes.models import Worker
11
from ..ressources.models import ActType
12
from ..middleware.request import get_request
13 0a82dcb8 Benjamin Dauvergne
14 7b28c0b2 Benjamin Dauvergne
from ajax_select import make_ajax_field
15 6fdbe245 Serghei MIHAI
from ajax_select.fields import AutoCompleteSelectField, AutoCompleteSelectMultipleField
16 76974b6f Benjamin Dauvergne
from models import Event, EventWithAct, EventType
17 7b28c0b2 Benjamin Dauvergne
18 3e9b47e9 Benjamin Dauvergne
class BaseForm(forms.ModelForm):
19 86f4d2f2 Benjamin Dauvergne
    date = forms.DateField(label=u'Date', localize=True)
20 0a82dcb8 Benjamin Dauvergne
    time = forms.TimeField(label=u'Heure de début')
21 74ba9776 Benjamin Dauvergne
    duration = forms.CharField(label=u'Durée',
22
            help_text=u'en minutes; vous pouvez utiliser la roulette de votre souris.')
23 76974b6f Benjamin Dauvergne
    participants = make_ajax_field(EventWithAct, 'participants', 'worker-or-group', True)
24 3e9b47e9 Benjamin Dauvergne
25
26
class NewAppointmentForm(BaseForm):
27 f1a4cd58 Serghei MIHAI
    patient = AutoCompleteSelectMultipleField('patientrecord')
28 7b28c0b2 Benjamin Dauvergne
29 0a82dcb8 Benjamin Dauvergne
    class Meta:
30 76974b6f Benjamin Dauvergne
        model = EventWithAct
31 0a82dcb8 Benjamin Dauvergne
        fields = (
32 5e9463c5 Benjamin Dauvergne
                'start_datetime',
33 0a82dcb8 Benjamin Dauvergne
                'date',
34
                'time',
35
                'duration',
36 f1a4cd58 Serghei MIHAI
                'patient',
37 0a82dcb8 Benjamin Dauvergne
                'participants',
38 dd986559 Serghei MIHAI
                'ressource',
39 0a82dcb8 Benjamin Dauvergne
                'act_type',
40 b41e6f51 Mikaël Ates
                'description',
41 4ce756c8 Benjamin Dauvergne
                'recurrence_periodicity',
42 0a4c0520 Benjamin Dauvergne
                'recurrence_end_date'
43 0a82dcb8 Benjamin Dauvergne
        )
44 5e9463c5 Benjamin Dauvergne
        widgets = {
45
                'start_datetime': forms.HiddenInput,
46
        }
47
48 e92e5a1b Benjamin Dauvergne
    def __init__(self, instance, service=None, **kwargs):
49 0a82dcb8 Benjamin Dauvergne
        self.service = None
50 e92e5a1b Benjamin Dauvergne
        super(NewAppointmentForm, self).__init__(instance=instance, **kwargs)
51 7f9269be Benjamin Dauvergne
        self.fields['date'].css = 'datepicker'
52 f0a9b9ee Mikaël Ates
        self.fields['participants'].required = True
53 8c0910ce Serghei MIHAI
        self.fields['time'].required = False
54
        self.fields['duration'].required = False
55 0a82dcb8 Benjamin Dauvergne
        if service:
56
            self.service = service
57 8c0910ce Serghei MIHAI
            self.special_types = [str(act.id) for act in ActType.objects.filter(Q(name__iexact='courriel')
58
                                                                                | Q(name__iexact='telephone')
59
                                                                                | Q(name__iexact='téléphone'))]
60 0a82dcb8 Benjamin Dauvergne
            self.fields['participants'].queryset = \
61
                    Worker.objects.for_service(service)
62 f1a4cd58 Serghei MIHAI
            self.fields['patient'].queryset = \
63 0a82dcb8 Benjamin Dauvergne
                    PatientRecord.objects.for_service(service)
64 b37eebfb Jérôme Schneider
            self.fields['act_type'].queryset = \
65 e1a80c08 Mikaël Ates
                    ActType.objects.for_service(service) \
66
                    .order_by('name')
67 0a82dcb8 Benjamin Dauvergne
68 8c0910ce Serghei MIHAI
    def clean_time(self):
69
        act_type = self.data.get('act_type')
70
        # act type is available as raw data from the post request
71
        if act_type in self.special_types:
72
            return time(8, 0)
73
        if self.cleaned_data['time']:
74
            return self.cleaned_data['time']
75
        raise forms.ValidationError(_(u'This field is required.'))
76
77 dd45cd7d Benjamin Dauvergne
    def clean_duration(self):
78 8c0910ce Serghei MIHAI
        act_type = self.data.get('act_type')
79
        if act_type in self.special_types:
80
            return 10
81
        if self.cleaned_data['duration']:
82
            duration = self.cleaned_data['duration']
83
            try:
84
                duration = int(duration)
85
                if duration <= 0:
86
                    raise ValueError
87
                return duration
88
            except ValueError:
89
                raise forms.ValidationError(u'Le champ doit contenir uniquement des chiffres')
90
        raise forms.ValidationError(_(u'This field is required.'))
91 dd45cd7d Benjamin Dauvergne
92 f1a4cd58 Serghei MIHAI
    def clean_patient(self):
93
        patients = self.cleaned_data['patient']
94 6fdbe245 Serghei MIHAI
        if patients:
95
            return [patient for patient in PatientRecord.objects.filter(pk__in=patients)]
96
97 0a4c0520 Benjamin Dauvergne
    def clean(self):
98
        cleaned_data = super(NewAppointmentForm, self).clean()
99 4ce756c8 Benjamin Dauvergne
        if not cleaned_data.get('recurrence_periodicity'):
100 0a4c0520 Benjamin Dauvergne
            cleaned_data['recurrence_end_date'] = None
101 1e03331f Jérôme Schneider
        if cleaned_data.has_key('date') and cleaned_data.has_key('time'):
102
            cleaned_data['start_datetime'] = datetime.combine(cleaned_data['date'],
103
                    cleaned_data['time'])
104 f1a4cd58 Serghei MIHAI
        if 'patient' in cleaned_data and isinstance(cleaned_data['patient'], list):
105
            # nasty trick to store the list of patients and pass the form
106
            # validation
107
            cleaned_data['patients'] = cleaned_data['patient']
108
            cleaned_data['patient'] = cleaned_data['patient'][0]
109 0a4c0520 Benjamin Dauvergne
        return cleaned_data
110
111 76974b6f Benjamin Dauvergne
    def save(self, commit=True):
112 f1a4cd58 Serghei MIHAI
113
        patients = self.cleaned_data.pop('patients')
114
        for patient in patients:
115 6fdbe245 Serghei MIHAI
            appointment = forms.save_instance(self, self._meta.model(), commit=False)
116
            appointment.start_datetime = datetime.combine(self.cleaned_data['date'],
117
                                                          self.cleaned_data['time'])
118
            appointment.end_datetime = appointment.start_datetime + timedelta(
119 0a82dcb8 Benjamin Dauvergne
                minutes=self.cleaned_data['duration'])
120 6fdbe245 Serghei MIHAI
            appointment.creator = get_request().user
121
            appointment.clean()
122
            if commit:
123
                appointment.patient = patient
124
                appointment.save()
125 a01d85be Serghei MIHAI
                get_request().record('new-eventwithact',
126
                                    '{obj_id} created by {user} from {ip}',
127
                                     obj_id=appointment.id)
128 6fdbe245 Serghei MIHAI
                self.save_m2m()
129
                appointment.services = [self.service]
130 37f9d898 Jérôme Schneider
131 88abfb2a Jérôme Schneider
class UpdateAppointmentForm(NewAppointmentForm):
132 9ca08421 Jérôme Schneider
133 f1a4cd58 Serghei MIHAI
    patient = make_ajax_field(EventWithAct, 'patient', 'patientrecord', False)
134
135
    def clean_patient(self):
136
        return self.cleaned_data['patient']
137
138
    def save(self, commit=True):
139
        appointment = super(NewAppointmentForm, self).save(commit=False)
140
        appointment.start_datetime = datetime.combine(self.cleaned_data['date'],
141
                    self.cleaned_data['time'])
142
        appointment.end_datetime = appointment.start_datetime + timedelta(
143
                minutes=self.cleaned_data['duration'])
144
        appointment.creator = get_request().user
145
        appointment.clean()
146
        if commit:
147
            appointment.save()
148 a01d85be Serghei MIHAI
            get_request().record('update-eventwithact',
149
                                 '{obj_id} saved by {user} from {ip}',
150
                                 obj_id=appointment.id)
151 d3cfbd19 Serghei MIHAI
            self.save_m2m()
152 f1a4cd58 Serghei MIHAI
            appointment.services = [self.service]
153
        return appointment
154
155 88abfb2a Jérôme Schneider
156 abb68dff Serghei MIHAI
class UpdatePeriodicAppointmentForm(UpdateAppointmentForm):
157 fd03639c Serghei MIHAI
    patient = make_ajax_field(EventWithAct, 'patient', 'patientrecord', False)
158 9ca08421 Jérôme Schneider
    recurrence_periodicity = forms.ChoiceField(label=u"Périodicité",
159
            choices=Event.PERIODICITIES, required=True)
160 c082b14e Jérôme Schneider
161 c48dcd4c Jérôme Schneider
    def clean(self):
162
        cleaned_data = super(UpdatePeriodicAppointmentForm, self).clean()
163 7af04d52 Jérôme Schneider
        acts = self.instance.act_set.filter(is_billed=True).order_by('-date')
164 c48dcd4c Jérôme Schneider
        if acts and cleaned_data.get('recurrence_end_date'):
165
            recurrence_end_date = cleaned_data['recurrence_end_date']
166 7af04d52 Jérôme Schneider
            if recurrence_end_date < acts[0].date:
167 c48dcd4c Jérôme Schneider
                self._errors['recurrence_end_date'] = self.error_class([
168
                            u"La date doit être supérieur au dernier acte facturé de la récurrence"])
169
        return cleaned_data
170 7af04d52 Jérôme Schneider
171 88abfb2a Jérôme Schneider
class DisablePatientAppointmentForm(UpdateAppointmentForm):
172 7af04d52 Jérôme Schneider
173 c082b14e Jérôme Schneider
    def __init__(self, instance, service=None, **kwargs):
174 7af04d52 Jérôme Schneider
        super(DisablePatientAppointmentForm, self).__init__(instance,
175 c082b14e Jérôme Schneider
                service, **kwargs)
176
        if instance and instance.pk:
177
            self.fields['patient'].required = False
178
            self.fields['patient'].widget.attrs['disabled'] = 'disabled'
179
180
    def clean_patient(self):
181
        instance = getattr(self, 'instance', None)
182
        if instance:
183
            return instance.patient
184
        else:
185
            return self.cleaned_data.get('patient', None)
186 37f9d898 Jérôme Schneider
187
188 3e9b47e9 Benjamin Dauvergne
class NewEventForm(BaseForm):
189 b8608ae3 Frédéric Péters
    title = forms.CharField(label=u"Complément de l'intitulé", max_length=32, required=False)
190 67707adb Jérôme Schneider
191
    class Meta:
192
        model = Event
193
        fields = (
194 5e9463c5 Benjamin Dauvergne
                'start_datetime',
195 67707adb Jérôme Schneider
                'title',
196
                'date',
197
                'time',
198
                'duration',
199 dd986559 Serghei MIHAI
                'ressource',
200 69a9009e Jérôme Schneider
                'participants',
201 0a4c0520 Benjamin Dauvergne
                'event_type',
202 cc250927 Jérôme Schneider
                'services',
203 b41e6f51 Mikaël Ates
                'description',
204 4ce756c8 Benjamin Dauvergne
                'recurrence_periodicity',
205 d0819102 Serghei MIHAI
                'recurrence_end_date',
206 67707adb Jérôme Schneider
        )
207 5e9463c5 Benjamin Dauvergne
        widgets = {
208
                'start_datetime': forms.HiddenInput,
209 b41e6f51 Mikaël Ates
                'services': forms.CheckboxSelectMultiple,
210 5e9463c5 Benjamin Dauvergne
        }
211 67707adb Jérôme Schneider
212 f9be3ef6 Benjamin Dauvergne
    def __init__(self, instance, service=None, **kwargs):
213
        self.service = service
214 67707adb Jérôme Schneider
        super(NewEventForm, self).__init__(instance=instance, **kwargs)
215
        self.fields['date'].css = 'datepicker'
216 c8d74e1a Jérôme Schneider
        self.fields['event_type'].queryset = \
217 68e9f8c1 Frédéric Péters
                    EventType.objects.exclude(id=1).exclude(id=3).order_by('rank', 'label')
218 67707adb Jérôme Schneider
219
    def clean_duration(self):
220
        duration = self.cleaned_data['duration']
221
        try:
222
            return int(duration)
223
        except:
224 d0220ea6 Jérôme Schneider
            raise forms.ValidationError('Veuillez saisir un entier')
225 67707adb Jérôme Schneider
226 76974b6f Benjamin Dauvergne
    def save(self, commit=True):
227
        event = super(NewEventForm, self).save(commit=False)
228
        event.start_datetime = datetime.combine(self.cleaned_data['date'],
229 67707adb Jérôme Schneider
                    self.cleaned_data['time'])
230 76974b6f Benjamin Dauvergne
        event.end_datetime = event.start_datetime + timedelta(
231 67707adb Jérôme Schneider
                minutes=self.cleaned_data['duration'])
232 76974b6f Benjamin Dauvergne
        event.creator = get_request().user
233
        event.clean()
234
        if commit:
235
            event.save()
236 a01d85be Serghei MIHAI
            get_request().record('new-event', '{obj_id} created by {user} from {ip}',
237
                                 obj_id=event.id)
238 26c55fb5 Benjamin Dauvergne
            event.services = [self.service]
239 76974b6f Benjamin Dauvergne
        return event
240 d525e593 Jérôme Schneider
241 68e9f8c1 Frédéric Péters
    def clean(self):
242
        cleaned_data = super(NewEventForm, self).clean()
243 1e03331f Jérôme Schneider
        if cleaned_data.has_key('date') and cleaned_data.has_key('time'):
244
            cleaned_data['start_datetime'] = datetime.combine(cleaned_data['date'],
245
                    cleaned_data['time'])
246 4ce756c8 Benjamin Dauvergne
        if not cleaned_data.get('recurrence_periodicity'):
247 0a4c0520 Benjamin Dauvergne
            cleaned_data['recurrence_end_date'] = None
248 68e9f8c1 Frédéric Péters
        event_type = cleaned_data.get('event_type')
249
        if event_type and event_type.id == 4 and not cleaned_data.get('title'): # 'Autre'
250
            self._errors['title'] = self.error_class([
251
                            u"Ce champ est obligatoire pour les événements de type « Autre »."])
252
        return cleaned_data
253 2ae5dd3d Benjamin Dauvergne
254 9ca08421 Jérôme Schneider
class UpdatePeriodicEventForm(NewEventForm):
255
    recurrence_periodicity = forms.ChoiceField(label=u"Périodicité",
256
            choices=Event.PERIODICITIES, required=True)
257 2ae5dd3d Benjamin Dauvergne
258
class UpdateEventForm(NewEventForm):
259
    class Meta(NewEventForm.Meta):
260
        fields = (
261
                'start_datetime',
262
                'title',
263
                'date',
264
                'time',
265
                'duration',
266 dd986559 Serghei MIHAI
                'ressource',
267 2ae5dd3d Benjamin Dauvergne
                'participants',
268
                'event_type',
269
                'services',
270
        )
271 e46a1c3f Benjamin Dauvergne
272
class PeriodicEventsSearchForm(forms.Form):
273 4cb5c31f Serghei MIHAI
    start_date = forms.DateField(localize=True, required = False)
274 e46a1c3f Benjamin Dauvergne
    end_date = forms.DateField(required=False, localize=True)
275
276 37674910 Benjamin Dauvergne
    event_type = forms.MultipleChoiceField(
277
            choices=(
278
                (0, 'Rendez-vous patient'),
279 4ad85397 Benjamin Dauvergne
                (1, 'Évènement')),
280 37674910 Benjamin Dauvergne
            widget=forms.CheckboxSelectMultiple,
281
            initial=[0,1])
282
    no_end_date = forms.BooleanField(label=u'Sans date de fin', required=False)
283 392c5526 Benjamin Dauvergne
    patient = AutoCompleteSelectField('patientrecord', required=False, help_text='')
284 6afd600b Benjamin Dauvergne
    worker = AutoCompleteSelectField('worker', required=False, help_text='')
285 37674910 Benjamin Dauvergne
286 e46a1c3f Benjamin Dauvergne
    def clean(self):
287
        cleaned_data = super(PeriodicEventsSearchForm, self).clean()
288
        if cleaned_data.get('start_date') and cleaned_data.get('end_date'):
289
            if cleaned_data['start_date'] > cleaned_data['end_date']:
290
                raise forms.ValidationError(u'La date de début doit être supérieure à la date de fin')
291
        return cleaned_data