Project

General

Profile

Download (47.2 KB) Statistics
| Branch: | Tag: | Revision:
f6203b66 Frédéric Péters
# -*- coding: utf-8 -*-

23937808 Frédéric Péters
import os

4e8467aa Benjamin Dauvergne
from datetime import datetime, date
54f8d003 Jérôme Schneider
23937808 Frédéric Péters
from django.conf import settings
17e36a37 Frédéric Péters
from django.db import models
23937808 Frédéric Péters
from django.http import HttpResponseRedirect, HttpResponse
7bc87b6f Frédéric Péters
from django.views.generic import View
3c5df84d Jérôme Schneider
from django.views.generic.edit import DeleteView
f6203b66 Frédéric Péters
from django.contrib import messages
43a5b181 Frédéric Péters
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
364eecbe Mikaël Ates
from django.core.files import File
cda02476 Mikaël Ates
from django.forms import Form
61c88ce1 Mikaël Ates
from django.utils import formats
5497fedd Mikaël Ates
from django.shortcuts import get_object_or_404
e7898322 Jérôme Schneider
554289d5 Jérôme Schneider
from calebasse import cbv
23937808 Frédéric Péters
from calebasse.doc_templates import make_doc_from_template
317bcb4c Jérôme Schneider
from calebasse.dossiers import forms
aa31cdc8 Jérôme Schneider
from calebasse.dossiers.views_utils import get_next_rdv, get_last_rdv, get_status
cda02476 Mikaël Ates
from calebasse.dossiers.transport import render_transport
76974b6f Benjamin Dauvergne
from calebasse.agenda.models import Event, EventWithAct
from calebasse.actes.models import Act
23937808 Frédéric Péters
from calebasse.agenda.appointments import Appointment
29168b44 Jérôme Schneider
from calebasse.dossiers.models import (PatientRecord, PatientContact,
b8957f1d Jérôme Schneider
PatientAddress, Status, FileState, create_patient, CmppHealthCareTreatment,
07b0577e Mikaël Ates
CmppHealthCareDiagnostic, SessadHealthCareNotification, HealthCare,
5497fedd Mikaël Ates
TransportPrescriptionLog, ProtectionState)
3c5df84d Jérôme Schneider
from calebasse.dossiers.states import STATES_MAPPING, STATES_BTN_MAPPER
00c7103f Mikaël Ates
from calebasse.ressources.models import (Service,
c8083788 Mikaël Ates
SocialisationDuration, MDPHRequest, MDPHResponse)
523c5aaf Mikaël Ates
from calebasse.facturation.list_acts import list_acts_for_billing_CMPP_per_patient
3b4bba4a Serghei MIHAI
from calebasse.facturation.invoice_header import render_to_pdf_file
c20d5459 Jérôme Schneider
8630b77b Mikaël Ates
from calebasse.decorators import validator_only
f3407c83 Jérôme Schneider
e24683bd Jérôme Schneider
cea6ec34 Jérôme Schneider
class NewPatientRecordView(cbv.FormView, cbv.ServiceViewMixin):
317bcb4c Jérôme Schneider
form_class = forms.NewPatientRecordForm
554289d5 Jérôme Schneider
template_name = 'dossiers/patientrecord_new.html'
success_url = '..'
77c6fe82 Frédéric Péters
patient = None
554289d5 Jérôme Schneider
def post(self, request, *args, **kwarg):
self.user = request.user
return super(NewPatientRecordView, self).post(request, *args, **kwarg)

def form_valid(self, form):
5327927f Mikaël Ates
self.patient = create_patient(form.data['first_name'], form.data['last_name'], self.service,
self.user, date_selected=datetime.strptime(form.data['date_selected'], "%d/%m/%Y"))
554289d5 Jérôme Schneider
return super(NewPatientRecordView, self).form_valid(form)

77c6fe82 Frédéric Péters
def get_success_url(self):
return '%s/view' % self.patient.id

554289d5 Jérôme Schneider
new_patient_record = NewPatientRecordView.as_view()

f8606a78 Benjamin Dauvergne
class RecordPatientRecordIdMixing(object):
def dispatch(self, request, *args, **kwargs):
5d625358 Jérôme Schneider
self.patientrecord_id = request.session['patientrecord_id'] = int(kwargs['patientrecord_id'])
f8606a78 Benjamin Dauvergne
return super(RecordPatientRecordIdMixing, self).dispatch(request, *args, **kwargs)

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

class NewPatientContactView(RecordPatientRecordIdMixing, cbv.CreateView):
317bcb4c Jérôme Schneider
model = PatientContact
f8606a78 Benjamin Dauvergne
form_class = forms.PatientContactForm
dfd4bd12 Jérôme Schneider
template_name = 'dossiers/patientcontact_new.html'
success_url = '../view#tab=2'
317bcb4c Jérôme Schneider
6d9e4005 Jérôme Schneider
def get_initial(self):
initial = super(NewPatientContactView, self).get_initial()
fields = self.form_class.base_fields.keys()
for arg in self.request.GET.keys():
if arg in fields:
5a1c0763 Jérôme Schneider
if arg == 'addresses':
value = self.request.GET.getlist(arg)
else:
value = self.request.GET.get(arg)
0bbd4c47 Jérôme Schneider
initial[arg] = value
if initial:
5a1c0763 Jérôme Schneider
if not initial.has_key('addresses'):
initial['addresses'] = []
0bbd4c47 Jérôme Schneider
patient = PatientRecord.objects.get(id=self.patientrecord_id)
addresses = patient.addresses.order_by('-id')
if addresses:
initial['addresses'].append(addresses[0].pk)
6d9e4005 Jérôme Schneider
return initial

1a9b2fe9 Jérôme Schneider
new_patient_contact = NewPatientContactView.as_view()
317bcb4c Jérôme Schneider
95593005 Serghei MIHAI
class UpdatePatientContactView(RecordPatientRecordIdMixing, cbv.NotificationDisplayView, cbv.UpdateView):
0ad2d82a Jérôme Schneider
model = PatientContact
f8606a78 Benjamin Dauvergne
form_class = forms.PatientContactForm
0ad2d82a Jérôme Schneider
template_name = 'dossiers/patientcontact_new.html'
success_url = '../../view#tab=2'

update_patient_contact = UpdatePatientContactView.as_view()

