Project

General

Profile

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

calebasse / calebasse / dossiers / views.py @ 02f39251

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

    
3
import os
4

    
5
from datetime import datetime
6

    
7
from django.conf import settings
8
from django.core.urlresolvers import reverse_lazy
9
from django.db import models
10
from django.http import HttpResponseRedirect, HttpResponse
11
from django.views.generic import View
12
from django.views.generic.edit import DeleteView, FormMixin
13
from django.contrib import messages
14
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
15

    
16
from calebasse import cbv
17
from calebasse.doc_templates import make_doc_from_template
18
from calebasse.dossiers import forms
19
from calebasse.agenda.models import Event, EventWithAct
20
from calebasse.actes.models import Act
21
from calebasse.agenda.appointments import Appointment
22
from calebasse.dossiers.models import (PatientRecord, PatientContact,
23
        PatientAddress, Status, FileState, create_patient, CmppHealthCareTreatment,
24
        CmppHealthCareDiagnostic, SessadHealthCareNotification, HealthCare)
25
from calebasse.dossiers.states import STATES_MAPPING, STATE_CHOICES_TYPE, STATES_BTN_MAPPER
26
from calebasse.ressources.models import (Service,
27
    SocialisationDuration, MDPHRequest, MDPHResponse)
28

    
29

    
30
def get_next_rdv(patient_record):
31
    next_rdv = {}
32
    event = Event.objects.next_appointment(patient_record)
33
    if event:
34
        next_rdv['start_datetime'] = event.start_datetime
35
        next_rdv['participants'] = event.participants.all()
36
        next_rdv['act_type'] = event.eventwithact.act_type
37
    return next_rdv
38

    
39
def get_last_rdv(patient_record):
40
    last_rdv = {}
41
    event = Event.objects.last_appointment(patient_record)
42
    if event:
43
        last_rdv['start_datetime'] = event.start_datetime
44
        last_rdv['participants'] = event.participants.all()
45
        last_rdv['act_type'] = event.eventwithact.act_type
46
    return last_rdv
47

    
48
class NewPatientRecordView(cbv.FormView, cbv.ServiceViewMixin):
49
    form_class = forms.NewPatientRecordForm
50
    template_name = 'dossiers/patientrecord_new.html'
51
    success_url = '..'
52
    patient = None
53

    
54
    def post(self, request, *args, **kwarg):
55
        self.user = request.user
56
        return super(NewPatientRecordView, self).post(request, *args, **kwarg)
57

    
58
    def form_valid(self, form):
59
        self.patient = create_patient(form.data['first_name'], form.data['last_name'], self.service,
60
                self.user, date_selected=datetime.strptime(form.data['date_selected'], "%d/%m/%Y"))
61
        return super(NewPatientRecordView, self).form_valid(form)
62

    
63
    def get_success_url(self):
64
        return '%s/view' % self.patient.id
65

    
66
new_patient_record = NewPatientRecordView.as_view()
67

    
68
def dynamic_patient_contact_form(patientrecord_id):
69
    patient = PatientRecord.objects.get(id=patientrecord_id)
70
    class DynamicPatientContactForm(forms.PatientContactForm):
71
        def __init__(self, *args, **kwargs):
72
            super(DynamicPatientContactForm, self).__init__(*args, **kwargs)
73
            self.fields['addresses'].queryset = patient.addresses
74
    return DynamicPatientContactForm
75

    
76
class NewPatientContactView(cbv.CreateView):
77
    model = PatientContact
78
    template_name = 'dossiers/patientcontact_new.html'
79
    success_url = '../view#tab=2'
80

    
81
    def get(self, request, *args, **kwargs):
82
        request.session['patientrecord_id'] = kwargs['patientrecord_id']
83
        self.form_class = dynamic_patient_contact_form(kwargs['patientrecord_id'])
84
        return super(NewPatientContactView, self).get(request, *args, **kwargs)
85

    
86
new_patient_contact = NewPatientContactView.as_view()
87

    
88
class UpdatePatientContactView(cbv.UpdateView):
89
    model = PatientContact
90
    template_name = 'dossiers/patientcontact_new.html'
91
    success_url = '../../view#tab=2'
92

    
93
    def get(self, request, *args, **kwargs):
94
        request.session['patientrecord_id'] = kwargs['patientrecord_id']
95
        self.form_class = dynamic_patient_contact_form(kwargs['patientrecord_id'])
