Project

General

Profile

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

calebasse / calebasse / dossiers / forms.py @ 243e22a9

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

    
3
import os
4
import logging
5

    
6
from datetime import date
7

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

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

    
20
from ajax_select import make_ajax_field
21

    
22
logger = logging.getLogger(__name__)
23

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

    
28
class SearchForm(Form):
29
    last_name = forms.CharField(label=u'Nom', required=False)
30
    first_name = forms.CharField(label=u'Prénom', required=False)
31
    folder_id = forms.CharField(label=u'Numéro de dossier', required=False)
32
    social_security_id = forms.CharField(label=u"Numéro d'assuré social", required=False)
33
    states = forms.ModelMultipleChoiceField(queryset=Status.objects.all(),
34
            initial=Status.objects.exclude(type='CLOS'),
35
            widget=forms.CheckboxSelectMultiple(attrs={'class':'checkbox_state'}))
36

    
37
    def __init__(self, service=None, *args, **kwargs):
38
        self.service = service
39
        super(SearchForm, self).__init__(*args, **kwargs)
40
        self.fields['states'].queryset = Status.objects.filter(services=service)
41

    
42

    
43
class StateForm(Form):
44
    patient_id = forms.IntegerField()
45
    service_id = forms.IntegerField()
46
    state_type = forms.CharField(max_length=40)
47
    date = forms.DateField(label=u'Date', localize=True)
48
    comment = forms.CharField(label='Commentaire',
49
            required=False, widget=forms.Textarea)
50

    
51
    def clean_date(self):
52
        patient = PatientRecord.objects.get(id=self.cleaned_data['patient_id'])
53
        date_selected = self.cleaned_data['date']
54
        current_state = patient.get_state()
55
        if date_selected < current_state.date_selected.date():
56
            raise forms.ValidationError(u"La date ne peut pas être antérieure à celle du précédent changement d'état.")
57
        return self.cleaned_data['date']
58

    
59
class PatientStateForm(ModelForm):
60
    date_selected = forms.DateTimeField(label=u'Date', localize=True)
61
    comment = forms.CharField(label='Commentaire',
62
            required=False, widget=forms.Textarea)
63

    
64
    class Meta:
65
        model = FileState
66
        fields = ('status', 'date_selected', 'comment')
67
        widgets = {
68
                'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
69
                }
70

    
71
    def __init__(self, service=None, *args, **kwargs):
72
        self.service = service
73
        super(PatientStateForm, self).__init__(*args, **kwargs)
74
        self.fields['status'].queryset = Status.objects.filter(services=service)
75

    
76
    def clean_date_selected(self):
77
        date_selected = self.cleaned_data['date_selected']
78
        next_state = self.instance.get_next_state()
79
        if self.instance.previous_state:
80
            if date_selected < self.instance.previous_state.date_selected:
81
                raise forms.ValidationError(u"La date ne peut pas être antérieure à celle du précédent changement d'état.")
82
        if next_state:
83
            if date_selected > next_state.date_selected:
84
                raise forms.ValidationError(u"La date ne peut pas être postérieure à celle du changement d'état suivant.")
85
        return self.cleaned_data['date_selected']
86

    
87
class NewPatientRecordForm(ModelForm):
88
    date_selected = forms.DateField(label=u"Date de contact", localize=True)
89

    
90
    def __init__(self, *args, **kwargs):
91
        super(NewPatientRecordForm, self).__init__(*args, **kwargs)
92
        self.fields['first_name'].required = True
93
        self.fields['date_selected'].initial = date.today()
94

    
95
    class Meta:
96
        model = PatientRecord
97
        fields = ('last_name', 'first_name')
98

    
99
class GeneralForm(ModelForm):
100
    class Meta:
101
        model = PatientRecord
102
        fields = ('comment', 'pause', 'pause_comment', 'confidential')
103
        widgets = {
104
                'comment': forms.Textarea(attrs={'cols': 50, 'rows': 5}),
105
                'pause_comment': forms.Textarea(attrs={'cols': 50, 'rows': 3}),
106
                }
107

    
108
class CivilStatusForm(ModelForm):
109
    class Meta:
110
        model = PatientRecord
111
        fields = ('first_name', 'last_name', 'birthdate', 'birthplace', 'gender', 'nationality')
112

    
113

    
114
class FilteredSelectMultipleMise(django.contrib.admin.widgets.FilteredSelectMultiple):
115
    def __init__(self, **kwargs):
