Project

General

Profile

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

calebasse / calebasse / dossiers / views.py @ dd986559

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

    
3
import os
4

    
5
from datetime import datetime, date
6

    
7
from django.conf import settings
8
from django.db import models
9
from django.http import HttpResponseRedirect, HttpResponse
10
from django.views.generic import View
11
from django.views.generic.edit import DeleteView
12
from django.contrib import messages
13
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
14
from django.core.files import File
15
from django.forms import Form
16
from django.utils import formats
17
from django.shortcuts import get_object_or_404
18

    
19
from calebasse import cbv
20
from calebasse.doc_templates import make_doc_from_template
21
from calebasse.dossiers import forms
22
from calebasse.dossiers.views_utils import get_next_rdv, get_last_rdv, get_status
23
from calebasse.dossiers.transport import render_transport
24
from calebasse.agenda.models import Event, EventWithAct
25
from calebasse.actes.models import Act
26
from calebasse.agenda.appointments import Appointment
27
from calebasse.dossiers.models import (PatientRecord, PatientContact,
28
        PatientAddress, Status, FileState, create_patient, CmppHealthCareTreatment,
29
        CmppHealthCareDiagnostic, SessadHealthCareNotification, HealthCare,
30
        TransportPrescriptionLog, ProtectionState)
31
from calebasse.dossiers.states import STATES_MAPPING, STATES_BTN_MAPPER
32
from calebasse.ressources.models import (Service,
33
    SocialisationDuration, MDPHRequest, MDPHResponse)
34
from calebasse.facturation.list_acts import list_acts_for_billing_CMPP_per_patient
35

    
36
from calebasse.decorators import validator_only
37

    
38

    
39
class NewPatientRecordView(cbv.FormView, cbv.ServiceViewMixin):
40
    form_class = forms.NewPatientRecordForm
41
    template_name = 'dossiers/patientrecord_new.html'
42
    success_url = '..'
43
    patient = None
44

    
45
    def post(self, request, *args, **kwarg):
46
        self.user = request.user
47
        return super(NewPatientRecordView, self).post(request, *args, **kwarg)
48

    
49
    def form_valid(self, form):
50
        self.patient = create_patient(form.data['first_name'], form.data['last_name'], self.service,
51
                self.user, date_selected=datetime.strptime(form.data['date_selected'], "%d/%m/%Y"))
52
        return super(NewPatientRecordView, self).form_valid(form)
53

    
54
    def get_success_url(self):
55
        return '%s/view' % self.patient.id
56

    
57
new_patient_record = NewPatientRecordView.as_view()
58

    
59
class RecordPatientRecordIdMixing(object):
60
    def dispatch(self, request, *args, **kwargs):
61
        self.patientrecord_id = request.session['patientrecord_id'] = int(kwargs['patientrecord_id'])
62
        return super(RecordPatientRecordIdMixing, self).dispatch(request, *args, **kwargs)
63

    
64
    def get_form_kwargs(self):
65
        kwargs = super(RecordPatientRecordIdMixing, self).get_form_kwargs()
66
        kwargs['patient'] = PatientRecord.objects.get(id=self.patientrecord_id)
67
        return kwargs
68

    
69
class NewPatientContactView(RecordPatientRecordIdMixing, cbv.CreateView):
70
    model = PatientContact
71
    form_class = forms.PatientContactForm
72
    template_name = 'dossiers/patientcontact_new.html'
73
    success_url = '../view#tab=2'
74

    
75
    def get_initial(self):
76
        initial = super(NewPatientContactView, self).get_initial()
77
        fields = self.form_class.base_fields.keys()
78
        for arg in self.request.GET.keys():
79
            if arg in fields:
80
                initial[arg] = self.request.GET.get(arg)
81
        return initial
82

    
83
new_patient_contact = NewPatientContactView.as_view()
84

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

    
91
update_patient_contact = UpdatePatientContactView.as_view()
92

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

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

    
109
delete_patient_contact = DeletePatientContactView.as_view()
110

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

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

    
120
    def form_valid(self, form):
121
        patientaddress = form.save()
122
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
123
        patientrecord.addresses.add(patientaddress)
124
        messages.add_message(self.request, messages.INFO, u'Nouvelle adresse enregistrée avec succès.')
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
    def form_valid(self, form):
136
        messages.add_message(self.request,
137
                messages.INFO,
138
                u'Modification enregistrée avec succès.')
139
        return super(UpdatePatientAddressView, self).form_valid(form)
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

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

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

    
222
state_form = StateFormView.as_view()
223

    
224
class PatientRecordView(cbv.UpdateView):
225
    model = PatientRecord
226
    template_name = 'dossiers/patientrecord_update.html'
227

    
228
    def get_context_data(self, **kwargs):
229
        ctx = super(PatientRecordView, self).get_context_data(**kwargs)
230
        ctx['object'].create_diag_healthcare(self.request.user)
231
        ctx['object'].automated_switch_state(self.request.user)
232
        current_state = ctx['object'].get_current_state()
233
        if not current_state:
234
            current_state = ctx['object'].get_state()
235
            ctx['future_state'] = True
236
        if STATES_MAPPING.has_key(current_state.status.type):
237
            state = STATES_MAPPING[current_state.status.type]
238
        else:
239
            state = current_state.status.name
240
        ctx['current_state'] = current_state
241
        ctx['service_id'] = self.service.id
