Project

General

Profile

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

calebasse / calebasse / dossiers / models.py @ 47b11707

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

    
3
import logging
4

    
5
from datetime import datetime
6

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

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

    
14
logger = logging.getLogger('calebasse.dossiers')
15

    
16

    
17
class FileState(models.Model):
18

    
19
    class Meta:
20
        app_label = 'dossiers'
21

    
22
    patient = models.ForeignKey('dossiers.PatientRecord',
23
        verbose_name=u'Dossier patient', editable=False)
24
    state_name = models.CharField(max_length=150)
25
    created = models.DateTimeField(u'Création', auto_now_add=True)
26
    date_selected = models.DateTimeField()
27
    author = \
28
        models.ForeignKey(User,
29
        verbose_name=u'Auteur', editable=False)
30
    comment = models.TextField(max_length=3000, blank=True, null=True)
31
    previous_state = models.ForeignKey('FileState',
32
        verbose_name=u'Etat précédent',
33
        editable=False, blank=True, null=True)
34

    
35
    def get_next_state(self):
36
        try:
37
            return FileState.objects.get(previous_state=self)
38
        except:
39
            return None
40

    
41
    def save(self, **kwargs):
42
        self.date_selected = \
43
            datetime(self.date_selected.year,
44
                self.date_selected.month, self.date_selected.day)
45
        super(FileState, self).save(**kwargs)
46

    
47
    def __unicode__(self):
48
        return self.state_name + ' ' + str(self.date_selected)
49

    
50

    
51
class PatientRecord(ServiceLinkedAbstractModel, People):
52
    class Meta:
53
        verbose_name = u'Dossier'
54
        verbose_name_plural = u'Dossiers'
55

    
56
    created = models.DateTimeField(u'création', auto_now_add=True)
57
    creator = \
58
        models.ForeignKey(User,
59
        verbose_name=u'Créateur dossier patient',
60
        editable=False)
61
    contacts = models.ManyToManyField('personnes.People',
62
            related_name='contact_of')
63
    birthdate = models.DateField()
64
    paper_id = models.CharField(max_length=12)
65

    
66
    def __init__(self, *args, **kwargs):
67
        super(PatientRecord, self).__init__(*args, **kwargs)
68
        if not hasattr(self, 'service'):
69
            raise Exception('The field service is mandatory.')
70

    
71
    def get_state(self):
72
        last_state = self.filestate_set.latest('date_selected')
73
        multiple = self.filestate_set.\
74
            filter(date_selected=last_state.date_selected)
75
        if len(multiple) > 1:
76
            last_state = multiple.latest('created')
77
        return last_state
78

    
79
    def get_state_at_day(self, date):
80
        state = self.get_state()
81
        while(state):
82
            if datetime(state.date_selected.year,
83
                    state.date_selected.month, state.date_selected.day) <= \
84
                    datetime(date.year, date.month, date.day):
85
                return state
86
            state = state.previous_state
87
        return None
88

    
89
    def was_in_state_at_day(self, date, state_name):
90
        state_at_day = self.get_state_at_day(date)
91
        if state_at_day and state_at_day.state_name == state_name:
92
            return True
93
        return False
94

    
95
    def get_states_history(self):
96
        return self.filestate_set.order_by('date_selected')
97

    
98
    def set_state(self, state_name, author, date_selected=None, comment=None):
99
        if not author:
100
            raise Exception('Missing author to set state')
101
        if not state_name in STATES[self.service.name].keys():
102
            raise Exception('Etat de dossier '
103
                'non existant dans le service %s.' % self.service.name)
104
        if not date_selected:
105
            date_selected = datetime.now()
106
        current_state = self.get_state()
107
        if not current_state:
108
            raise Exception('Invalid patient record. '
109
                'Missing current state.')
110
        if date_selected < current_state.date_selected:
111
            raise Exception('You cannot set a state starting the %s that '
112
                'is before the previous state starting at day %s.' % \
113
                (str(date_selected), str(current_state.date_selected)))
114
        FileState(patient=self, state_name=state_name,
115
            date_selected=date_selected, author=author, comment=comment,
116
            previous_state=current_state).save()
117

    
118
    def change_day_selected_of_state(self, state, new_date):
119
        if state.previous_state:
120
            if new_date < state.previous_state.date_selected:
121
                raise Exception('You cannot set a state starting the %s '
122
                    'before the previous state starting at day %s.' % \
123
                    (str(new_date), str(state.previous_state.date_selected)))
124
        next_state = state.get_next_state()
125
        if next_state:
126
            if new_date > next_state.date_selected:
127
                raise Exception('You cannot set a state starting the %s '
128
                    'after the following state starting at day %s.' % \
129
                    (str(new_date), str(next_state.date_selected)))
130
        state.date_selected = new_date
131
        state.save()
132

    
133
    def remove_state(self, state):
134
        if state.patient.id != self.id:
135
            raise Exception('The state given is not about this patient '
136
                'record but about %s' % state.patient)
137
        next_state = state.get_next_state()
138
        if not next_state:
139
            self.remove_last_state()
140
        else:
141
            next_state.previous_state = state.previous_state
142
            next_state.save()
143
            state.delete()
144

    
145
    def remove_last_state(self):
146
        try:
147
            self.get_state().delete()
148
        except:
149
            pass
150

    
151

    
152
def create_patient(first_name, last_name, service, creator,
153
        date_selected=None):
154
    logger.debug('create_patient: creation for patient %s %s in service %s '
155
        'by %s' % (first_name, last_name, service, creator))
156
    if not (first_name and last_name and service and creator):
157
        raise Exception('Missing parameter to create a patient record.')
158
    patient = PatientRecord(first_name=first_name, last_name=last_name,
159
        service=service, creator=creator)
160
    patient.save()
161
    if not date_selected:
162
        date_selected = patient.created
163
    FileState(patient=patient, state_name=STATE_ACCUEIL[service.name],
164
        date_selected=date_selected, author=creator,
165
        previous_state=None).save()
166
    return patient
(4-4/8)