116
        super(FilteredSelectMultipleMise, self).__init__(u'Catégorie', False)
117

    
118
class PhysiologyForm(ModelForm):
119
    cranium_perimeter = forms.DecimalField(label=u"Périmètre cranien",
120
                    max_digits=5, decimal_places=2, localize=True,
121
                    required=False)
122
    chest_perimeter = forms.DecimalField(label=u"Périmètre thoracique",
123
                    max_digits=5, decimal_places=2, localize=True,
124
                    required=False)
125

    
126
    class Meta:
127
        model = PatientRecord
128
        fields = ('size', 'weight', 'pregnancy_term',
129
            'cranium_perimeter', 'chest_perimeter', 'apgar_score_one',
130
            'apgar_score_two', 'mises_1', 'mises_2', 'mises_3',
131
            'deficiency_intellectual', 'deficiency_autism_and_other_ted',
132
            'deficiency_mental_disorder', 'deficiency_learning_disorder',
133
            'deficiency_auditory', 'deficiency_visual', 'deficiency_motor',
134
            'deficiency_metabolic_disorder', 'deficiency_brain_damage',
135
            'deficiency_polyhandicap', 'deficiency_behavioral_disorder',
136
            'deficiency_in_diagnostic', 'deficiency_other_disorder')
137
        widgets = {
138
            'mises_1': FilteredSelectMultipleMise,
139
            'mises_2': FilteredSelectMultipleMise,
140
            'mises_3': FilteredSelectMultipleMise,
141
        }
142

    
143
    def __init__(self, instance, **kwargs):
144
        super(PhysiologyForm, self).__init__(instance=instance, **kwargs)
145
        self.fields['mises_1'].queryset = \
146
                CodeCFTMEA.objects.filter(axe=1)
147
        self.fields['mises_2'].queryset = \
148
                CodeCFTMEA.objects.filter(axe=2)
149
        self.fields['mises_3'].queryset = \
150
                CodeCFTMEA.objects.filter(axe=3)
151

    
152

    
153
class InscriptionForm(ModelForm):
154
    class Meta:
155
        model = PatientRecord
156
        fields = ('analysemotive', 'familymotive', 'provenance',
157
            'advicegiver', 'provenanceplace')
158
        widgets = {}
159

    
160
class OutForm(ModelForm):
161
    class Meta:
162
        model = PatientRecord
163
        fields = ('outmotive', 'outto')
164
        widgets = {}
165

    
166
class FamilyForm(ModelForm):
167
    class Meta:
168
        model = PatientRecord
169
        fields = ('sibship_place', 'nb_children_family', 'parental_authority',
170
                'family_situation', 'child_custody', 'job_mother', 'job_father',
171
                'rm_mother', 'rm_father', 'family_comment')
172
        widgets = {
173
                'family_comment': forms.Textarea(attrs={'cols': 50, 'rows': 1}),
174
                }
175

    
176
class TransportFrom(ModelForm):
177
    class Meta:
178
        model = PatientRecord
179
        fields = ('transporttype', 'transportcompany')
180

    
181
class PaperIDForm(ModelForm):
182
    class Meta:
183
        model = PatientRecord
184
        fields = ('paper_id', )
185

    
186
class PolicyHolderForm(ModelForm):
187
    class Meta:
188
        model = PatientRecord
189
        fields = ('policyholder', 'contact_comment')
190
        widgets = { 
191
                'policyholder': forms.RadioSelect(),
192
                'contact_comment': forms.Textarea(attrs={'cols': 50, 'rows': 2}),
193
                }
194

    
195
class FollowUpForm(ModelForm):
196
    coordinators = make_ajax_field(PatientRecord, 'coordinators', 'worker', True)
197
    class Meta:
198
        model = PatientRecord
199
        fields = ('coordinators', 'externaldoctor', 'externalintervener')
200

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

    
204
    class Meta:
205
        model = PatientContact
206
        widgets = {
207
                'key': forms.TextInput(attrs={'size': 4}),
208
                'twinning_rank': forms.TextInput(attrs={'size': 4}),
209
                'health_org': forms.TextInput(attrs={'size': 9}),
210
                'addresses': forms.CheckboxSelectMultiple(),
211
                'contact_comment': forms.Textarea(attrs={'rows': 2}),
212
                }