dfd4bd12 Jérôme Schneider
class DeletePatientContactView(cbv.DeleteView):
model = PatientContact
form_class = forms.PatientContactForm
template_name = 'dossiers/patientcontact_confirm_delete.html'
success_url = '../../view#tab=2'

40de3ad2 Frédéric Péters
def post(self, request, *args, **kwargs):
try:
patient = PatientRecord.objects.get(id=kwargs.get('pk'))
except PatientRecord.DoesNotExist:
return super(DeletePatientContactView, self).post(request, *args, **kwargs)
# the contact is also a patient record; it shouldn't be deleted; just
# altered to remove an address
patient.addresses.remove(self.request.GET['address'])
return HttpResponseRedirect(self.get_success_url())

dfd4bd12 Jérôme Schneider
delete_patient_contact = DeletePatientContactView.as_view()

1a9b2fe9 Jérôme Schneider
class NewPatientAddressView(cbv.CreateView):
29168b44 Jérôme Schneider
model = PatientAddress
form_class = forms.PatientAddressForm
dfd4bd12 Jérôme Schneider
template_name = 'dossiers/patientaddress_new.html'
success_url = '../view#tab=2'
29168b44 Jérôme Schneider
1a9b2fe9 Jérôme Schneider
def get_success_url(self):
return self.success_url

def form_valid(self, form):
patientaddress = form.save()
patientrecord = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
patientrecord.addresses.add(patientaddress)
fca68db0 Jérôme Schneider
messages.add_message(self.request, messages.INFO, u'Nouvelle adresse enregistrée avec succès.')
1a9b2fe9 Jérôme Schneider
return HttpResponseRedirect(self.get_success_url())
29168b44 Jérôme Schneider
1a9b2fe9 Jérôme Schneider
new_patient_address = NewPatientAddressView.as_view()
29168b44 Jérôme Schneider
95593005 Serghei MIHAI
class UpdatePatientAddressView(cbv.NotificationDisplayView, cbv.UpdateView):
4e9e8ae5 Jérôme Schneider
model = PatientAddress
form_class = forms.PatientAddressForm
template_name = 'dossiers/patientaddress_new.html'
success_url = '../../view#tab=2'

update_patient_address = UpdatePatientAddressView.as_view()

dfd4bd12 Jérôme Schneider
class DeletePatientAddressView(cbv.DeleteView):
model = PatientAddress
form_class = forms.PatientAddressForm
template_name = 'dossiers/patientaddress_confirm_delete.html'
success_url = '../../view#tab=2'

delete_patient_address = DeletePatientAddressView.as_view()

b464657d Mikaël Ates
1d205fa9 Mikaël Ates
class NewHealthCareView(cbv.CreateView):
b464657d Mikaël Ates
2da0976b Jérôme Schneider
def get_initial(self):
b8957f1d Jérôme Schneider
initial = super(NewHealthCareView, self).get_initial()
2da0976b Jérôme Schneider
initial['author'] = self.request.user.id
initial['patient'] = self.kwargs['patientrecord_id']
return initial
b464657d Mikaël Ates
1d205fa9 Mikaël Ates
new_healthcare_treatment = \
NewHealthCareView.as_view(model=CmppHealthCareTreatment,
template_name = 'dossiers/generic_form.html',
success_url = '../view#tab=3',
form_class=forms.CmppHealthCareTreatmentForm)
new_healthcare_diagnostic = \
NewHealthCareView.as_view(model=CmppHealthCareDiagnostic,
template_name = 'dossiers/generic_form.html',
success_url = '../view#tab=3',
form_class=forms.CmppHealthCareDiagnosticForm)
new_healthcare_notification = \
NewHealthCareView.as_view(model=SessadHealthCareNotification,
template_name = 'dossiers/generic_form.html',
success_url = '../view#tab=3',
form_class=forms.SessadHealthCareNotificationForm)
update_healthcare_treatment = \
cbv.UpdateView.as_view(model=CmppHealthCareTreatment,
template_name = 'dossiers/generic_form.html',
success_url = '../../view#tab=3',
b8957f1d Jérôme Schneider
form_class=forms.CmppHealthCareTreatmentForm)
1d205fa9 Mikaël Ates
update_healthcare_diagnostic = \
cbv.UpdateView.as_view(model=CmppHealthCareDiagnostic,
template_name = 'dossiers/generic_form.html',
success_url = '../../view#tab=3',
b8957f1d Jérôme Schneider
form_class=forms.CmppHealthCareDiagnosticForm)
1d205fa9 Mikaël Ates
update_healthcare_notification = \
cbv.UpdateView.as_view(model=SessadHealthCareNotification,
template_name = 'dossiers/generic_form.html',
success_url = '../../view#tab=3',
b8957f1d Jérôme Schneider
form_class=forms.SessadHealthCareNotificationForm)
1d205fa9 Mikaël Ates
delete_healthcare_treatment = \
cbv.DeleteView.as_view(model=CmppHealthCareTreatment,
template_name = 'dossiers/generic_confirm_delete.html',
success_url = '../../view#tab=3')
delete_healthcare_diagnostic = \
cbv.DeleteView.as_view(model=CmppHealthCareDiagnostic,
template_name = 'dossiers/generic_confirm_delete.html',
success_url = '../../view#tab=3')
delete_healthcare_notification = \
cbv.DeleteView.as_view(model=SessadHealthCareNotification,
template_name = 'dossiers/generic_confirm_delete.html',
success_url = '../../view#tab=3')
b464657d Mikaël Ates

554289d5 Jérôme Schneider
class StateFormView(cbv.FormView):
f78e473c Jérôme Schneider
template_name = 'dossiers/state.html'
317bcb4c Jérôme Schneider
form_class = forms.StateForm
dfd4bd12 Jérôme Schneider
success_url = './view#tab=0'
f78e473c Jérôme Schneider
5f476468 Jérôme Schneider
54f8d003 Jérôme Schneider
def post(self, request, *args, **kwarg):
self.user = request.user
return super(StateFormView, self).post(request, *args, **kwarg)

f78e473c Jérôme Schneider
def form_valid(self, form):
54f8d003 Jérôme Schneider
service = Service.objects.get(id=form.data['service_id'])
status = Status.objects.filter(services=service).filter(type=form.data['state_type'])
patient = PatientRecord.objects.get(id=form.data['patient_id'])
date_selected = datetime.strptime(form.data['date'], "%d/%m/%Y")
patient.set_state(status[0], self.user, date_selected, form.data['comment'])
f78e473c Jérôme Schneider
return super(StateFormView, self).form_valid(form)

