Projet

Général

Profil

Télécharger (45 ko) Statistiques
| Branche: | Tag: | Révision:

calebasse / calebasse / dossiers / views.py @ feffc421

1 f6203b66 Frédéric Péters
# -*- coding: utf-8 -*-
2
3 23937808 Frédéric Péters
import os
4
5 4e8467aa Benjamin Dauvergne
from datetime import datetime, date
6 54f8d003 Jérôme Schneider
7 23937808 Frédéric Péters
from django.conf import settings
8 17e36a37 Frédéric Péters
from django.db import models
9 23937808 Frédéric Péters
from django.http import HttpResponseRedirect, HttpResponse
10 7bc87b6f Frédéric Péters
from django.views.generic import View
11 3c5df84d Jérôme Schneider
from django.views.generic.edit import DeleteView
12 f6203b66 Frédéric Péters
from django.contrib import messages
13 43a5b181 Frédéric Péters
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
14 364eecbe Mikaël Ates
from django.core.files import File
15 cda02476 Mikaël Ates
from django.forms import Form
16 61c88ce1 Mikaël Ates
from django.utils import formats
17 5497fedd Mikaël Ates
from django.shortcuts import get_object_or_404
18 e7898322 Jérôme Schneider
19 554289d5 Jérôme Schneider
from calebasse import cbv
20 23937808 Frédéric Péters
from calebasse.doc_templates import make_doc_from_template
21 317bcb4c Jérôme Schneider
from calebasse.dossiers import forms
22 aa31cdc8 Jérôme Schneider
from calebasse.dossiers.views_utils import get_next_rdv, get_last_rdv, get_status
23 cda02476 Mikaël Ates
from calebasse.dossiers.transport import render_transport
24 76974b6f Benjamin Dauvergne
from calebasse.agenda.models import Event, EventWithAct
25
from calebasse.actes.models import Act
26 23937808 Frédéric Péters
from calebasse.agenda.appointments import Appointment
27 29168b44 Jérôme Schneider
from calebasse.dossiers.models import (PatientRecord, PatientContact,
28 b8957f1d Jérôme Schneider
        PatientAddress, Status, FileState, create_patient, CmppHealthCareTreatment,
29 07b0577e Mikaël Ates
        CmppHealthCareDiagnostic, SessadHealthCareNotification, HealthCare,
30 5497fedd Mikaël Ates
        TransportPrescriptionLog, ProtectionState)
31 3c5df84d Jérôme Schneider
from calebasse.dossiers.states import STATES_MAPPING, STATES_BTN_MAPPER
32 00c7103f Mikaël Ates
from calebasse.ressources.models import (Service,
33 c8083788 Mikaël Ates
    SocialisationDuration, MDPHRequest, MDPHResponse)
34 523c5aaf Mikaël Ates
from calebasse.facturation.list_acts import list_acts_for_billing_CMPP_per_patient
35 c20d5459 Jérôme Schneider
36 8630b77b Mikaël Ates
from calebasse.decorators import validator_only
37 f3407c83 Jérôme Schneider
38 e24683bd Jérôme Schneider
39 cea6ec34 Jérôme Schneider
class NewPatientRecordView(cbv.FormView, cbv.ServiceViewMixin):
40 317bcb4c Jérôme Schneider
    form_class = forms.NewPatientRecordForm
41 554289d5 Jérôme Schneider
    template_name = 'dossiers/patientrecord_new.html'
42
    success_url = '..'
43 77c6fe82 Frédéric Péters
    patient = None
44 554289d5 Jérôme Schneider
45
    def post(self, request, *args, **kwarg):
46
        self.user = request.user
47
        return super(NewPatientRecordView, self).post(request, *args, **kwarg)
48
49
    def form_valid(self, form):
50 5327927f Mikaël Ates
        self.patient = create_patient(form.data['first_name'], form.data['last_name'], self.service,
51
                self.user, date_selected=datetime.strptime(form.data['date_selected'], "%d/%m/%Y"))
52 554289d5 Jérôme Schneider
        return super(NewPatientRecordView, self).form_valid(form)
53
54 77c6fe82 Frédéric Péters
    def get_success_url(self):
55
        return '%s/view' % self.patient.id
56
57 554289d5 Jérôme Schneider
new_patient_record = NewPatientRecordView.as_view()
58
59 f8606a78 Benjamin Dauvergne
class RecordPatientRecordIdMixing(object):
60
    def dispatch(self, request, *args, **kwargs):
61 5d625358 Jérôme Schneider
        self.patientrecord_id = request.session['patientrecord_id'] = int(kwargs['patientrecord_id'])
62 f8606a78 Benjamin Dauvergne
        return super(RecordPatientRecordIdMixing, self).dispatch(request, *args, **kwargs)
63
64
    def get_form_kwargs(self):
65
        kwargs = super(RecordPatientRecordIdMixing, self).get_form_kwargs()
66
        kwargs['patient'] = PatientRecord.objects.get(id=self.patientrecord_id)
67
        return kwargs
68
69
class NewPatientContactView(RecordPatientRecordIdMixing, cbv.CreateView):
70 317bcb4c Jérôme Schneider
    model = PatientContact
71 f8606a78 Benjamin Dauvergne
    form_class = forms.PatientContactForm
72 dfd4bd12 Jérôme Schneider
    template_name = 'dossiers/patientcontact_new.html'
73
    success_url = '../view#tab=2'
74 317bcb4c Jérôme Schneider
75 6d9e4005 Jérôme Schneider
    def get_initial(self):
76
        initial = super(NewPatientContactView, self).get_initial()
77
        fields = self.form_class.base_fields.keys()
78
        for arg in self.request.GET.keys():
79
            if arg in fields:
80 5a1c0763 Jérôme Schneider
                if arg == 'addresses':
81
                    value = self.request.GET.getlist(arg)
82
                else:
83
                    value = self.request.GET.get(arg)
84 0bbd4c47 Jérôme Schneider
                initial[arg] = value
85
        if initial:
86 5a1c0763 Jérôme Schneider
            if not initial.has_key('addresses'):
87
                initial['addresses'] = []
88 0bbd4c47 Jérôme Schneider
            patient = PatientRecord.objects.get(id=self.patientrecord_id)
89
            addresses = patient.addresses.order_by('-id')
90
            if addresses:
91
                initial['addresses'].append(addresses[0].pk)
92 6d9e4005 Jérôme Schneider
        return initial
93
94 1a9b2fe9 Jérôme Schneider
new_patient_contact = NewPatientContactView.as_view()
95 317bcb4c Jérôme Schneider
96 f8606a78 Benjamin Dauvergne
class UpdatePatientContactView(RecordPatientRecordIdMixing, cbv.UpdateView):
97 0ad2d82a Jérôme Schneider
    model = PatientContact
98 f8606a78 Benjamin Dauvergne
    form_class = forms.PatientContactForm
99 0ad2d82a Jérôme Schneider
    template_name = 'dossiers/patientcontact_new.html'
100
    success_url = '../../view#tab=2'
101
102
update_patient_contact = UpdatePatientContactView.as_view()
103
104 dfd4bd12 Jérôme Schneider
class DeletePatientContactView(cbv.DeleteView):
105
    model = PatientContact
106
    form_class = forms.PatientContactForm
107
    template_name = 'dossiers/patientcontact_confirm_delete.html'
108
    success_url = '../../view#tab=2'
109
110 40de3ad2 Frédéric Péters
    def post(self, request, *args, **kwargs):
111
        try:
112
            patient = PatientRecord.objects.get(id=kwargs.get('pk'))
113
        except PatientRecord.DoesNotExist:
114
            return super(DeletePatientContactView, self).post(request, *args, **kwargs)
115
        # the contact is also a patient record; it shouldn't be deleted; just
116
        # altered to remove an address
117
        patient.addresses.remove(self.request.GET['address'])
118
        return HttpResponseRedirect(self.get_success_url())
119
120 dfd4bd12 Jérôme Schneider
delete_patient_contact = DeletePatientContactView.as_view()
121
122 1a9b2fe9 Jérôme Schneider
class NewPatientAddressView(cbv.CreateView):
123 29168b44 Jérôme Schneider
    model = PatientAddress
124
    form_class = forms.PatientAddressForm
125 dfd4bd12 Jérôme Schneider
    template_name = 'dossiers/patientaddress_new.html'
126
    success_url = '../view#tab=2'
127 29168b44 Jérôme Schneider
128 1a9b2fe9 Jérôme Schneider
    def get_success_url(self):
129
        return self.success_url
130
131
    def form_valid(self, form):
132
        patientaddress = form.save()
133
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
134
        patientrecord.addresses.add(patientaddress)
135 fca68db0 Jérôme Schneider
        messages.add_message(self.request, messages.INFO, u'Nouvelle adresse enregistrée avec succès.')
136 1a9b2fe9 Jérôme Schneider
        return HttpResponseRedirect(self.get_success_url())
137 29168b44 Jérôme Schneider
138 1a9b2fe9 Jérôme Schneider
new_patient_address = NewPatientAddressView.as_view()
139 29168b44 Jérôme Schneider
140 4e9e8ae5 Jérôme Schneider
class UpdatePatientAddressView(cbv.UpdateView):
141
    model = PatientAddress
142
    form_class = forms.PatientAddressForm
143
    template_name = 'dossiers/patientaddress_new.html'
144
    success_url = '../../view#tab=2'
145
146 fca68db0 Jérôme Schneider
    def form_valid(self, form):
147 aa31cdc8 Jérôme Schneider
        messages.add_message(self.request,
148
                messages.INFO,
149
                u'Modification enregistrée avec succès.')
150 fca68db0 Jérôme Schneider
        return super(UpdatePatientAddressView, self).form_valid(form)
151
152 4e9e8ae5 Jérôme Schneider
update_patient_address = UpdatePatientAddressView.as_view()
153
154 dfd4bd12 Jérôme Schneider
class DeletePatientAddressView(cbv.DeleteView):
155
    model = PatientAddress
156
    form_class = forms.PatientAddressForm
157
    template_name = 'dossiers/patientaddress_confirm_delete.html'
158
    success_url = '../../view#tab=2'
159
160
delete_patient_address = DeletePatientAddressView.as_view()
161
162 b464657d Mikaël Ates
163 1d205fa9 Mikaël Ates
class NewHealthCareView(cbv.CreateView):
164 b464657d Mikaël Ates
165 2da0976b Jérôme Schneider
    def get_initial(self):
166 b8957f1d Jérôme Schneider
        initial = super(NewHealthCareView, self).get_initial()
167 2da0976b Jérôme Schneider
        initial['author'] = self.request.user.id
168
        initial['patient'] = self.kwargs['patientrecord_id']
169
        return initial
170 b464657d Mikaël Ates
171 1d205fa9 Mikaël Ates
new_healthcare_treatment = \
172
    NewHealthCareView.as_view(model=CmppHealthCareTreatment,
173
        template_name = 'dossiers/generic_form.html',
174
        success_url = '../view#tab=3',
175
        form_class=forms.CmppHealthCareTreatmentForm)
176
new_healthcare_diagnostic = \
177
    NewHealthCareView.as_view(model=CmppHealthCareDiagnostic,
178
        template_name = 'dossiers/generic_form.html',
179
        success_url = '../view#tab=3',
180
        form_class=forms.CmppHealthCareDiagnosticForm)
181
new_healthcare_notification = \
182
    NewHealthCareView.as_view(model=SessadHealthCareNotification,
183
        template_name = 'dossiers/generic_form.html',
184
        success_url = '../view#tab=3',
185
        form_class=forms.SessadHealthCareNotificationForm)
186
update_healthcare_treatment = \
187
    cbv.UpdateView.as_view(model=CmppHealthCareTreatment,
188
        template_name = 'dossiers/generic_form.html',
189
        success_url = '../../view#tab=3',
190 b8957f1d Jérôme Schneider
        form_class=forms.CmppHealthCareTreatmentForm)
191 1d205fa9 Mikaël Ates
update_healthcare_diagnostic = \
192
    cbv.UpdateView.as_view(model=CmppHealthCareDiagnostic,
193
        template_name = 'dossiers/generic_form.html',
194
        success_url = '../../view#tab=3',
195 b8957f1d Jérôme Schneider
        form_class=forms.CmppHealthCareDiagnosticForm)
196 1d205fa9 Mikaël Ates
update_healthcare_notification = \
197
    cbv.UpdateView.as_view(model=SessadHealthCareNotification,
198
        template_name = 'dossiers/generic_form.html',
199
        success_url = '../../view#tab=3',
200 b8957f1d Jérôme Schneider
        form_class=forms.SessadHealthCareNotificationForm)
201 1d205fa9 Mikaël Ates
delete_healthcare_treatment = \
202
    cbv.DeleteView.as_view(model=CmppHealthCareTreatment,
203
        template_name = 'dossiers/generic_confirm_delete.html',
204
        success_url = '../../view#tab=3')
205
delete_healthcare_diagnostic = \
206
    cbv.DeleteView.as_view(model=CmppHealthCareDiagnostic,
207
        template_name = 'dossiers/generic_confirm_delete.html',
208
        success_url = '../../view#tab=3')
209
delete_healthcare_notification = \
210
    cbv.DeleteView.as_view(model=SessadHealthCareNotification,
211
        template_name = 'dossiers/generic_confirm_delete.html',
212
        success_url = '../../view#tab=3')
213 b464657d Mikaël Ates
214
215 554289d5 Jérôme Schneider
class StateFormView(cbv.FormView):
216 f78e473c Jérôme Schneider
    template_name = 'dossiers/state.html'
217 317bcb4c Jérôme Schneider
    form_class = forms.StateForm
218 dfd4bd12 Jérôme Schneider
    success_url = './view#tab=0'
219 f78e473c Jérôme Schneider
220 5f476468 Jérôme Schneider
221 54f8d003 Jérôme Schneider
    def post(self, request, *args, **kwarg):
222
        self.user = request.user
223
        return super(StateFormView, self).post(request, *args, **kwarg)
224
225 f78e473c Jérôme Schneider
    def form_valid(self, form):
226 54f8d003 Jérôme Schneider
        service = Service.objects.get(id=form.data['service_id'])
227
        status = Status.objects.filter(services=service).filter(type=form.data['state_type'])
228
        patient = PatientRecord.objects.get(id=form.data['patient_id'])
229
        date_selected = datetime.strptime(form.data['date'], "%d/%m/%Y")
230
        patient.set_state(status[0], self.user, date_selected, form.data['comment'])
231 f78e473c Jérôme Schneider
        return super(StateFormView, self).form_valid(form)
232
233
state_form = StateFormView.as_view()
234
235 aa31cdc8 Jérôme Schneider
class PatientRecordView(cbv.UpdateView):
236 f3407c83 Jérôme Schneider
    model = PatientRecord
237
    template_name = 'dossiers/patientrecord_update.html'
238 380f5426 Jérôme Schneider
239 f3407c83 Jérôme Schneider
    def get_context_data(self, **kwargs):
240
        ctx = super(PatientRecordView, self).get_context_data(**kwargs)