96
        return super(UpdatePatientContactView, self).get(request, *args, **kwargs)
97

    
98
update_patient_contact = UpdatePatientContactView.as_view()
99

    
100
class DeletePatientContactView(cbv.DeleteView):
101
    model = PatientContact
102
    form_class = forms.PatientContactForm
103
    template_name = 'dossiers/patientcontact_confirm_delete.html'
104
    success_url = '../../view#tab=2'
105

    
106
    def post(self, request, *args, **kwargs):
107
        try:
108
            patient = PatientRecord.objects.get(id=kwargs.get('pk'))
109
        except PatientRecord.DoesNotExist:
110
            return super(DeletePatientContactView, self).post(request, *args, **kwargs)
111
        # the contact is also a patient record; it shouldn't be deleted; just
112
        # altered to remove an address
113
        patient.addresses.remove(self.request.GET['address'])
114
        return HttpResponseRedirect(self.get_success_url())
115

    
116
delete_patient_contact = DeletePatientContactView.as_view()
117

    
118
class NewPatientAddressView(cbv.CreateView):
119
    model = PatientAddress
120
    form_class = forms.PatientAddressForm
121
    template_name = 'dossiers/patientaddress_new.html'
122
    success_url = '../view#tab=2'
123

    
124
    def get_success_url(self):
125
        return self.success_url
126

    
127
    def form_valid(self, form):
128
        patientaddress = form.save()
129
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
130
        patientrecord.addresses.add(patientaddress)
131
        return HttpResponseRedirect(self.get_success_url())
132

    
133
new_patient_address = NewPatientAddressView.as_view()
134

    
135
class UpdatePatientAddressView(cbv.UpdateView):
136
    model = PatientAddress
137
    form_class = forms.PatientAddressForm
138
    template_name = 'dossiers/patientaddress_new.html'
139
    success_url = '../../view#tab=2'
140

    
141
update_patient_address = UpdatePatientAddressView.as_view()
142

    
143
class DeletePatientAddressView(cbv.DeleteView):
144
    model = PatientAddress
145
    form_class = forms.PatientAddressForm
146
    template_name = 'dossiers/patientaddress_confirm_delete.html'
147
    success_url = '../../view#tab=2'
148

    
149
delete_patient_address = DeletePatientAddressView.as_view()
150

    
151

    
152
class NewHealthCareView(cbv.CreateView):
153

    
154
    def get_initial(self):
155
        initial = super(NewHealthCareView, self).get_initial()
156
        initial['author'] = self.request.user.id
157
        initial['patient'] = self.kwargs['patientrecord_id']
158
        return initial
159

    
160
new_healthcare_treatment = \
161
    NewHealthCareView.as_view(model=CmppHealthCareTreatment,
162
        template_name = 'dossiers/generic_form.html',
163
        success_url = '../view#tab=3',
164
        form_class=forms.CmppHealthCareTreatmentForm)
165
new_healthcare_diagnostic = \
166
    NewHealthCareView.as_view(model=CmppHealthCareDiagnostic,
167
        template_name = 'dossiers/generic_form.html',
168
        success_url = '../view#tab=3',
169
        form_class=forms.CmppHealthCareDiagnosticForm)
170
new_healthcare_notification = \
171
    NewHealthCareView.as_view(model=SessadHealthCareNotification,
172
        template_name = 'dossiers/generic_form.html',
173
        success_url = '../view#tab=3',
174
        form_class=forms.SessadHealthCareNotificationForm)
175
update_healthcare_treatment = \
176
    cbv.UpdateView.as_view(model=CmppHealthCareTreatment,
177
        template_name = 'dossiers/generic_form.html',
178
        success_url = '../../view#tab=3',
179
        form_class=forms.CmppHealthCareTreatmentForm)
180
update_healthcare_diagnostic = \
181
    cbv.UpdateView.as_view(model=CmppHealthCareDiagnostic,
182
        template_name = 'dossiers/generic_form.html',
183
        success_url = '../../view#tab=3',
184
        form_class=forms.CmppHealthCareDiagnosticForm)
185
update_healthcare_notification = \
186
    cbv.UpdateView.as_view(model=SessadHealthCareNotification,
187
        template_name = 'dossiers/generic_form.html',
188
        success_url = '../../view#tab=3',
189
        form_class=forms.SessadHealthCareNotificationForm)
