Project

General

Profile

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

calebasse / calebasse / dossiers / forms.py @ 86f4d2f2

1
# -*- coding: utf-8 -*-
2

    
3
import os
4

    
5
from datetime import date
6

    
7
from django import forms
8
from django.conf import settings
9
from django.forms import ModelForm, Form
10
import django.contrib.admin.widgets
11

    
12
from calebasse.dossiers.models import (PatientRecord,
13
    PatientAddress, PatientContact, DEFAULT_ACT_NUMBER_TREATMENT,
14
    CmppHealthCareTreatment, CmppHealthCareDiagnostic,
15
    SessadHealthCareNotification, FileState)
16
from calebasse.dossiers.states import STATE_CHOICES
17
from calebasse.ressources.models import (HealthCenter, LargeRegime,
18
    CodeCFTMEA, SocialisationDuration, MDPHRequest, MDPHResponse)
19

    
20
from ajax_select import make_ajax_field
21

    
22

    
23
class EditPatientRecordForm(ModelForm):
24
    class Meta:
25
        model = PatientRecord
26

    
27
class SearchForm(Form):
28
    last_name = forms.CharField(label=u'Nom', required=False)
29
    first_name = forms.CharField(label=u'Prénom', required=False)
30
    folder_id = forms.CharField(label=u'Numéro de dossier', required=False)
31
    social_security_id = forms.CharField(label=u"Numéro d'assuré social", required=False)
32
    states = forms.MultipleChoiceField(
33
            widget=forms.CheckboxSelectMultiple(attrs={'class':'checkbox_state'}),
34
            choices=STATE_CHOICES, initial=(0,1,2,3,4))
35

    
36
class StateForm(Form):
37
    patient_id = forms.IntegerField()
38
    service_id = forms.IntegerField()
39
    state_type = forms.CharField(max_length=40)
40
    date = forms.DateField(label=u'Date', localize=True)
41
    comment = forms.CharField(label='Commentaire',
42
            required=False, widget=forms.Textarea)
43

    
44
    def clean_date(self):
45
        patient = PatientRecord.objects.get(id=self.cleaned_data['patient_id'])
46
        date_selected = self.cleaned_data['date']
47
        current_state = patient.get_state()
48
        if date_selected < current_state.date_selected.date():
49
            raise forms.ValidationError(u"La date ne peut pas être antérieure à celle du précédent changement d'état.")
50
        return self.cleaned_data['date']
51

    
52
class PatientStateForm(ModelForm):
53
    date_selected = forms.DateField(label=u'Date', localize=True)
54
    comment = forms.CharField(label='Commentaire',
55
            required=False, widget=forms.Textarea)
56

    
57
    class Meta:
58
        model = FileState
59
        fields = ('status', 'date_selected', 'comment')
60
        widgets = {
61
                'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
62
                }
63

    
64
    def clean_date_selected(self):
65
        date_selected = self.cleaned_data['date_selected']
66
        next_state = self.instance.get_next_state()
67
        if self.instance.previous_state:
68
            if date_selected < self.instance.previous_state.date_selected.date():
69
                raise forms.ValidationError(u"La date ne peut pas être antérieure à celle du précédent changement d'état.")
70
        if next_state:
71
            if date_selected > next_state.date_selected.date():
72
                raise forms.ValidationError(u"La date ne peut pas être postérieure à celle du changement d'état suivant.")
73
        return self.cleaned_data['date_selected']
74

    
75
class NewPatientRecordForm(ModelForm):
76
    date_selected = forms.DateField(label=u"Date de contact", initial=date.today(), localize=True)
77

    
78
    class Meta:
79
        model = PatientRecord
80
        fields = ('last_name', 'first_name')
81

    
82
class GeneralForm(ModelForm):
83
    class Meta:
84
        model = PatientRecord
85
        fields = ('comment', 'pause')
86
        widgets = {
87
                'comment': forms.Textarea(attrs={'cols': 50, 'rows': 5}),
88
                }
89

    
90
class CivilStatusForm(ModelForm):
91
    class Meta:
92
        model = PatientRecord
93
        fields = ('first_name', 'last_name', 'birthdate', 'gender', 'nationality')
94

    
95

    
96
class FilteredSelectMultipleMise(django.contrib.admin.widgets.FilteredSelectMultiple):
97
    def __init__(self, **kwargs):
98
        super(FilteredSelectMultipleMise, self).__init__(u'Catégorie', False)
99

    
100

    
101
class PhysiologyForm(ModelForm):
102
    cranium_perimeter = forms.DecimalField(label=u"Périmètre cranien",
103
                    max_digits=5, decimal_places=2, localize=True,
104
                    required=False)
105
    chest_perimeter = forms.DecimalField(label=u"Périmètre thoracique",
106
                    max_digits=5, decimal_places=2, localize=True,
107
                    required=False)
108

    
109
    class Meta:
110
        model = PatientRecord