241 f3c2d53a Mikaël Ates
        ctx['object'].create_diag_healthcare(self.request.user)
242
        ctx['object'].automated_switch_state(self.request.user)
243 3665f853 Mikaël Ates
        current_state = ctx['object'].get_current_state()
244 aa31cdc8 Jérôme Schneider
        if not current_state:
245
            current_state = ctx['object'].get_state()
246
            ctx['future_state'] = True
247 3665f853 Mikaël Ates
        if STATES_MAPPING.has_key(current_state.status.type):
248
            state = STATES_MAPPING[current_state.status.type]
249
        else:
250
            state = current_state.status.name
251
        ctx['current_state'] = current_state
252 54f8d003 Jérôme Schneider
        ctx['service_id'] = self.service.id
253 7f360e71 Jérôme Schneider
        ctx['states'] = FileState.objects.filter(patient=self.object) \
254
                .filter(status__services=self.service) \
255
                .order_by('-date_selected')
256 aa31cdc8 Jérôme Schneider
        return ctx
257
258
patient_record = PatientRecordView.as_view()
259
260
class PatientRecordGeneralView(cbv.UpdateView):
261
    model = PatientRecord
262
    form_class = forms.GeneralForm
263
    template_name = 'dossiers/patientrecord_tab1_general.html'
264
    success_url = './view'
265 a72d40ba Mikaël Ates
266 aa31cdc8 Jérôme Schneider
    def get_context_data(self, **kwargs):
267
        ctx = super(PatientRecordGeneralView, self).get_context_data(**kwargs)
268
        ctx['nb_place_of_lifes'] = ctx['object'].addresses.filter(place_of_life=True).count()
269
        ctx['initial_state'] = ctx['object'].get_initial_state()
270
        ctx['last_rdv'] = get_last_rdv(ctx['object'])
271
        ctx['next_rdv'] = get_next_rdv(ctx['object'])
272
        current_state = ctx['object'].get_current_state()
273 c14fdef9 Jérôme Schneider
        if current_state.status and STATES_MAPPING.has_key(current_state.status.type):
274 aa31cdc8 Jérôme Schneider
            state = STATES_MAPPING[current_state.status.type]
275 c0ae5eb9 Jérôme Schneider
        elif current_state.status:
276
            state = current_state.status.name
277 aa31cdc8 Jérôme Schneider
        else:
278 c0ae5eb9 Jérôme Schneider
            state = "Aucun"
279 aa31cdc8 Jérôme Schneider
        ctx['current_state'] = current_state
280
        ctx['status'], ctx['hc_status'] = get_status(ctx, self.request.user)
281 a72d40ba Mikaël Ates
        ctx['missing_policy'] = False
282
        if not self.object.policyholder or \
283
                not self.object.policyholder.health_center or \
284
                not self.object.policyholder.social_security_id:
285
            ctx['missing_policy'] = True
286 67992ef6 Mikaël Ates
        ctx['missing_birthdate'] = False
287
        if not self.object.birthdate:
288
            ctx['missing_birthdate'] = True
289 aa31cdc8 Jérôme Schneider
        return ctx
290 a72d40ba Mikaël Ates
291 aa31cdc8 Jérôme Schneider
tab1_general = PatientRecordGeneralView.as_view()
292
293 1a3d8912 Jérôme Schneider
class PatientRecordAdmView(cbv.UpdateView):
294 aa31cdc8 Jérôme Schneider
    model = PatientRecord
295 1a3d8912 Jérôme Schneider
    form_class = forms.AdministrativeForm
296 aa31cdc8 Jérôme Schneider
    template_name = 'dossiers/patientrecord_tab2_fiche_adm.html'
297
    success_url = './view#tab=1'
298
299
    def get_context_data(self, **kwargs):
300
        ctx = super(PatientRecordAdmView, self).get_context_data(**kwargs)
301
        try:
302
            ctx['last_prescription'] = TransportPrescriptionLog.objects.filter(patient=ctx['object']).latest('created')
303
        except:
304
            pass
305
        return ctx
306
307
tab2_fiche_adm = PatientRecordAdmView.as_view()
308
309
class PatientRecordAddrView(cbv.ServiceViewMixin, cbv.MultiUpdateView):
310
    model = PatientRecord
311
    forms_classes = {
312
            'contact': forms.PatientContactForm,
313
            'policyholder': forms.PolicyHolderForm
314
            }
315
    template_name = 'dossiers/patientrecord_tab3_adresses.html'
316
    success_url = './view#tab=2'
317
318
319
    def get_context_data(self, **kwargs):
320
        ctx = super(PatientRecordAddrView, self).get_context_data(**kwargs)
321
        ctx['nb_place_of_lifes'] = ctx['object'].addresses.filter(place_of_life=True).count()
322
        ctx['addresses'] = ctx['object'].addresses.order_by('-place_of_life', 'id')
323
        return ctx
324
325
tab3_addresses = PatientRecordAddrView.as_view()
326
327
class PatientRecordNotifsView(cbv.DetailView):
328
    model = PatientRecord
329
    template_name = 'dossiers/patientrecord_tab4_notifs.html'
330
331
    def get_context_data(self, **kwargs):
332
        ctx = super(PatientRecordNotifsView, self).get_context_data(**kwargs)
333
        ctx['status'], ctx['hc_status'] = get_status(ctx, self.request.user)
334
        if ctx['object'].service.slug == "cmpp":
335 3b1f5878 Mikaël Ates
            (acts_not_locked, days_not_locked, acts_not_valide,
336
            acts_not_billable, acts_pause, acts_per_hc, acts_losts) = \
337 523c5aaf Mikaël Ates
                list_acts_for_billing_CMPP_per_patient(self.object,
338 3b1f5878 Mikaël Ates
                    datetime.today(), self.service)
339
            ctx['acts_losts'] = acts_losts
340
            ctx['acts_pause'] = acts_pause
341
            hcs_used = acts_per_hc.keys()
342 d5ca00ed Mikaël Ates
            hcs = None
343 3b1f5878 Mikaël Ates
            if not hcs_used:
344 d5ca00ed Mikaël Ates
                hcs = [(hc, None) for hc in HealthCare.objects.filter(patient=self.object).order_by('-start_date')]
345 3b1f5878 Mikaël Ates
            else:
346 d5ca00ed Mikaël Ates
                hcs = []
347 3b1f5878 Mikaël Ates
                for hc in HealthCare.objects.filter(patient=self.object).order_by('-start_date'):
348
                    acts = None
349
                    if hasattr(hc, 'cmpphealthcarediagnostic') and hc.cmpphealthcarediagnostic in hcs_used:
350
                        acts = acts_per_hc[hc.cmpphealthcarediagnostic]
351
                    elif hasattr(hc, 'cmpphealthcaretreatment') and hc.cmpphealthcaretreatment in hcs_used:
352
                        acts = acts_per_hc[hc.cmpphealthcaretreatment]
353 d5ca00ed Mikaël Ates
                    hcs.append((hc, acts))
354
            ctx['hcs'] = []
355
            for hc, acts in hcs:
356
                ctx['hcs'].append((hc, acts, hc.act_set.order_by('date', 'time')))
357 aa31cdc8 Jérôme Schneider
        elif ctx['object'].service.slug == "sessad-ted" or ctx['object'].service.slug == "sessad-dys":
358 3b1f5878 Mikaël Ates
            ctx['hcs'] = HealthCare.objects.filter(patient=self.object).order_by('-start_date')
359 aa31cdc8 Jérôme Schneider
        return ctx