state_form = StateFormView.as_view()

aa31cdc8 Jérôme Schneider
class PatientRecordView(cbv.UpdateView):
f3407c83 Jérôme Schneider
model = PatientRecord
template_name = 'dossiers/patientrecord_update.html'
380f5426 Jérôme Schneider
f3407c83 Jérôme Schneider
def get_context_data(self, **kwargs):
ctx = super(PatientRecordView, self).get_context_data(**kwargs)
f3c2d53a Mikaël Ates
ctx['object'].create_diag_healthcare(self.request.user)
ctx['object'].automated_switch_state(self.request.user)
3665f853 Mikaël Ates
current_state = ctx['object'].get_current_state()
aa31cdc8 Jérôme Schneider
if not current_state:
current_state = ctx['object'].get_state()
ctx['future_state'] = True
3665f853 Mikaël Ates
if STATES_MAPPING.has_key(current_state.status.type):
state = STATES_MAPPING[current_state.status.type]
else:
state = current_state.status.name
ctx['current_state'] = current_state
54f8d003 Jérôme Schneider
ctx['service_id'] = self.service.id
7f360e71 Jérôme Schneider
ctx['states'] = FileState.objects.filter(patient=self.object) \
.filter(status__services=self.service) \
.order_by('-date_selected')
aa31cdc8 Jérôme Schneider
return ctx

patient_record = PatientRecordView.as_view()

3b4bba4a Serghei MIHAI
class PatientRecordPrint(cbv.DetailView):
model = PatientRecord
content_type = 'application/pdf'
template_name = 'dossiers/patientrecord_print.html'

def get_context_data(self, *args, **kwargs):
context = super(PatientRecordPrint, self).get_context_data(*args, **kwargs)
for view in (PatientRecordGeneralView, PatientRecordAdmView,
PatientRecordAddrView, PatientRecordNotifsView, PatientRecordOldActs,
PatientRecordNextAppointmentsView, PatientRecordSocialisationView):
view_instance = view(request=self.request, object=self.object,
service=self.service)
context.update(view_instance.get_context_data(object=self.object))
return context

def get(self, request, *args, **kwargs):
self.object = self.get_object()
path = render_to_pdf_file([self.template_name],
self.get_context_data(object = self.object))
content = File(file(path))
response = HttpResponse(content, self.content_type)
response['Content-Length'] = content.size
output = 'dossier_%s.pdf' % self.object.id
response['Content-Disposition'] = \
'attachment; filename="%s"' % output
return response

patient_record_print = PatientRecordPrint.as_view()

aa31cdc8 Jérôme Schneider
class PatientRecordGeneralView(cbv.UpdateView):
model = PatientRecord
form_class = forms.GeneralForm
template_name = 'dossiers/patientrecord_tab1_general.html'
success_url = './view'
a72d40ba Mikaël Ates
aa31cdc8 Jérôme Schneider
def get_context_data(self, **kwargs):
ctx = super(PatientRecordGeneralView, self).get_context_data(**kwargs)
ctx['nb_place_of_lifes'] = ctx['object'].addresses.filter(place_of_life=True).count()
ctx['initial_state'] = ctx['object'].get_initial_state()
ctx['last_rdv'] = get_last_rdv(ctx['object'])
ctx['next_rdv'] = get_next_rdv(ctx['object'])
current_state = ctx['object'].get_current_state()
c14fdef9 Jérôme Schneider
if current_state.status and STATES_MAPPING.has_key(current_state.status.type):
aa31cdc8 Jérôme Schneider
state = STATES_MAPPING[current_state.status.type]
c0ae5eb9 Jérôme Schneider
elif current_state.status:
state = current_state.status.name
aa31cdc8 Jérôme Schneider
else:
c0ae5eb9 Jérôme Schneider
state = "Aucun"
aa31cdc8 Jérôme Schneider
ctx['current_state'] = current_state
ctx['status'], ctx['hc_status'] = get_status(ctx, self.request.user)
a72d40ba Mikaël Ates
ctx['missing_policy'] = False
if not self.object.policyholder or \
not self.object.policyholder.health_center or \
not self.object.policyholder.social_security_id:
ctx['missing_policy'] = True
67992ef6 Mikaël Ates
ctx['missing_birthdate'] = False
if not self.object.birthdate:
ctx['missing_birthdate'] = True
aa31cdc8 Jérôme Schneider
return ctx
a72d40ba Mikaël Ates
aa31cdc8 Jérôme Schneider
tab1_general = PatientRecordGeneralView.as_view()

1a3d8912 Jérôme Schneider
class PatientRecordAdmView(cbv.UpdateView):
aa31cdc8 Jérôme Schneider
model = PatientRecord
1a3d8912 Jérôme Schneider
form_class = forms.AdministrativeForm
aa31cdc8 Jérôme Schneider
template_name = 'dossiers/patientrecord_tab2_fiche_adm.html'
success_url = './view#tab=1'

def get_context_data(self, **kwargs):
ctx = super(PatientRecordAdmView, self).get_context_data(**kwargs)
try:
ctx['last_prescription'] = TransportPrescriptionLog.objects.filter(patient=ctx['object']).latest('created')
except:
pass
return ctx

tab2_fiche_adm = PatientRecordAdmView.as_view()

95593005 Serghei MIHAI
class PatientRecordAddrView(cbv.ServiceViewMixin, cbv.NotificationDisplayView, cbv.MultiUpdateView):
aa31cdc8 Jérôme Schneider
model = PatientRecord
forms_classes = {
'contact': forms.PatientContactForm,
a869df8f Mikaël Ates
'policyholder': forms.PolicyHolderForm,
'comment' : forms.AddrCommentForm,
aa31cdc8 Jérôme Schneider
}
template_name = 'dossiers/patientrecord_tab3_adresses.html'
success_url = './view#tab=2'


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

tab3_addresses = PatientRecordAddrView.as_view()

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

