Project

General

Profile

Download (16.6 KB) Statistics
| Branch: | Tag: | Revision:
562586fb Jérôme Schneider
# -*- coding: utf-8 -*-

23937808 Frédéric Péters
import os
0d5f763c Jérôme Schneider
import logging
23937808 Frédéric Péters
f78e473c Jérôme Schneider
from datetime import date

562586fb Jérôme Schneider
from django import forms
23937808 Frédéric Péters
from django.conf import settings
39ddd165 Jérôme Schneider
from django.forms import ModelForm, Form
11f94c15 Frédéric Péters
import django.contrib.admin.widgets
da64143d Benjamin Dauvergne
b464657d Mikaël Ates
from calebasse.dossiers.models import (PatientRecord,
2da0976b Jérôme Schneider
PatientAddress, PatientContact, DEFAULT_ACT_NUMBER_TREATMENT,
b8957f1d Jérôme Schneider
CmppHealthCareTreatment, CmppHealthCareDiagnostic,
5497fedd Mikaël Ates
SessadHealthCareNotification, FileState, Status, ProtectionState)
1117d039 Mikaël Ates
from calebasse.ressources.models import (HealthCenter, LargeRegime,
a4bccba9 Mikaël Ates
CodeCFTMEA, SocialisationDuration, MDPHRequest, MDPHResponse)
da64143d Benjamin Dauvergne
4aa8bb1d Jérôme Schneider
from ajax_select import make_ajax_field

0d5f763c Jérôme Schneider
logger = logging.getLogger(__name__)
b464657d Mikaël Ates
3087a41c Jérôme Schneider
class EditPatientRecordForm(ModelForm):
da64143d Benjamin Dauvergne
class Meta:
e3c5afd2 Jérôme Schneider
model = PatientRecord
562586fb Jérôme Schneider
class SearchForm(Form):
last_name = forms.CharField(label=u'Nom', required=False)
first_name = forms.CharField(label=u'Prénom', required=False)
folder_id = forms.CharField(label=u'Numéro de dossier', required=False)
social_security_id = forms.CharField(label=u"Numéro d'assuré social", required=False)
e30c9bdb Jérôme Schneider
states = forms.ModelMultipleChoiceField(queryset=Status.objects.all(),
58ffd7f4 Mikaël Ates
initial=Status.objects.exclude(type='CLOS'),
e30c9bdb Jérôme Schneider
widget=forms.CheckboxSelectMultiple(attrs={'class':'checkbox_state'}))

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

8e6fe119 Jérôme Schneider
f78e473c Jérôme Schneider
class StateForm(Form):
patient_id = forms.IntegerField()
54f8d003 Jérôme Schneider
service_id = forms.IntegerField()
state_type = forms.CharField(max_length=40)
86f4d2f2 Benjamin Dauvergne
date = forms.DateField(label=u'Date', localize=True)
f78e473c Jérôme Schneider
comment = forms.CharField(label='Commentaire',
required=False, widget=forms.Textarea)

e6a65c33 Frédéric Péters
def clean_date(self):
patient = PatientRecord.objects.get(id=self.cleaned_data['patient_id'])
date_selected = self.cleaned_data['date']
current_state = patient.get_state()
if date_selected < current_state.date_selected.date():
raise forms.ValidationError(u"La date ne peut pas être antérieure à celle du précédent changement d'état.")
return self.cleaned_data['date']

4a0ff5ea Frédéric Péters
class PatientStateForm(ModelForm):
c4c63c3e Jérôme Schneider
date_selected = forms.DateTimeField(label=u'Date', localize=True)
4a0ff5ea Frédéric Péters
comment = forms.CharField(label='Commentaire',
required=False, widget=forms.Textarea)

class Meta:
model = FileState
fields = ('status', 'date_selected', 'comment')
widgets = {
'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
}

24c750bb Jérôme Schneider
def __init__(self, service=None, *args, **kwargs):
self.service = service
super(PatientStateForm, self).__init__(*args, **kwargs)
self.fields['status'].queryset = Status.objects.filter(services=service)