360 eb3a7e71 Jérôme Schneider
361 aa31cdc8 Jérôme Schneider
tab4_notifs = PatientRecordNotifsView.as_view()
362
363
class PatientRecordOldActs(cbv.DetailView):
364
    model = PatientRecord
365
    template_name = 'dossiers/patientrecord_tab5_actes_passes.html'
366
367
    def get_context_data(self, **kwargs):
368
        ctx = super(PatientRecordOldActs, self).get_context_data(**kwargs)
369
        ctx['last_rdvs'] = []
370
        for act in Act.objects.last_acts(ctx['object']).prefetch_related('doctors'):
371
            state = act.get_state()
372
            if state and not state.previous_state and state.state_name == 'NON_VALIDE':
373
                state = None
374
            missing_workers = []
375
            try:
376
                missing_workers = [participant.worker for participant in act.event.get_missing_participants()]
377
            except:
378
                pass
379
            ctx['last_rdvs'].append((act, state, missing_workers))
380
        history = []
381
        i = 0
382
        for state in ctx['object'].filestate_set.order_by('-date_selected'):
383
            acts = []
384
            try:
385
                while ctx['last_rdvs'][i][0].date >= state.date_selected.date():
386
                    acts.append(ctx['last_rdvs'][i])
387
                    i += 1
388
            except:
389
                pass
390
            history.append((state, acts))
391
        if i < len(ctx['last_rdvs']) - 1:
392
            history.append((None, ctx['last_rdvs'][i:]))
393
        ctx['history'] = history
394 f3407c83 Jérôme Schneider
        return ctx
395
396 aa31cdc8 Jérôme Schneider
tab5_old_acts = PatientRecordOldActs.as_view()
397 f6203b66 Frédéric Péters
398 aa31cdc8 Jérôme Schneider
class PatientRecordNextAppointmentsView(cbv.DetailView):
399
    model = PatientRecord
400
    template_name = 'dossiers/patientrecord_tab6_next_rdv.html'
401 f6203b66 Frédéric Péters
402 aa31cdc8 Jérôme Schneider
    def get_context_data(self, **kwargs):
403
        ctx = super(PatientRecordNextAppointmentsView, self).get_context_data(**kwargs)
404
        ctx['next_rdvs'] = []
405
        Q = models.Q
406
        today = date.today()
407 3cdae7c3 Serghei MIHAI
        qs = EventWithAct.objects.filter(patient=ctx['object']) \
408 aa31cdc8 Jérôme Schneider
                .filter(exception_to__isnull=True, canceled=False) \
409
                .filter(Q(start_datetime__gte=today) \
410
                |  Q(exceptions__isnull=False) \
411
                | ( Q(recurrence_periodicity__isnull=False) \
412
                & (Q(recurrence_end_date__gte=today) \
413
                | Q(recurrence_end_date__isnull=True) \
414
                ))) \
415
                .distinct() \
416
                .select_related() \
417
                .prefetch_related('participants', 'exceptions__eventwithact',
418
                        'act_set__actvalidationstate_set')
419
        occurrences = []
420
        for event in qs:
421
            occurrences.extend(filter(lambda e: e.start_datetime.date() >= today,
422
                event.all_occurences(limit=180)))
423
        occurrences = sorted(occurrences, key=lambda e: e.start_datetime)
424
        for event in occurrences:
425
            state = None
426
            if event.act:
427
                state = event.act.get_state()
428
            if state and not state.previous_state and state.state_name == 'NON_VALIDE':
429
                state = None
430 bba85766 Serghei MIHAI
            ctx['next_rdvs'].append((event, state, event.get_missing_participants(), event.get_inactive_participants()))
431 aa31cdc8 Jérôme Schneider
        return ctx
432
433
tab6_next_rdv = PatientRecordNextAppointmentsView.as_view()
434
435
class PatientRecordSocialisationView(cbv.DetailView):
436
    model = PatientRecord
437
    template_name = 'dossiers/patientrecord_tab7_socialisation.html'
438
439
tab7_socialisation = PatientRecordSocialisationView.as_view()
440
441 63975fa8 Jérôme Schneider
class PatientRecordMedicalView(cbv.UpdateView):
442 aa31cdc8 Jérôme Schneider
    model = PatientRecord
443 63975fa8 Jérôme Schneider
    form_class = forms.PhysiologyForm
444 aa31cdc8 Jérôme Schneider
    template_name = 'dossiers/patientrecord_tab8_medical.html'
445
    success_url = './view#tab=7'
446
447
tab8_medical = PatientRecordMedicalView.as_view()
448 f3407c83 Jérôme Schneider
449 554289d5 Jérôme Schneider
class PatientRecordsHomepageView(cbv.ListView):
450 562586fb Jérôme Schneider
    model = PatientRecord
451 c20d5459 Jérôme Schneider
    template_name = 'dossiers/index.html'
452 562586fb Jérôme Schneider
453 e16b3817 Jérôme Schneider
454
    def _get_search_result(self, paginate_patient_records):
455
        patient_records = []
456
        for patient_record in paginate_patient_records:
457
            next_rdv = get_next_rdv(patient_record)
458
            last_rdv = get_last_rdv(patient_record)
459
            current_status = patient_record.last_state.status
460
            state = current_status.name
461
            state_class = current_status.type.lower()
462
            patient_records.append(
463
                    {
464
                        'object': patient_record,
465
                        'next_rdv': next_rdv,
466
                        'last_rdv': last_rdv,
467
                        'state': state,
468
                        'state_class': state_class
469
                        }
470
                    )
471
        return patient_records
472
473 562586fb Jérôme Schneider
    def get_queryset(self):
474
        first_name = self.request.GET.get('first_name')
475
        last_name = self.request.GET.get('last_name')
476
        paper_id = self.request.GET.get('paper_id')
477 301ff5c0 Frédéric Péters
        id = self.request.GET.get('id')
478 562586fb Jérôme Schneider
        social_security_id = self.request.GET.get('social_security_id')
479 a75ff93a Mikaël Ates
        if not (first_name or last_name or paper_id or id or social_security_id):
480
            return None
481
        if (first_name and len(first_name) < 2) or (last_name and len(last_name) < 2):
482
            return None
483
        qs = super(PatientRecordsHomepageView, self).get_queryset()
484
        states = self.request.GET.getlist('states')
485 562586fb Jérôme Schneider
        if last_name:
486 86aba266 Jérôme Schneider
            qs = qs.filter(last_name__istartswith=last_name)
487 562586fb Jérôme Schneider
        if first_name:
488 86aba266 Jérôme Schneider
            qs = qs.filter(first_name__istartswith=first_name)
489 562586fb Jérôme Schneider
        if paper_id:
490 a75ff93a Mikaël Ates
            qs = qs.filter(paper_id__startswith=paper_id)
491 301ff5c0 Frédéric Péters
        if id:
492 a75ff93a Mikaël Ates
            qs = qs.filter(id__startswith=id)
493 562586fb Jérôme Schneider
        if social_security_id:
494 a75ff93a Mikaël Ates
            qs = qs.filter(models.Q(social_security_id__startswith=social_security_id) | \
495
                models.Q(contacts__social_security_id__startswith=social_security_id))
496 7328a577 Jérôme Schneider
        if states:
497 e30c9bdb Jérôme Schneider
            qs = qs.filter(last_state__status__id__in=states)
498 348bd1f9 Jérôme Schneider
        else:
499
            qs = qs.filter(last_state__status__type__in="")
500 e30c9bdb Jérôme Schneider
        qs = qs.filter(service=self.service).order_by('last_name').\
501
                prefetch_related('last_state',
502
                        'patientcontact', 'last_state__status')
503 562586fb Jérôme Schneider
        return qs