190
delete_healthcare_treatment = \
191
    cbv.DeleteView.as_view(model=CmppHealthCareTreatment,
192
        template_name = 'dossiers/generic_confirm_delete.html',
193
        success_url = '../../view#tab=3')
194
delete_healthcare_diagnostic = \
195
    cbv.DeleteView.as_view(model=CmppHealthCareDiagnostic,
196
        template_name = 'dossiers/generic_confirm_delete.html',
197
        success_url = '../../view#tab=3')
198
delete_healthcare_notification = \
199
    cbv.DeleteView.as_view(model=SessadHealthCareNotification,
200
        template_name = 'dossiers/generic_confirm_delete.html',
201
        success_url = '../../view#tab=3')
202

    
203

    
204
class StateFormView(cbv.FormView):
205
    template_name = 'dossiers/state.html'
206
    form_class = forms.StateForm
207
    success_url = './view#tab=0'
208

    
209
    def post(self, request, *args, **kwarg):
210
        self.user = request.user
211
        return super(StateFormView, self).post(request, *args, **kwarg)
212

    
213
    def form_valid(self, form):
214
        service = Service.objects.get(id=form.data['service_id'])
215
        status = Status.objects.filter(services=service).filter(type=form.data['state_type'])
216
        patient = PatientRecord.objects.get(id=form.data['patient_id'])
217
        date_selected = datetime.strptime(form.data['date'], "%d/%m/%Y")
218
        patient.set_state(status[0], self.user, date_selected, form.data['comment'])
219
        return super(StateFormView, self).form_valid(form)
220

    
221
state_form = StateFormView.as_view()
222

    
223

    
224
class PatientRecordView(cbv.ServiceViewMixin, cbv.MultiUpdateView):
225
    model = PatientRecord
226
    forms_classes = {
227
            'general': forms.GeneralForm,
228
            'id': forms.CivilStatusForm,
229
            'physiology': forms.PhysiologyForm,
230
            'inscription': forms.InscriptionForm,
231
            'out': forms.OutForm,
232
            'family': forms.FamilyForm,
233
            'transport': forms.TransportFrom,
234
            'followup': forms.FollowUpForm,
235
            'policyholder': forms.PolicyHolderForm
236
            }
237
    template_name = 'dossiers/patientrecord_update.html'
238
    success_url = './view'
239

    
240
    def get_success_url(self):
241
        if self.request.POST.has_key('tab'):
242
            return self.success_url + '#tab=' + self.request.POST['tab']
243
        else:
244
            return self.success_url
245

    
246
    def get_context_data(self, **kwargs):
247
        ctx = super(PatientRecordView, self).get_context_data(**kwargs)
248
        ctx['next_rdv'] = get_next_rdv(ctx['object'])
249
        ctx['last_rdv'] = get_last_rdv(ctx['object'])
250
        ctx['initial_state'] = ctx['object'].get_initial_state()
251
        current_state = ctx['object'].get_current_state()
252
        if STATES_MAPPING.has_key(current_state.status.type):
253
            state = STATES_MAPPING[current_state.status.type]
254
        else:
255
            state = current_state.status.name
256
        ctx['current_state'] = current_state
257
        ctx['service_id'] = self.service.id
258
        ctx['states'] = FileState.objects.filter(patient=self.object).filter(status__services=self.service)
259
        ctx['next_rdvs'] = []
260
        for act in Act.objects.next_acts(ctx['object']).select_related():
261
            state = act.get_state()
262
            if not state.previous_state:
263
                state = None
264
            ctx['next_rdvs'].append((act, state))
265
        ctx['last_rdvs'] = []
266
        for act in Act.objects.last_acts(ctx['object']):
267
            state = act.get_state()
268
            if not state.previous_state:
269
                state = None
270
            ctx['last_rdvs'].append((act, state))
271
        ctx['status'] = []
272
        if ctx['object'].service.name == "CMPP":
273
            if ctx['object'].last_state.status.type == "ACCUEIL":
274
                # Inscription automatique au premier acte facturable valide
275
                ctx['status'] = [STATES_BTN_MAPPER['FIN_ACCUEIL'],
276
                        STATES_BTN_MAPPER['DIAGNOSTIC'],
277
                        STATES_BTN_MAPPER['TRAITEMENT']]
278
            elif ctx['object'].last_state.status.type == "FIN_ACCUEIL":
