Project

General

Profile

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

calebasse / calebasse / dossiers / views.py @ 8ee74769

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.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
from calebasse.decorators import validator_only
30

    
31
def get_next_rdv(patient_record):
32
    Q = models.Q
33
    today = date.today()
34
    next_rdv = {}
35
    event = Event.objects.next_appointment(patient_record)
36
    if event:
37
        next_rdv['start_datetime'] = event.start_datetime
38
        next_rdv['participants'] = event.participants.all()
39
        next_rdv['act_type'] = event.eventwithact.act_type
40
    qs = EventWithAct.objects.filter(patient=patient_record) \
41
                .filter(exception_to__isnull=True, canceled=False) \
42
                .filter(Q(start_datetime__gte=today) \
43
                | ( Q(recurrence_periodicity__isnull=False) \
44
                & (Q(recurrence_end_date__gte=today) \
45
                | Q(recurrence_end_date__isnull=True)))) \
46
                .select_related() \
47
                .prefetch_related('participants', 'exceptions__eventwithact')
48
    occurrences = []
49
    for event in qs:
50
        occurrences.extend(filter(lambda e: e.start_datetime.date() >= today, event.all_occurences(limit=180)))
51
    occurrences = sorted(occurrences, key=lambda e: e.start_datetime)
52
    if occurrences:
53
        return occurrences[0]
54
    else:
55
        return None
56

    
57
def get_last_rdv(patient_record):
58
    last_rdv = {}
59
    event = Event.objects.last_appointment(patient_record)
60
    if event:
61
        last_rdv['start_datetime'] = event.start_datetime
62
        last_rdv['participants'] = event.participants.all()
63
        last_rdv['act_type'] = event.eventwithact.act_type
64
        last_rdv['is_absent'] = event.is_absent()
65
    return last_rdv
66

    
67
class NewPatientRecordView(cbv.FormView, cbv.ServiceViewMixin):
68
    form_class = forms.NewPatientRecordForm
69
    template_name = 'dossiers/patientrecord_new.html'
70
    success_url = '..'
71
    patient = None
72

    
73
    def post(self, request, *args, **kwarg):
74
        self.user = request.user
75
        return super(NewPatientRecordView, self).post(request, *args, **kwarg)
76

    
77
    def form_valid(self, form):
78
        self.patient = create_patient(form.data['first_name'], form.data['last_name'], self.service,
79
                self.user, date_selected=datetime.strptime(form.data['date_selected'], "%d/%m/%Y"))
80
        return super(NewPatientRecordView, self).form_valid(form)
81

    
82
    def get_success_url(self):
83
        return '%s/view' % self.patient.id
84

    
85
new_patient_record = NewPatientRecordView.as_view()
86

    
87
class RecordPatientRecordIdMixing(object):
88
    def dispatch(self, request, *args, **kwargs):
89
        self.patientrecord_id = request.session['patientrecord_id'] = kwargs['patientrecord_id']
90
        return super(RecordPatientRecordIdMixing, self).dispatch(request, *args, **kwargs)
91

    
92
    def get_form_kwargs(self):
93
        kwargs = super(RecordPatientRecordIdMixing, self).get_form_kwargs()
94
        kwargs['patient'] = PatientRecord.objects.get(id=self.patientrecord_id)
95
        return kwargs
96

    
97
class NewPatientContactView(RecordPatientRecordIdMixing, cbv.CreateView):
98
    model = PatientContact
99
    form_class = forms.PatientContactForm
100
    template_name = 'dossiers/patientcontact_new.html'
101
    success_url = '../view#tab=2'
102

    
103
new_patient_contact = NewPatientContactView.as_view()
104

    
105
class UpdatePatientContactView(RecordPatientRecordIdMixing, cbv.UpdateView):
106
    model = PatientContact
107
    form_class = forms.PatientContactForm
108
    template_name = 'dossiers/patientcontact_new.html'
109
    success_url = '../../view#tab=2'
110

    
111
update_patient_contact = UpdatePatientContactView.as_view()
112

    
113
class DeletePatientContactView(cbv.DeleteView):
114
    model = PatientContact
115
    form_class = forms.PatientContactForm
116
    template_name = 'dossiers/patientcontact_confirm_delete.html'
117
    success_url = '../../view#tab=2'
118

    
119
    def post(self, request, *args, **kwargs):
120
        try:
121
            patient = PatientRecord.objects.get(id=kwargs.get('pk'))
