Project

General

Profile

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

calebasse / calebasse / dossiers / views.py @ 43a5b181

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
            'family': forms.FamilyForm,
232
            'transport': forms.TransportFrom,
233
            'followup': forms.FollowUpForm,
234
            'policyholder': forms.PolicyHolderForm
235
            }
236
    template_name = 'dossiers/patientrecord_update.html'
237
    success_url = './view'
238

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

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

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

    
350

    
351
patient_record = PatientRecordView.as_view()
352

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

    
357
    def get_queryset(self):
358
        qs = super(PatientRecordsHomepageView, self).get_queryset()
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
        states = self.request.GET.getlist('states')
364
        social_security_id = self.request.GET.get('social_security_id')
365
        if last_name:
366
            qs = qs.filter(last_name__icontains=last_name)
367
        if first_name:
368
            qs = qs.filter(first_name__icontains=first_name)
369
        if paper_id:
370
            qs = qs.filter(paper_id__contains=paper_id)
371
        if id:
372
            qs = qs.filter(id__contains=id)
373
        if social_security_id:
374
            qs = qs.filter(social_security_id__contains=social_security_id)
375
        if states:
376
            status_types = ['BILAN', 'SURVEILLANCE', 'SUIVI']
377
            for state in states:
378
                status_types.append(STATE_CHOICES_TYPE[state])
379
            qs = qs.filter(last_state__status__type__in=status_types)
380
        else:
381
            qs = qs.filter(last_state__status__type__in="")
382
        qs = qs.filter(service=self.service).order_by('last_name')
383
        return qs
384

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

    
421
        page = self.request.GET.get('page')
422
        paginator = Paginator(patient_records, 3)
423
        try:
424
            patient_records = paginator.page(page)
425
        except PageNotAnInteger:
426
            patient_records = paginator.page(1)
427
        except EmptyPage:
428
            patient_records = paginator.page(paginator.num_pages)
429

    
430
        query = self.request.GET.copy()
431
        if 'page' in query:
432
            del query['page']
433
        ctx['query'] = query.urlencode()
434

    
435
        ctx['patient_records'] = patient_records
436
        return ctx
437

    
438
patientrecord_home = PatientRecordsHomepageView.as_view()
439

    
440
class PatientRecordDeleteView(DeleteView):
441
    model = PatientRecord
442
    success_url = ".."
443
    template_name = 'dossiers/patientrecord_confirm_delete.html'
444

    
445
patientrecord_delete = PatientRecordDeleteView.as_view()
446

    
447

    
448
class PatientRecordPaperIDUpdateView(cbv.UpdateView):
449
    model = PatientRecord
450
    form_class = forms.PaperIDForm
451
    template_name = 'dossiers/generic_form.html'
452
    success_url = '../..'
453

    
454
update_paper_id = PatientRecordPaperIDUpdateView.as_view()
455

    
456

    
457
class NewSocialisationDurationView(cbv.CreateView):
458
    model = SocialisationDuration
459
    form_class = forms.SocialisationDurationForm
460
    template_name = 'dossiers/generic_form.html'
461
    success_url = '../view#tab=6'
462

    
463
    def get_success_url(self):
464
        return self.success_url
465

    
466
    def get(self, request, *args, **kwargs):
467
        if kwargs.has_key('patientrecord_id'):
468
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
469
        return super(NewSocialisationDurationView, self).get(request, *args, **kwargs)
470

    
471
    def form_valid(self, form):
472
        duration = form.save()
473
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
474
        patientrecord.socialisation_durations.add(duration)
475
        return HttpResponseRedirect(self.get_success_url())
476

    
477
new_socialisation_duration = NewSocialisationDurationView.as_view()
478

    
479
class UpdateSocialisationDurationView(cbv.UpdateView):
480
    model = SocialisationDuration
481
    form_class = forms.SocialisationDurationForm
482
    template_name = 'dossiers/generic_form.html'
483
    success_url = '../../view#tab=6'
484

    
485
    def get(self, request, *args, **kwargs):
486
        if kwargs.has_key('patientrecord_id'):
487
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
488
        return super(UpdateSocialisationDurationView, self).get(request, *args, **kwargs)
489

    
490
update_socialisation_duration = UpdateSocialisationDurationView.as_view()
491

    
492
class DeleteSocialisationDurationView(cbv.DeleteView):
493
    model = SocialisationDuration
494
    form_class = forms.SocialisationDurationForm
495
    template_name = 'dossiers/socialisationduration_confirm_delete.html'