279
                # Passage automatique en diagnostic ou traitement
280
                ctx['status'] = [STATES_BTN_MAPPER['ACCUEIL'],
281
                        STATES_BTN_MAPPER['DIAGNOSTIC'],
282
                        STATES_BTN_MAPPER['TRAITEMENT']]
283
            elif ctx['object'].last_state.status.type == "DIAGNOSTIC":
284
                # Passage automatique en traitement
285
                ctx['status'] = [STATES_BTN_MAPPER['TRAITEMENT'],
286
                        STATES_BTN_MAPPER['CLOS'],
287
                        STATES_BTN_MAPPER['ACCUEIL']]
288
            elif ctx['object'].last_state.status.type == "TRAITEMENT":
289
                # Passage automatique en diagnostic si on ajoute une prise en charge diagnostic,
290
                # ce qui est faisable dans l'onglet prise en charge par un bouton visible sous conditions
291
                ctx['status'] = [STATES_BTN_MAPPER['DIAGNOSTIC'],
292
                        STATES_BTN_MAPPER['CLOS'],
293
                        STATES_BTN_MAPPER['ACCUEIL']]
294
            elif ctx['object'].last_state.status.type == "CLOS":
295
                # Passage automatique en diagnostic ou traitement
296
                ctx['status'] = [STATES_BTN_MAPPER['DIAGNOSTIC'],
297
                        STATES_BTN_MAPPER['TRAITEMENT'],
298
                        STATES_BTN_MAPPER['ACCUEIL']]
299
        elif ctx['object'].service.name == "CAMSP":
300
            if ctx['object'].last_state.status.type == "ACCUEIL":
301
                ctx['status'] = [STATES_BTN_MAPPER['FIN_ACCUEIL'],
302
                        STATES_BTN_MAPPER['BILAN']]
303
            elif ctx['object'].last_state.status.type == "FIN_ACCUEIL":
304
                ctx['status'] = [STATES_BTN_MAPPER['ACCUEIL'],
305
                        STATES_BTN_MAPPER['BILAN'],
306
                        STATES_BTN_MAPPER['SURVEILLANCE'],
307
                        STATES_BTN_MAPPER['SUIVI'],
308
                        STATES_BTN_MAPPER['CLOS']]
309
            elif ctx['object'].last_state.status.type == "BILAN":
310
                ctx['status'] = [STATES_BTN_MAPPER['SURVEILLANCE'],
311
                        STATES_BTN_MAPPER['SUIVI'],
312
                        STATES_BTN_MAPPER['CLOS'],
313
                        STATES_BTN_MAPPER['ACCUEIL']]
314
            elif ctx['object'].last_state.status.type == "SURVEILLANCE":
315
                ctx['status'] = [STATES_BTN_MAPPER['SUIVI'],
316
                        STATES_BTN_MAPPER['CLOS'],
317
                        STATES_BTN_MAPPER['ACCUEIL'],
318
                        STATES_BTN_MAPPER['BILAN']]
319
            elif ctx['object'].last_state.status.type == "SUIVI":
320
                ctx['status'] = [STATES_BTN_MAPPER['CLOS'],
321
                        STATES_BTN_MAPPER['ACCUEIL'],
322
                        STATES_BTN_MAPPER['BILAN'],
323
                        STATES_BTN_MAPPER['SURVEILLANCE']]
324
            elif ctx['object'].last_state.status.type == "CLOS":
325
                ctx['status'] = [STATES_BTN_MAPPER['ACCUEIL'],
326
                        STATES_BTN_MAPPER['BILAN'],
327
                        STATES_BTN_MAPPER['SURVEILLANCE'],
328
                        STATES_BTN_MAPPER['SUIVI']]
329
        elif ctx['object'].service.name == "SESSAD TED" or ctx['object'].service.name == "SESSAD DYS":
330
            if ctx['object'].last_state.status.type == "ACCUEIL":
331
                ctx['status'] = [STATES_BTN_MAPPER['FIN_ACCUEIL'],
332
                        STATES_BTN_MAPPER['TRAITEMENT']]
333
            elif ctx['object'].last_state.status.type == "FIN_ACCUEIL":
334
                ctx['status'] = [STATES_BTN_MAPPER['ACCUEIL'],
335
                        STATES_BTN_MAPPER['TRAITEMENT'],
336
                        STATES_BTN_MAPPER['CLOS']]