def get_context_data(self, **kwargs):
ctx = super(PatientRecordNotifsView, self).get_context_data(**kwargs)
ctx['status'], ctx['hc_status'] = get_status(ctx, self.request.user)
if ctx['object'].service.slug == "cmpp":
3b1f5878 Mikaël Ates
(acts_not_locked, days_not_locked, acts_not_valide,
acts_not_billable, acts_pause, acts_per_hc, acts_losts) = \
523c5aaf Mikaël Ates
list_acts_for_billing_CMPP_per_patient(self.object,
3b1f5878 Mikaël Ates
datetime.today(), self.service)
ctx['acts_losts'] = acts_losts
ctx['acts_pause'] = acts_pause
hcs_used = acts_per_hc.keys()
d5ca00ed Mikaël Ates
hcs = None
3b1f5878 Mikaël Ates
if not hcs_used:
d5ca00ed Mikaël Ates
hcs = [(hc, None) for hc in HealthCare.objects.filter(patient=self.object).order_by('-start_date')]
3b1f5878 Mikaël Ates
else:
d5ca00ed Mikaël Ates
hcs = []
3b1f5878 Mikaël Ates
for hc in HealthCare.objects.filter(patient=self.object).order_by('-start_date'):
acts = None
if hasattr(hc, 'cmpphealthcarediagnostic') and hc.cmpphealthcarediagnostic in hcs_used:
acts = acts_per_hc[hc.cmpphealthcarediagnostic]
elif hasattr(hc, 'cmpphealthcaretreatment') and hc.cmpphealthcaretreatment in hcs_used:
acts = acts_per_hc[hc.cmpphealthcaretreatment]
d5ca00ed Mikaël Ates
hcs.append((hc, acts))
ctx['hcs'] = []
for hc, acts in hcs:
ctx['hcs'].append((hc, acts, hc.act_set.order_by('date', 'time')))
aa31cdc8 Jérôme Schneider
elif ctx['object'].service.slug == "sessad-ted" or ctx['object'].service.slug == "sessad-dys":
3b1f5878 Mikaël Ates
ctx['hcs'] = HealthCare.objects.filter(patient=self.object).order_by('-start_date')
aa31cdc8 Jérôme Schneider
return ctx
eb3a7e71 Jérôme Schneider
aa31cdc8 Jérôme Schneider
tab4_notifs = PatientRecordNotifsView.as_view()

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

def get_context_data(self, **kwargs):
ctx = super(PatientRecordOldActs, self).get_context_data(**kwargs)
ctx['last_rdvs'] = []
for act in Act.objects.last_acts(ctx['object']).prefetch_related('doctors'):
state = act.get_state()
if state and not state.previous_state and state.state_name == 'NON_VALIDE':
state = None
missing_workers = []
try:
missing_workers = [participant.worker for participant in act.event.get_missing_participants()]
except:
pass
ctx['last_rdvs'].append((act, state, missing_workers))
history = []
i = 0
for state in ctx['object'].filestate_set.order_by('-date_selected'):
acts = []
try:
while ctx['last_rdvs'][i][0].date >= state.date_selected.date():
acts.append(ctx['last_rdvs'][i])
i += 1
except:
pass
history.append((state, acts))
if i < len(ctx['last_rdvs']) - 1:
history.append((None, ctx['last_rdvs'][i:]))
ctx['history'] = history
f3407c83 Jérôme Schneider
return ctx

aa31cdc8 Jérôme Schneider
tab5_old_acts = PatientRecordOldActs.as_view()
f6203b66 Frédéric Péters
aa31cdc8 Jérôme Schneider
class PatientRecordNextAppointmentsView(cbv.DetailView):
model = PatientRecord
template_name = 'dossiers/patientrecord_tab6_next_rdv.html'
f6203b66 Frédéric Péters
aa31cdc8 Jérôme Schneider
def get_context_data(self, **kwargs):
ctx = super(PatientRecordNextAppointmentsView, self).get_context_data(**kwargs)
ctx['next_rdvs'] = []
Q = models.Q
today = date.today()
3cdae7c3 Serghei MIHAI
qs = EventWithAct.objects.filter(patient=ctx['object']) \
aa31cdc8 Jérôme Schneider
.filter(exception_to__isnull=True, canceled=False) \
.filter(Q(start_datetime__gte=today) \
| Q(exceptions__isnull=False) \
| ( Q(recurrence_periodicity__isnull=False) \
& (Q(recurrence_end_date__gte=today) \
| Q(recurrence_end_date__isnull=True) \
))) \
.distinct() \
.select_related() \
.prefetch_related('participants', 'exceptions__eventwithact',
'act_set__actvalidationstate_set')
occurrences = []
for event in qs:
occurrences.extend(filter(lambda e: e.start_datetime.date() >= today,
event.all_occurences(limit=180)))
occurrences = sorted(occurrences, key=lambda e: e.start_datetime)
for event in occurrences:
state = None
if event.act:
state = event.act.get_state()
if state and not state.previous_state and state.state_name == 'NON_VALIDE':
state = None
bba85766 Serghei MIHAI
ctx['next_rdvs'].append((event, state, event.get_missing_participants(), event.get_inactive_participants()))
aa31cdc8 Jérôme Schneider
return ctx

tab6_next_rdv = PatientRecordNextAppointmentsView.as_view()

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

tab7_socialisation = PatientRecordSocialisationView.as_view()

63975fa8 Jérôme Schneider
class PatientRecordMedicalView(cbv.UpdateView):
aa31cdc8 Jérôme Schneider
model = PatientRecord
63975fa8 Jérôme Schneider
form_class = forms.PhysiologyForm
aa31cdc8 Jérôme Schneider
template_name = 'dossiers/patientrecord_tab8_medical.html'
success_url = './view#tab=7'

tab8_medical = PatientRecordMedicalView.as_view()
f3407c83 Jérôme Schneider
554289d5 Jérôme Schneider
class PatientRecordsHomepageView(cbv.ListView):
562586fb Jérôme Schneider
model = PatientRecord
c20d5459 Jérôme Schneider
template_name = 'dossiers/index.html'
562586fb Jérôme Schneider
e16b3817 Jérôme Schneider
def _get_search_result(self, paginate_patient_records):
patient_records = []
for patient_record in paginate_patient_records:
next_rdv = get_next_rdv(patient_record)
last_rdv = get_last_rdv(patient_record)
current_status = patient_record.last_state.status
state = current_status.name
state_class = current_status.type.lower()
patient_records.append(
{
'object': patient_record,
'next_rdv': next_rdv,
'last_rdv': last_rdv,
'state': state,
'state_class': state_class
}
)
return patient_records