4a0ff5ea Frédéric Péters
def clean_date_selected(self):
date_selected = self.cleaned_data['date_selected']
next_state = self.instance.get_next_state()
if self.instance.previous_state:
c4c63c3e Jérôme Schneider
if date_selected < self.instance.previous_state.date_selected:
4a0ff5ea Frédéric Péters
raise forms.ValidationError(u"La date ne peut pas être antérieure à celle du précédent changement d'état.")
if next_state:
c4c63c3e Jérôme Schneider
if date_selected > next_state.date_selected:
4a0ff5ea Frédéric Péters
raise forms.ValidationError(u"La date ne peut pas être postérieure à celle du changement d'état suivant.")
return self.cleaned_data['date_selected']

554289d5 Jérôme Schneider
class NewPatientRecordForm(ModelForm):
23af777c Serghei MIHAI
date_selected = forms.DateField(label=u"Date de contact", localize=True)
5327927f Mikaël Ates
9ad6d1ac Serghei MIHAI
def __init__(self, *args, **kwargs):
super(NewPatientRecordForm, self).__init__(*args, **kwargs)
self.fields['first_name'].required = True
23af777c Serghei MIHAI
self.fields['date_selected'].initial = date.today()
9ad6d1ac Serghei MIHAI
554289d5 Jérôme Schneider
class Meta:
model = PatientRecord
c0c2ff54 Frédéric Péters
fields = ('last_name', 'first_name')
554289d5 Jérôme Schneider
0259c7ef Jérôme Schneider
class GeneralForm(ModelForm):
class Meta:
model = PatientRecord
21fb4def Mikaël Ates
fields = ('comment', 'pause', 'pause_comment', 'confidential')
0259c7ef Jérôme Schneider
widgets = {
'comment': forms.Textarea(attrs={'cols': 50, 'rows': 5}),
21fb4def Mikaël Ates
'pause_comment': forms.Textarea(attrs={'cols': 50, 'rows': 3}),
0259c7ef Jérôme Schneider
}

f3407c83 Jérôme Schneider
class CivilStatusForm(ModelForm):
class Meta:
model = PatientRecord
28ff59f7 Mikaël Ates
fields = ('first_name', 'last_name', 'birthdate', 'birthplace', 'gender', 'nationality')
54f8d003 Jérôme Schneider
11f94c15 Frédéric Péters
class FilteredSelectMultipleMise(django.contrib.admin.widgets.FilteredSelectMultiple):
def __init__(self, **kwargs):
super(FilteredSelectMultipleMise, self).__init__(u'Catégorie', False)

6c5b2d74 Jérôme Schneider
class PhysiologyForm(ModelForm):
901f6f98 Frédéric Péters
cranium_perimeter = forms.DecimalField(label=u"Périmètre cranien",
14f0963a Mikaël Ates
max_digits=5, decimal_places=2, localize=True,
required=False)
901f6f98 Frédéric Péters
chest_perimeter = forms.DecimalField(label=u"Périmètre thoracique",
14f0963a Mikaël Ates
max_digits=5, decimal_places=2, localize=True,
required=False)
901f6f98 Frédéric Péters
6c5b2d74 Jérôme Schneider
class Meta:
model = PatientRecord
1117d039 Mikaël Ates
fields = ('size', 'weight', 'pregnancy_term',
'cranium_perimeter', 'chest_perimeter', 'apgar_score_one',
5c6f1b32 Mikaël Ates
'apgar_score_two', 'mises_1', 'mises_2', 'mises_3',
'deficiency_intellectual', 'deficiency_autism_and_other_ted',
'deficiency_mental_disorder', 'deficiency_learning_disorder',
'deficiency_auditory', 'deficiency_visual', 'deficiency_motor',
'deficiency_metabolic_disorder', 'deficiency_brain_damage',
'deficiency_polyhandicap', 'deficiency_behavioral_disorder',
'deficiency_in_diagnostic', 'deficiency_other_disorder')
11f94c15 Frédéric Péters
widgets = {
'mises_1': FilteredSelectMultipleMise,
'mises_2': FilteredSelectMultipleMise,
'mises_3': FilteredSelectMultipleMise,
}
1117d039 Mikaël Ates
def __init__(self, instance, **kwargs):
super(PhysiologyForm, self).__init__(instance=instance, **kwargs)
self.fields['mises_1'].queryset = \
CodeCFTMEA.objects.filter(axe=1)
self.fields['mises_2'].queryset = \
CodeCFTMEA.objects.filter(axe=2)
self.fields['mises_3'].queryset = \
CodeCFTMEA.objects.filter(axe=3)