504
505
    def get_context_data(self, **kwargs):
506 f3407c83 Jérôme Schneider
        ctx = super(PatientRecordsHomepageView, self).get_context_data(**kwargs)
507 e30c9bdb Jérôme Schneider
        ctx['search_form'] = forms.SearchForm(service=self.service, data=self.request.GET or None)
508
        ctx['stats'] = [["Dossiers", 0]]
509
        for status in Status.objects.filter(services=self.service):
510
            ctx['stats'].append([status.name, 0])
511 ca4afcae Jérôme Schneider
512 43a5b181 Frédéric Péters
        page = self.request.GET.get('page')
513 e16b3817 Jérôme Schneider
        if ctx['object_list']:
514
            patient_records = ctx['object_list'].filter()
515
        else:
516
            patient_records = []
517
518
        # TODO: use a sql query to do this
519
        for patient_record in patient_records:
520
            ctx['stats'][0][1] += 1
521
            for elem in ctx['stats']:
522
                if elem[0] == patient_record.last_state.status.name:
523
                    elem[1] += 1
524 36e10f58 Frédéric Péters
        paginator = Paginator(patient_records, 50)
525 43a5b181 Frédéric Péters
        try:
526 e16b3817 Jérôme Schneider
            paginate_patient_records = paginator.page(page)
527 43a5b181 Frédéric Péters
        except PageNotAnInteger:
528 e16b3817 Jérôme Schneider
            paginate_patient_records = paginator.page(1)
529 43a5b181 Frédéric Péters
        except EmptyPage:
530 e16b3817 Jérôme Schneider
            paginate_patient_records = paginator.page(paginator.num_pages)
531 43a5b181 Frédéric Péters
532
        query = self.request.GET.copy()
533
        if 'page' in query:
534
            del query['page']
535
        ctx['query'] = query.urlencode()
536
537 e16b3817 Jérôme Schneider
        ctx['paginate_patient_records'] = paginate_patient_records
538
        ctx['patient_records'] = self._get_search_result(paginate_patient_records)
539 562586fb Jérôme Schneider
        return ctx
540
541 f78e473c Jérôme Schneider
patientrecord_home = PatientRecordsHomepageView.as_view()
542 e7898322 Jérôme Schneider
543
class PatientRecordDeleteView(DeleteView):
544
    model = PatientRecord
545
    success_url = ".."
546
    template_name = 'dossiers/patientrecord_confirm_delete.html'
547
548 8630b77b Mikaël Ates
patientrecord_delete = validator_only(PatientRecordDeleteView.as_view())
549 e7898322 Jérôme Schneider
550 29168b44 Jérôme Schneider
551 729480ef Jérôme Schneider
class PatientRecordPaperIDUpdateView(cbv.UpdateView):
552
    model = PatientRecord
553
    form_class = forms.PaperIDForm
554
    template_name = 'dossiers/generic_form.html'
555
    success_url = '../..'
556
557
update_paper_id = PatientRecordPaperIDUpdateView.as_view()
558 00c7103f Mikaël Ates
559
560
class NewSocialisationDurationView(cbv.CreateView):
561
    model = SocialisationDuration
562
    form_class = forms.SocialisationDurationForm
563
    template_name = 'dossiers/generic_form.html'
564
    success_url = '../view#tab=6'
565
566
    def get_success_url(self):
567
        return self.success_url
568
569
    def get(self, request, *args, **kwargs):
570
        if kwargs.has_key('patientrecord_id'):
571
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
572
        return super(NewSocialisationDurationView, self).get(request, *args, **kwargs)
573
574
    def form_valid(self, form):
575
        duration = form.save()
576
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
577
        patientrecord.socialisation_durations.add(duration)
578
        return HttpResponseRedirect(self.get_success_url())
579
580
new_socialisation_duration = NewSocialisationDurationView.as_view()
581
582
class UpdateSocialisationDurationView(cbv.UpdateView):
583
    model = SocialisationDuration
584
    form_class = forms.SocialisationDurationForm
585
    template_name = 'dossiers/generic_form.html'
586
    success_url = '../../view#tab=6'
587
588
    def get(self, request, *args, **kwargs):
589
        if kwargs.has_key('patientrecord_id'):
590
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
591
        return super(UpdateSocialisationDurationView, self).get(request, *args, **kwargs)
592
593
update_socialisation_duration = UpdateSocialisationDurationView.as_view()
594
595
class DeleteSocialisationDurationView(cbv.DeleteView):
596
    model = SocialisationDuration
597
    form_class = forms.SocialisationDurationForm
598
    template_name = 'dossiers/socialisationduration_confirm_delete.html'
599
    success_url = '../../view#tab=6'
600
601
delete_socialisation_duration = DeleteSocialisationDurationView.as_view()
602 c8083788 Mikaël Ates
603
604
class NewMDPHRequestView(cbv.CreateView):
605
    def get(self, request, *args, **kwargs):
606
        if kwargs.has_key('patientrecord_id'):
607
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
608
        return super(NewMDPHRequestView, self).get(request, *args, **kwargs)
609
610
    def form_valid(self, form):
611
        request = form.save()
612
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
613
        patientrecord.mdph_requests.add(request)
614
        return HttpResponseRedirect(self.success_url)
615
616
class UpdateMDPHRequestView(cbv.UpdateView):
617
    def get(self, request, *args, **kwargs):
618
        if kwargs.has_key('patientrecord_id'):
619
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
620
        return super(UpdateMDPHRequestView, self).get(request, *args, **kwargs)
621
622
623
new_mdph_request = \
624
    NewMDPHRequestView.as_view(model=MDPHRequest,
625
        template_name = 'dossiers/generic_form.html',
626
        success_url = '../view#tab=6',
627
        form_class=forms.MDPHRequestForm)
628
update_mdph_request = \
629
    UpdateMDPHRequestView.as_view(model=MDPHRequest,
630
        template_name = 'dossiers/generic_form.html',
631
        success_url = '../../view#tab=6',
632
        form_class=forms.MDPHRequestForm)
633
delete_mdph_request = \
634
    cbv.DeleteView.as_view(model=MDPHRequest,
635
        template_name = 'dossiers/generic_confirm_delete.html',
636
        success_url = '../../view#tab=6')
637
638
class NewMDPHResponseView(cbv.CreateView):
639
    def get(self, request, *args, **kwargs):
640
        if kwargs.has_key('patientrecord_id'):
641
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
642
        return super(NewMDPHResponseView, self).get(request, *args, **kwargs)
643
644
    def form_valid(self, form):
645
        response = form.save()
646
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
647
        patientrecord.mdph_responses.add(response)
648
        return HttpResponseRedirect(self.success_url)
649
650
class UpdateMDPHResponseView(cbv.UpdateView):
651
    def get(self, request, *args, **kwargs):
652
        if kwargs.has_key('patientrecord_id'):
653
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
654
        return super(UpdateMDPHResponseView, self).get(request, *args, **kwargs)
655
656
657
new_mdph_response = \
658
    NewMDPHResponseView.as_view(model=MDPHResponse,
659
        template_name = 'dossiers/generic_form.html',
660
        success_url = '../view#tab=6',
661
        form_class=forms.MDPHResponseForm)
662
update_mdph_response = \
663
    UpdateMDPHResponseView.as_view(model=MDPHResponse,
664
        template_name = 'dossiers/generic_form.html',
665
        success_url = '../../view#tab=6',
666
        form_class=forms.MDPHResponseForm)
667
delete_mdph_response = \
668
    cbv.DeleteView.as_view(model=MDPHResponse,
669
        template_name = 'dossiers/generic_confirm_delete.html',
670
        success_url = '../../view#tab=6')