122
        except PatientRecord.DoesNotExist:
123
            return super(DeletePatientContactView, self).post(request, *args, **kwargs)
124
        # the contact is also a patient record; it shouldn't be deleted; just
125
        # altered to remove an address
126
        patient.addresses.remove(self.request.GET['address'])
127
        return HttpResponseRedirect(self.get_success_url())
128

    
129
delete_patient_contact = DeletePatientContactView.as_view()
130

    
131
class NewPatientAddressView(cbv.CreateView):
132
    model = PatientAddress
133
    form_class = forms.PatientAddressForm
134
    template_name = 'dossiers/patientaddress_new.html'
135
    success_url = '../view#tab=2'
136

    
137
    def get_success_url(self):
138
        return self.success_url
139

    
140
    def form_valid(self, form):
141
        patientaddress = form.save()
142
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
143
        patientrecord.addresses.add(patientaddress)
144
        return HttpResponseRedirect(self.get_success_url())
145

    
146
new_patient_address = NewPatientAddressView.as_view()
147

    
148
class UpdatePatientAddressView(cbv.UpdateView):
149
    model = PatientAddress
150
    form_class = forms.PatientAddressForm
151
    template_name = 'dossiers/patientaddress_new.html'
152
    success_url = '../../view#tab=2'
153

    
154
update_patient_address = UpdatePatientAddressView.as_view()
155

    
156
class DeletePatientAddressView(cbv.DeleteView):
157
    model = PatientAddress
158
    form_class = forms.PatientAddressForm
159
    template_name = 'dossiers/patientaddress_confirm_delete.html'
160
    success_url = '../../view#tab=2'
161

    
162
delete_patient_address = DeletePatientAddressView.as_view()
163

    
164

    
165
class NewHealthCareView(cbv.CreateView):
166

    
167
    def get_initial(self):
168
        initial = super(NewHealthCareView, self).get_initial()
169
        initial['author'] = self.request.user.id
170
        initial['patient'] = self.kwargs['patientrecord_id']
171
        return initial
172

    
173
new_healthcare_treatment = \
174
    NewHealthCareView.as_view(model=CmppHealthCareTreatment,
175
        template_name = 'dossiers/generic_form.html',
176
        success_url = '../view#tab=3',
177
        form_class=forms.CmppHealthCareTreatmentForm)
178
new_healthcare_diagnostic = \
179
    NewHealthCareView.as_view(model=CmppHealthCareDiagnostic,
180
        template_name = 'dossiers/generic_form.html',
181
        success_url = '../view#tab=3',
182
        form_class=forms.CmppHealthCareDiagnosticForm)
183
new_healthcare_notification = \
184
    NewHealthCareView.as_view(model=SessadHealthCareNotification,
185
        template_name = 'dossiers/generic_form.html',
186
        success_url = '../view#tab=3',
187
        form_class=forms.SessadHealthCareNotificationForm)
188
update_healthcare_treatment = \
189
    cbv.UpdateView.as_view(model=CmppHealthCareTreatment,
190
        template_name = 'dossiers/generic_form.html',
191
        success_url = '../../view#tab=3',
192
        form_class=forms.CmppHealthCareTreatmentForm)
193
update_healthcare_diagnostic = \
194
    cbv.UpdateView.as_view(model=CmppHealthCareDiagnostic,
195
        template_name = 'dossiers/generic_form.html',
196
        success_url = '../../view#tab=3',
197
        form_class=forms.CmppHealthCareDiagnosticForm)
198
update_healthcare_notification = \
199
    cbv.UpdateView.as_view(model=SessadHealthCareNotification,
200
        template_name = 'dossiers/generic_form.html',
201
        success_url = '../../view#tab=3',
202
        form_class=forms.SessadHealthCareNotificationForm)
203
delete_healthcare_treatment = \
204
    cbv.DeleteView.as_view(model=CmppHealthCareTreatment,
205
        template_name = 'dossiers/generic_confirm_delete.html',
206
        success_url = '../../view#tab=3')
207
delete_healthcare_diagnostic = \
208
    cbv.DeleteView.as_view(model=CmppHealthCareDiagnostic,
209
        template_name = 'dossiers/generic_confirm_delete.html',
210
        success_url = '../../view#tab=3')
211
delete_healthcare_notification = \
212
    cbv.DeleteView.as_view(model=SessadHealthCareNotification,
213
        template_name = 'dossiers/generic_confirm_delete.html',
214
        success_url = '../../view#tab=3')