2773b4d4 Jérôme Schneider
class InscriptionForm(ModelForm):
class Meta:
model = PatientRecord
a37b47e6 Mikaël Ates
fields = ('analysemotive', 'familymotive', 'provenance',
'advicegiver', 'provenanceplace')
cea6ec34 Jérôme Schneider
widgets = {}
2773b4d4 Jérôme Schneider
dc1389b8 Mikaël Ates
class OutForm(ModelForm):
class Meta:
model = PatientRecord
fields = ('outmotive', 'outto')
widgets = {}

428081e0 Jérôme Schneider
class FamilyForm(ModelForm):
2773b4d4 Jérôme Schneider
class Meta:
model = PatientRecord
a8dd5599 Jérôme Schneider
fields = ('sibship_place', 'nb_children_family', 'parental_authority',
08391712 Mikaël Ates
'family_situation', 'child_custody', 'job_mother', 'job_father',
'rm_mother', 'rm_father', 'family_comment')
widgets = {
ca1f2836 Jérôme Schneider
'family_comment': forms.Textarea(attrs={'cols': 50, 'rows': 1}),
08391712 Mikaël Ates
}
428081e0 Jérôme Schneider
class TransportFrom(ModelForm):
class Meta:
model = PatientRecord
fields = ('transporttype', 'transportcompany')

11fe262b Jérôme Schneider
class PaperIDForm(ModelForm):
3194ad10 Jérôme Schneider
class Meta:
model = PatientRecord
f25ef019 Jérôme Schneider
fields = ('paper_id', )

class PolicyHolderForm(ModelForm):
class Meta:
model = PatientRecord
56f20753 Jérôme Schneider
fields = ('policyholder', 'contact_comment')
widgets = {
'policyholder': forms.RadioSelect(),
'contact_comment': forms.Textarea(attrs={'cols': 50, 'rows': 2}),
}
3194ad10 Jérôme Schneider
428081e0 Jérôme Schneider
class FollowUpForm(ModelForm):
4aa8bb1d Jérôme Schneider
coordinators = make_ajax_field(PatientRecord, 'coordinators', 'worker', True)
428081e0 Jérôme Schneider
class Meta:
model = PatientRecord
fields = ('coordinators', 'externaldoctor', 'externalintervener')
2773b4d4 Jérôme Schneider
317bcb4c Jérôme Schneider
class PatientContactForm(ModelForm):
f7f9d7c7 Mikaël Ates
health_org = forms.CharField(label=u"Numéro de l'organisme destinataire", required=False)

317bcb4c Jérôme Schneider
class Meta:
model = PatientContact
widgets = {
a8dd5599 Jérôme Schneider
'key': forms.TextInput(attrs={'size': 4}),
39ddd165 Jérôme Schneider
'twinning_rank': forms.TextInput(attrs={'size': 4}),
f7f9d7c7 Mikaël Ates
'health_org': forms.TextInput(attrs={'size': 9}),
f34241d5 Frédéric Péters
'addresses': forms.CheckboxSelectMultiple(),
3a91ff50 Jérôme Schneider
'contact_comment': forms.Textarea(attrs={'rows': 2}),
317bcb4c Jérôme Schneider
}