111
        fields = ('size', 'weight', 'pregnancy_term',
112
            'cranium_perimeter', 'chest_perimeter', 'apgar_score_one',
113
            'apgar_score_two', 'mises_1', 'mises_2', 'mises_3')
114
        widgets = {
115
            'mises_1': FilteredSelectMultipleMise,
116
            'mises_2': FilteredSelectMultipleMise,
117
            'mises_3': FilteredSelectMultipleMise,
118
        }
119

    
120
    def __init__(self, instance, **kwargs):
121
        super(PhysiologyForm, self).__init__(instance=instance, **kwargs)
122
        self.fields['mises_1'].queryset = \
123
                CodeCFTMEA.objects.filter(axe=1)
124
        self.fields['mises_2'].queryset = \
125
                CodeCFTMEA.objects.filter(axe=2)
126
        self.fields['mises_3'].queryset = \
127
                CodeCFTMEA.objects.filter(axe=3)
128

    
129

    
130
class InscriptionForm(ModelForm):
131
    class Meta:
132
        model = PatientRecord
133
        fields = ('analysemotive', 'familymotive', 'provenance', 'advicegiver')
134
        widgets = {}
135

    
136
class FamilyForm(ModelForm):
137
    class Meta:
138
        model = PatientRecord
139
        fields = ('sibship_place', 'nb_children_family', 'parental_authority',
140
                'family_situation', 'child_custody')
141

    
142
class TransportFrom(ModelForm):
143
    class Meta:
144
        model = PatientRecord
145
        fields = ('transporttype', 'transportcompany')
146

    
147
class PaperIDForm(ModelForm):
148
    class Meta:
149
        model = PatientRecord
150
        fields = ('paper_id', )
151

    
152
class PolicyHolderForm(ModelForm):
153
    class Meta:
154
        model = PatientRecord
155
        fields = ('policyholder', )
156
        widgets = { 'policyholder': forms.RadioSelect() }
157

    
158
class FollowUpForm(ModelForm):
159
    coordinators = make_ajax_field(PatientRecord, 'coordinators', 'worker', True)
160
    class Meta:
161
        model = PatientRecord
162
        fields = ('coordinators', 'externaldoctor', 'externalintervener')
163

    
164
class PatientContactForm(ModelForm):
165
    health_org = forms.CharField(label=u"Numéro de l'organisme destinataire", required=False)
166

    
167
    class Meta:
168
        model = PatientContact
169
        widgets = {
170
                'contact_comment': forms.Textarea(attrs={'cols': 50, 'rows': 2}),
171
                'key': forms.TextInput(attrs={'size': 4}),
172
                'twinning_rank': forms.TextInput(attrs={'size': 4}),
173
                'health_org': forms.TextInput(attrs={'size': 9}),
174
                'addresses': forms.CheckboxSelectMultiple(),
175
                }
176

    
177
    def __init__(self, *args, **kwargs):
178
        super(PatientContactForm, self).__init__(*args,**kwargs)
179
        if self.instance and self.instance.health_center:
180
            print self.instance.health_center
181
            self.fields['health_org'].initial = self.instance.health_center.large_regime.code + self.instance.health_center.health_fund + self.instance.health_center.code
182

    
183
    def clean(self):
184
        cleaned_data = super(PatientContactForm, self).clean()
185
        health_org = cleaned_data.get('health_org')
186
        if health_org:
187
            msg = None
188
            lr = None
189
            hc = None
190
            if len(health_org) < 5:
191
                msg = u"Numéro inférieur à 5 chiffres."
192
            else:
193
                try:
194
                    lr = LargeRegime.objects.get(code=health_org[:2])
195
                except:
196
                    msg = u"Grand régime %s inconnu." % health_org[:2]
197
                else:
198
                    hcs = HealthCenter.objects.filter(health_fund=health_org[2:5], large_regime=lr)
199
                    if not hcs:
200
                        msg = u"Caisse %s inconnue." % health_org[2:5]
201
                    elif len(hcs) == 1:
202
                        hc = hcs[0]
203
                    else:
204
                        if len(health_org) == 9:
205
                            hcs = hcs.filter(code=health_org[5:9])
206
                            if not hcs:
207
                                msg = u"Centre %s inconnu." % health_org[5:9]
208
                            elif len(hcs) == 1:
209
                                hc = hcs[0]
210
                            else:
211
                                msg = u"Ceci ne devrait pas arriver, %s n'est pas unique." % health_org
212
                        else:
213
                            msg = "Plusieurs centres possibles, précisez parmi :"
214
                            for hc in hcs:
215
                                msg += " %s" % str(hc)
216
            if msg:
217
                self._errors["health_org"] = self.error_class([msg])
218
            else:
219
                cleaned_data['large_regime'] = lr.code
220
                cleaned_data['health_center'] = hc
221
        return cleaned_data
222

    
223

    
224
class PatientAddressForm(ModelForm):
225

    
226
    class Meta:
227
        model = PatientAddress