562586fb Jérôme Schneider
def get_queryset(self):
first_name = self.request.GET.get('first_name')
last_name = self.request.GET.get('last_name')
paper_id = self.request.GET.get('paper_id')
301ff5c0 Frédéric Péters
id = self.request.GET.get('id')
562586fb Jérôme Schneider
social_security_id = self.request.GET.get('social_security_id')
a75ff93a Mikaël Ates
if not (first_name or last_name or paper_id or id or social_security_id):
return None
if (first_name and len(first_name) < 2) or (last_name and len(last_name) < 2):
return None
qs = super(PatientRecordsHomepageView, self).get_queryset()
states = self.request.GET.getlist('states')
562586fb Jérôme Schneider
if last_name:
86aba266 Jérôme Schneider
qs = qs.filter(last_name__istartswith=last_name)
562586fb Jérôme Schneider
if first_name:
86aba266 Jérôme Schneider
qs = qs.filter(first_name__istartswith=first_name)
562586fb Jérôme Schneider
if paper_id:
a75ff93a Mikaël Ates
qs = qs.filter(paper_id__startswith=paper_id)
301ff5c0 Frédéric Péters
if id:
a75ff93a Mikaël Ates
qs = qs.filter(id__startswith=id)
562586fb Jérôme Schneider
if social_security_id:
a75ff93a Mikaël Ates
qs = qs.filter(models.Q(social_security_id__startswith=social_security_id) | \
models.Q(contacts__social_security_id__startswith=social_security_id))
7328a577 Jérôme Schneider
if states:
e30c9bdb Jérôme Schneider
qs = qs.filter(last_state__status__id__in=states)
348bd1f9 Jérôme Schneider
else:
qs = qs.filter(last_state__status__type__in="")
e30c9bdb Jérôme Schneider
qs = qs.filter(service=self.service).order_by('last_name').\
prefetch_related('last_state',
'patientcontact', 'last_state__status')
562586fb Jérôme Schneider
return qs

def get_context_data(self, **kwargs):
f3407c83 Jérôme Schneider
ctx = super(PatientRecordsHomepageView, self).get_context_data(**kwargs)
e30c9bdb Jérôme Schneider
ctx['search_form'] = forms.SearchForm(service=self.service, data=self.request.GET or None)
ctx['stats'] = [["Dossiers", 0]]
for status in Status.objects.filter(services=self.service):
ctx['stats'].append([status.name, 0])
ca4afcae Jérôme Schneider
43a5b181 Frédéric Péters
page = self.request.GET.get('page')
e16b3817 Jérôme Schneider
if ctx['object_list']:
patient_records = ctx['object_list'].filter()
else:
patient_records = []

# TODO: use a sql query to do this
for patient_record in patient_records:
ctx['stats'][0][1] += 1
for elem in ctx['stats']:
if elem[0] == patient_record.last_state.status.name:
elem[1] += 1
36e10f58 Frédéric Péters
paginator = Paginator(patient_records, 50)
43a5b181 Frédéric Péters
try:
e16b3817 Jérôme Schneider
paginate_patient_records = paginator.page(page)
43a5b181 Frédéric Péters
except PageNotAnInteger:
e16b3817 Jérôme Schneider
paginate_patient_records = paginator.page(1)
43a5b181 Frédéric Péters
except EmptyPage:
e16b3817 Jérôme Schneider
paginate_patient_records = paginator.page(paginator.num_pages)
43a5b181 Frédéric Péters
query = self.request.GET.copy()
if 'page' in query:
del query['page']
ctx['query'] = query.urlencode()

e16b3817 Jérôme Schneider
ctx['paginate_patient_records'] = paginate_patient_records
ctx['patient_records'] = self._get_search_result(paginate_patient_records)
562586fb Jérôme Schneider
return ctx

f78e473c Jérôme Schneider
patientrecord_home = PatientRecordsHomepageView.as_view()
e7898322 Jérôme Schneider
class PatientRecordDeleteView(DeleteView):
model = PatientRecord
success_url = ".."
template_name = 'dossiers/patientrecord_confirm_delete.html'

8630b77b Mikaël Ates
patientrecord_delete = validator_only(PatientRecordDeleteView.as_view())
e7898322 Jérôme Schneider
29168b44 Jérôme Schneider
729480ef Jérôme Schneider
class PatientRecordPaperIDUpdateView(cbv.UpdateView):
model = PatientRecord
form_class = forms.PaperIDForm
template_name = 'dossiers/generic_form.html'
33c3c6d1 Jérôme Schneider
success_url = '../view#tab=0'
729480ef Jérôme Schneider
update_paper_id = PatientRecordPaperIDUpdateView.as_view()
00c7103f Mikaël Ates

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

def get_success_url(self):
return self.success_url

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

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

new_socialisation_duration = NewSocialisationDurationView.as_view()

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

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

update_socialisation_duration = UpdateSocialisationDurationView.as_view()

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

delete_socialisation_duration = DeleteSocialisationDurationView.as_view()
c8083788 Mikaël Ates

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

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

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


new_mdph_request = \
NewMDPHRequestView.as_view(model=MDPHRequest,
template_name = 'dossiers/generic_form.html',
success_url = '../view#tab=6',
form_class=forms.MDPHRequestForm)
update_mdph_request = \
UpdateMDPHRequestView.as_view(model=MDPHRequest,
template_name = 'dossiers/generic_form.html',
success_url = '../../view#tab=6',
form_class=forms.MDPHRequestForm)
delete_mdph_request = \
cbv.DeleteView.as_view(model=MDPHRequest,
template_name = 'dossiers/generic_confirm_delete.html',
success_url = '../../view#tab=6')

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

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

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


new_mdph_response = \
NewMDPHResponseView.as_view(model=MDPHResponse,
template_name = 'dossiers/generic_form.html',
success_url = '../view#tab=6',
form_class=forms.MDPHResponseForm)
update_mdph_response = \
UpdateMDPHResponseView.as_view(model=MDPHResponse,
template_name = 'dossiers/generic_form.html',
success_url = '../../view#tab=6',
form_class=forms.MDPHResponseForm)
delete_mdph_response = \
cbv.DeleteView.as_view(model=MDPHResponse,
template_name = 'dossiers/generic_confirm_delete.html',
success_url = '../../view#tab=6')
4a0ff5ea Frédéric Péters

24c750bb Jérôme Schneider
class UpdatePatientStateView(cbv.ServiceFormMixin, cbv.UpdateView):
5f476468 Jérôme Schneider
def get_initial(self):
initial = super(UpdatePatientStateView, self).get_initial()
initial['date_selected'] = self.object.date_selected.date()
return initial

