Project

General

Profile

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

calebasse / calebasse / dossiers / models.py @ d489bf41

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

    
3
import logging
4

    
5
from datetime import datetime
6
from datetime import timedelta
7

    
8
from django.db import models
9
from django.contrib.auth.models import User
10

    
11
from calebasse.personnes.models import People
12
from calebasse.ressources.models import ServiceLinkedAbstractModel
13
from calebasse.dossiers.states import STATES, STATE_ACCUEIL
14

    
15
DEFAULT_ACT_NUMBER_DIAGNOSTIC = 6
16
DEFAULT_ACT_NUMBER_TREATMENT = 30
17
DEFAULT_ACT_NUMBER_PROLONGATION = 10
18
VALIDITY_PERIOD_TREATMENT_HEALTHCARE = 365
19

    
20
logger = logging.getLogger('calebasse.dossiers')
21

    
22

    
23
class HealthCare(models.Model):
24

    
25
    class Meta:
26
        app_label = 'dossiers'
27

    
28
    patient = models.ForeignKey('dossiers.PatientRecord',
29
        verbose_name=u'Dossier patient', editable=False)
30
    created = models.DateTimeField(u'Création', auto_now_add=True)
31
    author = \
32
        models.ForeignKey(User,
33
        verbose_name=u'Auteur', editable=False)
34
    comment = models.TextField(max_length=3000, blank=True, null=True)
35
    start_date = models.DateTimeField()
36

    
37

    
38
class CmppHealthCareDiagnostic(HealthCare):
39

    
40
    class Meta:
41
        app_label = 'dossiers'
42

    
43
    _act_number = models.IntegerField(default=DEFAULT_ACT_NUMBER_DIAGNOSTIC)
44

    
45
    def get_act_number(self):
46
        return self._act_number
47

    
48
    def save(self, **kwargs):
49
        self.start_date = \
50
            datetime(self.start_date.year, self.start_date.month,
51
                self.start_date.day)
52
        super(CmppHealthCareDiagnostic, self).save(**kwargs)
53

    
54

    
55
class CmppHealthCareTreatment(HealthCare):
56

    
57
    class Meta:
58
        app_label = 'dossiers'
59

    
60
    _act_number = models.IntegerField(default=DEFAULT_ACT_NUMBER_TREATMENT)
61
    end_date = models.DateTimeField()
62
    prolongation = models.IntegerField(default=0,
63
            verbose_name=u'Prolongation')
64

    
65
    def get_act_number(self):
66
        if self.is_extended():
67
            return self._act_number + self.prolongation
68
        return self._act_number
69

    
70
    def is_extended(self):
71
        if self.prolongation > 0:
72
            return True
73
        return False
74

    
75
    def add_prolongation(self, value=None):
76
        if not value:
77
            value = DEFAULT_ACT_NUMBER_PROLONGATION
78
        if self.is_extended():
79
            raise Exception(u'Prise en charge déja prolongée')
80
        self.prolongation = value
81
        self.save()
82

    
83
    def save(self, **kwargs):
84
        self.start_date = \
85
            datetime(self.start_date.year, self.start_date.month,
86
                self.start_date.day)
87
        self.end_date = self.start_date + \
88
            timedelta(days=VALIDITY_PERIOD_TREATMENT_HEALTHCARE)
89

    
90
        super(CmppHealthCareTreatment, self).save(**kwargs)
91

    
92

    
93
class SessadHealthCareNotification(HealthCare):
94

    
95
    class Meta:
96
        app_label = 'dossiers'
97

    
98
    end_date = models.DateTimeField()
99

    
100
    def save(self, **kwargs):
101
        self.start_date = \
102
            datetime(self.start_date.year, self.start_date.month,
103
                self.start_date.day)
104
        self.end_date = \
105
            datetime(self.end_date.year, self.end_date.month,
106
                self.end_date.day)
107
        super(SessadHealthCareNotification, self).save(**kwargs)
108

    
109

    
110
class FileState(models.Model):
111

    
112
    class Meta:
113
        app_label = 'dossiers'
114

    
115
    patient = models.ForeignKey('dossiers.PatientRecord',
116
        verbose_name=u'Dossier patient', editable=False)
117
    state_name = models.CharField(max_length=150)
118
    created = models.DateTimeField(u'Création', auto_now_add=True)
119
    date_selected = models.DateTimeField()
120
    author = \
121
        models.ForeignKey(User,
122
        verbose_name=u'Auteur', editable=False)
123
    comment = models.TextField(max_length=3000, blank=True, null=True)
124
    previous_state = models.ForeignKey('FileState',
125
        verbose_name=u'Etat précédent',
126
        editable=False, blank=True, null=True)
127

    
128
    def get_next_state(self):
129
        try:
130
            return FileState.objects.get(previous_state=self)
131
        except:
132
            return None
133

    
134
    def save(self, **kwargs):