213

    
214
    def __init__(self, *args, **kwargs):
215
        self.patient = kwargs.pop('patient', None)
216
        super(PatientContactForm, self).__init__(*args,**kwargs)
217
        if self.instance and self.instance.health_center:
218
            self.fields['health_org'].initial = self.instance.health_center.large_regime.code + self.instance.health_center.health_fund + self.instance.health_center.code
219
        if self.patient:
220
            self.fields['addresses'].queryset = self.patient.addresses
221
            self.fields['addresses'].required = False
222

    
223
    def clean(self):
224
        cleaned_data = super(PatientContactForm, self).clean()
225
        health_org = cleaned_data.get('health_org')
226
        other_health_center = cleaned_data.get('other_health_center')
227
        if health_org:
228
            msg = None
229
            lr = None
230
            hc = None
231
            if len(health_org) < 5:
232
                msg = u"Numéro inférieur à 5 chiffres."
233
            else:
234
                try:
235
                    lr = LargeRegime.objects.get(code=health_org[:2])
236
                except:
237
                    msg = u"Grand régime %s inconnu." % health_org[:2]
238
                else:
239
                    hcs = HealthCenter.objects.filter(health_fund=health_org[2:5], large_regime=lr)
240
                    if not hcs:
241
                        msg = u"Caisse %s inconnue." % health_org[2:5]
242
                    elif len(hcs) == 1:
243
                        hc = hcs[0]
244
                        if not other_health_center and len(health_org) == 9:
245
                            other_health_center = health_org[5:9]
246
                    else:
247
                        if len(health_org) == 9:
248
                            hcs = hcs.filter(code=health_org[5:9])
249
                            if not hcs:
250
                                msg = u"Centre %s inconnu." % health_org[5:9]
251
                            elif len(hcs) == 1:
252
                                hc = hcs[0]
253
                            else:
254
                                msg = u"Ceci ne devrait pas arriver, %s n'est pas unique." % health_org
255
                        else:
256
                            msg = "Plusieurs centres possibles, précisez parmi :"
257
                            for hc in hcs:
258
                                msg += " %s" % str(hc)
259
            if msg:
260
                self._errors["health_org"] = self.error_class([msg])
261
            else:
262
                cleaned_data['large_regime'] = lr.code
263
                cleaned_data['health_center'] = hc
264
                cleaned_data['other_health_center'] = other_health_center
265
        return cleaned_data
266

    
267
    def save(self, commit=True):
268
        contact = super(PatientContactForm, self).save(commit=False)
269
        contact.clean()
270
        if commit:
271
            contact.save()
272
            if self.patient and not self.instance.addresses.all():
273
                self.patient.contacts.add(contact)
274
        return contact
275

    
276
class PatientAddressForm(ModelForm):
277

    
278
    class Meta:
279
        model = PatientAddress
280
        widgets = {
281
                'comment': forms.Textarea(attrs={'cols': 40, 'rows': 4}),
282
                'zip_code': forms.TextInput(attrs={'size': 10}),
283
                'number': forms.TextInput(attrs={'size': 10}),
284
                }
285

    
286

    
287
class CmppHealthCareTreatmentForm(ModelForm):
288
    class Meta:
289
        model = CmppHealthCareTreatment
290
        fields = ('start_date', 'request_date',
291
                'agree_date', 'insist_date', 'end_date', 'act_number',
292
                'prolongation', 'prolongation_date', 'comment', 'patient',
293
                'author')
294
        widgets = {
295
                'comment': forms.Textarea(attrs={'cols': 40, 'rows': 4}),
296
                'patient': forms.HiddenInput(),
297
                'author': forms.HiddenInput(),
298
                }
299

    
300
    def clean(self):
301
        cleaned_data = super(CmppHealthCareTreatmentForm, self).clean()
302
        if self.instance.pk and cleaned_data.get('act_number') < self.instance.get_nb_acts_cared():
303
            msg = u"Le nombre d'actes ne peut être inférieur au \
304
                nombre d'actes déja pris en charge (%d)." \
305
                    % self.instance.get_nb_acts_cared()
306
            self._errors["act_number"] = self.error_class([msg])
307
        return cleaned_data
308

    
309

    
310
class CmppHealthCareDiagnosticForm(ModelForm):
311
    class Meta:
312
        model = CmppHealthCareDiagnostic