4a0ff5ea Frédéric Péters
def get(self, request, *args, **kwargs):
if kwargs.has_key('patientrecord_id'):
request.session['patientrecord_id'] = kwargs['patientrecord_id']
return super(UpdatePatientStateView, self).get(request, *args, **kwargs)

0cebd645 Jérôme Schneider
class DeletePatientView(cbv.DeleteView):

def delete(self, request, *args, **kwargs):
self.object = self.get_object()
1f5cae7f Jérôme Schneider
if self.object == self.object.patient.last_state:
status = self.object.patient.filestate_set.all().order_by('-created')
if len(status) > 1:
self.object.patient.last_state = status[1]
32061a0e Jérôme Schneider
self.object.patient.save()
1f5cae7f Jérôme Schneider
else:
# TODO return an error here
return HttpResponseRedirect(self.get_success_url())
self.object.delete()
0cebd645 Jérôme Schneider
return HttpResponseRedirect(self.get_success_url())


4a0ff5ea Frédéric Péters
update_patient_state = \
UpdatePatientStateView.as_view(model=FileState,
template_name = 'dossiers/generic_form.html',
success_url = '../../view#tab=0',
form_class=forms.PatientStateForm)
delete_patient_state = \
0cebd645 Jérôme Schneider
DeletePatientView.as_view(model=FileState,
4a0ff5ea Frédéric Péters
template_name = 'dossiers/generic_confirm_delete.html',
success_url = '../../view#tab=0')
23937808 Frédéric Péters

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

def get_context_data(self, **kwargs):
ctx = super(GenerateRtfFormView, self).get_context_data(**kwargs)
ctx['object'] = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
ctx['service_id'] = self.service.id
if self.request.GET.get('event-id'):
76974b6f Benjamin Dauvergne
date = self.request.GET.get('date')
date = datetime.strptime(date, '%Y-%m-%d').date()
23937808 Frédéric Péters
appointment = Appointment()
c2246b82 Benjamin Dauvergne
event = EventWithAct.objects.get(id=self.request.GET.get('event-id'))
5c2d0ea2 Benjamin Dauvergne
event = event.today_occurrence(date)
76974b6f Benjamin Dauvergne
appointment.init_from_event(event, self.service)
577ecc05 Jérôme Schneider
ctx['event'] = event
23937808 Frédéric Péters
ctx['appointment'] = appointment
return ctx

b4310641 Mikaël Ates
def form_valid(self, form, **kwargs):
ctx = self.get_context_data(**kwargs)
patient = ctx['object']
appointment = ctx['appointment']
577ecc05 Jérôme Schneider
event = ctx['event']
23937808 Frédéric Péters
template_filename = form.cleaned_data.get('template_filename')
7296f9f1 Mikaël Ates
dest_filename = datetime.now().strftime('%Y-%m-%d--%H:%M:%S') + '--' + template_filename
23937808 Frédéric Péters
from_path = os.path.join(settings.RTF_TEMPLATES_DIRECTORY, template_filename)
364eecbe Mikaël Ates
to_path = ''
persistent = True
if settings.USE_PATIENT_FILE_RTF_REPOSITORY_DIRECTORY \
or settings.RTF_REPOSITORY_DIRECTORY:
if settings.USE_PATIENT_FILE_RTF_REPOSITORY_DIRECTORY:
to_path = patient.get_ondisk_directory(self.service.name)
if settings.RTF_REPOSITORY_DIRECTORY:
to_path = os.path.join(to_path,
settings.RTF_REPOSITORY_DIRECTORY)
to_path = os.path.join(to_path, dest_filename)
else:
# else : use temporary files
persistent = False
to_path = dest_filename
b4310641 Mikaël Ates
variables = {'AD11': '', 'AD12': '', 'AD13': '', 'AD14': '',
'AD15': '', 'AD18': '',
61c88ce1 Mikaël Ates
'JOU1': formats.date_format(datetime.today(), "DATE_FORMAT"),
b4310641 Mikaël Ates
'VIL1': u'Saint-Étienne',
'RDV1': '', 'HEU1': '', 'THE1': '', 'DPA1': '',
'NOM1': '', 'PRE1': '', 'NAI1': '', 'NUM2': '',
'NOM2': '', 'PRE2': '', 'TPA1': '', 'NSS1': '',
'TR01': '', 'TR02': '', 'TR03': '', 'TR04': '', 'TR05': '',
'AD16': '', 'AD17': '', 'AD19': '',
'AD21': '', 'AD22': '', 'AD23': '', 'AD24': '', 'AD25': '',
'AD26': '', 'AD27': '', 'AD28': '', 'AD29': '',
c0fe0fc5 Mikaël Ates
'RDV2': '' ,
b4310641 Mikaël Ates
}
c0fe0fc5 Mikaël Ates
list_rdvs = []
for act in Act.objects.last_acts(patient):
state = act.get_state()
if state and state.state_name in ('VALIDE', 'ACT_DOUBLE'):
rdv = "\t- %s" % formats.date_format(act.date, "DATE_FORMAT")
if act.time:
rdv += " à %s" % formats.date_format(act.time, "TIME_FORMAT")
list_rdvs.append(rdv)
variables['RDV2'] = '\par'.join(list_rdvs)
b4310641 Mikaël Ates
if appointment:
1193006a Mikaël Ates
variables['RDV1'] = formats.date_format(appointment.date, "DATE_FORMAT")
b4310641 Mikaël Ates
variables['HEU1'] = appointment.begin_hour
variables['THE1'] = ' '.join([str(i) for i in appointment.workers])# ou DPA1?
variables['DPA1'] = variables['THE1']
if patient:
variables['NOM1'] = patient.last_name
variables['PRE1'] = patient.first_name
if patient.birthdate :
variables['NAI1'] = patient.birthdate.strftime('%d/%m/%Y')
variables['NUM2'] = patient.paper_id
if patient.policyholder:
variables['NOM2'] = patient.policyholder.last_name
variables['PRE2'] = patient.policyholder.first_name
2a5c234c Mikaël Ates
if patient.policyholder.health_center:
variables['TPA1'] = patient.policyholder.health_center.name
b4310641 Mikaël Ates
if patient.policyholder.social_security_id:
key = str(patient.policyholder.get_control_key())
if len(key) == 1:
key = '0' + key
variables['NSS1'] = \
' '.join([patient.policyholder.social_security_id,
key])
if patient.transportcompany:
variables['TR01'] = patient.transportcompany.name
variables['TR02'] = patient.transportcompany.address
variables['TR03'] = patient.transportcompany.address_complement
variables['TR04'] = patient.transportcompany.zip_code
variables['TR05'] = patient.transportcompany.city
variables['AD18'] = form.cleaned_data.get('phone_address') or ''
23937808 Frédéric Péters
for i, line in enumerate(form.cleaned_data.get('address').splitlines()):
b4310641 Mikaël Ates
variables['AD%d' % (11+i)] = line
bc17dbd7 Mikaël Ates
if i == 4:
break
b4310641 Mikaël Ates
filename = make_doc_from_template(from_path, to_path, variables,
persistent)
23937808 Frédéric Péters
ac0cd457 Frédéric Péters
client_dir = patient.get_client_side_directory(self.service.name)
577ecc05 Jérôme Schneider
event.convocation_sent = True
event.save()
ac0cd457 Frédéric Péters
if not client_dir:
364eecbe Mikaël Ates
content = File(file(filename))
response = HttpResponse(content,'text/rtf')
response['Content-Length'] = content.size
b1bac2e0 Mikaël Ates
response['Content-Disposition'] = 'attachment; filename="%s"' \
% dest_filename.encode('utf-8')
ac0cd457 Frédéric Péters
return response
else:
02f39251 Frédéric Péters
class LocalFileHttpResponseRedirect(HttpResponseRedirect):
allowed_schemes = ['file']
ac0cd457 Frédéric Péters
client_filepath = os.path.join(client_dir, dest_filename)
02f39251 Frédéric Péters
return LocalFileHttpResponseRedirect('file://' + client_filepath)
23937808 Frédéric Péters
generate_rtf_form = GenerateRtfFormView.as_view()
17e36a37 Frédéric Péters

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