496
    success_url = '../../view#tab=6'
497

    
498
delete_socialisation_duration = DeleteSocialisationDurationView.as_view()
499

    
500

    
501
class NewMDPHRequestView(cbv.CreateView):
502
    def get(self, request, *args, **kwargs):
503
        if kwargs.has_key('patientrecord_id'):
504
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
505
        return super(NewMDPHRequestView, self).get(request, *args, **kwargs)
506

    
507
    def form_valid(self, form):
508
        request = form.save()
509
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
510
        patientrecord.mdph_requests.add(request)
511
        return HttpResponseRedirect(self.success_url)
512

    
513
class UpdateMDPHRequestView(cbv.UpdateView):
514
    def get(self, request, *args, **kwargs):
515
        if kwargs.has_key('patientrecord_id'):
516
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
517
        return super(UpdateMDPHRequestView, self).get(request, *args, **kwargs)
518

    
519

    
520
new_mdph_request = \
521
    NewMDPHRequestView.as_view(model=MDPHRequest,
522
        template_name = 'dossiers/generic_form.html',
523
        success_url = '../view#tab=6',
524
        form_class=forms.MDPHRequestForm)
525
update_mdph_request = \
526
    UpdateMDPHRequestView.as_view(model=MDPHRequest,
527
        template_name = 'dossiers/generic_form.html',
528
        success_url = '../../view#tab=6',
529
        form_class=forms.MDPHRequestForm)
530
delete_mdph_request = \
531
    cbv.DeleteView.as_view(model=MDPHRequest,
532
        template_name = 'dossiers/generic_confirm_delete.html',
533
        success_url = '../../view#tab=6')
534

    
535
class NewMDPHResponseView(cbv.CreateView):
536
    def get(self, request, *args, **kwargs):
537
        if kwargs.has_key('patientrecord_id'):
538
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
539
        return super(NewMDPHResponseView, self).get(request, *args, **kwargs)
540

    
541
    def form_valid(self, form):
542
        response = form.save()
543
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
544
        patientrecord.mdph_responses.add(response)
545
        return HttpResponseRedirect(self.success_url)
546

    
547
class UpdateMDPHResponseView(cbv.UpdateView):
548
    def get(self, request, *args, **kwargs):
549
        if kwargs.has_key('patientrecord_id'):
550
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
551
        return super(UpdateMDPHResponseView, self).get(request, *args, **kwargs)
552

    
553

    
554
new_mdph_response = \
555
    NewMDPHResponseView.as_view(model=MDPHResponse,
556
        template_name = 'dossiers/generic_form.html',
557
        success_url = '../view#tab=6',
558
        form_class=forms.MDPHResponseForm)
559
update_mdph_response = \
560
    UpdateMDPHResponseView.as_view(model=MDPHResponse,
561
        template_name = 'dossiers/generic_form.html',
562
        success_url = '../../view#tab=6',
563
        form_class=forms.MDPHResponseForm)
564
delete_mdph_response = \
565
    cbv.DeleteView.as_view(model=MDPHResponse,
566
        template_name = 'dossiers/generic_confirm_delete.html',
567
        success_url = '../../view#tab=6')
568

    
569

    
570
class UpdatePatientStateView(cbv.UpdateView):
571
    def get(self, request, *args, **kwargs):
572
        if kwargs.has_key('patientrecord_id'):
573
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
574
        return super(UpdatePatientStateView, self).get(request, *args, **kwargs)
575

    
576
update_patient_state = \
577
    UpdatePatientStateView.as_view(model=FileState,
578
        template_name = 'dossiers/generic_form.html',
579
        success_url = '../../view#tab=0',
580
        form_class=forms.PatientStateForm)
581
delete_patient_state = \
582
    cbv.DeleteView.as_view(model=FileState,
583
        template_name = 'dossiers/generic_confirm_delete.html',
584
        success_url = '../../view#tab=0')
585

    
586

    
587
class GenerateRtfFormView(cbv.FormView):
588
    template_name = 'dossiers/generate_rtf_form.html'
589
    form_class = forms.GenerateRtfForm
590
    success_url = './view#tab=0'
591

    
592
    def get_context_data(self, **kwargs):
593
        ctx = super(GenerateRtfFormView, self).get_context_data(**kwargs)
594
        ctx['object'] = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
595
        ctx['service_id'] = self.service.id
596
        if self.request.GET.get('event-id'):
597
            date = self.request.GET.get('date')
598
            date = datetime.strptime(date, '%Y-%m-%d').date()