337
            elif ctx['object'].last_state.status.type == "TRAITEMENT":
338
                ctx['status'] = [STATES_BTN_MAPPER['CLOS'],
339
                        STATES_BTN_MAPPER['ACCUEIL']]
340
            elif ctx['object'].last_state.status.type == "CLOS":
341
                ctx['status'] = [STATES_BTN_MAPPER['ACCUEIL'],
342
                        STATES_BTN_MAPPER['TRAITEMENT']]
343
        ctx['can_rediag'] = self.object.create_diag_healthcare(self.request.user)
344
        ctx['hcs'] = HealthCare.objects.filter(patient=self.object).order_by('-start_date')
345
        return ctx
346

    
347
    def form_valid(self, form):
348
        messages.add_message(self.request, messages.INFO, u'Modification enregistrée avec succès.')
349
        return super(PatientRecordView, self).form_valid(form)
350

    
351

    
352
patient_record = PatientRecordView.as_view()
353

    
354
class PatientRecordsHomepageView(cbv.ListView):
355
    model = PatientRecord
356
    template_name = 'dossiers/index.html'
357

    
358
    def get_queryset(self):
359
        first_name = self.request.GET.get('first_name')
360
        last_name = self.request.GET.get('last_name')
361
        paper_id = self.request.GET.get('paper_id')
362
        id = self.request.GET.get('id')
363
        social_security_id = self.request.GET.get('social_security_id')
364
        if not (first_name or last_name or paper_id or id or social_security_id):
365
            return None
366
        if (first_name and len(first_name) < 2) or (last_name and len(last_name) < 2):
367
            return None
368
        qs = super(PatientRecordsHomepageView, self).get_queryset()
369
        states = self.request.GET.getlist('states')
370
        if last_name:
371
            qs = qs.filter(last_name__icontains=last_name)
372
        if first_name:
373
            qs = qs.filter(first_name__icontains=first_name)
374
        if paper_id:
375
            qs = qs.filter(paper_id__startswith=paper_id)
376
        if id:
377
            qs = qs.filter(id__startswith=id)
378
        if social_security_id:
379
            qs = qs.filter(models.Q(social_security_id__startswith=social_security_id) | \
380
                models.Q(contacts__social_security_id__startswith=social_security_id))
381
        if states:
382
            status_types = ['BILAN', 'SURVEILLANCE', 'SUIVI']
383
            for state in states:
384
                status_types.append(STATE_CHOICES_TYPE[state])
385
            qs = qs.filter(last_state__status__type__in=status_types)
386
        else:
387
            qs = qs.filter(last_state__status__type__in="")
388
        qs = qs.filter(service=self.service).order_by('last_name')
389
        return qs
390

    
391
    def get_context_data(self, **kwargs):
392
        ctx = super(PatientRecordsHomepageView, self).get_context_data(**kwargs)
393
        ctx['search_form'] = forms.SearchForm(data=self.request.GET or None)
394
        patient_records = []
395
        ctx['stats'] = {"dossiers": 0,
396
                "En_contact": 0,
397
                "Fin_daccueil": 0,
398
                "Diagnostic": 0,
399
                "Traitement": 0,
400
                "Clos": 0}
401
        if self.request.GET:
402
            if ctx['object_list']:
403
                for patient_record in ctx['object_list'].filter():
404
                    ctx['stats']['dossiers'] += 1
405
                    next_rdv = get_next_rdv(patient_record)
406
                    last_rdv = get_last_rdv(patient_record)
407
                    current_state = patient_record.get_current_state()
408
                    if STATES_MAPPING.has_key(current_state.status.type):
409
                        state = STATES_MAPPING[current_state.status.type]
410
                    else:
411
                        state = current_state.status.name
412
                    state_class = current_state.status.type.lower()
413
                    patient_records.append(
414
                            {
415
                                'object': patient_record,
416
                                'next_rdv': next_rdv,
417
                                'last_rdv': last_rdv,
418
                                'state': state,
419
                                'state_class': state_class
420
                                }
421
                            )
422
                    state = state.replace(' ', '_')
423
                    state = state.replace("'", '')
424
                    if not ctx['stats'].has_key(state):
425
                        ctx['stats'][state] = 0
426
                    ctx['stats'][state] += 1
427

    
428
        page = self.request.GET.get('page')
429
        paginator = Paginator(patient_records, 50)
430
        try:
431
            patient_records = paginator.page(page)
432
        except PageNotAnInteger:
433
            patient_records = paginator.page(1)
434
        except EmptyPage:
435
            patient_records = paginator.page(paginator.num_pages)
436

    
437
        query = self.request.GET.copy()
438
        if 'page' in query:
439
            del query['page']
440
        ctx['query'] = query.urlencode()
441

    
442
        ctx['patient_records'] = patient_records
443
        return ctx
444

    
445
patientrecord_home = PatientRecordsHomepageView.as_view()
446

    
447
class PatientRecordDeleteView(DeleteView):
448
    model = PatientRecord
449
    success_url = ".."
450
    template_name = 'dossiers/patientrecord_confirm_delete.html'
451

    
452
patientrecord_delete = PatientRecordDeleteView.as_view()
453

    
454

    
455
class PatientRecordPaperIDUpdateView(cbv.UpdateView):
456
    model = PatientRecord
457
    form_class = forms.PaperIDForm
458
    template_name = 'dossiers/generic_form.html'
459
    success_url = '../..'
460

    
461
update_paper_id = PatientRecordPaperIDUpdateView.as_view()
462

    
463

    
464
class NewSocialisationDurationView(cbv.CreateView):
465
    model = SocialisationDuration
466
    form_class = forms.SocialisationDurationForm
467
    template_name = 'dossiers/generic_form.html'
468
    success_url = '../view#tab=6'
469

    
470
    def get_success_url(self):
471
        return self.success_url
472

    
473
    def get(self, request, *args, **kwargs):
474
        if kwargs.has_key('patientrecord_id'):
475
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
476
        return super(NewSocialisationDurationView, self).get(request, *args, **kwargs)
477

    
478
    def form_valid(self, form):
479
        duration = form.save()
480
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
481
        patientrecord.socialisation_durations.add(duration)
482
        return HttpResponseRedirect(self.get_success_url())
483

    
484
new_socialisation_duration = NewSocialisationDurationView.as_view()
485

    
486
class UpdateSocialisationDurationView(cbv.UpdateView):
487
    model = SocialisationDuration
488
    form_class = forms.SocialisationDurationForm
489
    template_name = 'dossiers/generic_form.html'
490
    success_url = '../../view#tab=6'
491

    
492
    def get(self, request, *args, **kwargs):
493
        if kwargs.has_key('patientrecord_id'):
494
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
495
        return super(UpdateSocialisationDurationView, self).get(request, *args, **kwargs)
496

    
497
update_socialisation_duration = UpdateSocialisationDurationView.as_view()
498

    
499
class DeleteSocialisationDurationView(cbv.DeleteView):
500
    model = SocialisationDuration
501
    form_class = forms.SocialisationDurationForm
502
    template_name = 'dossiers/socialisationduration_confirm_delete.html'
503
    success_url = '../../view#tab=6'
504

    
505
delete_socialisation_duration = DeleteSocialisationDurationView.as_view()
506

    
507

    
508
class NewMDPHRequestView(cbv.CreateView):
509
    def get(self, request, *args, **kwargs):
510
        if kwargs.has_key('patientrecord_id'):
511
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
512
        return super(NewMDPHRequestView, self).get(request, *args, **kwargs)
513

    
514
    def form_valid(self, form):
515
        request = form.save()
516
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
517
        patientrecord.mdph_requests.add(request)
518
        return HttpResponseRedirect(self.success_url)
519

    
520
class UpdateMDPHRequestView(cbv.UpdateView):
521
    def get(self, request, *args, **kwargs):
522
        if kwargs.has_key('patientrecord_id'):
523
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
524
        return super(UpdateMDPHRequestView, self).get(request, *args, **kwargs)
525

    
526

    
527
new_mdph_request = \
528
    NewMDPHRequestView.as_view(model=MDPHRequest,
529
        template_name = 'dossiers/generic_form.html',
530
        success_url = '../view#tab=6',
531
        form_class=forms.MDPHRequestForm)
532
update_mdph_request = \
533
    UpdateMDPHRequestView.as_view(model=MDPHRequest,
534
        template_name = 'dossiers/generic_form.html',
535
        success_url = '../../view#tab=6',
536
        form_class=forms.MDPHRequestForm)
537
delete_mdph_request = \
538
    cbv.DeleteView.as_view(model=MDPHRequest,
539
        template_name = 'dossiers/generic_confirm_delete.html',
540
        success_url = '../../view#tab=6')