228
        widgets = {
229
                'comment': forms.Textarea(attrs={'cols': 40, 'rows': 4}),
230
                'zip_code': forms.TextInput(attrs={'size': 10}),
231
                'number': forms.TextInput(attrs={'size': 10}),
232
                }
233

    
234

    
235
class CmppHealthCareTreatmentForm(ModelForm):
236
    class Meta:
237
        model = CmppHealthCareTreatment
238
        fields = ('start_date', 'act_number',
239
                'prolongation', 'comment', 'patient', 'author')
240
        widgets = {
241
                'comment': forms.Textarea(attrs={'cols': 40, 'rows': 4}),
242
                'patient': forms.HiddenInput(),
243
                'author': forms.HiddenInput(),
244
                }
245

    
246
    def clean(self):
247
        cleaned_data = super(CmppHealthCareTreatmentForm, self).clean()
248
        if cleaned_data.get('act_number') < self.instance.get_nb_acts_cared():
249
            msg = u"Le nombre d'actes ne peut être inférieur au \
250
                nombre d'actes déja pris en charge (%d)." \
251
                    % self.get_nb_acts_cared()
252
            self._errors["act_number"] = self.error_class([msg])
253
        return cleaned_data
254

    
255

    
256
class CmppHealthCareDiagnosticForm(ModelForm):
257
    class Meta:
258
        model = CmppHealthCareDiagnostic
259
        fields = ('start_date', 'act_number',
260
                'comment', 'patient', 'author')
261
        widgets = {
262
                'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
263
                'patient': forms.HiddenInput(),
264
                'author': forms.HiddenInput(),
265
                }
266

    
267
    def clean(self):
268
        cleaned_data = super(CmppHealthCareDiagnosticForm, self).clean()
269
        if cleaned_data.get('act_number') < self.instance.get_nb_acts_cared():
270
            msg = u"Le nombre d'actes ne peut être inférieur au \
271
                nombre d'actes déja pris en charge (%d)." \
272
                    % self.get_nb_acts_cared()
273
            self._errors["act_number"] = self.error_class([msg])
274
        return cleaned_data
275

    
276

    
277
class SessadHealthCareNotificationForm(ModelForm):
278
    class Meta:
279
        model = SessadHealthCareNotification
280
        fields = ('start_date', 'end_date',
281
                'comment', 'patient', 'author')
282
        widgets = {
283
                'comment': forms.Textarea(attrs={'cols': 40, 'rows': 4}),
284
                'patient': forms.HiddenInput(),
285
                'author': forms.HiddenInput(),
286
                }
287

    
288

    
289
class SocialisationDurationForm(ModelForm):
290
    school = make_ajax_field(SocialisationDuration, 'school', 'school', False)
291
    class Meta:
292
        model = SocialisationDuration
293
        fields = ('school', 'start_date',
294
            'end_date', 'level', 'contact', 'comment')
295
        widgets = {
296
                'contact': forms.Textarea(attrs={'cols': 39, 'rows': 2}),
297
                'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
298
                }
299

    
300
class MDPHRequestForm(ModelForm):
301
    class Meta:
302
        model = MDPHRequest
303
        fields = ('start_date', 'mdph', 'comment')
304
        widgets = {
305
                'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
306
                }
307

    
308
class MDPHResponseForm(ModelForm):
309
    class Meta:
310
        model = MDPHResponse
311
        fields = ('start_date', 'end_date', 'mdph', 'comment',
312
            'type_aide', 'name', 'rate')
313
        widgets = {
314
                'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
315
                }
316

    
317
class AvailableRtfTemplates:
318
    def __iter__(self):
319
        if not settings.RTF_TEMPLATES_DIRECTORY:
320
            return iter([])
321
        templates = []
322
        for filename in os.listdir(settings.RTF_TEMPLATES_DIRECTORY):
323
            templates.append((filename, filename[:-4]))
324
        return iter(templates)
325

    
326
class GenerateRtfForm(Form):
327
    template_filename = forms.ChoiceField(choices=AvailableRtfTemplates())
328
    address = forms.CharField(widget=forms.Textarea(attrs={'rows':5}), required=False)
329
    first_name = forms.CharField(required=False)
330
    last_name = forms.CharField(required=False)
331
    birthdate = forms.CharField(required=False)
332
    appointment_date = forms.CharField(required=False)
333
    appointment_begin_hour = forms.CharField(required=False)
334
    appointment_intervenants = forms.CharField(required=False)
335

    
336
class QuotationsForm(Form):
337
    states = forms.MultipleChoiceField(
338
            widget=forms.CheckboxSelectMultiple(attrs={'class':'checkbox_state'}),
339
            choices=STATE_CHOICES, initial=(2,3,4))
340
    date_actes_start = forms.DateField(label=u'Date', localize=True)
341
    date_actes_end = forms.DateField(label=u'Date', localize=True)
342
    without_quotations = forms.BooleanField()
(3-3/9)