242
        ctx['states'] = FileState.objects.filter(patient=self.object) \
243
                .filter(status__services=self.service) \
244
                .order_by('-date_selected')
245
        return ctx
246

    
247
patient_record = PatientRecordView.as_view()
248

    
249
class PatientRecordGeneralView(cbv.UpdateView):
250
    model = PatientRecord
251
    form_class = forms.GeneralForm
252
    template_name = 'dossiers/patientrecord_tab1_general.html'
253
    success_url = './view'
254

    
255
    def get_context_data(self, **kwargs):
256
        ctx = super(PatientRecordGeneralView, self).get_context_data(**kwargs)
257
        ctx['nb_place_of_lifes'] = ctx['object'].addresses.filter(place_of_life=True).count()
258
        ctx['initial_state'] = ctx['object'].get_initial_state()
259
        ctx['last_rdv'] = get_last_rdv(ctx['object'])
260
        ctx['next_rdv'] = get_next_rdv(ctx['object'])
261
        current_state = ctx['object'].get_current_state()
262
        if STATES_MAPPING.has_key(current_state.status.type):
263
            state = STATES_MAPPING[current_state.status.type]
264
        else:
265
            state = current_state.status.name
266
        ctx['current_state'] = current_state
267
        ctx['status'], ctx['hc_status'] = get_status(ctx, self.request.user)
268
        ctx['missing_policy'] = False
269
        if not self.object.policyholder or \
270
                not self.object.policyholder.health_center or \
271
                not self.object.policyholder.social_security_id:
272
            ctx['missing_policy'] = True
273
        ctx['missing_birthdate'] = False
274
        if not self.object.birthdate:
275
            ctx['missing_birthdate'] = True
276
        return ctx
277

    
278
tab1_general = PatientRecordGeneralView.as_view()
279

    
280
class PatientRecordAdmView(cbv.ServiceViewMixin, cbv.MultiUpdateView):
281
    model = PatientRecord
282
    forms_classes = {
283
            'id': forms.CivilStatusForm,
284
            'inscription': forms.InscriptionForm,
285
            'out': forms.OutForm,
286
            'family': forms.FamilyForm,
287
            'transport': forms.TransportFrom,
288
            'followup': forms.FollowUpForm,
289
            }
290
    template_name = 'dossiers/patientrecord_tab2_fiche_adm.html'
291
    success_url = './view#tab=1'
292

    
293

    
294
    def get_context_data(self, **kwargs):
295
        ctx = super(PatientRecordAdmView, self).get_context_data(**kwargs)
296
        try:
297
            ctx['last_prescription'] = TransportPrescriptionLog.objects.filter(patient=ctx['object']).latest('created')
298
        except:
299
            pass
300
        return ctx
301

    
302
tab2_fiche_adm = PatientRecordAdmView.as_view()
303

    
304
class PatientRecordAddrView(cbv.ServiceViewMixin, cbv.MultiUpdateView):
305
    model = PatientRecord
306
    forms_classes = {
307
            'contact': forms.PatientContactForm,
308
            'policyholder': forms.PolicyHolderForm
309
            }
310
    template_name = 'dossiers/patientrecord_tab3_adresses.html'
311
    success_url = './view#tab=2'
312

    
313

    
314
    def get_context_data(self, **kwargs):
315
        ctx = super(PatientRecordAddrView, self).get_context_data(**kwargs)
316
        ctx['nb_place_of_lifes'] = ctx['object'].addresses.filter(place_of_life=True).count()
317
        ctx['addresses'] = ctx['object'].addresses.order_by('-place_of_life', 'id')
318
        return ctx
319

    
320
tab3_addresses = PatientRecordAddrView.as_view()
321

    
322
class PatientRecordNotifsView(cbv.DetailView):
323
    model = PatientRecord
324
    template_name = 'dossiers/patientrecord_tab4_notifs.html'
325

    
326
    def get_context_data(self, **kwargs):
327
        ctx = super(PatientRecordNotifsView, self).get_context_data(**kwargs)
328
        ctx['status'], ctx['hc_status'] = get_status(ctx, self.request.user)
329
        if ctx['object'].service.slug == "cmpp":
330
            (acts_not_locked, days_not_locked, acts_not_valide,
331
            acts_not_billable, acts_pause, acts_per_hc, acts_losts) = \
332
                list_acts_for_billing_CMPP_per_patient(self.object,
333
                    datetime.today(), self.service)
334
            ctx['acts_losts'] = acts_losts
335
            ctx['acts_pause'] = acts_pause
336
            hcs_used = acts_per_hc.keys()
337
            hcs = None
338
            if not hcs_used:
339
                hcs = [(hc, None) for hc in HealthCare.objects.filter(patient=self.object).order_by('-start_date')]
340
            else:
341
                hcs = []
342
                for hc in HealthCare.objects.filter(patient=self.object).order_by('-start_date'):
343
                    acts = None
344
                    if hasattr(hc, 'cmpphealthcarediagnostic') and hc.cmpphealthcarediagnostic in hcs_used:
345
                        acts = acts_per_hc[hc.cmpphealthcarediagnostic]
346
                    elif hasattr(hc, 'cmpphealthcaretreatment') and hc.cmpphealthcaretreatment in hcs_used:
347
                        acts = acts_per_hc[hc.cmpphealthcaretreatment]
348
                    hcs.append((hc, acts))
