Project

General

Profile

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

calebasse / calebasse / dossiers / models.py @ 70b65c8c

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

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

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

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

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

    
93
    def get_states_history(self):
94
        return self.filestate_set.order_by('date_selected')
95

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

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

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

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

    
149

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