313
        fields = ('start_date', 'request_date',
314
                'agree_date', 'insist_date', 'end_date', 'act_number',
315
                'comment', 'patient', 'author')
316
        widgets = {
317
                'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
318
                'patient': forms.HiddenInput(),
319
                'author': forms.HiddenInput(),
320
                }
321

    
322
    def clean(self):
323
        cleaned_data = super(CmppHealthCareDiagnosticForm, self).clean()
324
        if self.instance.pk and cleaned_data.get('act_number') < self.instance.get_nb_acts_cared():
325
            msg = u"Le nombre d'actes ne peut être inférieur au \
326
                nombre d'actes déja pris en charge (%d)." \
327
                    % self.instance.get_nb_acts_cared()
328
            self._errors["act_number"] = self.error_class([msg])
329
        return cleaned_data
330

    
331

    
332
class SessadHealthCareNotificationForm(ModelForm):
333
    class Meta:
334
        model = SessadHealthCareNotification
335
        fields = ('start_date', 'end_date',
336
                'request_date', 'agree_date', 'insist_date',
337
                'comment', 'patient', 'author')
338
        widgets = {
339
                'comment': forms.Textarea(attrs={'cols': 40, 'rows': 4}),
340
                'patient': forms.HiddenInput(),
341
                'author': forms.HiddenInput(),
342
                }
343

    
344

    
345
class SocialisationDurationForm(ModelForm):
346
    school = make_ajax_field(SocialisationDuration, 'school', 'school', False)
347
    class Meta:
348
        model = SocialisationDuration
349
        fields = ('school', 'start_date',
350
            'end_date', 'level', 'contact', 'comment')
351
        widgets = {
352
                'contact': forms.Textarea(attrs={'cols': 39, 'rows': 2}),
353
                'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
354
                }
355

    
356
class ProtectionStateForm(ModelForm):
357
    class Meta:
358
        model = ProtectionState
359
        fields = ('status', 'start_date', 'end_date', 'comment')
360
        widgets = {
361
                'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
362
                }
363

    
364
class MDPHRequestForm(ModelForm):
365
    class Meta:
366
        model = MDPHRequest
367
        fields = ('start_date', 'mdph', 'comment')
368
        widgets = {
369
                'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
370
                }
371

    
372
class MDPHResponseForm(ModelForm):
373
    class Meta:
374
        model = MDPHResponse
375
        fields = ('start_date', 'end_date', 'mdph', 'comment',
376
            'type_aide', 'name', 'rate')
377
        widgets = {
378
                'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
379
                }
380

    
381
class AvailableRtfTemplates:
382
    def __iter__(self):
383
        if not settings.RTF_TEMPLATES_DIRECTORY:
384
            return iter([])
385
        if not os.path.exists(settings.RTF_TEMPLATES_DIRECTORY):
386
            logger.warning("RTF_TEMPLATES_DIRECTOR %r doesn't exist" % \
387
                    settings.RTF_TEMPLATES_DIRECTORY)
388
            return iter([])
389

    
390
        templates = []
391
        for filename in os.listdir(settings.RTF_TEMPLATES_DIRECTORY):
392
            templates.append((filename, filename[:-4]))
393
        return iter(templates)
394

    
395
class GenerateRtfForm(Form):
396
    template_filename = forms.ChoiceField(choices=AvailableRtfTemplates())
397
    address = forms.CharField(widget=forms.Textarea(attrs={'rows':5}), required=False)
398
    phone_address = forms.CharField(required=False)
399

    
400
    def __init__(self, *args, **kwargs):
401
        super(GenerateRtfForm, self).__init__(*args, **kwargs)
402
        self.fields['template_filename'].choices = AvailableRtfTemplates()
403

    
404
class QuotationsForm(Form):
405

    
406
    def __init__(self, service=None, *args, **kwargs):
407
        self.service = service
408
        super(QuotationsForm, self).__init__(*args, **kwargs)
409
        self.fields['states'].queryset = Status.objects.filter(services=service)
410

    
411
    states = forms.ModelMultipleChoiceField(queryset=Status.objects.all(),
412
            initial=Status.objects.all(),
413
            widget=forms.CheckboxSelectMultiple(attrs={'class':'checkbox_state'}))
414
    date_actes_start = forms.DateField(label=u'Date', localize=True)
415
    date_actes_end = forms.DateField(label=u'Date', localize=True)
416
    without_quotations = forms.BooleanField()
(3-3/12)