349
            ctx['hcs'] = []
350
            for hc, acts in hcs:
351
                ctx['hcs'].append((hc, acts, hc.act_set.order_by('date', 'time')))
352
        elif ctx['object'].service.slug == "sessad-ted" or ctx['object'].service.slug == "sessad-dys":
353
            ctx['hcs'] = HealthCare.objects.filter(patient=self.object).order_by('-start_date')
354
        return ctx
355

    
356
tab4_notifs = PatientRecordNotifsView.as_view()
357

    
358
class PatientRecordOldActs(cbv.DetailView):
359
    model = PatientRecord
360
    template_name = 'dossiers/patientrecord_tab5_actes_passes.html'
361

    
362
    def get_context_data(self, **kwargs):
363
        ctx = super(PatientRecordOldActs, self).get_context_data(**kwargs)
364
        ctx['last_rdvs'] = []
365
        for act in Act.objects.last_acts(ctx['object']).prefetch_related('doctors'):
366
            state = act.get_state()
367
            if state and not state.previous_state and state.state_name == 'NON_VALIDE':
368
                state = None
369
            missing_workers = []
370
            try:
371
                missing_workers = [participant.worker for participant in act.event.get_missing_participants()]
372
            except:
373
                pass
374
            ctx['last_rdvs'].append((act, state, missing_workers))
375
        history = []
376
        i = 0
377
        for state in ctx['object'].filestate_set.order_by('-date_selected'):
378
            acts = []
379
            try:
380
                while ctx['last_rdvs'][i][0].date >= state.date_selected.date():
381
                    acts.append(ctx['last_rdvs'][i])
382
                    i += 1
383
            except:
384
                pass
385
            history.append((state, acts))
386
        if i < len(ctx['last_rdvs']) - 1:
387
            history.append((None, ctx['last_rdvs'][i:]))
388
        ctx['history'] = history
389
        return ctx
390

    
391
tab5_old_acts = PatientRecordOldActs.as_view()
392

    
393
class PatientRecordNextAppointmentsView(cbv.DetailView):
394
    model = PatientRecord
395
    template_name = 'dossiers/patientrecord_tab6_next_rdv.html'
396

    
397
    def get_context_data(self, **kwargs):
398
        ctx = super(PatientRecordNextAppointmentsView, self).get_context_data(**kwargs)
399
        ctx['next_rdvs'] = []
400
        Q = models.Q
401
        today = date.today()
402
        qs = EventWithAct.objects.filter(patient=ctx['object']) \
403
                .filter(exception_to__isnull=True, canceled=False) \
404
                .filter(Q(start_datetime__gte=today) \
405
                |  Q(exceptions__isnull=False) \
406
                | ( Q(recurrence_periodicity__isnull=False) \
407
                & (Q(recurrence_end_date__gte=today) \
408
                | Q(recurrence_end_date__isnull=True) \
409
                ))) \
410
                .distinct() \
411
                .select_related() \
412
                .prefetch_related('participants', 'exceptions__eventwithact',
413
                        'act_set__actvalidationstate_set')
414
        occurrences = []
415
        for event in qs:
416
            occurrences.extend(filter(lambda e: e.start_datetime.date() >= today,
417
                event.all_occurences(limit=180)))
418
        occurrences = sorted(occurrences, key=lambda e: e.start_datetime)
419
        for event in occurrences:
420
            state = None
421
            if event.act:
422
                state = event.act.get_state()
423
            if state and not state.previous_state and state.state_name == 'NON_VALIDE':
424
                state = None
425
            ctx['next_rdvs'].append((event, state, event.get_missing_participants()))
426
        return ctx
427

    
428
tab6_next_rdv = PatientRecordNextAppointmentsView.as_view()
429

    
430
class PatientRecordSocialisationView(cbv.DetailView):
431
    model = PatientRecord
432
    template_name = 'dossiers/patientrecord_tab7_socialisation.html'
433

    
434
tab7_socialisation = PatientRecordSocialisationView.as_view()
435

    
436
class PatientRecordMedicalView(cbv.UpdateView):
437
    model = PatientRecord
438
    form_class = forms.PhysiologyForm
439
    template_name = 'dossiers/patientrecord_tab8_medical.html'
440
    success_url = './view#tab=7'
441

    
442
tab8_medical = PatientRecordMedicalView.as_view()
443

    
444
class PatientRecordsHomepageView(cbv.ListView):
445
    model = PatientRecord
446
    template_name = 'dossiers/index.html'
447

    
448

    
449
    def _get_search_result(self, paginate_patient_records):
450
        patient_records = []
451
        for patient_record in paginate_patient_records:
452
            next_rdv = get_next_rdv(patient_record)
453
            last_rdv = get_last_rdv(patient_record)
454
            current_status = patient_record.last_state.status
455
            state = current_status.name
456
            state_class = current_status.type.lower()
457
            patient_records.append(
458
                    {
459
                        'object': patient_record,
460
                        'next_rdv': next_rdv,
461
                        'last_rdv': last_rdv,
462
                        'state': state,
463
                        'state_class': state_class
464
                        }
465
                    )
466
        return patient_records
467

    
468
    def get_queryset(self):
469
        first_name = self.request.GET.get('first_name')
470
        last_name = self.request.GET.get('last_name')
471
        paper_id = self.request.GET.get('paper_id')
472
        id = self.request.GET.get('id')