541

    
542
class NewMDPHResponseView(cbv.CreateView):
543
    def get(self, request, *args, **kwargs):
544
        if kwargs.has_key('patientrecord_id'):
545
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
546
        return super(NewMDPHResponseView, self).get(request, *args, **kwargs)
547

    
548
    def form_valid(self, form):
549
        response = form.save()
550
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
551
        patientrecord.mdph_responses.add(response)
552
        return HttpResponseRedirect(self.success_url)
553

    
554
class UpdateMDPHResponseView(cbv.UpdateView):
555
    def get(self, request, *args, **kwargs):
556
        if kwargs.has_key('patientrecord_id'):
557
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
558
        return super(UpdateMDPHResponseView, self).get(request, *args, **kwargs)
559

    
560

    
561
new_mdph_response = \
562
    NewMDPHResponseView.as_view(model=MDPHResponse,
563
        template_name = 'dossiers/generic_form.html',
564
        success_url = '../view#tab=6',
565
        form_class=forms.MDPHResponseForm)
566
update_mdph_response = \
567
    UpdateMDPHResponseView.as_view(model=MDPHResponse,
568
        template_name = 'dossiers/generic_form.html',
569
        success_url = '../../view#tab=6',
570
        form_class=forms.MDPHResponseForm)
571
delete_mdph_response = \
572
    cbv.DeleteView.as_view(model=MDPHResponse,
573
        template_name = 'dossiers/generic_confirm_delete.html',
574
        success_url = '../../view#tab=6')
575

    
576

    
577
class UpdatePatientStateView(cbv.UpdateView):
578
    def get(self, request, *args, **kwargs):
579
        if kwargs.has_key('patientrecord_id'):
580
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
581
        return super(UpdatePatientStateView, self).get(request, *args, **kwargs)
582

    
583
update_patient_state = \
584
    UpdatePatientStateView.as_view(model=FileState,
585
        template_name = 'dossiers/generic_form.html',
586
        success_url = '../../view#tab=0',
587
        form_class=forms.PatientStateForm)
588
delete_patient_state = \
589
    cbv.DeleteView.as_view(model=FileState,
590
        template_name = 'dossiers/generic_confirm_delete.html',
591
        success_url = '../../view#tab=0')
592

    
593

    
594
class GenerateRtfFormView(cbv.FormView):
595
    template_name = 'dossiers/generate_rtf_form.html'
596
    form_class = forms.GenerateRtfForm
597
    success_url = './view#tab=0'
598

    
599
    def get_context_data(self, **kwargs):
600
        ctx = super(GenerateRtfFormView, self).get_context_data(**kwargs)
601
        ctx['object'] = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
602
        ctx['service_id'] = self.service.id
603
        if self.request.GET.get('event-id'):
604
            date = self.request.GET.get('date')
605
            date = datetime.strptime(date, '%Y-%m-%d').date()
606
            appointment = Appointment()
607
            event = EventWithAct.objects.get(id=self.request.GET.get('event-id'))
608
            event = event.today_occurrence(date)
609
            appointment.init_from_event(event, self.service)
610
            ctx['appointment'] = appointment
611
        return ctx
612

    
613
    def form_valid(self, form):
614
        patient = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
615
        template_filename = form.cleaned_data.get('template_filename')
616
        dest_filename = datetime.now().strftime('%Y-%m-%d--%H:%M') + '--' + template_filename
617
        from_path = os.path.join(settings.RTF_TEMPLATES_DIRECTORY, template_filename)
618
        to_path = os.path.join(patient.get_ondisk_directory(self.service.name), dest_filename)
619
        vars = {'AD11': '', 'AD12': '', 'AD13': '', 'AD14': '', 'AD15': '',
620
                'JOU1': datetime.today().strftime('%d/%m/%Y'),
621
                'VIL1': u'Saint-Étienne',
622
                'PRE1': form.cleaned_data.get('first_name'),
623
                'NOM1': form.cleaned_data.get('last_name'),
624
                'DPA1': form.cleaned_data.get('appointment_intervenants')
625
               }
626
        for i, line in enumerate(form.cleaned_data.get('address').splitlines()):
627
            vars['AD%d' % (11+i)] = line
628
        make_doc_from_template(from_path, to_path, vars)
629

    
630
        client_dir = patient.get_client_side_directory(self.service.name)