135
        self.date_selected = \
136
            datetime(self.date_selected.year,
137
                self.date_selected.month, self.date_selected.day)
138
        super(FileState, self).save(**kwargs)
139

    
140
    def __unicode__(self):
141
        return self.state_name + ' ' + str(self.date_selected)
142

    
143

    
144
class PatientRecord(ServiceLinkedAbstractModel, People):
145
    class Meta:
146
        verbose_name = u'Dossier'
147
        verbose_name_plural = u'Dossiers'
148

    
149
    created = models.DateTimeField(u'création', auto_now_add=True)
150
    creator = \
151
        models.ForeignKey(User,
152
        verbose_name=u'Créateur dossier patient',
153
        editable=False)
154
    contacts = models.ManyToManyField('personnes.People',
155
            related_name='contact_of')
156
    birthdate = models.DateField()
157
    paper_id = models.CharField(max_length=12,
158
            null=True, blank=True)
159

    
160
    def __init__(self, *args, **kwargs):
161
        super(PatientRecord, self).__init__(*args, **kwargs)
162
        if not hasattr(self, 'service'):
163
            raise Exception('The field service is mandatory.')
164

    
165
    def get_state(self):
166
        last_state = self.filestate_set.latest('date_selected')
167
        multiple = self.filestate_set.\
168
            filter(date_selected=last_state.date_selected)
169
        if len(multiple) > 1:
170
            last_state = multiple.latest('created')
171
        return last_state
172

    
173
    def get_state_at_day(self, date):
174
        state = self.get_state()
175
        while(state):
176
            if datetime(state.date_selected.year,
177
                    state.date_selected.month, state.date_selected.day) <= \
178
                    datetime(date.year, date.month, date.day):
179
                return state
180
            state = state.previous_state
181
        return None
182

    
183
    def was_in_state_at_day(self, date, state_name):
184
        state_at_day = self.get_state_at_day(date)
185
        if state_at_day and state_at_day.state_name == state_name:
186
            return True
187
        return False
188

    
189
    def get_states_history(self):
190
        return self.filestate_set.order_by('date_selected')
191

    
192
    def set_state(self, state_name, author, date_selected=None, comment=None):
193
        if not author:
194
            raise Exception('Missing author to set state')
195
        if not state_name in STATES[self.service.name].keys():
196
            raise Exception('Etat de dossier '
197
                'non existant dans le service %s.' % self.service.name)
198
        if not date_selected:
199
            date_selected = datetime.now()
200
        current_state = self.get_state()
201
        if not current_state:
202
            raise Exception('Invalid patient record. '
203
                'Missing current state.')
204
        if date_selected < current_state.date_selected:
205
            raise Exception('You cannot set a state starting the %s that '
206
                'is before the previous state starting at day %s.' % \
207
                (str(date_selected), str(current_state.date_selected)))
208
        FileState(patient=self, state_name=state_name,
209
            date_selected=date_selected, author=author, comment=comment,
210
            previous_state=current_state).save()
211

    
212
    def change_day_selected_of_state(self, state, new_date):
213
        if state.previous_state:
214
            if new_date < state.previous_state.date_selected:
215
                raise Exception('You cannot set a state starting the %s '
216
                    'before the previous state starting at day %s.' % \
217
                    (str(new_date), str(state.previous_state.date_selected)))
218
        next_state = state.get_next_state()
219
        if next_state:
220
            if new_date > next_state.date_selected:
221
                raise Exception('You cannot set a state starting the %s '
222
                    'after the following state starting at day %s.' % \
223
                    (str(new_date), str(next_state.date_selected)))
224
        state.date_selected = new_date
225
        state.save()
226

    
227
    def remove_state(self, state):
228
        if state.patient.id != self.id:
229
            raise Exception('The state given is not about this patient '
230
                'record but about %s' % state.patient)
231
        next_state = state.get_next_state()
232
        if not next_state:
233
            self.remove_last_state()
234
        else:
235
            next_state.previous_state = state.previous_state
236
            next_state.save()
237
            state.delete()
238

    
239
    def remove_last_state(self):
240
        try:
241
            self.get_state().delete()
242
        except:
243
            pass
244

    
245

    
246
def create_patient(first_name, last_name, service, creator,
247
        date_selected=None):
248
    logger.debug('create_patient: creation for patient %s %s in service %s '
249
        'by %s' % (first_name, last_name, service, creator))
250
    if not (first_name and last_name and service and creator):
251
        raise Exception('Missing parameter to create a patient record.')
252
    patient = PatientRecord(first_name=first_name, last_name=last_name,
253
        service=service, creator=creator)
254
    patient.save()
255
    if not date_selected:
256
        date_selected = patient.created
257
    FileState(patient=patient, state_name=STATE_ACCUEIL[service.name],
258
        date_selected=date_selected, author=creator,
259
        previous_state=None).save()
260
    return patient
(4-4/8)