e16b3817 Jérôme Schneider
def _get_search_result(self, paginate_patient_records):
patient_records = []
for patient_record in paginate_patient_records:
584b363f Mikaël Ates
current_state = patient_record.get_current_state() or patient_record.get_state()
feffc421 Serghei MIHAI
deficiencies = [getattr(patient_record, field) \
3fa5579e Serghei MIHAI
for field in self.model.DEFICIENCY_FIELDS]
anap = any(deficiencies)
mises = reduce(lambda m1, m2: m1+m2, [list(getattr(patient_record, field).all()) for field in self.model.MISES_FIELDS])
748e8d64 Serghei MIHAI
next_rdv = get_next_rdv(patient_record)
last_rdv = get_last_rdv(patient_record)

if next_rdv:
next_rdv_datetime = next_rdv.start_datetime
else:
next_rdv_datetime = None
if last_rdv:
last_rdv_datetime = last_rdv['start_datetime']
else:
last_rdv_datetime = None
e16b3817 Jérôme Schneider
patient_records.append(
{
'object': patient_record,
97fbc132 Mikaël Ates
'state': current_state,
748e8d64 Serghei MIHAI
'anap': anap,
'mises': mises,
'next_rdv_date': next_rdv_datetime,
'last_rdv_date': last_rdv_datetime
e16b3817 Jérôme Schneider
}
)
return patient_records

17e36a37 Frédéric Péters
def get_queryset(self):
form = forms.QuotationsForm(data=self.request.GET or None)
qs = super(PatientRecordsQuotationsView, self).get_queryset()
without_quotations = self.request.GET.get('without_quotations')
feffc421 Serghei MIHAI
without_anap_quotations = self.request.GET.get('without_anap_quotations')
17e36a37 Frédéric Péters
if without_quotations:
3fa5579e Serghei MIHAI
for field in self.model.MISES_FIELDS:
748e8d64 Serghei MIHAI
mise_field = {'%s__isnull' % field: True}
qs = qs.filter(**mise_field)
feffc421 Serghei MIHAI
if without_anap_quotations:
3fa5579e Serghei MIHAI
for field in self.model.DEFICIENCY_FIELDS:
feffc421 Serghei MIHAI
anap_field = {field: 0}
qs = qs.filter(**anap_field)

17e36a37 Frédéric Péters
states = self.request.GET.getlist('states')
e30c9bdb Jérôme Schneider
qs = qs.filter(last_state__status__id__in=states)
17e36a37 Frédéric Péters
try:
date_actes_start = datetime.strptime(form.data['date_actes_start'], "%d/%m/%Y")
64839f29 Mikaël Ates
qs = qs.filter(act__date__gte=date_actes_start.date()).distinct()
17e36a37 Frédéric Péters
except (ValueError, KeyError):
76974b6f Benjamin Dauvergne
pass
17e36a37 Frédéric Péters
try:
date_actes_end = datetime.strptime(form.data['date_actes_end'], "%d/%m/%Y")
64839f29 Mikaël Ates
qs = qs.filter(act__date__lte=date_actes_end.date()).distinct()
17e36a37 Frédéric Péters
except (ValueError, KeyError):
76974b6f Benjamin Dauvergne
pass
e16b3817 Jérôme Schneider
qs = qs.filter(service=self.service).order_by('last_name').prefetch_related()
17e36a37 Frédéric Péters
return qs

def get_context_data(self, **kwargs):
ctx = super(PatientRecordsQuotationsView, self).get_context_data(**kwargs)
f6be0c7d Jérôme Schneider
ctx['search_form'] = forms.QuotationsForm(data=self.request.GET or None,
service=self.service)
43a5b181 Frédéric Péters
patient_records = []
page = self.request.GET.get('page')
2c6641c8 Serghei MIHAI
all = 'all' in self.request.GET
if all:
patient_records = ctx['object_list']
ctx['all'] = all
self.template_name = 'dossiers/quotations_print.html'
else:
affeff87 Mikaël Ates
paginator = Paginator(ctx['object_list'].filter(), 25)
2c6641c8 Serghei MIHAI
try:
patient_records = paginator.page(page)
except PageNotAnInteger:
patient_records = paginator.page(1)
except EmptyPage:
patient_records = paginator.page(paginator.num_pages)
ctx['paginate_patient_records'] = patient_records

ctx['patient_records'] = self._get_search_result(patient_records)
43a5b181 Frédéric Péters
query = self.request.GET.copy()
if 'page' in query:
del query['page']
ctx['query'] = query.urlencode()

17e36a37 Frédéric Péters
return ctx