473
        social_security_id = self.request.GET.get('social_security_id')
474
        if not (first_name or last_name or paper_id or id or social_security_id):
475
            return None
476
        if (first_name and len(first_name) < 2) or (last_name and len(last_name) < 2):
477
            return None
478
        qs = super(PatientRecordsHomepageView, self).get_queryset()
479
        states = self.request.GET.getlist('states')
480
        if last_name:
481
            qs = qs.filter(last_name__istartswith=last_name)
482
        if first_name:
483
            qs = qs.filter(first_name__istartswith=first_name)
484
        if paper_id:
485
            qs = qs.filter(paper_id__startswith=paper_id)
486
        if id:
487
            qs = qs.filter(id__startswith=id)
488
        if social_security_id:
489
            qs = qs.filter(models.Q(social_security_id__startswith=social_security_id) | \
490
                models.Q(contacts__social_security_id__startswith=social_security_id))
491
        if states:
492
            qs = qs.filter(last_state__status__id__in=states)
493
        else:
494
            qs = qs.filter(last_state__status__type__in="")
495
        qs = qs.filter(service=self.service).order_by('last_name').\
496
                prefetch_related('last_state',
497
                        'patientcontact', 'last_state__status')
498
        return qs
499

    
500
    def get_context_data(self, **kwargs):
501
        ctx = super(PatientRecordsHomepageView, self).get_context_data(**kwargs)
502
        ctx['search_form'] = forms.SearchForm(service=self.service, data=self.request.GET or None)
503
        ctx['stats'] = [["Dossiers", 0]]
504
        for status in Status.objects.filter(services=self.service):
505
            ctx['stats'].append([status.name, 0])
506

    
507
        page = self.request.GET.get('page')
508
        if ctx['object_list']:
509
            patient_records = ctx['object_list'].filter()
510
        else:
511
            patient_records = []
512

    
513
        # TODO: use a sql query to do this
514
        for patient_record in patient_records:
515
            ctx['stats'][0][1] += 1
516
            for elem in ctx['stats']:
517
                if elem[0] == patient_record.last_state.status.name:
518
                    elem[1] += 1
519
        paginator = Paginator(patient_records, 50)
520
        try:
521
            paginate_patient_records = paginator.page(page)
522
        except PageNotAnInteger:
523
            paginate_patient_records = paginator.page(1)
524
        except EmptyPage:
525
            paginate_patient_records = paginator.page(paginator.num_pages)
526

    
527
        query = self.request.GET.copy()
528
        if 'page' in query:
529
            del query['page']
530
        ctx['query'] = query.urlencode()
531

    
532
        ctx['paginate_patient_records'] = paginate_patient_records
533
        ctx['patient_records'] = self._get_search_result(paginate_patient_records)
534
        return ctx
535

    
536
patientrecord_home = PatientRecordsHomepageView.as_view()
537

    
538
class PatientRecordDeleteView(DeleteView):
539
    model = PatientRecord
540
    success_url = ".."
541
    template_name = 'dossiers/patientrecord_confirm_delete.html'
542

    
543
patientrecord_delete = validator_only(PatientRecordDeleteView.as_view())
544

    
545

    
546
class PatientRecordPaperIDUpdateView(cbv.UpdateView):
547
    model = PatientRecord
548
    form_class = forms.PaperIDForm
549
    template_name = 'dossiers/generic_form.html'
550
    success_url = '../..'
551

    
552
update_paper_id = PatientRecordPaperIDUpdateView.as_view()
553

    
554

    
555
class NewSocialisationDurationView(cbv.CreateView):
556
    model = SocialisationDuration
557
    form_class = forms.SocialisationDurationForm
558
    template_name = 'dossiers/generic_form.html'
559
    success_url = '../view#tab=6'
560

    
561
    def get_success_url(self):
562
        return self.success_url
563

    
564
    def get(self, request, *args, **kwargs):
565
        if kwargs.has_key('patientrecord_id'):
566
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
567
        return super(NewSocialisationDurationView, self).get(request, *args, **kwargs)
568

    
569
    def form_valid(self, form):
570
        duration = form.save()
571
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
572
        patientrecord.socialisation_durations.add(duration)
573
        return HttpResponseRedirect(self.get_success_url())
574

    
575
new_socialisation_duration = NewSocialisationDurationView.as_view()
576

    
577
class UpdateSocialisationDurationView(cbv.UpdateView):
578
    model = SocialisationDuration
579
    form_class = forms.SocialisationDurationForm
580
    template_name = 'dossiers/generic_form.html'
581
    success_url = '../../view#tab=6'
582

    
583
    def get(self, request, *args, **kwargs):
584
        if kwargs.has_key('patientrecord_id'):
585
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
586
        return super(UpdateSocialisationDurationView, self).get(request, *args, **kwargs)
587

    
588
update_socialisation_duration = UpdateSocialisationDurationView.as_view()
589

    
590
class DeleteSocialisationDurationView(cbv.DeleteView):
591
    model = SocialisationDuration
592
    form_class = forms.SocialisationDurationForm
593
    template_name = 'dossiers/socialisationduration_confirm_delete.html'
594
    success_url = '../../view#tab=6'
595

    
596
delete_socialisation_duration = DeleteSocialisationDurationView.as_view()
597

    
598

    
599
class NewMDPHRequestView(cbv.CreateView):
600
    def get(self, request, *args, **kwargs):