215

    
216

    
217
class StateFormView(cbv.FormView):
218
    template_name = 'dossiers/state.html'
219
    form_class = forms.StateForm
220
    success_url = './view#tab=0'
221

    
222
    def post(self, request, *args, **kwarg):
223
        self.user = request.user
224
        return super(StateFormView, self).post(request, *args, **kwarg)
225

    
226
    def form_valid(self, form):
227
        service = Service.objects.get(id=form.data['service_id'])
228
        status = Status.objects.filter(services=service).filter(type=form.data['state_type'])
229
        patient = PatientRecord.objects.get(id=form.data['patient_id'])
230
        date_selected = datetime.strptime(form.data['date'], "%d/%m/%Y")
231
        patient.set_state(status[0], self.user, date_selected, form.data['comment'])
232
        return super(StateFormView, self).form_valid(form)
233

    
234
state_form = StateFormView.as_view()
235

    
236

    
237
class PatientRecordView(cbv.ServiceViewMixin, cbv.MultiUpdateView):
238
    model = PatientRecord
239
    forms_classes = {
240
            'general': forms.GeneralForm,
241
            'id': forms.CivilStatusForm,
242
            'physiology': forms.PhysiologyForm,
243
            'inscription': forms.InscriptionForm,
244
            'out': forms.OutForm,
245
            'family': forms.FamilyForm,
246
            'transport': forms.TransportFrom,
247
            'followup': forms.FollowUpForm,
248
            'policyholder': forms.PolicyHolderForm
249
            }
250
    template_name = 'dossiers/patientrecord_update.html'
251
    success_url = './view'
252

    
253
    def get_success_url(self):
254
        if self.request.POST.has_key('tab'):
255
            return self.success_url + '#tab=' + self.request.POST['tab']
256
        else:
257
            return self.success_url
258

    
259
    def get_context_data(self, **kwargs):
260
        ctx = super(PatientRecordView, self).get_context_data(**kwargs)
261
        ctx['initial_state'] = ctx['object'].get_initial_state()
262
        current_state = ctx['object'].get_current_state()
263
        if STATES_MAPPING.has_key(current_state.status.type):
264
            state = STATES_MAPPING[current_state.status.type]
265
        else:
266
            state = current_state.status.name
267
        ctx['current_state'] = current_state
268
        ctx['service_id'] = self.service.id
269
        ctx['states'] = FileState.objects.filter(patient=self.object).filter(status__services=self.service)
270
        ctx['next_rdvs'] = []
271
        Q = models.Q
272
        today = date.today()
273
        qs = EventWithAct.objects.filter(patient=ctx['object']) \
274
                .filter(exception_to__isnull=True, canceled=False) \
275
                .filter(Q(start_datetime__gte=today)
276
                        | ( Q(recurrence_periodicity__isnull=False)
277
                            & (Q(recurrence_end_date__gte=today)
278
                               | Q(recurrence_end_date__isnull=True)))) \
279
                .select_related() \
280
                .prefetch_related('participants', 'exceptions__eventwithact', 'act_set__actvalidationstate_set')
281
        occurrences = []
282
        for event in qs:
283
            occurrences.extend(filter(lambda e: e.start_datetime.date() >= today, event.all_occurences(limit=180)))
284
        occurrences = sorted(occurrences, key=lambda e: e.start_datetime)
285
        for event in occurrences:
286
            state = None
287
            if event.act:
288
                state = event.act.get_state()
289
            if state and not state.previous_state and state.state_name == 'NON_VALIDE':
290
                state = None
291
            ctx['next_rdvs'].append((event, state))
292
        if ctx['next_rdvs']:
293
            ctx['next_rdv'] = ctx['next_rdvs'][0][0]
294
        ctx['last_rdvs'] = []
295
        for act in Act.objects.last_acts(ctx['object']).prefetch_related('doctors'):
296
            state = act.get_state()
297
            if state and not state.previous_state and state.state_name == 'NON_VALIDE':
298
                state = None
299
            ctx['last_rdvs'].append((act, state))
300
        ctx['last_rdv'] = get_last_rdv(ctx['object'])
301
        ctx['status'] = []
302
        if ctx['object'].service.name == "CMPP":
303
            if ctx['object'].last_state.status.type == "ACCUEIL":