f7f9d7c7 Mikaël Ates
def __init__(self, *args, **kwargs):
f8606a78 Benjamin Dauvergne
self.patient = kwargs.pop('patient', None)
f7f9d7c7 Mikaël Ates
super(PatientContactForm, self).__init__(*args,**kwargs)
if self.instance and self.instance.health_center:
self.fields['health_org'].initial = self.instance.health_center.large_regime.code + self.instance.health_center.health_fund + self.instance.health_center.code
f8606a78 Benjamin Dauvergne
if self.patient:
self.fields['addresses'].queryset = self.patient.addresses
724b950f Mikaël Ates
self.fields['addresses'].required = False
f7f9d7c7 Mikaël Ates
def clean(self):
cleaned_data = super(PatientContactForm, self).clean()
health_org = cleaned_data.get('health_org')
e20cf07a Mikaël Ates
other_health_center = cleaned_data.get('other_health_center')
f7f9d7c7 Mikaël Ates
if health_org:
msg = None
lr = None
hc = None
if len(health_org) < 5:
msg = u"Numéro inférieur à 5 chiffres."
else:
try:
lr = LargeRegime.objects.get(code=health_org[:2])
except:
msg = u"Grand régime %s inconnu." % health_org[:2]
else:
hcs = HealthCenter.objects.filter(health_fund=health_org[2:5], large_regime=lr)
if not hcs:
msg = u"Caisse %s inconnue." % health_org[2:5]
elif len(hcs) == 1:
hc = hcs[0]
e20cf07a Mikaël Ates
if not other_health_center and len(health_org) == 9:
other_health_center = health_org[5:9]
f7f9d7c7 Mikaël Ates
else:
if len(health_org) == 9:
hcs = hcs.filter(code=health_org[5:9])
if not hcs:
msg = u"Centre %s inconnu." % health_org[5:9]
elif len(hcs) == 1:
hc = hcs[0]
else:
msg = u"Ceci ne devrait pas arriver, %s n'est pas unique." % health_org
else:
3e10c7d9 Mikaël Ates
msg = "Plusieurs centres possibles, précisez parmi :"
f7f9d7c7 Mikaël Ates
for hc in hcs:
msg += " %s" % str(hc)
if msg:
self._errors["health_org"] = self.error_class([msg])
else:
cleaned_data['large_regime'] = lr.code
cleaned_data['health_center'] = hc
e20cf07a Mikaël Ates
cleaned_data['other_health_center'] = other_health_center
f7f9d7c7 Mikaël Ates
return cleaned_data

724b950f Mikaël Ates
def save(self, commit=True):
contact = super(PatientContactForm, self).save(commit=False)
contact.clean()
if commit:
contact.save()
if self.patient and not self.instance.addresses.all():
self.patient.contacts.add(contact)
return contact
f7f9d7c7 Mikaël Ates
317bcb4c Jérôme Schneider
class PatientAddressForm(ModelForm):
29168b44 Jérôme Schneider
317bcb4c Jérôme Schneider
class Meta:
model = PatientAddress
29168b44 Jérôme Schneider
widgets = {
2523f48f Jérôme Schneider
'comment': forms.Textarea(attrs={'cols': 40, 'rows': 4}),
29168b44 Jérôme Schneider
'zip_code': forms.TextInput(attrs={'size': 10}),
'number': forms.TextInput(attrs={'size': 10}),
}
317bcb4c Jérôme Schneider
29aa5385 Mikaël Ates
2da0976b Jérôme Schneider
class CmppHealthCareTreatmentForm(ModelForm):
class Meta:
model = CmppHealthCareTreatment
5b234990 Mikaël Ates
fields = ('start_date', 'request_date',
44a0fb10 Mikaël Ates
'agree_date', 'insist_date', 'end_date', 'act_number',
61405b31 Mikaël Ates
'prolongation', 'prolongation_date', 'comment', 'patient',
'author')
2da0976b Jérôme Schneider
widgets = {
'comment': forms.Textarea(attrs={'cols': 40, 'rows': 4}),
'patient': forms.HiddenInput(),
'author': forms.HiddenInput(),
}
b8957f1d Jérôme Schneider
29aa5385 Mikaël Ates
def clean(self):
cleaned_data = super(CmppHealthCareTreatmentForm, self).clean()
5b234990 Mikaël Ates
if self.instance.pk and cleaned_data.get('act_number') < self.instance.get_nb_acts_cared():
29aa5385 Mikaël Ates
msg = u"Le nombre d'actes ne peut être inférieur au \
nombre d'actes déja pris en charge (%d)." \
5b234990 Mikaël Ates
% self.instance.get_nb_acts_cared()
29aa5385 Mikaël Ates
self._errors["act_number"] = self.error_class([msg])
return cleaned_data


b8957f1d Jérôme Schneider
class CmppHealthCareDiagnosticForm(ModelForm):
class Meta:
model = CmppHealthCareDiagnostic
5b234990 Mikaël Ates
fields = ('start_date', 'request_date',
7ecc94f9 Mikaël Ates
'agree_date', 'insist_date', 'end_date', 'act_number',
b8957f1d Jérôme Schneider
'comment', 'patient', 'author')
widgets = {
'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
'patient': forms.HiddenInput(),
'author': forms.HiddenInput(),
}