601
        if kwargs.has_key('patientrecord_id'):
602
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
603
        return super(NewMDPHRequestView, self).get(request, *args, **kwargs)
604

    
605
    def form_valid(self, form):
606
        request = form.save()
607
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
608
        patientrecord.mdph_requests.add(request)
609
        return HttpResponseRedirect(self.success_url)
610

    
611
class UpdateMDPHRequestView(cbv.UpdateView):
612
    def get(self, request, *args, **kwargs):
613
        if kwargs.has_key('patientrecord_id'):
614
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
615
        return super(UpdateMDPHRequestView, self).get(request, *args, **kwargs)
616

    
617

    
618
new_mdph_request = \
619
    NewMDPHRequestView.as_view(model=MDPHRequest,
620
        template_name = 'dossiers/generic_form.html',
621
        success_url = '../view#tab=6',
622
        form_class=forms.MDPHRequestForm)
623
update_mdph_request = \
624
    UpdateMDPHRequestView.as_view(model=MDPHRequest,
625
        template_name = 'dossiers/generic_form.html',
626
        success_url = '../../view#tab=6',
627
        form_class=forms.MDPHRequestForm)
628
delete_mdph_request = \
629
    cbv.DeleteView.as_view(model=MDPHRequest,
630
        template_name = 'dossiers/generic_confirm_delete.html',
631
        success_url = '../../view#tab=6')
632

    
633
class NewMDPHResponseView(cbv.CreateView):
634
    def get(self, request, *args, **kwargs):
635
        if kwargs.has_key('patientrecord_id'):
636
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
637
        return super(NewMDPHResponseView, self).get(request, *args, **kwargs)
638

    
639
    def form_valid(self, form):
640
        response = form.save()
641
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
642
        patientrecord.mdph_responses.add(response)
643
        return HttpResponseRedirect(self.success_url)
644

    
645
class UpdateMDPHResponseView(cbv.UpdateView):
646
    def get(self, request, *args, **kwargs):
647
        if kwargs.has_key('patientrecord_id'):
648
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
649
        return super(UpdateMDPHResponseView, self).get(request, *args, **kwargs)
650

    
651

    
652
new_mdph_response = \
653
    NewMDPHResponseView.as_view(model=MDPHResponse,
654
        template_name = 'dossiers/generic_form.html',
655
        success_url = '../view#tab=6',
656
        form_class=forms.MDPHResponseForm)
657
update_mdph_response = \
658
    UpdateMDPHResponseView.as_view(model=MDPHResponse,
659
        template_name = 'dossiers/generic_form.html',
660
        success_url = '../../view#tab=6',
661
        form_class=forms.MDPHResponseForm)
662
delete_mdph_response = \
663
    cbv.DeleteView.as_view(model=MDPHResponse,
664
        template_name = 'dossiers/generic_confirm_delete.html',
665
        success_url = '../../view#tab=6')
666

    
667

    
668
class UpdatePatientStateView(cbv.ServiceFormMixin, cbv.UpdateView):
669

    
670
    def get_initial(self):
671
        initial = super(UpdatePatientStateView, self).get_initial()
672
        initial['date_selected'] = self.object.date_selected.date()
673
        return initial
674

    
675
    def get(self, request, *args, **kwargs):
676
        if kwargs.has_key('patientrecord_id'):
677
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
678
        return super(UpdatePatientStateView, self).get(request, *args, **kwargs)
679

    
680
class DeletePatientView(cbv.DeleteView):
681

    
682
    def delete(self, request, *args, **kwargs):
683
        self.object = self.get_object()
684
        if self.object == self.object.patient.last_state:
685
            status = self.object.patient.filestate_set.all().order_by('-created')
686
            if len(status) > 1:
687
                self.object.patient.last_state = status[1]
688
                self.object.patient.save()
689
            else:
690
                # TODO return an error here
691
                return HttpResponseRedirect(self.get_success_url())
692
        self.object.delete()
693
        return HttpResponseRedirect(self.get_success_url())
694

    
695

    
696
update_patient_state = \
697
    UpdatePatientStateView.as_view(model=FileState,
698
        template_name = 'dossiers/generic_form.html',
699
        success_url = '../../view#tab=0',
700
        form_class=forms.PatientStateForm)
701
delete_patient_state = \
702
    DeletePatientView.as_view(model=FileState,
703
        template_name = 'dossiers/generic_confirm_delete.html',
704
        success_url = '../../view#tab=0')
705

    
706

    
707
class GenerateRtfFormView(cbv.FormView):
708
    template_name = 'dossiers/generate_rtf_form.html'
709
    form_class = forms.GenerateRtfForm
710
    success_url = './view#tab=0'
711

    
712
    def get_context_data(self, **kwargs):
713
        ctx = super(GenerateRtfFormView, self).get_context_data(**kwargs)
714
        ctx['object'] = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
715
        ctx['service_id'] = self.service.id
716
        if self.request.GET.get('event-id'):
717
            date = self.request.GET.get('date')
718
            date = datetime.strptime(date, '%Y-%m-%d').date()
719
            appointment = Appointment()
720
            event = EventWithAct.objects.get(id=self.request.GET.get('event-id'))
721
            event = event.today_occurrence(date)
722
            appointment.init_from_event(event, self.service)
723
            ctx['event'] = event
724
            ctx['appointment'] = appointment