304
                # Inscription automatique au premier acte facturable valide
305
                ctx['status'] = [STATES_BTN_MAPPER['FIN_ACCUEIL'],
306
                        STATES_BTN_MAPPER['DIAGNOSTIC'],
307
                        STATES_BTN_MAPPER['TRAITEMENT']]
308
            elif ctx['object'].last_state.status.type == "FIN_ACCUEIL":
309
                # Passage automatique en diagnostic ou traitement
310
                ctx['status'] = [STATES_BTN_MAPPER['ACCUEIL'],
311
                        STATES_BTN_MAPPER['DIAGNOSTIC'],
312
                        STATES_BTN_MAPPER['TRAITEMENT']]
313
            elif ctx['object'].last_state.status.type == "DIAGNOSTIC":
314
                # Passage automatique en traitement
315
                ctx['status'] = [STATES_BTN_MAPPER['TRAITEMENT'],
316
                        STATES_BTN_MAPPER['CLOS'],
317
                        STATES_BTN_MAPPER['ACCUEIL']]
318
            elif ctx['object'].last_state.status.type == "TRAITEMENT":
319
                # Passage automatique en diagnostic si on ajoute une prise en charge diagnostic,
320
                # ce qui est faisable dans l'onglet prise en charge par un bouton visible sous conditions
321
                ctx['status'] = [STATES_BTN_MAPPER['DIAGNOSTIC'],
322
                        STATES_BTN_MAPPER['CLOS'],
323
                        STATES_BTN_MAPPER['ACCUEIL']]
324
            elif ctx['object'].last_state.status.type == "CLOS":
325
                # Passage automatique en diagnostic ou traitement
326
                ctx['status'] = [STATES_BTN_MAPPER['DIAGNOSTIC'],
327
                        STATES_BTN_MAPPER['TRAITEMENT'],
328
                        STATES_BTN_MAPPER['ACCUEIL']]
329
        elif ctx['object'].service.name == "CAMSP":
330
            if ctx['object'].last_state.status.type == "ACCUEIL":
331
                ctx['status'] = [STATES_BTN_MAPPER['FIN_ACCUEIL'],
332
                        STATES_BTN_MAPPER['BILAN']]
333
            elif ctx['object'].last_state.status.type == "FIN_ACCUEIL":
334
                ctx['status'] = [STATES_BTN_MAPPER['ACCUEIL'],
335
                        STATES_BTN_MAPPER['BILAN'],
336
                        STATES_BTN_MAPPER['SURVEILLANCE'],
337
                        STATES_BTN_MAPPER['SUIVI'],
338
                        STATES_BTN_MAPPER['CLOS']]
339
            elif ctx['object'].last_state.status.type == "BILAN":
340
                ctx['status'] = [STATES_BTN_MAPPER['SURVEILLANCE'],
341
                        STATES_BTN_MAPPER['SUIVI'],
342
                        STATES_BTN_MAPPER['CLOS'],
343
                        STATES_BTN_MAPPER['ACCUEIL']]
344
            elif ctx['object'].last_state.status.type == "SURVEILLANCE":
345
                ctx['status'] = [STATES_BTN_MAPPER['SUIVI'],
346
                        STATES_BTN_MAPPER['CLOS'],
347
                        STATES_BTN_MAPPER['ACCUEIL'],
348
                        STATES_BTN_MAPPER['BILAN']]
349
            elif ctx['object'].last_state.status.type == "SUIVI":
350
                ctx['status'] = [STATES_BTN_MAPPER['CLOS'],
351
                        STATES_BTN_MAPPER['ACCUEIL'],
352
                        STATES_BTN_MAPPER['BILAN'],
353
                        STATES_BTN_MAPPER['SURVEILLANCE']]
354
            elif ctx['object'].last_state.status.type == "CLOS":
355
                ctx['status'] = [STATES_BTN_MAPPER['ACCUEIL'],
356
                        STATES_BTN_MAPPER['BILAN'],
357
                        STATES_BTN_MAPPER['SURVEILLANCE'],
358
                        STATES_BTN_MAPPER['SUIVI']]
359
        elif ctx['object'].service.name == "SESSAD TED" or ctx['object'].service.name == "SESSAD DYS":
360
            if ctx['object'].last_state.status.type == "ACCUEIL":
361
                ctx['status'] = [STATES_BTN_MAPPER['FIN_ACCUEIL'],
362
                        STATES_BTN_MAPPER['TRAITEMENT']]