patientrecord_quotations = PatientRecordsQuotationsView.as_view()
7bc87b6f Frédéric Péters
5497fedd Mikaël Ates
class NewProtectionStateView(cbv.CreateView):
model = ProtectionState
template_name = 'dossiers/generic_form.html'
success_url = '../view#tab=1'
form_class = forms.ProtectionStateForm

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

new_protection = NewProtectionStateView.as_view()

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

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

update_protection = UpdateProtectionStateView.as_view()

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

delete_protection = DeleteProtectionStateView.as_view()

c5f8a919 Mikaël Ates
class PatientRecordsWaitingQueueView(cbv.ListView):
model = PatientRecord
template_name = 'dossiers/waiting_queue.html'

def _get_search_result(self, paginate_patient_records,
all_patient_records):
patient_records = []
if paginate_patient_records:
position = 1
for patient_record in paginate_patient_records:
while patient_record.id != all_patient_records[position - 1].id:
position += 1
patient_records.append(
{
'object': patient_record,
'position': position,
}
)
return patient_records

def get_queryset(self):
form = forms.QuotationsForm(data=self.request.GET or None)
qs = super(PatientRecordsWaitingQueueView, self).get_queryset()
first_name = self.request.GET.get('first_name')
last_name = self.request.GET.get('last_name')
paper_id = self.request.GET.get('paper_id')
id = self.request.GET.get('id')
social_security_id = self.request.GET.get('social_security_id')
qs = qs.filter(service=self.service,
last_state__status__type='ACCUEIL')
if last_name:
qs = qs.filter(last_name__istartswith=last_name)
if first_name:
qs = qs.filter(first_name__istartswith=first_name)
if paper_id:
qs = qs.filter(paper_id__startswith=paper_id)
if id:
qs = qs.filter(id__startswith=id)
if social_security_id:
qs = qs.filter(models.Q(
social_security_id__startswith=social_security_id)
| models.Q(
contacts__social_security_id__startswith=social_security_id))
qs = qs.order_by('last_state__date_selected', 'created')
return qs

def get_context_data(self, **kwargs):
ctx = super(PatientRecordsWaitingQueueView, self).get_context_data(**kwargs)
ctx['search_form'] = forms.QuotationsForm(data=self.request.GET or None,
service=self.service)
patient_records = []
page = self.request.GET.get('page')
affeff87 Mikaël Ates
all = 'all' in self.request.GET
if all:
paginate_patient_records = ctx['object_list']
ctx['all'] = all
self.template_name = 'dossiers/waiting_queue_print.html'
else:
paginator = Paginator(ctx['object_list'].filter(), 25)
try:
paginate_patient_records = paginator.page(page)
except PageNotAnInteger:
paginate_patient_records = paginator.page(1)
except EmptyPage:
paginate_patient_records = paginator.page(paginator.num_pages)
ctx['paginate_patient_records'] = paginate_patient_records
c5f8a919 Mikaël Ates
all_patient_records = PatientRecord.objects.filter(
service=self.service,
last_state__status__type='ACCUEIL').order_by(
'last_state__date_selected', 'created')
ctx['patient_records'] = self._get_search_result(
paginate_patient_records, all_patient_records)
ctx['len_patient_records'] = all_patient_records.count()

query = self.request.GET.copy()
if 'page' in query:
del query['page']
ctx['query'] = query.urlencode()

return ctx

patientrecord_waiting_queue = PatientRecordsWaitingQueueView.as_view()
7bc87b6f Frédéric Péters
class CreateDirectoryView(View, cbv.ServiceViewMixin):
def post(self, request, *args, **kwargs):
patient = PatientRecord.objects.get(id=kwargs['patientrecord_id'])
service = Service.objects.get(slug=kwargs['service'])
patient.get_ondisk_directory(service.name)
messages.add_message(self.request, messages.INFO, u'Répertoire patient créé.')
return HttpResponseRedirect('view')

create_directory = CreateDirectoryView.as_view()
cda02476 Mikaël Ates
class GenerateTransportPrescriptionFormView(cbv.FormView):
template_name = 'dossiers/generate_transport_prescription_form.html'
form_class = Form
success_url = './view#tab=1'

def get_context_data(self, **kwargs):
ctx = super(GenerateTransportPrescriptionFormView, self).get_context_data(**kwargs)
07b0577e Mikaël Ates
ctx['lieu'] = 'Saint-Etienne'
ctx['date'] = formats.date_format(datetime.today(), "SHORT_DATE_FORMAT")
ctx['id_etab'] = '''%s SAINT ETIENNE
66/68, RUE MARENGO
42000 SAINT ETIENNE''' % ctx['service'].upper()
try:
patient = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
ctx['object'] = patient
last_log = TransportPrescriptionLog.objects.filter(patient=patient).latest('created')
if last_log:
ctx['choices'] = last_log.get_choices()
if 'lieu' in ctx['choices'] and ctx['choices']['lieu']:
ctx['lieu'] = ctx['choices']['lieu']
if 'date' in ctx['choices'] and ctx['choices']['date']:
ctx['date'] = ctx['choices']['date']
if 'id_etab' in ctx['choices'] and ctx['choices']['id_etab']:
ctx['id_etab'] = ctx['choices']['id_etab']
except:
pass
cda02476 Mikaël Ates
return ctx

def form_valid(self, form):
patient = PatientRecord.objects.get(id=self.kwargs['patientrecord_id'])
address = PatientAddress.objects.get(id=form.data['address_id'])
07b0577e Mikaël Ates
path = render_transport(patient, address, form.data)
cda02476 Mikaël Ates
content = File(file(path))
07b0577e Mikaël Ates
log = TransportPrescriptionLog(patient=patient)
log.set_choices(form.data)
log.save()
cda02476 Mikaël Ates
response = HttpResponse(content,'application/pdf')
response['Content-Length'] = content.size
b9039913 Mikaël Ates
dest_filename = "%s--prescription-transport-%s-%s.pdf" \
71d239fc Mikaël Ates
% (datetime.now().strftime('%Y-%m-%d--%H:%M:%S'),
b9039913 Mikaël Ates
patient.last_name.upper().encode('utf-8'),
patient.first_name.encode('utf-8'))
response['Content-Disposition'] = \
'attachment; filename="%s"' % dest_filename
cda02476 Mikaël Ates
return response

prescription_transport = GenerateTransportPrescriptionFormView.as_view()