671 4a0ff5ea Frédéric Péters
672
673 24c750bb Jérôme Schneider
class UpdatePatientStateView(cbv.ServiceFormMixin, cbv.UpdateView):
674 5f476468 Jérôme Schneider
675
    def get_initial(self):
676
        initial = super(UpdatePatientStateView, self).get_initial()
677
        initial['date_selected'] = self.object.date_selected.date()
678
        return initial
679
680 4a0ff5ea Frédéric Péters
    def get(self, request, *args, **kwargs):
681
        if kwargs.has_key('patientrecord_id'):
682
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
683
        return super(UpdatePatientStateView, self).get(request, *args, **kwargs)
684
685 0cebd645 Jérôme Schneider
class DeletePatientView(cbv.DeleteView):
686
687
    def delete(self, request, *args, **kwargs):
688
        self.object = self.get_object()
689 1f5cae7f Jérôme Schneider
        if self.object == self.object.patient.last_state:
690
            status = self.object.patient.filestate_set.all().order_by('-created')
691
            if len(status) > 1:
692
                self.object.patient.last_state = status[1]
693 32061a0e Jérôme Schneider
                self.object.patient.save()
694 1f5cae7f Jérôme Schneider
            else:
695
                # TODO return an error here
696
                return HttpResponseRedirect(self.get_success_url())
697
        self.object.delete()
698 0cebd645 Jérôme Schneider
        return HttpResponseRedirect(self.get_success_url())
699
700
701 4a0ff5ea Frédéric Péters
update_patient_state = \
702
    UpdatePatientStateView.as_view(model=FileState,
703
        template_name = 'dossiers/generic_form.html',
704
        success_url = '../../view#tab=0',
705
        form_class=forms.PatientStateForm)
706
delete_patient_state = \
707 0cebd645 Jérôme Schneider
    DeletePatientView.as_view(model=FileState,
708 4a0ff5ea Frédéric Péters
        template_name = 'dossiers/generic_confirm_delete.html',
709
        success_url = '../../view#tab=0')
710 23937808 Frédéric Péters
711
712
class GenerateRtfFormView(cbv.FormView):
713
    template_name = 'dossiers/generate_rtf_form.html'
714
    form_class = forms.GenerateRtfForm
715
    success_url = './view#tab=0'
716
717
    def get_context_data(self, **kwargs):
718
        ctx = super(GenerateRtfFormView, self).get_context_data(**kwargs)
719
        ctx['object'] = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
720
        ctx['service_id'] = self.service.id
721
        if self.request.GET.get('event-id'):
722 76974b6f Benjamin Dauvergne
            date = self.request.GET.get('date')
723
            date = datetime.strptime(date, '%Y-%m-%d').date()
724 23937808 Frédéric Péters
            appointment = Appointment()
725 c2246b82 Benjamin Dauvergne
            event = EventWithAct.objects.get(id=self.request.GET.get('event-id'))
726 5c2d0ea2 Benjamin Dauvergne
            event = event.today_occurrence(date)
727 76974b6f Benjamin Dauvergne
            appointment.init_from_event(event, self.service)
728 577ecc05 Jérôme Schneider
            ctx['event'] = event
729 23937808 Frédéric Péters
            ctx['appointment'] = appointment
730
        return ctx
731
732 b4310641 Mikaël Ates
    def form_valid(self, form, **kwargs):
733
        ctx = self.get_context_data(**kwargs)
734
        patient = ctx['object']
735
        appointment = ctx['appointment']
736 577ecc05 Jérôme Schneider
        event = ctx['event']
737 23937808 Frédéric Péters
        template_filename = form.cleaned_data.get('template_filename')
738 7296f9f1 Mikaël Ates
        dest_filename = datetime.now().strftime('%Y-%m-%d--%H:%M:%S') + '--' + template_filename
739 23937808 Frédéric Péters
        from_path = os.path.join(settings.RTF_TEMPLATES_DIRECTORY, template_filename)
740 364eecbe Mikaël Ates
        to_path = ''
741
        persistent = True
742
        if settings.USE_PATIENT_FILE_RTF_REPOSITORY_DIRECTORY \
743
                or settings.RTF_REPOSITORY_DIRECTORY:
744
            if settings.USE_PATIENT_FILE_RTF_REPOSITORY_DIRECTORY:
745
                to_path = patient.get_ondisk_directory(self.service.name)
746
            if settings.RTF_REPOSITORY_DIRECTORY:
747
                to_path = os.path.join(to_path,
748
                    settings.RTF_REPOSITORY_DIRECTORY)
749
            to_path = os.path.join(to_path, dest_filename)
750
        else:
751
            # else : use temporary files
752
            persistent = False
753
            to_path = dest_filename
754 b4310641 Mikaël Ates
        variables = {'AD11': '', 'AD12': '', 'AD13': '', 'AD14': '',
755
            'AD15': '', 'AD18': '',
756 61c88ce1 Mikaël Ates
            'JOU1': formats.date_format(datetime.today(), "DATE_FORMAT"),
757 b4310641 Mikaël Ates
            'VIL1': u'Saint-Étienne',
758
            'RDV1': '', 'HEU1': '', 'THE1': '', 'DPA1': '',
759
            'NOM1': '', 'PRE1': '', 'NAI1': '', 'NUM2': '',
760
            'NOM2': '', 'PRE2': '', 'TPA1': '', 'NSS1': '',
761
            'TR01': '', 'TR02': '', 'TR03': '', 'TR04': '', 'TR05': '',
762
            'AD16': '', 'AD17': '', 'AD19': '',
763
            'AD21': '', 'AD22': '', 'AD23': '', 'AD24': '', 'AD25': '',
764
            'AD26': '', 'AD27': '', 'AD28': '', 'AD29': '',
765 c0fe0fc5 Mikaël Ates
            'RDV2': '' ,
766 b4310641 Mikaël Ates
        }
767 c0fe0fc5 Mikaël Ates
        list_rdvs = []
768
        for act in Act.objects.last_acts(patient):
769
            state = act.get_state()
770
            if state and state.state_name in ('VALIDE', 'ACT_DOUBLE'):
771
                rdv = "\t- %s" % formats.date_format(act.date, "DATE_FORMAT")
772
                if act.time:
773
                    rdv += " à %s" % formats.date_format(act.time, "TIME_FORMAT")
774
                list_rdvs.append(rdv)
775
        variables['RDV2'] = '\par'.join(list_rdvs)
776 b4310641 Mikaël Ates
        if appointment:
777 1193006a Mikaël Ates
            variables['RDV1'] = formats.date_format(appointment.date, "DATE_FORMAT")
778 b4310641 Mikaël Ates
            variables['HEU1'] = appointment.begin_hour
779
            variables['THE1'] = ' '.join([str(i) for i in appointment.workers])# ou DPA1?
780
            variables['DPA1'] = variables['THE1']
781
        if patient:
782
            variables['NOM1'] = patient.last_name
783
            variables['PRE1'] = patient.first_name
784
            if patient.birthdate :
785
                variables['NAI1'] = patient.birthdate.strftime('%d/%m/%Y')
786
            variables['NUM2'] = patient.paper_id
787
            if patient.policyholder:
788
                variables['NOM2'] = patient.policyholder.last_name
789
                variables['PRE2'] = patient.policyholder.first_name
790 2a5c234c Mikaël Ates
                if patient.policyholder.health_center:
791
                    variables['TPA1'] = patient.policyholder.health_center.name
792 b4310641 Mikaël Ates
                if patient.policyholder.social_security_id:
793
                    key = str(patient.policyholder.get_control_key())