725
        return ctx
726

    
727
    def form_valid(self, form, **kwargs):
728
        ctx = self.get_context_data(**kwargs)
729
        patient = ctx['object']
730
        appointment = ctx['appointment']
731
        event = ctx['event']
732
        template_filename = form.cleaned_data.get('template_filename')
733
        dest_filename = datetime.now().strftime('%Y-%m-%d--%H:%M:%S') + '--' + template_filename
734
        from_path = os.path.join(settings.RTF_TEMPLATES_DIRECTORY, template_filename)
735
        to_path = ''
736
        persistent = True
737
        if settings.USE_PATIENT_FILE_RTF_REPOSITORY_DIRECTORY \
738
                or settings.RTF_REPOSITORY_DIRECTORY:
739
            if settings.USE_PATIENT_FILE_RTF_REPOSITORY_DIRECTORY:
740
                to_path = patient.get_ondisk_directory(self.service.name)
741
            if settings.RTF_REPOSITORY_DIRECTORY:
742
                to_path = os.path.join(to_path,
743
                    settings.RTF_REPOSITORY_DIRECTORY)
744
            to_path = os.path.join(to_path, dest_filename)
745
        else:
746
            # else : use temporary files
747
            persistent = False
748
            to_path = dest_filename
749
        variables = {'AD11': '', 'AD12': '', 'AD13': '', 'AD14': '',
750
            'AD15': '', 'AD18': '',
751
            'JOU1': formats.date_format(datetime.today(), "DATE_FORMAT"),
752
            'VIL1': u'Saint-Étienne',
753
            'RDV1': '', 'HEU1': '', 'THE1': '', 'DPA1': '',
754
            'NOM1': '', 'PRE1': '', 'NAI1': '', 'NUM2': '',
755
            'NOM2': '', 'PRE2': '', 'TPA1': '', 'NSS1': '',
756
            'TR01': '', 'TR02': '', 'TR03': '', 'TR04': '', 'TR05': '',
757
            'AD16': '', 'AD17': '', 'AD19': '',
758
            'AD21': '', 'AD22': '', 'AD23': '', 'AD24': '', 'AD25': '',
759
            'AD26': '', 'AD27': '', 'AD28': '', 'AD29': '',
760
            'RDV2': '' ,
761
        }
762
        list_rdvs = []
763
        for act in Act.objects.last_acts(patient):
764
            state = act.get_state()
765
            if state and state.state_name in ('VALIDE', 'ACT_DOUBLE'):
766
                rdv = "\t- %s" % formats.date_format(act.date, "DATE_FORMAT")
767
                if act.time:
768
                    rdv += " à %s" % formats.date_format(act.time, "TIME_FORMAT")
769
                list_rdvs.append(rdv)
770
        variables['RDV2'] = '\par'.join(list_rdvs)
771
        if appointment:
772
            variables['RDV1'] = formats.date_format(appointment.date, "DATE_FORMAT")
773
            variables['HEU1'] = appointment.begin_hour
774
            variables['THE1'] = ' '.join([str(i) for i in appointment.workers])# ou DPA1?
775
            variables['DPA1'] = variables['THE1']
776
        if patient:
777
            variables['NOM1'] = patient.last_name
778
            variables['PRE1'] = patient.first_name
779
            if patient.birthdate :
780
                variables['NAI1'] = patient.birthdate.strftime('%d/%m/%Y')
781
            variables['NUM2'] = patient.paper_id
782
            if patient.policyholder:
783
                variables['NOM2'] = patient.policyholder.last_name
784
                variables['PRE2'] = patient.policyholder.first_name
785
                if patient.policyholder.health_center:
786
                    variables['TPA1'] = patient.policyholder.health_center.name
787
                if patient.policyholder.social_security_id:
788
                    key = str(patient.policyholder.get_control_key())
789
                    if len(key) == 1:
790
                        key = '0' + key
791
                    variables['NSS1'] = \
792
                        ' '.join([patient.policyholder.social_security_id,
793
                            key])
794
            if patient.transportcompany:
795
                variables['TR01'] = patient.transportcompany.name
796
                variables['TR02'] = patient.transportcompany.address
797
                variables['TR03'] = patient.transportcompany.address_complement
798
                variables['TR04'] = patient.transportcompany.zip_code
799
                variables['TR05'] = patient.transportcompany.city
800
        variables['AD18'] = form.cleaned_data.get('phone_address') or ''
801
        for i, line in enumerate(form.cleaned_data.get('address').splitlines()):
802
            variables['AD%d' % (11+i)] = line
803
            if i == 4:
804
                break
805

    
806
        filename = make_doc_from_template(from_path, to_path, variables,
807
            persistent)
808

    
809
        client_dir = patient.get_client_side_directory(self.service.name)
810
        event.convocation_sent = True
811
        event.save()
812
        if not client_dir:
813
            content = File(file(filename))
814
            response = HttpResponse(content,'text/rtf')
815
            response['Content-Length'] = content.size
816
            response['Content-Disposition'] = 'attachment; filename="%s"' \
817
                % dest_filename.encode('utf-8')
818
            return response
819
        else:
820
            class LocalFileHttpResponseRedirect(HttpResponseRedirect):
821
                allowed_schemes = ['file']
822
            client_filepath = os.path.join(client_dir, dest_filename)
823
            return LocalFileHttpResponseRedirect('file://' + client_filepath)