363
            elif ctx['object'].last_state.status.type == "FIN_ACCUEIL":
364
                ctx['status'] = [STATES_BTN_MAPPER['ACCUEIL'],
365
                        STATES_BTN_MAPPER['TRAITEMENT'],
366
                        STATES_BTN_MAPPER['CLOS']]
367
            elif ctx['object'].last_state.status.type == "TRAITEMENT":
368
                ctx['status'] = [STATES_BTN_MAPPER['CLOS'],
369
                        STATES_BTN_MAPPER['ACCUEIL']]
370
            elif ctx['object'].last_state.status.type == "CLOS":
371
                ctx['status'] = [STATES_BTN_MAPPER['ACCUEIL'],
372
                        STATES_BTN_MAPPER['TRAITEMENT']]
373
        ctx['can_rediag'] = self.object.create_diag_healthcare(self.request.user)
374
        ctx['hcs'] = HealthCare.objects.filter(patient=self.object).order_by('-start_date')
375
        return ctx
376

    
377
    def form_valid(self, form):
378
        messages.add_message(self.request, messages.INFO, u'Modification enregistrée avec succès.')
379
        return super(PatientRecordView, self).form_valid(form)
380

    
381

    
382
patient_record = PatientRecordView.as_view()
383

    
384
class PatientRecordsHomepageView(cbv.ListView):
385
    model = PatientRecord
386
    template_name = 'dossiers/index.html'
387

    
388

    
389
    def _get_search_result(self, paginate_patient_records):
390
        patient_records = []
391
        for patient_record in paginate_patient_records:
392
            next_rdv = get_next_rdv(patient_record)
393
            last_rdv = get_last_rdv(patient_record)
394
            current_status = patient_record.last_state.status
395
            state = current_status.name
396
            state_class = current_status.type.lower()
397
            patient_records.append(
398
                    {
399
                        'object': patient_record,
400
                        'next_rdv': next_rdv,
401
                        'last_rdv': last_rdv,
402
                        'state': state,
403
                        'state_class': state_class
404
                        }
405
                    )
406
        return patient_records
407

    
408
    def get_queryset(self):
409
        first_name = self.request.GET.get('first_name')
410
        last_name = self.request.GET.get('last_name')
411
        paper_id = self.request.GET.get('paper_id')
412
        id = self.request.GET.get('id')
413
        social_security_id = self.request.GET.get('social_security_id')
414
        if not (first_name or last_name or paper_id or id or social_security_id):
415
            return None
416
        if (first_name and len(first_name) < 2) or (last_name and len(last_name) < 2):
417
            return None
418
        qs = super(PatientRecordsHomepageView, self).get_queryset()
419
        states = self.request.GET.getlist('states')
420
        if last_name:
421
            qs = qs.filter(last_name__icontains=last_name)
422
        if first_name:
423
            qs = qs.filter(first_name__icontains=first_name)
424
        if paper_id:
425
            qs = qs.filter(paper_id__startswith=paper_id)
426
        if id:
427
            qs = qs.filter(id__startswith=id)
428
        if social_security_id:
429
            qs = qs.filter(models.Q(social_security_id__startswith=social_security_id) | \
430
                models.Q(contacts__social_security_id__startswith=social_security_id))
431
        if states:
432
            qs = qs.filter(last_state__status__id__in=states)
433
        else:
434
            qs = qs.filter(last_state__status__type__in="")
435
        qs = qs.filter(service=self.service).order_by('last_name').\
436
                prefetch_related('last_state',
437
                        'patientcontact', 'last_state__status')
438
        return qs
439

    
440
    def get_context_data(self, **kwargs):
441
        ctx = super(PatientRecordsHomepageView, self).get_context_data(**kwargs)
442
        ctx['search_form'] = forms.SearchForm(service=self.service, data=self.request.GET or None)
443
        ctx['stats'] = [["Dossiers", 0]]
444
        for status in Status.objects.filter(services=self.service):
445
            ctx['stats'].append([status.name, 0])
446

    
447
        page = self.request.GET.get('page')
448
        if ctx['object_list']:
449
            patient_records = ctx['object_list'].filter()
450
        else:
451
            patient_records = []
452

    
453
        # TODO: use a sql query to do this
454
        for patient_record in patient_records:
455
            ctx['stats'][0][1] += 1
456
            for elem in ctx['stats']:
457
                if elem[0] == patient_record.last_state.status.name:
458
                    elem[1] += 1
459
        paginator = Paginator(patient_records, 50)
460
        try:
461
            paginate_patient_records = paginator.page(page)
462
        except PageNotAnInteger:
463
            paginate_patient_records = paginator.page(1)
464
        except EmptyPage:
465
            paginate_patient_records = paginator.page(paginator.num_pages)
466

    
467
        query = self.request.GET.copy()
468
        if 'page' in query:
469
            del query['page']
470
        ctx['query'] = query.urlencode()
471

    
472
        ctx['paginate_patient_records'] = paginate_patient_records
473
        ctx['patient_records'] = self._get_search_result(paginate_patient_records)
474
        return ctx
475

    
476
patientrecord_home = PatientRecordsHomepageView.as_view()
477

    
478
class PatientRecordDeleteView(DeleteView):
479
    model = PatientRecord
480
    success_url = ".."
481
    template_name = 'dossiers/patientrecord_confirm_delete.html'
482

    
483
patientrecord_delete = validator_only(PatientRecordDeleteView.as_view())
484

    
485

    
486
class PatientRecordPaperIDUpdateView(cbv.UpdateView):
487
    model = PatientRecord
488
    form_class = forms.PaperIDForm
489
    template_name = 'dossiers/generic_form.html'
490
    success_url = '../..'
491

    
492
update_paper_id = PatientRecordPaperIDUpdateView.as_view()
493

    
494

    
495
class NewSocialisationDurationView(cbv.CreateView):
496
    model = SocialisationDuration
497
    form_class = forms.SocialisationDurationForm
498
    template_name = 'dossiers/generic_form.html'
499
    success_url = '../view#tab=6'
500

    
501
    def get_success_url(self):
502
        return self.success_url
503

    
504
    def get(self, request, *args, **kwargs):
505
        if kwargs.has_key('patientrecord_id'):
506
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
507
        return super(NewSocialisationDurationView, self).get(request, *args, **kwargs)
508

    
509
    def form_valid(self, form):
510
        duration = form.save()
511
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
512
        patientrecord.socialisation_durations.add(duration)
513
        return HttpResponseRedirect(self.get_success_url())
514

    
515
new_socialisation_duration = NewSocialisationDurationView.as_view()
516

    
517
class UpdateSocialisationDurationView(cbv.UpdateView):
518
    model = SocialisationDuration
519
    form_class = forms.SocialisationDurationForm
520
    template_name = 'dossiers/generic_form.html'
521
    success_url = '../../view#tab=6'
522

    
523
    def get(self, request, *args, **kwargs):
524
        if kwargs.has_key('patientrecord_id'):
525
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
526
        return super(UpdateSocialisationDurationView, self).get(request, *args, **kwargs)
527

    
528
update_socialisation_duration = UpdateSocialisationDurationView.as_view()
529

    
530
class DeleteSocialisationDurationView(cbv.DeleteView):
531
    model = SocialisationDuration
532
    form_class = forms.SocialisationDurationForm
533
    template_name = 'dossiers/socialisationduration_confirm_delete.html'
534
    success_url = '../../view#tab=6'
535

    
536
delete_socialisation_duration = DeleteSocialisationDurationView.as_view()
537

    
538

    
539
class NewMDPHRequestView(cbv.CreateView):
540
    def get(self, request, *args, **kwargs):
541
        if kwargs.has_key('patientrecord_id'):
542
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
543
        return super(NewMDPHRequestView, self).get(request, *args, **kwargs)
544

    
545
    def form_valid(self, form):
546
        request = form.save()
547
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
548
        patientrecord.mdph_requests.add(request)
549
        return HttpResponseRedirect(self.success_url)
550

    
551
class UpdateMDPHRequestView(cbv.UpdateView):
552
    def get(self, request, *args, **kwargs):
553
        if kwargs.has_key('patientrecord_id'):
554
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
555
        return super(UpdateMDPHRequestView, self).get(request, *args, **kwargs)
556

    
557

    
558
new_mdph_request = \
559
    NewMDPHRequestView.as_view(model=MDPHRequest,
560
        template_name = 'dossiers/generic_form.html',
561
        success_url = '../view#tab=6',
562
        form_class=forms.MDPHRequestForm)