631
        if not client_dir:
632
            response = HttpResponse(mimetype='text/rtf')
633
            response['Content-Disposition'] = 'attachment; filename="%s"' % dest_filename
634
            response.write(file(to_path).read())
635
            return response
636
        else:
637
            class LocalFileHttpResponseRedirect(HttpResponseRedirect):
638
                allowed_schemes = ['file']
639
            client_filepath = os.path.join(client_dir, dest_filename)
640
            return LocalFileHttpResponseRedirect('file://' + client_filepath)
641

    
642
generate_rtf_form = GenerateRtfFormView.as_view()
643

    
644

    
645
class PatientRecordsQuotationsView(cbv.ListView):
646
    model = PatientRecord
647
    template_name = 'dossiers/quotations.html'
648

    
649
    def get_queryset(self):
650
        form = forms.QuotationsForm(data=self.request.GET or None)
651
        qs = super(PatientRecordsQuotationsView, self).get_queryset()
652
        without_quotations = self.request.GET.get('without_quotations')
653
        if without_quotations:
654
            qs = qs.filter(mises_1=None).filter(mises_2=None).filter(mises_3=None)
655
        states = self.request.GET.getlist('states')
656
        if states:
657
            status_types = ['BILAN', 'SURVEILLANCE', 'SUIVI']
658
            for state in states:
659
                status_types.append(STATE_CHOICES_TYPE[state])
660
            qs = qs.filter(last_state__status__type__in=status_types)
661
        else:
662
            qs = qs.filter(last_state__status__type__in='')
663

    
664
        try:
665
            date_actes_start = datetime.strptime(form.data['date_actes_start'], "%d/%m/%Y")
666
            qs = qs.filter(act_set__date__gte=date_actes_start.date())
667
        except (ValueError, KeyError):
668
            pass
669
        try:
670
            date_actes_end = datetime.strptime(form.data['date_actes_end'], "%d/%m/%Y")
671
            qs = qs.filter(act_set__date__lte=date_actes_end.date())
672
        except (ValueError, KeyError):
673
            pass
674
        qs = qs.filter(service=self.service).order_by('last_name')
675
        return qs
676

    
677
    def get_context_data(self, **kwargs):
678
        ctx = super(PatientRecordsQuotationsView, self).get_context_data(**kwargs)
679
        ctx['search_form'] = forms.QuotationsForm(data=self.request.GET or None)
680
        patient_records = []
681
        if self.request.GET:
682
            for patient_record in ctx['object_list'].filter():
683
                next_rdv = get_next_rdv(patient_record)
684
                last_rdv = get_last_rdv(patient_record)
685
                current_state = patient_record.get_current_state()
686
                if STATES_MAPPING.has_key(current_state.status.type):
687
                    state = STATES_MAPPING[current_state.status.type]
688
                else:
689
                    state = current_state.status.name
690
                state_class = current_state.status.type.lower()
691
                patient_records.append(
692
                        {
693
                            'object': patient_record,
694
                            'state': state,
695
                            'state_class': state_class
696
                            }
697
                        )
698
                state = state.replace(' ', '_')
699
                state = state.replace("'", '')
700

    
701
        page = self.request.GET.get('page')
702
        paginator = Paginator(patient_records, 50)
703
        try:
704
            patient_records = paginator.page(page)
705
        except PageNotAnInteger:
706
            patient_records = paginator.page(1)
707
        except EmptyPage:
708
            patient_records = paginator.page(paginator.num_pages)
709

    
710
        ctx['patient_records'] = patient_records
711

    
712
        query = self.request.GET.copy()
713
        if 'page' in query:
714
            del query['page']
715
        ctx['query'] = query.urlencode()
716

    
717
        return ctx
718

    
719
patientrecord_quotations = PatientRecordsQuotationsView.as_view()
720

    
721

    
722
class CreateDirectoryView(View, cbv.ServiceViewMixin):
723
    def post(self, request, *args, **kwargs):
724
        patient = PatientRecord.objects.get(id=kwargs['patientrecord_id'])
725
        service = Service.objects.get(slug=kwargs['service'])
726
        patient.get_ondisk_directory(service.name)
727
        messages.add_message(self.request, messages.INFO, u'Répertoire patient créé.')
728
        return HttpResponseRedirect('view')
729

    
730
create_directory = CreateDirectoryView.as_view()
(9-9/9)