824

    
825
generate_rtf_form = GenerateRtfFormView.as_view()
826

    
827

    
828
class PatientRecordsQuotationsView(cbv.ListView):
829
    model = PatientRecord
830
    template_name = 'dossiers/quotations.html'
831

    
832
    def _get_search_result(self, paginate_patient_records):
833
        patient_records = []
834
        for patient_record in paginate_patient_records:
835
            current_state = patient_record.get_current_state() or patient_record.get_state()
836
            state = current_state.status.name
837
            state_class = current_state.status.type.lower()
838
            patient_records.append(
839
                    {
840
                        'object': patient_record,
841
                        'state': state,
842
                        'state_class': state_class
843
                        }
844
                    )
845
        return patient_records
846

    
847
    def get_queryset(self):
848
        form = forms.QuotationsForm(data=self.request.GET or None)
849
        qs = super(PatientRecordsQuotationsView, self).get_queryset()
850
        without_quotations = self.request.GET.get('without_quotations')
851
        if without_quotations:
852
            qs = qs.filter(mises_1=None).filter(mises_2=None).filter(mises_3=None)
853
        states = self.request.GET.getlist('states')
854
        qs = qs.filter(last_state__status__id__in=states)
855

    
856
        try:
857
            date_actes_start = datetime.strptime(form.data['date_actes_start'], "%d/%m/%Y")
858
            qs = qs.filter(act__date__gte=date_actes_start.date()).distinct()
859
        except (ValueError, KeyError):
860
            pass
861
        try:
862
            date_actes_end = datetime.strptime(form.data['date_actes_end'], "%d/%m/%Y")
863
            qs = qs.filter(act__date__lte=date_actes_end.date()).distinct()
864
        except (ValueError, KeyError):
865
            pass
866
        qs = qs.filter(service=self.service).order_by('last_name').prefetch_related()
867
        return qs
868

    
869
    def get_context_data(self, **kwargs):
870
        ctx = super(PatientRecordsQuotationsView, self).get_context_data(**kwargs)
871
        ctx['search_form'] = forms.QuotationsForm(data=self.request.GET or None,
872
                service=self.service)
873
        patient_records = []
874
        page = self.request.GET.get('page')
875
        paginator = Paginator(ctx['object_list'].filter(), 50)
876
        try:
877
            paginate_patient_records = paginator.page(page)
878
        except PageNotAnInteger:
879
            paginate_patient_records = paginator.page(1)
880
        except EmptyPage:
881
            paginate_patient_records = paginator.page(paginator.num_pages)
882

    
883
        ctx['patient_records'] = self._get_search_result(paginate_patient_records)
884
        ctx['paginate_patient_records'] = paginate_patient_records
885

    
886
        query = self.request.GET.copy()
887
        if 'page' in query:
888
            del query['page']
889
        ctx['query'] = query.urlencode()
890

    
891
        return ctx
892

    
893
patientrecord_quotations = PatientRecordsQuotationsView.as_view()
894

    
895
class NewProtectionStateView(cbv.CreateView):
896
    model = ProtectionState
897
    template_name = 'dossiers/generic_form.html'
898
    success_url = '../view#tab=1'
899
    form_class = forms.ProtectionStateForm
900

    
901
    def form_valid(self, form):
902
        self.patient = get_object_or_404(PatientRecord, id=self.kwargs.get('patientrecord_id',None))
903
        form.instance.patient = self.patient
904
        return super(NewProtectionStateView, self).form_valid(form)
905

    
906
new_protection = NewProtectionStateView.as_view()
907

    
908
class UpdateProtectionStateView(cbv.UpdateView):
909
    model = ProtectionState
910
    template_name = 'dossiers/generic_form.html'
911
    success_url = '../../view#tab=1'
912
    form_class = forms.ProtectionStateForm
913

    
914
    def form_valid(self, form):
915
        self.patient = get_object_or_404(PatientRecord, id=self.kwargs.get('patientrecord_id',None))
916
        form.instance.patient = self.patient
917
        return super(UpdateProtectionStateView, self).form_valid(form)
918

    
919
update_protection = UpdateProtectionStateView.as_view()
920

    
921
class DeleteProtectionStateView(cbv.DeleteView):
922
    model = ProtectionState
923
    template_name = 'dossiers/protection_confirm_delete.html'
924
    success_url = '../../view#tab=1'
925

    
926
delete_protection = DeleteProtectionStateView.as_view()
927

    
928
class PatientRecordsWaitingQueueView(cbv.ListView):
929
    model = PatientRecord
930
    template_name = 'dossiers/waiting_queue.html'
931

    
932
    def _get_search_result(self, paginate_patient_records,
933
            all_patient_records):
934
        patient_records = []
935
        if paginate_patient_records:
936
            position = 1
937
            for patient_record in paginate_patient_records:
938
                while patient_record.id != all_patient_records[position - 1].id:
939
                    position += 1
940
                patient_records.append(
941
                        {
942
                            'object': patient_record,
943
                            'position': position,
944
                            }
945
                        )
946
        return patient_records
947

    
948
    def get_queryset(self):
949
        form = forms.QuotationsForm(data=self.request.GET or None)
950
        qs = super(PatientRecordsWaitingQueueView, self).get_queryset()
951
        first_name = self.request.GET.get('first_name')
952
        last_name = self.request.GET.get('last_name')