563
update_mdph_request = \
564
    UpdateMDPHRequestView.as_view(model=MDPHRequest,
565
        template_name = 'dossiers/generic_form.html',
566
        success_url = '../../view#tab=6',
567
        form_class=forms.MDPHRequestForm)
568
delete_mdph_request = \
569
    cbv.DeleteView.as_view(model=MDPHRequest,
570
        template_name = 'dossiers/generic_confirm_delete.html',
571
        success_url = '../../view#tab=6')
572

    
573
class NewMDPHResponseView(cbv.CreateView):
574
    def get(self, request, *args, **kwargs):
575
        if kwargs.has_key('patientrecord_id'):
576
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
577
        return super(NewMDPHResponseView, self).get(request, *args, **kwargs)
578

    
579
    def form_valid(self, form):
580
        response = form.save()
581
        patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
582
        patientrecord.mdph_responses.add(response)
583
        return HttpResponseRedirect(self.success_url)
584

    
585
class UpdateMDPHResponseView(cbv.UpdateView):
586
    def get(self, request, *args, **kwargs):
587
        if kwargs.has_key('patientrecord_id'):
588
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
589
        return super(UpdateMDPHResponseView, self).get(request, *args, **kwargs)
590

    
591

    
592
new_mdph_response = \
593
    NewMDPHResponseView.as_view(model=MDPHResponse,
594
        template_name = 'dossiers/generic_form.html',
595
        success_url = '../view#tab=6',
596
        form_class=forms.MDPHResponseForm)
597
update_mdph_response = \
598
    UpdateMDPHResponseView.as_view(model=MDPHResponse,
599
        template_name = 'dossiers/generic_form.html',
600
        success_url = '../../view#tab=6',
601
        form_class=forms.MDPHResponseForm)
602
delete_mdph_response = \
603
    cbv.DeleteView.as_view(model=MDPHResponse,
604
        template_name = 'dossiers/generic_confirm_delete.html',
605
        success_url = '../../view#tab=6')
606

    
607

    
608
class UpdatePatientStateView(cbv.UpdateView):
609
    def get(self, request, *args, **kwargs):
610
        if kwargs.has_key('patientrecord_id'):
611
            request.session['patientrecord_id'] = kwargs['patientrecord_id']
612
        return super(UpdatePatientStateView, self).get(request, *args, **kwargs)
613

    
614
update_patient_state = \
615
    UpdatePatientStateView.as_view(model=FileState,
616
        template_name = 'dossiers/generic_form.html',
617
        success_url = '../../view#tab=0',
618
        form_class=forms.PatientStateForm)
619
delete_patient_state = \
620
    cbv.DeleteView.as_view(model=FileState,
621
        template_name = 'dossiers/generic_confirm_delete.html',
622
        success_url = '../../view#tab=0')
623

    
624

    
625
class GenerateRtfFormView(cbv.FormView):
626
    template_name = 'dossiers/generate_rtf_form.html'
627
    form_class = forms.GenerateRtfForm
628
    success_url = './view#tab=0'
629

    
630
    def get_context_data(self, **kwargs):
631
        ctx = super(GenerateRtfFormView, self).get_context_data(**kwargs)
632
        ctx['object'] = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
633
        ctx['service_id'] = self.service.id
634
        if self.request.GET.get('event-id'):
635
            date = self.request.GET.get('date')
636
            date = datetime.strptime(date, '%Y-%m-%d').date()
637
            appointment = Appointment()
638
            event = EventWithAct.objects.get(id=self.request.GET.get('event-id'))
639
            event = event.today_occurrence(date)
640
            appointment.init_from_event(event, self.service)
641
            ctx['appointment'] = appointment
642
        return ctx
643

    
644
    def form_valid(self, form):
645
        patient = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
646
        template_filename = form.cleaned_data.get('template_filename')
647
        dest_filename = datetime.now().strftime('%Y-%m-%d--%H:%M') + '--' + template_filename
648
        from_path = os.path.join(settings.RTF_TEMPLATES_DIRECTORY, template_filename)
649
        to_path = os.path.join(patient.get_ondisk_directory(self.service.name), dest_filename)
650
        vars = {'AD11': '', 'AD12': '', 'AD13': '', 'AD14': '', 'AD15': '',
651
                'JOU1': datetime.today().strftime('%d/%m/%Y'),
652
                'VIL1': u'Saint-Étienne',
653
                'PRE1': form.cleaned_data.get('first_name'),
654
                'NOM1': form.cleaned_data.get('last_name'),
655
                'DPA1': form.cleaned_data.get('appointment_intervenants')
656
               }