794
                    if len(key) == 1:
795
                        key = '0' + key
796
                    variables['NSS1'] = \
797
                        ' '.join([patient.policyholder.social_security_id,
798
                            key])
799
            if patient.transportcompany:
800
                variables['TR01'] = patient.transportcompany.name
801
                variables['TR02'] = patient.transportcompany.address
802
                variables['TR03'] = patient.transportcompany.address_complement
803
                variables['TR04'] = patient.transportcompany.zip_code
804
                variables['TR05'] = patient.transportcompany.city
805
        variables['AD18'] = form.cleaned_data.get('phone_address') or ''
806 23937808 Frédéric Péters
        for i, line in enumerate(form.cleaned_data.get('address').splitlines()):
807 b4310641 Mikaël Ates
            variables['AD%d' % (11+i)] = line
808 bc17dbd7 Mikaël Ates
            if i == 4:
809
                break
810 b4310641 Mikaël Ates
811
        filename = make_doc_from_template(from_path, to_path, variables,
812
            persistent)
813 23937808 Frédéric Péters
814 ac0cd457 Frédéric Péters
        client_dir = patient.get_client_side_directory(self.service.name)
815 577ecc05 Jérôme Schneider
        event.convocation_sent = True
816
        event.save()
817 ac0cd457 Frédéric Péters
        if not client_dir:
818 364eecbe Mikaël Ates
            content = File(file(filename))
819
            response = HttpResponse(content,'text/rtf')
820
            response['Content-Length'] = content.size
821 b1bac2e0 Mikaël Ates
            response['Content-Disposition'] = 'attachment; filename="%s"' \
822
                % dest_filename.encode('utf-8')
823 ac0cd457 Frédéric Péters
            return response
824
        else:
825 02f39251 Frédéric Péters
            class LocalFileHttpResponseRedirect(HttpResponseRedirect):
826
                allowed_schemes = ['file']
827 ac0cd457 Frédéric Péters
            client_filepath = os.path.join(client_dir, dest_filename)
828 02f39251 Frédéric Péters
            return LocalFileHttpResponseRedirect('file://' + client_filepath)
829 23937808 Frédéric Péters
830
generate_rtf_form = GenerateRtfFormView.as_view()
831 17e36a37 Frédéric Péters
832
833
class PatientRecordsQuotationsView(cbv.ListView):
834
    model = PatientRecord
835
    template_name = 'dossiers/quotations.html'
836
837 e16b3817 Jérôme Schneider
    def _get_search_result(self, paginate_patient_records):
838
        patient_records = []
839
        for patient_record in paginate_patient_records:
840 584b363f Mikaël Ates
            current_state = patient_record.get_current_state() or patient_record.get_state()
841 e16b3817 Jérôme Schneider
            state = current_state.status.name
842
            state_class = current_state.status.type.lower()
843 feffc421 Serghei MIHAI
            deficiencies = [getattr(patient_record, field) \
844
                            for field in self.deficience_fields]
845
            anap = reduce(lambda f1, f2: f1 or f2, deficiencies)
846 e16b3817 Jérôme Schneider
            patient_records.append(
847
                    {
848
                        'object': patient_record,
849
                        'state': state,
850 feffc421 Serghei MIHAI
                        'state_class': state_class,
851
                        'anap': anap
852 e16b3817 Jérôme Schneider
                        }
853
                    )
854
        return patient_records
855
856 17e36a37 Frédéric Péters
    def get_queryset(self):
857
        form = forms.QuotationsForm(data=self.request.GET or None)
858
        qs = super(PatientRecordsQuotationsView, self).get_queryset()
859 feffc421 Serghei MIHAI
        self.deficience_fields = [field for field in self.model._meta.get_all_field_names() if field.startswith('deficiency_')]
860
861 17e36a37 Frédéric Péters
        without_quotations = self.request.GET.get('without_quotations')
862 feffc421 Serghei MIHAI
        without_anap_quotations = self.request.GET.get('without_anap_quotations')
863 17e36a37 Frédéric Péters
        if without_quotations:
864 feffc421 Serghei MIHAI
            qs = qs.filter(mises_1__isnull=True).filter(mises_2__isnull=True).filter(mises_3__isnull=True)
865
866
        if without_anap_quotations:
867
            for field in self.deficience_fields:
868
                anap_field = {field: 0}
869
                qs = qs.filter(**anap_field)
870
871 17e36a37 Frédéric Péters
        states = self.request.GET.getlist('states')
872 e30c9bdb Jérôme Schneider
        qs = qs.filter(last_state__status__id__in=states)
873 17e36a37 Frédéric Péters
874
        try:
875
            date_actes_start = datetime.strptime(form.data['date_actes_start'], "%d/%m/%Y")
876 64839f29 Mikaël Ates
            qs = qs.filter(act__date__gte=date_actes_start.date()).distinct()
877 17e36a37 Frédéric Péters
        except (ValueError, KeyError):
878 76974b6f Benjamin Dauvergne
            pass
879 17e36a37 Frédéric Péters
        try:
880
            date_actes_end = datetime.strptime(form.data['date_actes_end'], "%d/%m/%Y")
881 64839f29 Mikaël Ates
            qs = qs.filter(act__date__lte=date_actes_end.date()).distinct()
882 17e36a37 Frédéric Péters
        except (ValueError, KeyError):
883 76974b6f Benjamin Dauvergne
            pass
884 e16b3817 Jérôme Schneider
        qs = qs.filter(service=self.service).order_by('last_name').prefetch_related()
885 17e36a37 Frédéric Péters
        return qs
886
887
    def get_context_data(self, **kwargs):
888
        ctx = super(PatientRecordsQuotationsView, self).get_context_data(**kwargs)
889 f6be0c7d Jérôme Schneider
        ctx['search_form'] = forms.QuotationsForm(data=self.request.GET or None,
890
                service=self.service)
891 43a5b181 Frédéric Péters
        patient_records = []
892
        page = self.request.GET.get('page')
893 e16b3817 Jérôme Schneider
        paginator = Paginator(ctx['object_list'].filter(), 50)
894 43a5b181 Frédéric Péters
        try:
895 e16b3817 Jérôme Schneider
            paginate_patient_records = paginator.page(page)
896 43a5b181 Frédéric Péters
        except PageNotAnInteger:
897 e16b3817 Jérôme Schneider
            paginate_patient_records = paginator.page(1)
898 43a5b181 Frédéric Péters
        except EmptyPage:
899 e16b3817 Jérôme Schneider
            paginate_patient_records = paginator.page(paginator.num_pages)
900 43a5b181 Frédéric Péters
901 e16b3817 Jérôme Schneider
        ctx['patient_records'] = self._get_search_result(paginate_patient_records)
902
        ctx['paginate_patient_records'] = paginate_patient_records
903 43a5b181 Frédéric Péters
904
        query = self.request.GET.copy()
905
        if 'page' in query:
906
            del query['page']
907
        ctx['query'] = query.urlencode()
908
909 17e36a37 Frédéric Péters
        return ctx
910
911
patientrecord_quotations = PatientRecordsQuotationsView.as_view()
912 7bc87b6f Frédéric Péters
913 5497fedd Mikaël Ates
class NewProtectionStateView(cbv.CreateView):
914
    model = ProtectionState
915
    template_name = 'dossiers/generic_form.html'
916
    success_url = '../view#tab=1'
917
    form_class = forms.ProtectionStateForm
918
919
    def form_valid(self, form):
920
        self.patient = get_object_or_404(PatientRecord, id=self.kwargs.get('patientrecord_id',None))
921
        form.instance.patient = self.patient
922
        return super(NewProtectionStateView, self).form_valid(form)
