This repository has been archived on 2023-02-21. You can view files and clone it, but cannot push or open issues or pull requests.
calebasse/calebasse/dossiers/views.py

1135 lines
47 KiB
Python

# -*- coding: utf-8 -*-
import os
from datetime import datetime, date
from django.conf import settings
from django.db import models
from django.http import HttpResponseRedirect, HttpResponse
from django.views.generic import View
from django.views.generic.edit import DeleteView
from django.contrib import messages
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.core.files import File
from django.forms import Form
from django.utils import formats
from django.shortcuts import get_object_or_404
from calebasse import cbv
from calebasse.doc_templates import make_doc_from_template
from calebasse.dossiers import forms
from calebasse.dossiers.views_utils import get_next_rdv, get_last_rdv, get_status
from calebasse.dossiers.transport import render_transport
from calebasse.agenda.models import Event, EventWithAct
from calebasse.actes.models import Act
from calebasse.agenda.appointments import Appointment
from calebasse.dossiers.models import (PatientRecord, PatientContact,
PatientAddress, Status, FileState, create_patient, CmppHealthCareTreatment,
CmppHealthCareDiagnostic, SessadHealthCareNotification, HealthCare,
TransportPrescriptionLog, ProtectionState)
from calebasse.dossiers.states import STATES_MAPPING, STATES_BTN_MAPPER
from calebasse.ressources.models import (Service,
SocialisationDuration, MDPHRequest, MDPHResponse)
from calebasse.facturation.list_acts import list_acts_for_billing_CMPP_per_patient
from calebasse.facturation.invoice_header import render_to_pdf_file
from calebasse.decorators import validator_only
from ..utils import get_service_setting
class NewPatientRecordView(cbv.FormView, cbv.ServiceViewMixin):
form_class = forms.NewPatientRecordForm
template_name = 'dossiers/patientrecord_new.html'
success_url = '..'
patient = None
def post(self, request, *args, **kwarg):
self.user = request.user
return super(NewPatientRecordView, self).post(request, *args, **kwarg)
def form_valid(self, form):
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"))
return super(NewPatientRecordView, self).form_valid(form)
def get_success_url(self):
return '%s/view' % self.patient.id
new_patient_record = NewPatientRecordView.as_view()
class RecordPatientRecordIdMixing(object):
def dispatch(self, request, *args, **kwargs):
self.patientrecord_id = request.session['patientrecord_id'] = int(kwargs['patientrecord_id'])
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):
model = PatientContact
form_class = forms.PatientContactForm
template_name = 'dossiers/patientcontact_new.html'
success_url = '../view#tab=2'
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:
if arg == 'addresses':
value = self.request.GET.getlist(arg)
else:
value = self.request.GET.get(arg)
initial[arg] = value
if initial:
if not initial.has_key('addresses'):
initial['addresses'] = []
patient = PatientRecord.objects.get(id=self.patientrecord_id)
addresses = patient.addresses.order_by('-id')
if addresses:
initial['addresses'].append(addresses[0].pk)
return initial
new_patient_contact = NewPatientContactView.as_view()
class UpdatePatientContactView(RecordPatientRecordIdMixing, cbv.NotificationDisplayView, cbv.UpdateView):
model = PatientContact
form_class = forms.PatientContactForm
template_name = 'dossiers/patientcontact_new.html'
success_url = '../../view#tab=2'
update_patient_contact = UpdatePatientContactView.as_view()
class DeletePatientContactView(cbv.DeleteView):
model = PatientContact
form_class = forms.PatientContactForm
template_name = 'dossiers/patientcontact_confirm_delete.html'
success_url = '../../view#tab=2'
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())
delete_patient_contact = DeletePatientContactView.as_view()
class NewPatientAddressView(cbv.CreateView):
model = PatientAddress
form_class = forms.PatientAddressForm
template_name = 'dossiers/patientaddress_new.html'
success_url = '../view#tab=2'
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)
messages.add_message(self.request, messages.INFO, u'Nouvelle adresse enregistrée avec succès.')
return HttpResponseRedirect(self.get_success_url())
new_patient_address = NewPatientAddressView.as_view()
class UpdatePatientAddressView(cbv.NotificationDisplayView, cbv.UpdateView):
model = PatientAddress
form_class = forms.PatientAddressForm
template_name = 'dossiers/patientaddress_new.html'
success_url = '../../view#tab=2'
update_patient_address = UpdatePatientAddressView.as_view()
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()
class NewHealthCareView(cbv.CreateView):
def get_initial(self):
initial = super(NewHealthCareView, self).get_initial()
initial['author'] = self.request.user.id
initial['patient'] = self.kwargs['patientrecord_id']
return initial
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',
form_class=forms.CmppHealthCareTreatmentForm)
update_healthcare_diagnostic = \
cbv.UpdateView.as_view(model=CmppHealthCareDiagnostic,
template_name = 'dossiers/generic_form.html',
success_url = '../../view#tab=3',
form_class=forms.CmppHealthCareDiagnosticForm)
update_healthcare_notification = \
cbv.UpdateView.as_view(model=SessadHealthCareNotification,
template_name = 'dossiers/generic_form.html',
success_url = '../../view#tab=3',
form_class=forms.SessadHealthCareNotificationForm)
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')
class StateFormView(cbv.FormView):
template_name = 'dossiers/state.html'
form_class = forms.StateForm
success_url = './view#tab=0'
def post(self, request, *args, **kwarg):
self.user = request.user
return super(StateFormView, self).post(request, *args, **kwarg)
def form_valid(self, form):
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'])
return super(StateFormView, self).form_valid(form)
state_form = StateFormView.as_view()
class PatientRecordView(cbv.UpdateView):
model = PatientRecord
template_name = 'dossiers/patientrecord_update.html'
def get_context_data(self, **kwargs):
ctx = super(PatientRecordView, self).get_context_data(**kwargs)
ctx['object'].create_diag_healthcare(self.request.user)
ctx['object'].automated_switch_state(self.request.user)
current_state = ctx['object'].get_current_state()
if not current_state:
current_state = ctx['object'].get_state()
ctx['future_state'] = True
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
ctx['service_id'] = self.service.id
ctx['states'] = FileState.objects.filter(patient=self.object) \
.filter(status__services=self.service) \
.order_by('-date_selected')
return ctx
patient_record = PatientRecordView.as_view()
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()
class PatientRecordGeneralView(cbv.UpdateView):
model = PatientRecord
form_class = forms.GeneralForm
template_name = 'dossiers/patientrecord_tab1_general.html'
success_url = './view'
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()
if current_state.status and STATES_MAPPING.has_key(current_state.status.type):
state = STATES_MAPPING[current_state.status.type]
elif current_state.status:
state = current_state.status.name
else:
state = "Aucun"
ctx['current_state'] = current_state
ctx['status'], ctx['hc_status'] = get_status(ctx, self.request.user)
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
ctx['missing_birthdate'] = False
if not self.object.birthdate:
ctx['missing_birthdate'] = True
return ctx
tab1_general = PatientRecordGeneralView.as_view()
class PatientRecordAdmView(cbv.UpdateView):
model = PatientRecord
form_class = forms.AdministrativeForm
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()
class PatientRecordAddrView(cbv.ServiceViewMixin, cbv.NotificationDisplayView, cbv.MultiUpdateView):
model = PatientRecord
forms_classes = {
'contact': forms.PatientContactForm,
'policyholder': forms.PolicyHolderForm,
'comment' : forms.AddrCommentForm,
}
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')
cv_files_path = get_service_setting('cv_files_path')
if cv_files_path and os.path.isdir(cv_files_path):
ctx['cv2_reading'] = True
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":
(acts_not_locked, days_not_locked, acts_not_valide,
acts_not_billable, acts_pause, acts_per_hc, acts_losts) = \
list_acts_for_billing_CMPP_per_patient(self.object,
datetime.today(), self.service)
ctx['acts_losts'] = acts_losts
ctx['acts_pause'] = acts_pause
hcs_used = acts_per_hc.keys()
hcs = None
if not hcs_used:
hcs = [(hc, None) for hc in HealthCare.objects.filter(patient=self.object).order_by('-start_date')]
else:
hcs = []
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]
hcs.append((hc, acts))
ctx['hcs'] = []
for hc, acts in hcs:
ctx['hcs'].append((hc, acts, hc.act_set.order_by('date', 'time')))
elif ctx['object'].service.slug == "sessad-ted" or ctx['object'].service.slug == "sessad-dys":
ctx['hcs'] = HealthCare.objects.filter(patient=self.object).order_by('-start_date')
return ctx
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
return ctx
tab5_old_acts = PatientRecordOldActs.as_view()
class PatientRecordNextAppointmentsView(cbv.DetailView):
model = PatientRecord
template_name = 'dossiers/patientrecord_tab6_next_rdv.html'
def get_context_data(self, **kwargs):
ctx = super(PatientRecordNextAppointmentsView, self).get_context_data(**kwargs)
ctx['next_rdvs'] = []
Q = models.Q
today = date.today()
qs = EventWithAct.objects.filter(patient=ctx['object']) \
.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
ctx['next_rdvs'].append((event, state, event.get_missing_participants(), event.get_inactive_participants()))
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()
class PatientRecordMedicalView(cbv.UpdateView):
model = PatientRecord
form_class = forms.PhysiologyForm
template_name = 'dossiers/patientrecord_tab8_medical.html'
success_url = './view#tab=7'
tab8_medical = PatientRecordMedicalView.as_view()
class PatientRecordsHomepageView(cbv.ListView):
model = PatientRecord
template_name = 'dossiers/index.html'
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
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')
id = self.request.GET.get('id')
social_security_id = self.request.GET.get('social_security_id')
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')
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))
if states:
qs = qs.filter(last_state__status__id__in=states)
else:
qs = qs.filter(last_state__status__type__in="")
qs = qs.filter(service=self.service).order_by('last_name').\
prefetch_related('last_state',
'patientcontact', 'last_state__status')
return qs
def get_context_data(self, **kwargs):
ctx = super(PatientRecordsHomepageView, self).get_context_data(**kwargs)
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])
page = self.request.GET.get('page')
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
paginator = Paginator(patient_records, 50)
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)
query = self.request.GET.copy()
if 'page' in query:
del query['page']
ctx['query'] = query.urlencode()
ctx['paginate_patient_records'] = paginate_patient_records
ctx['patient_records'] = self._get_search_result(paginate_patient_records)
return ctx
patientrecord_home = PatientRecordsHomepageView.as_view()
class PatientRecordDeleteView(DeleteView):
model = PatientRecord
success_url = ".."
template_name = 'dossiers/patientrecord_confirm_delete.html'
patientrecord_delete = validator_only(PatientRecordDeleteView.as_view())
class PatientRecordPaperIDUpdateView(cbv.UpdateView):
model = PatientRecord
form_class = forms.PaperIDForm
template_name = 'dossiers/generic_form.html'
success_url = '../view#tab=0'
update_paper_id = PatientRecordPaperIDUpdateView.as_view()
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()
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')
class UpdatePatientStateView(cbv.ServiceFormMixin, cbv.UpdateView):
def get_initial(self):
initial = super(UpdatePatientStateView, self).get_initial()
initial['date_selected'] = self.object.date_selected.date()
return initial
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)
class DeletePatientView(cbv.DeleteView):
def delete(self, request, *args, **kwargs):
self.object = self.get_object()
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]
self.object.patient.save()
else:
# TODO return an error here
return HttpResponseRedirect(self.get_success_url())
self.object.delete()
return HttpResponseRedirect(self.get_success_url())
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 = \
DeletePatientView.as_view(model=FileState,
template_name = 'dossiers/generic_confirm_delete.html',
success_url = '../../view#tab=0')
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'):
date = self.request.GET.get('date')
date = datetime.strptime(date, '%Y-%m-%d').date()
appointment = Appointment()
event = EventWithAct.objects.get(id=self.request.GET.get('event-id'))
event = event.today_occurrence(date)
appointment.init_from_event(event, self.service)
ctx['event'] = event
ctx['appointment'] = appointment
return ctx
def form_valid(self, form, **kwargs):
ctx = self.get_context_data(**kwargs)
patient = ctx['object']
appointment = ctx['appointment']
event = ctx['event']
template_filename = form.cleaned_data.get('template_filename')
dest_filename = datetime.now().strftime('%Y-%m-%d--%H:%M:%S') + '--' + template_filename
from_path = os.path.join(settings.RTF_TEMPLATES_DIRECTORY, template_filename)
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
variables = {'AD11': '', 'AD12': '', 'AD13': '', 'AD14': '',
'AD15': '', 'AD18': '',
'JOU1': formats.date_format(datetime.today(), "DATE_FORMAT"),
'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': '',
'RDV2': '' ,
}
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)
if appointment:
variables['RDV1'] = formats.date_format(appointment.date, "DATE_FORMAT")
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
if patient.policyholder.health_center:
variables['TPA1'] = patient.policyholder.health_center.name
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 ''
for i, line in enumerate(form.cleaned_data.get('address').splitlines()):
variables['AD%d' % (11+i)] = line
if i == 4:
break
filename = make_doc_from_template(from_path, to_path, variables,
persistent)
client_dir = patient.get_client_side_directory(self.service.name)
event.convocation_sent = True
event.save()
if not client_dir:
content = File(file(filename))
response = HttpResponse(content,'text/rtf')
response['Content-Length'] = content.size
response['Content-Disposition'] = 'attachment; filename="%s"' \
% dest_filename.encode('utf-8')
return response
else:
class LocalFileHttpResponseRedirect(HttpResponseRedirect):
allowed_schemes = ['file']
client_filepath = os.path.join(client_dir, dest_filename)
return LocalFileHttpResponseRedirect('file://' + client_filepath)
generate_rtf_form = GenerateRtfFormView.as_view()
class PatientRecordsQuotationsView(cbv.ListView):
model = PatientRecord
template_name = 'dossiers/quotations.html'
def _get_search_result(self, paginate_patient_records):
patient_records = []
for patient_record in paginate_patient_records:
current_state = patient_record.get_current_state() or patient_record.get_state()
deficiencies = [getattr(patient_record, field) \
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])
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
patient_records.append(
{
'object': patient_record,
'state': current_state,
'anap': anap,
'mises': mises,
'next_rdv_date': next_rdv_datetime,
'last_rdv_date': last_rdv_datetime
}
)
return patient_records
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')
without_anap_quotations = self.request.GET.get('without_anap_quotations')
if without_quotations:
for field in self.model.MISES_FIELDS:
mise_field = {'%s__isnull' % field: True}
qs = qs.filter(**mise_field)
if without_anap_quotations:
for field in self.model.DEFICIENCY_FIELDS:
anap_field = {field: 0}
qs = qs.filter(**anap_field)
states = self.request.GET.getlist('states')
qs = qs.filter(last_state__status__id__in=states)
try:
date_actes_start = datetime.strptime(form.data['date_actes_start'], "%d/%m/%Y")
qs = qs.filter(act__date__gte=date_actes_start.date()).distinct()
except (ValueError, KeyError):
pass
try:
date_actes_end = datetime.strptime(form.data['date_actes_end'], "%d/%m/%Y")
qs = qs.filter(act__date__lte=date_actes_end.date()).distinct()
except (ValueError, KeyError):
pass
qs = qs.filter(service=self.service).order_by('last_name').prefetch_related()
return qs
def get_context_data(self, **kwargs):
ctx = super(PatientRecordsQuotationsView, 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')
all = 'all' in self.request.GET
if all:
patient_records = ctx['object_list']
ctx['all'] = all
self.template_name = 'dossiers/quotations_print.html'
else:
paginator = Paginator(ctx['object_list'].filter(), 25)
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)
query = self.request.GET.copy()
if 'page' in query:
del query['page']
ctx['query'] = query.urlencode()
return ctx
patientrecord_quotations = PatientRecordsQuotationsView.as_view()
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()
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')
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
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()
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()
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)
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
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'])
path = render_transport(patient, address, form.data)
content = File(file(path))
log = TransportPrescriptionLog(patient=patient)
log.set_choices(form.data)
log.save()
response = HttpResponse(content,'application/pdf')
response['Content-Length'] = content.size
dest_filename = "%s--prescription-transport-%s-%s.pdf" \
% (datetime.now().strftime('%Y-%m-%d--%H:%M:%S'),
patient.last_name.upper().encode('utf-8'),
patient.first_name.encode('utf-8'))
response['Content-Disposition'] = \
'attachment; filename="%s"' % dest_filename
return response
prescription_transport = GenerateTransportPrescriptionFormView.as_view()