657
        for i, line in enumerate(form.cleaned_data.get('address').splitlines()):
658
            vars['AD%d' % (11+i)] = line
659
        make_doc_from_template(from_path, to_path, vars)
660

    
661
        client_dir = patient.get_client_side_directory(self.service.name)
662
        if not client_dir:
663
            response = HttpResponse(mimetype='text/rtf')
664
            response['Content-Disposition'] = 'attachment; filename="%s"' % dest_filename
665
            response.write(file(to_path).read())
666
            return response
667
        else:
668
            class LocalFileHttpResponseRedirect(HttpResponseRedirect):
669
                allowed_schemes = ['file']
670
            client_filepath = os.path.join(client_dir, dest_filename)
671
            return LocalFileHttpResponseRedirect('file://' + client_filepath)
672

    
673
generate_rtf_form = GenerateRtfFormView.as_view()
674

    
675

    
676
class PatientRecordsQuotationsView(cbv.ListView):
677
    model = PatientRecord
678
    template_name = 'dossiers/quotations.html'
679

    
680
    def _get_search_result(self, paginate_patient_records):
681
        patient_records = []
682
        for patient_record in paginate_patient_records:
683
            next_rdv = get_next_rdv(patient_record)
684
            last_rdv = get_last_rdv(patient_record)
685
            current_state = patient_record.get_current_state()
686
            state = current_state.status.name
687
            state_class = current_state.status.type.lower()
688
            patient_records.append(
689
                    {
690
                        'object': patient_record,
691
                        'state': state,
692
                        'state_class': state_class
693
                        }
694
                    )
695
        return patient_records
696

    
697
    def get_queryset(self):
698
        form = forms.QuotationsForm(data=self.request.GET or None)
699
        qs = super(PatientRecordsQuotationsView, self).get_queryset()
700
        without_quotations = self.request.GET.get('without_quotations')
701
        if without_quotations:
702
            qs = qs.filter(mises_1=None).filter(mises_2=None).filter(mises_3=None)
703
        states = self.request.GET.getlist('states')
704
        qs = qs.filter(last_state__status__id__in=states)
705

    
706
        try:
707
            date_actes_start = datetime.strptime(form.data['date_actes_start'], "%d/%m/%Y")
708
            qs = qs.filter(act_set__date__gte=date_actes_start.date())
709
        except (ValueError, KeyError):
710
            pass
711
        try:
712
            date_actes_end = datetime.strptime(form.data['date_actes_end'], "%d/%m/%Y")
713
            qs = qs.filter(act_set__date__lte=date_actes_end.date())
714
        except (ValueError, KeyError):
715
            pass
716
        qs = qs.filter(service=self.service).order_by('last_name').prefetch_related()
717
        return qs
718

    
719
    def get_context_data(self, **kwargs):
720
        ctx = super(PatientRecordsQuotationsView, self).get_context_data(**kwargs)
721
        ctx['search_form'] = forms.QuotationsForm(data=self.request.GET or None,
722
                service=self.service)
723
        patient_records = []
724
        page = self.request.GET.get('page')
725
        paginator = Paginator(ctx['object_list'].filter(), 50)
726
        try:
727
            paginate_patient_records = paginator.page(page)
728
        except PageNotAnInteger:
729
            paginate_patient_records = paginator.page(1)
730
        except EmptyPage:
731
            paginate_patient_records = paginator.page(paginator.num_pages)
732

    
733
        ctx['patient_records'] = self._get_search_result(paginate_patient_records)
734
        ctx['paginate_patient_records'] = paginate_patient_records
735

    
736
        query = self.request.GET.copy()
737
        if 'page' in query:
738
            del query['page']
739
        ctx['query'] = query.urlencode()
740

    
741
        return ctx
742

    
743
patientrecord_quotations = PatientRecordsQuotationsView.as_view()
744

    
745

    
746
class CreateDirectoryView(View, cbv.ServiceViewMixin):
747
    def post(self, request, *args, **kwargs):
748
        patient = PatientRecord.objects.get(id=kwargs['patientrecord_id'])
749
        service = Service.objects.get(slug=kwargs['service'])
750
        patient.get_ondisk_directory(service.name)
751
        messages.add_message(self.request, messages.INFO, u'Répertoire patient créé.')
752
        return HttpResponseRedirect('view')
753

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