923
924
new_protection = NewProtectionStateView.as_view()
925
926
class UpdateProtectionStateView(cbv.UpdateView):
927
    model = ProtectionState
928
    template_name = 'dossiers/generic_form.html'
929
    success_url = '../../view#tab=1'
930
    form_class = forms.ProtectionStateForm
931
932
    def form_valid(self, form):
933
        self.patient = get_object_or_404(PatientRecord, id=self.kwargs.get('patientrecord_id',None))
934
        form.instance.patient = self.patient
935
        return super(UpdateProtectionStateView, self).form_valid(form)
936
937
update_protection = UpdateProtectionStateView.as_view()
938
939
class DeleteProtectionStateView(cbv.DeleteView):
940
    model = ProtectionState
941
    template_name = 'dossiers/protection_confirm_delete.html'
942
    success_url = '../../view#tab=1'
943
944
delete_protection = DeleteProtectionStateView.as_view()
945
946 c5f8a919 Mikaël Ates
class PatientRecordsWaitingQueueView(cbv.ListView):
947
    model = PatientRecord
948
    template_name = 'dossiers/waiting_queue.html'
949
950
    def _get_search_result(self, paginate_patient_records,
951
            all_patient_records):
952
        patient_records = []
953
        if paginate_patient_records:
954
            position = 1
955
            for patient_record in paginate_patient_records:
956
                while patient_record.id != all_patient_records[position - 1].id:
957
                    position += 1
958
                patient_records.append(
959
                        {
960
                            'object': patient_record,
961
                            'position': position,
962
                            }
963
                        )
964
        return patient_records
965
966
    def get_queryset(self):
967
        form = forms.QuotationsForm(data=self.request.GET or None)
968
        qs = super(PatientRecordsWaitingQueueView, self).get_queryset()
969
        first_name = self.request.GET.get('first_name')
970
        last_name = self.request.GET.get('last_name')
971
        paper_id = self.request.GET.get('paper_id')
972
        id = self.request.GET.get('id')
973
        social_security_id = self.request.GET.get('social_security_id')
974
        qs = qs.filter(service=self.service,
975
            last_state__status__type='ACCUEIL')
976
        if last_name:
977
            qs = qs.filter(last_name__istartswith=last_name)
978
        if first_name:
979
            qs = qs.filter(first_name__istartswith=first_name)
980
        if paper_id:
981
            qs = qs.filter(paper_id__startswith=paper_id)
982
        if id:
983
            qs = qs.filter(id__startswith=id)
984
        if social_security_id:
985
            qs = qs.filter(models.Q(
986
                social_security_id__startswith=social_security_id)
987
                | models.Q(
988
                contacts__social_security_id__startswith=social_security_id))
989
        qs = qs.order_by('last_state__date_selected', 'created')
990
        return qs
991
992
    def get_context_data(self, **kwargs):
993
        ctx = super(PatientRecordsWaitingQueueView, self).get_context_data(**kwargs)
994
        ctx['search_form'] = forms.QuotationsForm(data=self.request.GET or None,
995
                service=self.service)
996
        patient_records = []
997
        page = self.request.GET.get('page')
998
        paginator = Paginator(ctx['object_list'].filter(), 50)
999
        try:
1000
            paginate_patient_records = paginator.page(page)
1001
        except PageNotAnInteger:
1002
            paginate_patient_records = paginator.page(1)
1003
        except EmptyPage:
1004
            paginate_patient_records = paginator.page(paginator.num_pages)
1005
1006
        all_patient_records = PatientRecord.objects.filter(
1007
                service=self.service,
1008
                last_state__status__type='ACCUEIL').order_by(
1009
                'last_state__date_selected', 'created')
1010
        ctx['patient_records'] = self._get_search_result(
1011
            paginate_patient_records, all_patient_records)
1012
        ctx['paginate_patient_records'] = paginate_patient_records
1013
        ctx['len_patient_records'] = all_patient_records.count()
1014
1015
        query = self.request.GET.copy()
1016
        if 'page' in query:
1017
            del query['page']
1018
        ctx['query'] = query.urlencode()
1019
1020
        return ctx
1021
1022
patientrecord_waiting_queue = PatientRecordsWaitingQueueView.as_view()
1023 7bc87b6f Frédéric Péters
1024
class CreateDirectoryView(View, cbv.ServiceViewMixin):
1025
    def post(self, request, *args, **kwargs):
1026
        patient = PatientRecord.objects.get(id=kwargs['patientrecord_id'])
1027
        service = Service.objects.get(slug=kwargs['service'])
1028
        patient.get_ondisk_directory(service.name)
1029
        messages.add_message(self.request, messages.INFO, u'Répertoire patient créé.')
1030
        return HttpResponseRedirect('view')
1031
1032
create_directory = CreateDirectoryView.as_view()
1033 cda02476 Mikaël Ates
1034
class GenerateTransportPrescriptionFormView(cbv.FormView):
1035
    template_name = 'dossiers/generate_transport_prescription_form.html'
1036
    form_class = Form
1037
    success_url = './view#tab=1'
1038
1039
    def get_context_data(self, **kwargs):
1040
        ctx = super(GenerateTransportPrescriptionFormView, self).get_context_data(**kwargs)
1041 07b0577e Mikaël Ates
        ctx['lieu'] = 'Saint-Etienne'
1042
        ctx['date'] = formats.date_format(datetime.today(), "SHORT_DATE_FORMAT")
1043
        ctx['id_etab'] = '''%s SAINT ETIENNE
1044
66/68, RUE MARENGO
1045
42000 SAINT ETIENNE''' % ctx['service'].upper()
1046
        try:
1047
            patient = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
1048
            ctx['object'] = patient
1049
            last_log = TransportPrescriptionLog.objects.filter(patient=patient).latest('created')
1050
            if last_log:
1051
                ctx['choices'] = last_log.get_choices()
1052
                if 'lieu' in ctx['choices'] and ctx['choices']['lieu']:
1053
                    ctx['lieu'] = ctx['choices']['lieu']
1054
                if 'date' in ctx['choices'] and ctx['choices']['date']:
1055
                    ctx['date'] = ctx['choices']['date']
1056
                if 'id_etab' in ctx['choices'] and ctx['choices']['id_etab']:
1057
                    ctx['id_etab'] = ctx['choices']['id_etab']
1058
        except:
1059
            pass
1060 cda02476 Mikaël Ates
        return ctx
1061
1062
    def form_valid(self, form):
1063
        patient = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
1064
        address = PatientAddress.objects.get(id=form.data['address_id'])
1065 07b0577e Mikaël Ates
        path = render_transport(patient, address, form.data)
1066 cda02476 Mikaël Ates
        content = File(file(path))
1067 07b0577e Mikaël Ates
        log = TransportPrescriptionLog(patient=patient)
1068
        log.set_choices(form.data)
1069
        log.save()
1070 cda02476 Mikaël Ates
        response = HttpResponse(content,'application/pdf')
1071
        response['Content-Length'] = content.size
1072 b9039913 Mikaël Ates
        dest_filename = "%s--prescription-transport-%s-%s.pdf" \
1073 71d239fc Mikaël Ates
            % (datetime.now().strftime('%Y-%m-%d--%H:%M:%S'),
1074 b9039913 Mikaël Ates
            patient.last_name.upper().encode('utf-8'),
1075
            patient.first_name.encode('utf-8'))
1076
        response['Content-Disposition'] = \
1077
            'attachment; filename="%s"' % dest_filename
1078 cda02476 Mikaël Ates
        return response
1079
1080
prescription_transport = GenerateTransportPrescriptionFormView.as_view()