Project

General

Profile

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

calebasse / calebasse / dossiers / views.py @ d09349e5

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
class RecordPatientRecordIdMixing(object):
69
    def dispatch(self, request, *args, **kwargs):
70
        self.patientrecord_id = request.session['patientrecord_id'] = kwargs['patientrecord_id']
71
        return super(RecordPatientRecordIdMixing, self).dispatch(request, *args, **kwargs)
72

    
73
    def get_form_kwargs(self):
74
        kwargs = super(RecordPatientRecordIdMixing, self).get_form_kwargs()
75
        kwargs['patient'] = PatientRecord.objects.get(id=self.patientrecord_id)
76
        return kwargs
77

    
78
class NewPatientContactView(RecordPatientRecordIdMixing, cbv.CreateView):
79
    model = PatientContact
80
    form_class = forms.PatientContactForm
81
    template_name = 'dossiers/patientcontact_new.html'
82
    success_url = '../view#tab=2'
83

    
84
new_patient_contact = NewPatientContactView.as_view()
85

    
86
class UpdatePatientContactView(RecordPatientRecordIdMixing, cbv.UpdateView):
87
    model = PatientContact
88
    form_class = forms.PatientContactForm
89
    template_name = 'dossiers/patientcontact_new.html'
90
    success_url = '../../view#tab=2'
91

    
92
update_patient_contact = UpdatePatientContactView.as_view()
93

    
94
class DeletePatientContactView(cbv.DeleteView):
95
    model = PatientContact
96
    form_class = forms.PatientContactForm
97
    template_name = 'dossiers/patientcontact_confirm_delete.html'
98
    success_url = '../../view#tab=2'
99

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

    
110
delete_patient_contact = DeletePatientContactView.as_view()
111

    
112
class NewPatientAddressView(cbv.CreateView):
113
    model = PatientAddress
114
    form_class = forms.PatientAddressForm
115
    template_name = 'dossiers/patientaddress_new.html'
116
    success_url = '../view#tab=2'
117

    
118
    def get_success_url(self):
119
        return self.success_url
120

    
121
    def form_valid(self, form):
122
        patientaddress = form.save()
123
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
124
        patientrecord.addresses.add(patientaddress)
125
        return HttpResponseRedirect(self.get_success_url())
126

    
127
new_patient_address = NewPatientAddressView.as_view()
128

    
129
class UpdatePatientAddressView(cbv.UpdateView):
130
    model = PatientAddress
131
    form_class = forms.PatientAddressForm
132
    template_name = 'dossiers/patientaddress_new.html'
133
    success_url = '../../view#tab=2'
134

    
135
update_patient_address = UpdatePatientAddressView.as_view()
136

    
137
class DeletePatientAddressView(cbv.DeleteView):
138
    model = PatientAddress
139
    form_class = forms.PatientAddressForm
140
    template_name = 'dossiers/patientaddress_confirm_delete.html'
141
    success_url = '../../view#tab=2'
142

    
143
delete_patient_address = DeletePatientAddressView.as_view()
144

    
145

    
146
class NewHealthCareView(cbv.CreateView):
147

    
148
    def get_initial(self):
149
        initial = super(NewHealthCareView, self).get_initial()
150
        initial['author'] = self.request.user.id
151
        initial['patient'] = self.kwargs['patientrecord_id']
152
        return initial
153

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

    
197

    
198
class StateFormView(cbv.FormView):
199
    template_name = 'dossiers/state.html'
200
    form_class = forms.StateForm
201
    success_url = './view#tab=0'
202

    
203
    def post(self, request, *args, **kwarg):
204
        self.user = request.user
205
        return super(StateFormView, self).post(request, *args, **kwarg)
206

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

    
215
state_form = StateFormView.as_view()
216

    
217

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

    
234
    def get_success_url(self):
235
        if self.request.POST.has_key('tab'):
236
            return self.success_url + '#tab=' + self.request.POST['tab']
237
        else:
238
            return self.success_url
239

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

    
341
    def form_valid(self, form):
342
        messages.add_message(self.request, messages.INFO, u'Modification enregistrée avec succès.')
343
        return super(PatientRecordView, self).form_valid(form)
344

    
345

    
346
patient_record = PatientRecordView.as_view()
347

    
348
class PatientRecordsHomepageView(cbv.ListView):
349
    model = PatientRecord
350
    template_name = 'dossiers/index.html'
351

    
352
    def get_queryset(self):
353
        first_name = self.request.GET.get('first_name')
354
        last_name = self.request.GET.get('last_name')
355
        paper_id = self.request.GET.get('paper_id')
356
        id = self.request.GET.get('id')
357
        social_security_id = self.request.GET.get('social_security_id')
358
        if not (first_name or last_name or paper_id or id or social_security_id):
359
            return None
360
        if (first_name and len(first_name) < 2) or (last_name and len(last_name) < 2):
361
            return None
362
        qs = super(PatientRecordsHomepageView, self).get_queryset()
363
        states = self.request.GET.getlist('states')
364
        if last_name:
365
            qs = qs.filter(last_name__icontains=last_name)
366
        if first_name:
367
            qs = qs.filter(first_name__icontains=first_name)
368
        if paper_id:
369
            qs = qs.filter(paper_id__startswith=paper_id)
370
        if id:
371
            qs = qs.filter(id__startswith=id)
372
        if social_security_id:
373
            qs = qs.filter(models.Q(social_security_id__startswith=social_security_id) | \
374
                models.Q(contacts__social_security_id__startswith=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
            if ctx['object_list']:
397
                for patient_record in ctx['object_list'].filter():
398
                    ctx['stats']['dossiers'] += 1
399
                    next_rdv = get_next_rdv(patient_record)
400
                    last_rdv = get_last_rdv(patient_record)
401
                    current_state = patient_record.get_current_state()
402
                    if STATES_MAPPING.has_key(current_state.status.type):
403
                        state = STATES_MAPPING[current_state.status.type]
404
                    else:
405
                        state = current_state.status.name
406
                    state_class = current_state.status.type.lower()
407
                    patient_records.append(
408
                            {
409
                                'object': patient_record,
410
                                'next_rdv': next_rdv,
411
                                'last_rdv': last_rdv,
412
                                'state': state,
413
                                'state_class': state_class
414
                                }
415
                            )
416
                    state = state.replace(' ', '_')
417
                    state = state.replace("'", '')
418
                    if not ctx['stats'].has_key(state):
419
                        ctx['stats'][state] = 0
420
                    ctx['stats'][state] += 1
421

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

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

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

    
439
patientrecord_home = PatientRecordsHomepageView.as_view()
440

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

    
446
patientrecord_delete = PatientRecordDeleteView.as_view()
447

    
448

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

    
455
update_paper_id = PatientRecordPaperIDUpdateView.as_view()
456

    
457

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

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

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

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

    
478
new_socialisation_duration = NewSocialisationDurationView.as_view()
479

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

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

    
491
update_socialisation_duration = UpdateSocialisationDurationView.as_view()
492

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

    
499
delete_socialisation_duration = DeleteSocialisationDurationView.as_view()
500

    
501

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

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

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

    
520

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

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

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

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

    
554

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

    
570

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

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

    
587

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

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

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

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

    
636
generate_rtf_form = GenerateRtfFormView.as_view()
637

    
638

    
639
class PatientRecordsQuotationsView(cbv.ListView):
640
    model = PatientRecord
641
    template_name = 'dossiers/quotations.html'
642

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

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

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

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

    
704
        ctx['patient_records'] = patient_records
705

    
706
        query = self.request.GET.copy()
707
        if 'page' in query:
708
            del query['page']
709
        ctx['query'] = query.urlencode()
710

    
711
        return ctx
712

    
713
patientrecord_quotations = PatientRecordsQuotationsView.as_view()
714

    
715

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

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