953
        paper_id = self.request.GET.get('paper_id')
954
        id = self.request.GET.get('id')
955
        social_security_id = self.request.GET.get('social_security_id')
956
        qs = qs.filter(service=self.service,
957
            last_state__status__type='ACCUEIL')
958
        if last_name:
959
            qs = qs.filter(last_name__istartswith=last_name)
960
        if first_name:
961
            qs = qs.filter(first_name__istartswith=first_name)
962
        if paper_id:
963
            qs = qs.filter(paper_id__startswith=paper_id)
964
        if id:
965
            qs = qs.filter(id__startswith=id)
966
        if social_security_id:
967
            qs = qs.filter(models.Q(
968
                social_security_id__startswith=social_security_id)
969
                | models.Q(
970
                contacts__social_security_id__startswith=social_security_id))
971
        qs = qs.order_by('last_state__date_selected', 'created')
972
        return qs
973

    
974
    def get_context_data(self, **kwargs):
975
        ctx = super(PatientRecordsWaitingQueueView, self).get_context_data(**kwargs)
976
        ctx['search_form'] = forms.QuotationsForm(data=self.request.GET or None,
977
                service=self.service)
978
        patient_records = []
979
        page = self.request.GET.get('page')
980
        paginator = Paginator(ctx['object_list'].filter(), 50)
981
        try:
982
            paginate_patient_records = paginator.page(page)
983
        except PageNotAnInteger:
984
            paginate_patient_records = paginator.page(1)
985
        except EmptyPage:
986
            paginate_patient_records = paginator.page(paginator.num_pages)
987

    
988
        all_patient_records = PatientRecord.objects.filter(
989
                service=self.service,
990
                last_state__status__type='ACCUEIL').order_by(
991
                'last_state__date_selected', 'created')
992
        ctx['patient_records'] = self._get_search_result(
993
            paginate_patient_records, all_patient_records)
994
        ctx['paginate_patient_records'] = paginate_patient_records
995
        ctx['len_patient_records'] = all_patient_records.count()
996

    
997
        query = self.request.GET.copy()
998
        if 'page' in query:
999
            del query['page']
1000
        ctx['query'] = query.urlencode()
1001

    
1002
        return ctx
1003

    
1004
patientrecord_waiting_queue = PatientRecordsWaitingQueueView.as_view()
1005

    
1006
class CreateDirectoryView(View, cbv.ServiceViewMixin):
1007
    def post(self, request, *args, **kwargs):
1008
        patient = PatientRecord.objects.get(id=kwargs['patientrecord_id'])
1009
        service = Service.objects.get(slug=kwargs['service'])
1010
        patient.get_ondisk_directory(service.name)
1011
        messages.add_message(self.request, messages.INFO, u'Répertoire patient créé.')
1012
        return HttpResponseRedirect('view')
1013

    
1014
create_directory = CreateDirectoryView.as_view()
1015

    
1016
class GenerateTransportPrescriptionFormView(cbv.FormView):
1017
    template_name = 'dossiers/generate_transport_prescription_form.html'
1018
    form_class = Form
1019
    success_url = './view#tab=1'
1020

    
1021
    def get_context_data(self, **kwargs):
1022
        ctx = super(GenerateTransportPrescriptionFormView, self).get_context_data(**kwargs)
1023
        ctx['lieu'] = 'Saint-Etienne'
1024
        ctx['date'] = formats.date_format(datetime.today(), "SHORT_DATE_FORMAT")
1025
        ctx['id_etab'] = '''%s SAINT ETIENNE
1026
66/68, RUE MARENGO
1027
42000 SAINT ETIENNE''' % ctx['service'].upper()
1028
        try:
1029
            patient = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
1030
            ctx['object'] = patient
1031
            last_log = TransportPrescriptionLog.objects.filter(patient=patient).latest('created')
1032
            if last_log:
1033
                ctx['choices'] = last_log.get_choices()
1034
                if 'lieu' in ctx['choices'] and ctx['choices']['lieu']:
1035
                    ctx['lieu'] = ctx['choices']['lieu']
1036
                if 'date' in ctx['choices'] and ctx['choices']['date']:
1037
                    ctx['date'] = ctx['choices']['date']
1038
                if 'id_etab' in ctx['choices'] and ctx['choices']['id_etab']:
1039
                    ctx['id_etab'] = ctx['choices']['id_etab']
1040
        except:
1041
            pass
1042
        return ctx
1043

    
1044
    def form_valid(self, form):
1045
        patient = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
1046
        address = PatientAddress.objects.get(id=form.data['address_id'])
1047
        path = render_transport(patient, address, form.data)
1048
        content = File(file(path))
1049
        log = TransportPrescriptionLog(patient=patient)
1050
        log.set_choices(form.data)
1051
        log.save()
1052
        response = HttpResponse(content,'application/pdf')
1053
        response['Content-Length'] = content.size
1054
        dest_filename = "%s--prescription-transport-%s-%s.pdf" \
1055
            % (datetime.now().strftime('%Y-%m-%d--%H:%M:%S'),
1056
            patient.last_name.upper().encode('utf-8'),
1057
            patient.first_name.encode('utf-8'))
1058
        response['Content-Disposition'] = \
1059
            'attachment; filename="%s"' % dest_filename
1060
        return response
1061

    
1062
prescription_transport = GenerateTransportPrescriptionFormView.as_view()
(11-11/12)