29aa5385 Mikaël Ates
def clean(self):
cleaned_data = super(CmppHealthCareDiagnosticForm, self).clean()
5b234990 Mikaël Ates
if self.instance.pk and cleaned_data.get('act_number') < self.instance.get_nb_acts_cared():
29aa5385 Mikaël Ates
msg = u"Le nombre d'actes ne peut être inférieur au \
nombre d'actes déja pris en charge (%d)." \
5b234990 Mikaël Ates
% self.instance.get_nb_acts_cared()
29aa5385 Mikaël Ates
self._errors["act_number"] = self.error_class([msg])
return cleaned_data


b8957f1d Jérôme Schneider
class SessadHealthCareNotificationForm(ModelForm):
class Meta:
model = SessadHealthCareNotification
fields = ('start_date', 'end_date',
416a1188 Mikaël Ates
'request_date', 'agree_date', 'insist_date',
b8957f1d Jérôme Schneider
'comment', 'patient', 'author')
widgets = {
'comment': forms.Textarea(attrs={'cols': 40, 'rows': 4}),
'patient': forms.HiddenInput(),
'author': forms.HiddenInput(),
}
69f3b883 Mikaël Ates

class SocialisationDurationForm(ModelForm):
6c60a174 Mikaël Ates
school = make_ajax_field(SocialisationDuration, 'school', 'school', False)
69f3b883 Mikaël Ates
class Meta:
model = SocialisationDuration
6c60a174 Mikaël Ates
fields = ('school', 'start_date',
5458878e Mikaël Ates
'end_date', 'level', 'contact', 'comment')
69f3b883 Mikaël Ates
widgets = {
24773178 Mikaël Ates
'contact': forms.Textarea(attrs={'cols': 39, 'rows': 2}),
69f3b883 Mikaël Ates
'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
}
5bdfc735 Mikaël Ates
5497fedd Mikaël Ates
class ProtectionStateForm(ModelForm):
class Meta:
model = ProtectionState
fields = ('status', 'start_date', 'end_date', 'comment')
widgets = {
'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
}

5bdfc735 Mikaël Ates
class MDPHRequestForm(ModelForm):
class Meta:
model = MDPHRequest
fields = ('start_date', 'mdph', 'comment')
widgets = {
'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
}

class MDPHResponseForm(ModelForm):
class Meta:
model = MDPHResponse
fields = ('start_date', 'end_date', 'mdph', 'comment',
'type_aide', 'name', 'rate')
widgets = {
'comment': forms.Textarea(attrs={'cols': 39, 'rows': 4}),
}
23937808 Frédéric Péters
class AvailableRtfTemplates:
def __iter__(self):
if not settings.RTF_TEMPLATES_DIRECTORY:
return iter([])
0d5f763c Jérôme Schneider
if not os.path.exists(settings.RTF_TEMPLATES_DIRECTORY):
logger.warning("RTF_TEMPLATES_DIRECTOR %r doesn't exist" % \
settings.RTF_TEMPLATES_DIRECTORY)
return iter([])

23937808 Frédéric Péters
templates = []
for filename in os.listdir(settings.RTF_TEMPLATES_DIRECTORY):
templates.append((filename, filename[:-4]))
return iter(templates)

class GenerateRtfForm(Form):
template_filename = forms.ChoiceField(choices=AvailableRtfTemplates())
1860b59f Frédéric Péters
address = forms.CharField(widget=forms.Textarea(attrs={'rows':5}), required=False)
b4310641 Mikaël Ates
phone_address = forms.CharField(required=False)
17e36a37 Frédéric Péters
a192e19a Mikaël Ates
def __init__(self, *args, **kwargs):
super(GenerateRtfForm, self).__init__(*args, **kwargs)
self.fields['template_filename'].choices = AvailableRtfTemplates()

17e36a37 Frédéric Péters
class QuotationsForm(Form):
f6be0c7d Jérôme Schneider
def __init__(self, service=None, *args, **kwargs):
self.service = service
super(QuotationsForm, self).__init__(*args, **kwargs)
self.fields['states'].queryset = Status.objects.filter(services=service)

states = forms.ModelMultipleChoiceField(queryset=Status.objects.all(),
initial=Status.objects.all(),
widget=forms.CheckboxSelectMultiple(attrs={'class':'checkbox_state'}))
86f4d2f2 Benjamin Dauvergne
date_actes_start = forms.DateField(label=u'Date', localize=True)
date_actes_end = forms.DateField(label=u'Date', localize=True)
17e36a37 Frédéric Péters
without_quotations = forms.BooleanField()