599
            appointment = Appointment()
600
            event = Event.objects.get(id=self.request.GET.get('event-id'))
601
            event = event.today_occurence(date)
602
            appointment.init_from_event(event, self.service)
603
            ctx['appointment'] = appointment
604
        return ctx
605

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

    
623
        client_dir = patient.get_client_side_directory(self.service.name)
624
        if not client_dir:
625
            response = HttpResponse(mimetype='text/rtf')
626
            response['Content-Disposition'] = 'attachment; filename="%s"' % dest_filename
627
            response.write(file(to_path).read())
628
            return response
629
        else:
630
            client_filepath = os.path.join(client_dir, dest_filename)
631
            return HttpResponseRedirect('file://' + client_filepath)
632

    
633
generate_rtf_form = GenerateRtfFormView.as_view()
634

    
635

    
636
class PatientRecordsQuotationsView(cbv.ListView):
637
    model = PatientRecord
638
    template_name = 'dossiers/quotations.html'
639

    
640
    def get_queryset(self):
641
        form = forms.QuotationsForm(data=self.request.GET or None)
642
        qs = super(PatientRecordsQuotationsView, self).get_queryset()
643
        without_quotations = self.request.GET.get('without_quotations')
644
        if without_quotations:
645
            qs = qs.filter(mises_1=None).filter(mises_2=None).filter(mises_3=None)
646
        states = self.request.GET.getlist('states')
647
        if states:
648
            status_types = ['BILAN', 'SURVEILLANCE', 'SUIVI']
649
            for state in states:
650
                status_types.append(STATE_CHOICES_TYPE[state])
651
            qs = qs.filter(last_state__status__type__in=status_types)
652
        else:
653
            qs = qs.filter(last_state__status__type__in='')
654

    
655
        try:
656
            date_actes_start = datetime.strptime(form.data['date_actes_start'], "%d/%m/%Y")
657
            qs = qs.filter(act_set__date__gte=date_actes_start.date())
658
        except (ValueError, KeyError):
659
            pass
660
        try:
661
            date_actes_end = datetime.strptime(form.data['date_actes_end'], "%d/%m/%Y")
662
            qs = qs.filter(act_set__date__lte=date_actes_end.date())
663
        except (ValueError, KeyError):
664
            pass
665
        qs = qs.filter(service=self.service).order_by('last_name')
666
        return qs
667

    
668
    def get_context_data(self, **kwargs):
669
        ctx = super(PatientRecordsQuotationsView, self).get_context_data(**kwargs)
670
        ctx['search_form'] = forms.QuotationsForm(data=self.request.GET or None)
671
        patient_records = []
672
        if self.request.GET:
673
            for patient_record in ctx['object_list'].filter():
674
                next_rdv = get_next_rdv(patient_record)
675
                last_rdv = get_last_rdv(patient_record)
676
                current_state = patient_record.get_current_state()
677
                if STATES_MAPPING.has_key(current_state.status.type):
678
                    state = STATES_MAPPING[current_state.status.type]
679
                else:
680
                    state = current_state.status.name
681
                state_class = current_state.status.type.lower()
682
                patient_records.append(
683
                        {
684
                            'object': patient_record,
685
                            'state': state,
686
                            'state_class': state_class
687
                            }
688
                        )
689
                state = state.replace(' ', '_')
690
                state = state.replace("'", '')
691

    
692
        page = self.request.GET.get('page')
693
        paginator = Paginator(patient_records, 50)
694
        try:
695
            patient_records = paginator.page(page)
696
        except PageNotAnInteger:
697
            patient_records = paginator.page(1)
698
        except EmptyPage:
699
            patient_records = paginator.page(paginator.num_pages)
700

    
701
        ctx['patient_records'] = patient_records
702

    
703
        query = self.request.GET.copy()
704
        if 'page' in query:
705
            del query['page']
706
        ctx['query'] = query.urlencode()
707

    
708
        return ctx
709

    
710
patientrecord_quotations = PatientRecordsQuotationsView.as_view()
711

    
712

    
713
class CreateDirectoryView(View, cbv.ServiceViewMixin):
714
    def post(self, request, *args, **kwargs):
715
        patient = PatientRecord.objects.get(id=kwargs['patientrecord_id'])
716
        service = Service.objects.get(slug=kwargs['service'])
717
        patient.get_ondisk_directory(service.name)
718
        messages.add_message(self.request, messages.INFO, u'Répertoire patient créé.')
719
        return HttpResponseRedirect('view')
720

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