adm-ntuh-net/ntuh/ck/views.py
2024-12-12 10:19:16 +08:00

1380 lines
44 KiB
Python
Executable file

# coding=utf-8
# Create your views here.
import datetime, re
import mx.DateTime
from django.contrib import auth
from django.contrib.auth.decorators import login_required
from django.core import serializers
from django.core.mail import send_mail
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.db.models import *
from django.http import Http404, HttpResponse, HttpResponseRedirect
#from django.newforms import form_for_instance
from django.shortcuts import render_to_response
from django.template import RequestContext
from django.utils import simplejson
from django.views.generic import *
from forms import *
from models import *
import intra
@login_required
def patient_add(request):
if request.method == 'POST':
force = True
result = intra.Default_Dr(request.POST)
else:
chartno = request.GET.get('ChartNo', '')
name = request.GET.get('Name', '')
idcode = request.GET.get('idcode', '')
force = request.GET.get('force', '')
result = intra.Default_Dr({'ChartNo': chartno,
'Name': name,
'idcode': idcode,
})
if force and len(result)==1:
r=result[0]
if r['gender'] == 'M':
r['gender'] = 1
else:
r['gender'] = 2
hw = intra.HeightWeight(r['id_cards'])
p = Patient(name = r['name'],
medical_records = r['medical_records'],
gender = r['gender'],
birthday = r['birthday'],
address = r['address'],
phone = r['phone'],
id_cards = r['id_cards'],
height = hw['Height'],
weight = hw['Weight'],
)
p.save()
return HttpResponseRedirect('/patient/detail/%d/' % p.id)
form = PatientForm()
return render_to_response('ck/patient_add.html',
{
'form': form,
'result': result,
}, context_instance=RequestContext(request))
@login_required
def patient_detail(request, object_id):
if object_id=='':
object_id = request.session.get('patient')
patient = Patient.objects.get(id=object_id)
if object_id:
qset = (
Q(patient=object_id)
)
treatments = Treatment.objects.filter(qset).distinct()
else:
treatments = []
# update patient timestamp
# ts = patient.timestamp.date()
# for treatment in treatments:
# if treatment.date_completed > ts:
# ts = treatment.date_completed
# if patient.timestamp.date() != ts:
# patient.timestamp = datetime.datetime.combine(ts, patient.timestamp.time())
# patient.save()
pacsimages = PACSImage.objects.filter(Q(patient=object_id),Q(Modality__startswith='CT')|Q(Modality__startswith='MR')).order_by('-ExamDate')
if len(pacsimages) > 9:
pacsimages = pacsimages[0:9]
response = render_to_response("ck/patient_detail.html",
{
"patient": patient,
"treatments": treatments,
"pacsimages": pacsimages,
}, context_instance=RequestContext(request))
response.set_cookie('patient', object_id)
request.session['patient'] = object_id
return response
@login_required
def patient_follow(request):
pass
@login_required
def patient_print(request, object_id):
if object_id=='':
object_id = request.session.get('patient')
patient = Patient.objects.get(id=object_id)
if object_id:
qset = (
Q(patient=object_id)
)
treatments = Treatment.objects.filter(qset).distinct()
else:
treatments = []
# update patient timestamp
# ts = patient.timestamp.date()
# for treatment in treatments:
# if treatment.date_completed > ts:
# ts = treatment.date_completed
# if patient.timestamp.date() != ts:
# patient.timestamp = datetime.datetime.combine(ts, patient.timestamp.time())
# patient.save()
response = render_to_response("ck/patient_print.html",
{
"patient": patient,
"treatments": treatments,
}, context_instance=RequestContext(request))
response.set_cookie('patient', object_id)
request.session['patient'] = object_id
return response
@login_required
def patient_search(request):
query = request.GET.get('q', '')
if query:
qset = (
Q(medical_records__icontains=query) |
Q(name__icontains=query) |
Q(id_cards__icontains=query)
)
results = Patient.objects.filter(qset).distinct()
if len(results) == 0:
if re.match('^\d+', query):
return HttpResponseRedirect('/patient/add/?ChartNo='+query)
elif re.match('^\w\d+', query):
return HttpResponseRedirect('/patient/add/?idcode='+query)
else:
return HttpResponseRedirect('/patient/add/?Name='+query)
else:
results = []
# print "query=", query
# print "results=", results
return render_to_response("ck/patient_search.html",
{
"results": results,
"query": query,
}, context_instance=RequestContext(request))
@login_required
def prior_oncrt_query(request, object_id):
if object_id=='':
object_id = request.session.get('patient')
patient = Patient.objects.get(id=object_id)
priors = patient.priortreatment_set;
answers = intra.oncrt_query(patient.medical_records)
# return HttpResponse(str(answers))
for answer in answers:
if answer['way'] != 'Radiosurgery' and not priors.filter(date=answer['start_date']):
p = PriorTreatment(
patient = patient,
date = answer['start_date'],
treatment = 3,
period = 1,
dose = answer['total_dose'],
memo = answer['site'] + ' ' + answer['remarks'],
)
p.save()
return HttpResponseRedirect('/patient/detail/'+object_id)
@login_required
def prior_op_note(request, object_id):
if object_id=='':
object_id = request.session.get('patient')
patient = Patient.objects.get(id=object_id)
priors = patient.priortreatment_set;
answers = intra.op_note_case(patient.medical_records)
# return HttpResponse(str(answers))
for answer in answers:
if not priors.filter(date=answer['surgery_date_time']):
p = PriorTreatment(
patient = patient,
date = answer['surgery_date_time'],
treatment = 1,
memo = ' '.join([answer['division'], answer['name_surgery'], answer['surgeon']])
)
p.save()
return HttpResponseRedirect('/patient/detail/'+object_id)
@login_required
def prior_path_exam(request, object_id):
if object_id=='':
object_id = request.session.get('patient')
patient = Patient.objects.get(id=object_id)
pathexams = patient.pathexam_set;
answers = intra.path_exam(patient.medical_records)
# return HttpResponse(str(answers))
for answer in answers:
if not pathexams.filter(path_code=answer['path_code']):
p = PathExam(
patient = patient,
path_code = answer['path_code'],
specimen_code = answer['specimen_code'],
specimen_get_date = answer['specimen_get_date'],
report_date = answer['report_date'],
division = answer['division'],
bed = answer['bed'],
report = answer['report'],
)
p.save()
return HttpResponseRedirect('/patient/detail/'+object_id)
@login_required
def query_height_weight(request, object_id):
if object_id=='':
object_id = request.session.get('patient')
patient = Patient.objects.get(id=object_id)
hw = intra.HeightWeight(patient.id_cards)
patient.height = hw['Height']
patient.weight = hw['Weight']
patient.save()
return HttpResponseRedirect('/patient/detail/'+object_id)
@login_required
def record_weekly(request, date):
if not date:
date = mx.DateTime.today()
Monday = mx.DateTime.DateTimeFrom(date) + mx.DateTime.RelativeDateTime(days=-6,weekday=(mx.DateTime.Monday,0))
NextMonday = Monday + mx.DateTime.RelativeDateTime(days=+7)
prevweek = mx.DateTime.DateTimeFrom(date) + mx.DateTime.RelativeDateTime(days=-7)
nextweek = mx.DateTime.DateTimeFrom(date) + mx.DateTime.RelativeDateTime(days=+7)
weekday = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun']
weekdate = {}
d = Monday
for day in weekday:
weekdate[day] = d.strftime('%m/%d')
d = d + mx.DateTime.RelativeDateTime(days=+1)
# print NextMonday, NNMonday
qset1 = Q(DTSTART__range=(Monday, NextMonday))
qset2 = Q(mode__exact=310) #310: 治療
events = VEVENT.objects.filter(qset1, qset2).order_by('DTSTART')
tids = []
for event in events:
tid = event.treatment.id
if not tid in tids:
tids.append(tid)
treatments = []
for tid in tids:
t = Treatment.objects.get(id=tid);
treatment = {
'id': t.id,
'icd9': t.icd9,
'other_diagnosis': t.other_diagnosis,
'accounting': t.get_accounting_display(),
'dates': [],
'surgeon': t.surgeon,
'oncologist': t.oncologist,
'referral': t.referral,
}
for event in events:
if tid == event.treatment.id:
treatment['dates'].append(event.DTSTART.date())
# for lesion in Treatment.objects.get(id=tid).lesion_set:
# treatment.
treatments.append(treatment)
# treatments = Treatment.objects.filter(id__in=tids)
response = render_to_response("ck/record_weekly.html",
{
"prevweek": prevweek.date,
"nextweek": nextweek.date,
"weeknumber": Monday.strftime('%G年 第%V週'),
"weekdate": weekdate,
"events": events,
"treatments": treatments,
}, context_instance=RequestContext(request))
return response
@login_required
def timetable_scheduling(request, date):
if not date:
date = mx.DateTime.today()
Monday = mx.DateTime.DateTimeFrom(date) + mx.DateTime.RelativeDateTime(days=+6,weekday=(mx.DateTime.Monday,0))
NextMonday = Monday + mx.DateTime.RelativeDateTime(days=+7)
prevweek = mx.DateTime.DateTimeFrom(date) + mx.DateTime.RelativeDateTime(days=-7)
nextweek = mx.DateTime.DateTimeFrom(date) + mx.DateTime.RelativeDateTime(days=+7)
# print NextMonday, NNMonday
qset = (
Q(DTSTART__range=(Monday, NextMonday))
)
treatments = Treatment.objects.filter(output__id__lt=900)
weekday = ['mon', 'tue', 'wed', 'thu', 'fri']
weekdate = {}
d = Monday
for day in weekday:
weekdate[day] = d.strftime('%m/%d')
d = d + mx.DateTime.RelativeDateTime(days=+1)
timetable = []
for treatment in treatments:
if treatment.vevent_set.filter(qset):
r = {}
patient = treatment.patient
r['name'] = patient.name
r['medical_records'] = patient.medical_records
r['indications'] = str(treatment.surgeon) + '\n' + str(treatment.oncologist)
r['diagnosis_site'] = treatment.other_diagnosis
r['number'] = ''
r['node'] = ''
r['mode'] = ''
r['time'] = ''
r['actual_treatment'] = ''
for day in weekday:
r[day] = ''
for event in treatment.vevent_set.order_by('DTSTART'):
wd = (event.DTSTART.date() - datetime.datetime.fromtimestamp(Monday).date()).days
if wd in range(0, 6):
r[weekday[wd]] += event.DTSTART.strftime('%H:%M') + ' ' + event.get_mode_display() + '\n'
timetable.append(r)
# print timetable
response = render_to_response("ck/timetable_scheduling.html",
{
"prevweek": prevweek.date,
"nextweek": nextweek.date,
"timetable": timetable,
"weekdate": weekdate,
}, context_instance=RequestContext(request))
return response
@login_required
def treatment_detail(request, object_id):
if object_id=='':
object_id = request.session.get('treatment')
treatment = Treatment.objects.get(id=object_id)
patient = Patient.objects.get(id=treatment.patient_id)
# response.set_cookie('patient', patient.id)
request.session['patient'] = patient.id
if object_id:
qset = (
Q(treatment=object_id)
)
vevents = VEVENT.objects.filter(qset).distinct().order_by('DTSTART')
lesions = Lesion.objects.filter(qset).distinct()
else:
vevents = []
lesions = []
# update treatment date_completed
for vevent in vevents:
vevent.SUMMARY = vevent.treatment.patient.name + vevent.get_mode_display()
vevent.save()
ds = False
dc = False
for lesion in lesions:
if lesion.start_date != None:
if not ds or lesion.start_date < ds:
ds = lesion.start_date
if lesion.end_date != None:
if not dc or lesion.end_date > dc:
dc = lesion.end_date
if not ds:
for vevent in vevents:
if vevent.mode != 310:
continue
if not ds or vevent.DTSTART.date() < ds:
ds = vevent.DTSTART.date()
if not dc or vevent.DTSTART.date() > dc:
dc = vevent.DTSTART.date()
if not ds:
for vevent in vevents:
if not ds or vevent.DTSTART.date() < ds:
ds = vevent.DTSTART.date()
if not dc or vevent.DTSTART.date() > dc:
dc = vevent.DTSTART.date()
if ds and treatment.date_started != ds:
treatment.date_started = ds
treatment.save()
if dc and treatment.date_completed != dc:
treatment.date_completed = dc
treatment.save()
response = render_to_response("ck/treatment_detail.html",
{
"patient": patient,
"treatment": treatment,
"vevents": vevents,
"lesions": lesions,
}, context_instance=RequestContext(request))
response.set_cookie('patient', patient.id)
request.session['patient'] = patient.id
response.set_cookie('treatment', object_id)
request.session['treatment'] = object_id
return response
@login_required
def treatment_print(request, object_id):
if object_id=='':
object_id = request.session.get('treatment')
treatment = Treatment.objects.get(id=object_id)
patient = Patient.objects.get(id=treatment.patient_id)
if object_id:
qset = (
Q(treatment=object_id)
)
vevents = VEVENT.objects.filter(qset).distinct().order_by('DTSTART')
lesions = Lesion.objects.filter(qset).distinct()
else:
vevents = []
lesions = []
# update treatment date_completed
dc = treatment.date_completed
for vevent in vevents:
vevent.SUMMARY = vevent.treatment.patient.name + vevent.get_mode_display()
vevent.save()
if vevent.DTSTART.date() > dc:
dc = vevent.DTSTART.date()
if treatment.date_completed != dc:
treatment.date_completed = dc
treatment.save()
paginator = Paginator(lesions, 3) # Show 3 lesions per page
# Make sure page request is an int. If not, deliver first page.
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
# If page request (9999) is out of range, deliver last page of results.
try:
contacts = paginator.page(page)
except (EmptyPage, InvalidPage):
contacts = paginator.page(paginator.num_pages)
response = render_to_response("ck/treatment_print.html",
{
"patient": patient,
"treatment": treatment,
"vevents": vevents,
"contacts": contacts,
}, context_instance=RequestContext(request))
response.set_cookie('patient', object_id)
request.session['patient'] = object_id
response.set_cookie('treatment', object_id)
request.session['treatment'] = object_id
return response
@login_required
def treatment_record(request, object_id):
if object_id=='':
object_id = request.session.get('treatment')
treatment = Treatment.objects.get(id=object_id)
patient = Patient.objects.get(id=treatment.patient_id)
if object_id:
qset = (
Q(treatment=object_id)
)
vevents = VEVENT.objects.filter(qset).distinct().order_by('DTSTART')
lesions = Lesion.objects.filter(qset).distinct()
else:
vevents = []
lesions = []
# update treatment date_completed
dc = treatment.date_completed
for vevent in vevents:
vevent.SUMMARY = vevent.treatment.patient.name + vevent.get_mode_display()
vevent.save()
if vevent.DTSTART.date() > dc:
dc = vevent.DTSTART.date()
if treatment.date_completed != dc:
treatment.date_completed = dc
treatment.save()
# response = render_to_response("ck/treatment_record.html",
response = render_to_response("ck/brief_history.html",
{
"patient": patient,
"treatment": treatment,
"vevents": vevents,
"lesions": lesions,
}, context_instance=RequestContext(request))
response.set_cookie('patient', object_id)
request.session['patient'] = object_id
response.set_cookie('treatment', object_id)
request.session['treatment'] = object_id
return response
@login_required
def treatment_report(request, object_id):
if object_id=='':
object_id = request.session.get('treatment')
treatment = Treatment.objects.get(id=object_id)
patient = Patient.objects.get(id=treatment.patient_id)
if object_id:
qset = (
Q(treatment=object_id)
)
vevents = VEVENT.objects.filter(qset).distinct().order_by('DTSTART')
lesions = Lesion.objects.filter(qset).distinct()
else:
vevents = []
lesions = []
# update treatment date_completed
dc = treatment.date_completed
for vevent in vevents:
vevent.SUMMARY = vevent.treatment.patient.name + vevent.get_mode_display()
vevent.save()
if vevent.DTSTART.date() > dc:
dc = vevent.DTSTART.date()
if treatment.date_completed != dc:
treatment.date_completed = dc
treatment.save()
paginator = Paginator(lesions, 5) # Show 25 contacts per page
# Make sure page request is an int. If not, deliver first page.
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
# If page request (9999) is out of range, deliver last page of results.
try:
contacts = paginator.page(page)
except (EmptyPage, InvalidPage):
contacts = paginator.page(paginator.num_pages)
response = render_to_response("ck/treatment_report.html",
{
"patient": patient,
"treatment": treatment,
"vevents": vevents,
"contacts": contacts,
}, context_instance=RequestContext(request))
response.set_cookie('patient', object_id)
request.session['patient'] = object_id
response.set_cookie('treatment', object_id)
request.session['treatment'] = object_id
return response
@login_required
def treatment_update(request, object_id):
if request.method == 'POST':
# TreatmentForm = form_for_model(Treatment)
form = TreatmentForm(request.POST)
form.save()
return HttpResponseRedirect('/treatment/list/')
treatment = Treatment.objects.get(id=object_id)
patient = Patient.objects.get(id=treatment.patient.id)
# TreatmentForm = form_for_instance(treatment)
form = TreatmentForm(instance=treatment)
response = render_to_response("ck/treatment_form2.html",
{
"form": form,
"patient": patient,
}, context_instance=RequestContext(request))
response.set_cookie('treatment', object_id)
request.session['treatment'] = object_id
return response
@login_required
def followup_newimages(request):
# date_start = Treatment.objects.values('patient_id').annotate(date=Min('date_started'))
# print date_start.query
# print date_start
date_query = Treatment.objects.values('patient_id').annotate(started=Min('date_started'),completed=Max('date_completed'))
# print date_query.query
# print date_query
images = PACSImage.objects.filter(Q(Saved = 0),Q(Modality__startswith='CT')|Q(Modality__startswith='MR')).order_by('-ExamDate')
# images = PACSImage.objects.get(Q(modality='CT')|Q(modality__startswith='MR'))
# print images
results = []
blank = 0
for image in images:
if blank > 50:
break
try:
treat_date = date_query.get(patient=image.patient)
except:
continue
# print image.ExamDate, image.patient.id, treat_date
if image.ExamDate > treat_date['completed']:
try:
LF = LesionFollow.objects.get(Q(Lesion__treatment__patient = image.patient),Q(Date = image.ExamDate))
image.Saved = 10 #有輸入
except:
pass
# print image.patient.name, image.ExamDate
results.append(image)
if image.Saved == 0:
blank += 1
return render_to_response("ck/followup_newimages.html",
{
"images": results,
}, context_instance=RequestContext(request))
@login_required
def followup_markimages(request, RequestSheetNo, Saved):
image = PACSImage.objects.get(Q(RequestSheetNo = RequestSheetNo))
image.Saved = Saved
image.save()
return HttpResponseRedirect('/followup/newimages/')
@login_required
def followup_nosee1(request):
treatment_date = Treatment.objects.values('patient_id').annotate(first=Min('date_started'),last=Max('date_completed'))
followup_date = Followup.objects.values('patient_id').annotate(first=Min('date'),last=Max('date'))
record_date = MedicalRecord.objects.values('patient_id').annotate(first=Min('InDate'),last=Max('InDate'))
image_date = PACSImage.objects.values('patient_id').annotate(first=Min('ExamDate'),last=Max('ExamDate'))
patients = Patient.objects.all()
results = []
# n = datetime.datetime.now()
for patient in patients:
if patient.dead:
continue
try:
d = treatment_date.get(patient=patient)
date = d['last']
except:
# print "%s no treatment" % patient.id
continue
try:
d = followup_date.get(patient=patient)
if d['last'] > date:
date = d['last']
except:
# print "%s no follow" % patient.id
pass
try:
d = record_date.get(patient=patient)
if d['last'] > date:
date = d['last']
except:
# print "%s no record" % patient.id
pass
try:
d = image_date.get(patient=patient)
if d['last'] > date:
date = d['last']
except:
# print "%s no image" % patient.id
pass
# results['patient.id']=date
results.append((patient, date))
# print results
results = sorted(results, key=lambda last: last[1])[:25]
# print datetime.datetime.now() - n
# print results
return render_to_response("ck/followup_nosee.html",
{
"results": results,
}, context_instance=RequestContext(request))
@login_required
def followup_nosee(request):
###Load all dates into hash first
treatment_date = Treatment.objects.values('patient_id').annotate(first=Min('date_started'),last=Max('date_completed'))
t = {}
for item in treatment_date:
t[item['patient_id']] = item['last']
followup_date = Followup.objects.values('patient_id').annotate(first=Min('date'),last=Max('date'))
f = {}
for item in followup_date:
f[item['patient_id']] = item['last']
record_date = MedicalRecord.objects.values('patient_id').annotate(first=Min('InDate'),last=Max('InDate'))
r = {}
for item in record_date:
r[item['patient_id']] = item['last']
image_date = PACSImage.objects.values('patient_id').annotate(first=Min('ExamDate'),last=Max('ExamDate'))
i = {}
for item in image_date:
i[item['patient_id']] = item['last']
patients = Patient.objects.all()
results = []
# n = datetime.datetime.now()
for patient in patients:
if patient.dead:
continue
try:
d = t[patient.id]
date = d
except:
# print "%s no treatment" % patient.id
continue
try:
d = f[patient.id]
if d > date:
date = d
except:
# print "%s no follow" % patient.id
pass
try:
d = r[patient.id]
if d > date:
date = d
except:
# print "%s no record" % patient.id
pass
try:
d = i[patient.id]
if d > date:
date = d
except:
# print "%s no image" % patient.id
pass
# results['patient.id']=date
results.append((patient, date))
# print results
results = sorted(results, key=lambda last: last[1])[:25]
# print datetime.datetime.now() - n
# print results
model = Patient
form_class = None
model, form_class = create_update.get_model_and_form_class(model, form_class)
form = form_class()
return render_to_response("ck/followup_nosee.html",
{
"results": results,
"form": form,
}, context_instance=RequestContext(request))
@login_required
def followup_image_long(request):
###Load all dates into hash first
treatment_date = Treatment.objects.values('patient_id').annotate(first=Min('date_started'),last=Max('date_completed'))
t = {}
for item in treatment_date:
t[item['patient_id']] = item['first']
image_date = PACSImage.objects.filter(Saved__in=[0,10]).values('patient_id').annotate(first=Min('ExamDate'),last=Max('ExamDate'))
i = {}
for item in image_date:
i[item['patient_id']] = item['last']
v = {}
follows = LesionFollow.objects.select_related().all()
# print follows
for follow in follows:
if not v.has_key(follow.Lesion.treatment.patient.id):
v[follow.Lesion.treatment.patient.id] = follow.Date
else:
v[follow.Lesion.treatment.patient.id] = max(follow.Date, v[follow.Lesion.treatment.patient.id])
# print v
# patients = Patient.objects.select_related().all()
patients = Patient.objects.all()
results = []
# n = datetime.datetime.now()
# print t
# print i
for patient in patients:
if patient.dead:
continue
try:
d = t[patient.id]
tdate = d
except:
# print "%s no treatment" % patient.id
continue
try:
d = i[patient.id]
idate = d
except:
# print "%s no image" % patient.id
continue
daydiff = (idate-tdate).days
if daydiff < 365:
continue
try:
d = v[patient.id]
vdate = d
except:
# print "%s no image" % patient.id
vdate = ''
# results['patient.id']=date
results.append((patient, daydiff, tdate, idate, vdate))
# print type(idate-tdate)
# print results
results = sorted(results, key=lambda last: -last[1])
# print datetime.datetime.now() - n
# print results
# model = Patient
# form_class = None
# model, form_class = create_update.get_model_and_form_class(model, form_class)
# form = form_class()
return render_to_response("ck/followup_image_long.html",
{
"results": results,
# "form": form,
}, context_instance=RequestContext(request))
@login_required
def followup_new_volume(request,object_id):
# print request
# print 'object_id=', object_id
idate = ''
p = request.POST
# print p
if p.has_key('Lesion'):
lesion = Lesion.objects.get(id=p['Lesion'])
f = lambda x:None if x == '' else x
l = LesionFollow(
Lesion = lesion,
Date = p['Date'],
Volume = f(p['Volume']),
A = f(p['A']),
B = f(p['B']),
C = f(p['C']),
Memo = p['Memo'],
)
l.save()
idate = p['Date']
try:
idate = request.GET['idate']
except:
idate = request.COOKIES['date']
try:
patient = Patient.objects.get(id=object_id)
except:
patient = Patient.objects.get(id=request.COOKIES['patient'])
model = LesionFollow
form_class = None
model, form_class = create_update.get_model_and_form_class(model, form_class)
form = form_class()
response = render_to_response("ck/followup_new_volume.html",
{
"patient": patient,
"idate": idate,
"form": form,
}, context_instance=RequestContext(request))
response.set_cookie('patient', patient.id)
response.set_cookie('date', idate)
return response
########## AJAX
@login_required
def below(request):
return render_to_response('ck/below.html')
@login_required
def get_target_location(request):
# return HttpResponse(serializers.serialize("xml", TargetLocation.objects.all()))
return HttpResponse(serializers.serialize("json", TargetLocation.objects.all()))
@login_required
def get_sublocation(request):
i = request.GET.get('id', '')
if i:
return HttpResponse(serializers.serialize("json", SubLocation.objects.filter(id=i)))
target = request.GET.get('target', '')
return HttpResponse(serializers.serialize("json", SubLocation.objects.filter(target_location=target)))
@login_required
def get_pathology(request):
sl = request.GET.get('sublocation', '')
return HttpResponse(serializers.serialize("json", Pathology.objects.filter(sublocation=sl)))
def get_icd9cm(request):
id = request.GET.get('id', False)
name = request.GET.get('q', '')
limit = request.GET.get('s', 99)
if (name.count('.')):
name = name.replace('.', '')[0:5].rstrip()
if id:
codes = ICD9Diag.objects.filter(code=id)
elif len(name):
qset = (
Q(code__istartswith=name) |
# Q(code__istartswith='0'+name) |
# Q(code__istartswith='00'+name) |
Q(desc__icontains=name)
)
codes = ICD9Diag.objects.filter(qset)[:100]
else:
codes =ICD9Diag.objects.all()[:100]
ret = """
[
"""
# ret = '{"results":['
for code in codes:
# ret += '["%s","%s"],' % (code.code, code)
ret += '["%s","%s"],' % (code, code.code)
# ret += '\n{"id":"%s","name":"%s"},' % (code.code, code)
ret = ret[:-1]+"""
]
"""
return HttpResponse(ret)
def get_icd9cm_old(request):
id = request.GET.get('id', False)
name = request.GET.get('name', '')[:-1]
if (name.count('.')):
name = name.replace('.', '')[0:5].rstrip()
if id:
codes = ICD9Diag.objects.filter(code=id)
elif len(name):
qset = (
Q(code__istartswith=name) |
# Q(code__istartswith='0'+name) |
# Q(code__istartswith='00'+name) |
Q(desc__icontains=name)
)
codes = ICD9Diag.objects.filter(qset)[:100]
else:
codes =ICD9Diag.objects.all()[:100]
ret = """
{ 'identifier': 'code',
'label': 'name',
'items': [
"""
# ret = '{"results":['
for code in codes:
ret += '\n{"code":"%s","name":"%s"},' % (code.code, code)
# ret += '\n{"id":"%s","name":"%s"},' % (code.code, code)
ret = ret[:-1]+"]}"
return HttpResponse(ret)
def get_followup(request):
date = request.GET.get('date', '')
if date:
d = mx.DateTime.DateTimeFrom(date)
fr = d + mx.DateTime.RelativeDateTime(weeks=-6)
to = d + mx.DateTime.RelativeDateTime(weeks=+6)
events = Patient.objects.filter(next_followup__range=(fr, to))
else:
events = Patient.objects.all()
return HttpResponse(serializers.serialize("json", events, ensure_ascii=False))
def get_vevent_old(request):
date = request.GET.get('date', '')
if date:
d = mx.DateTime.DateTimeFrom(date)
fr = d + mx.DateTime.RelativeDateTime(weeks=-6)
to = d + mx.DateTime.RelativeDateTime(weeks=+6)
events = VEVENT.objects.filter(DTSTART__range=(fr, to))
else:
events = VEVENT.objects.all()
return HttpResponse(serializers.serialize("json", events, ensure_ascii=False))
'''
DataDumper
'''
import types
from django.db import models
import pyxslt.serialize
from django.utils import simplejson as json
from django.core.serializers.json import DateTimeAwareJSONEncoder
from decimal import *
class DataDumper:
fields = {}
def selectObjectFields(self,objectType,fields = []):
self.fields[objectType] = fields
def dump(self,data,format='xml'):
"""
The main issues with django's default json serializer is that properties that
had been added to a object dynamically are being ignored (and it also has
problems with some models).
"""
def _any(data):
ret = None
if type(data) is types.ListType:
ret = _list(data)
elif type(data) is types.DictType:
ret = _dict(data)
elif isinstance(data, Decimal):
# json.dumps() cant handle Decimal
ret = str(data)
elif isinstance(data, models.query.QuerySet):
# Actually its the same as a list ...
ret = _list(data)
elif isinstance(data, models.Model):
ret = _model(data)
else:
ret = data
return ret
def _model(data):
ret = {}
# If we only have a model, we only want to encode the fields.
objType = data.__class__.__name__
for f in data._meta.fields:
if (self.fields[objType]) and (f.attname in self.fields[objType]):
ret[f.attname] = _any(getattr(data, f.attname))
# And additionally encode arbitrary properties that had been added.
fields = dir(data.__class__) + ret.keys()
add_ons = [k for k in dir(data) if k not in fields]
for k in add_ons:
if (self.fields[objType]) and (k in self.fields[objType]):
ret[k] = _any(getattr(data, k))
return ret
def _list(data):
ret = []
for v in data:
ret.append(_any(v))
return ret
def _dict(data):
ret = {}
for k,v in data.items():
ret[k] = _any(v)
return ret
ret = _any(data)
if(format == 'xml'):
return pyxslt.serialize.toString(prettyPrintXml=False,data=ret,)
else:
return json.dumps(ret, cls=DateTimeAwareJSONEncoder)
'''
DataDumper
'''
@login_required
def get_vevent(request):
events = VEVENT.objects.extra(select={
'title' : "SUMMARY",
'allDay': "false",
# 'start' : "UNIX_TIMESTAMP(DATE_SUB(DTSTART, INTERVAL 8 HOUR))",
# 'end' : "UNIX_TIMESTAMP(ADDTIME(DATE_SUB(DTSTART, INTERVAL 8 HOUR),DURATION))",
'start' : "UNIX_TIMESTAMP(DTSTART)",
'end' : "UNIX_TIMESTAMP(ADDTIME(DTSTART,DURATION))",
# 'end' : "UNIX_TIMESTAMP(ADDTIME(DTSTART,DURATION))",
# 'end' : "UNIX_TIMESTAMP(ADDTIME(DTSTART,MAX(DURATION,'00:30:00')))",
'url' : "CONCAT('/event/update/',id,'/')",
})
start = request.GET.get('start', '')
end = request.GET.get('end' , '')
if start:
fr = datetime.datetime.fromtimestamp(float(start))
to = datetime.datetime.fromtimestamp(float(end))
events = events.filter(DTSTART__range=(fr, to))
dumper = DataDumper()
dumper.selectObjectFields('VEVENT', ['id', 'title', 'allDay', 'start', 'end', 'url'])
dumper.dump(events,'json')
return HttpResponse(dumper.dump(events,'json'))
# return HttpResponse(serializers.serialize("json", events, ensure_ascii=False))
# entries = []
# for event in events:
# starttime = mx.DateTime.DateTimeFrom(event.DTSTART.isoformat())
# duration = mx.DateTime.DateTimeDeltaFrom(hours=event.DURATION.hour, minutes=event.DURATION.minute)
# endtime = starttime + duration
# entry = {
# 'id': event.id,
# 'starttime': starttime.strftime('%Y-%m-%dT%H:%M:%S'),
# 'endtime': starttime.strftime('%Y-%m-%dT%H:%M:%S'),
# 'allday': False,
# 'repeated': False,
# 'title': event.treatment.patient.name + event.get_mode_display(),
# 'url': "/treatment/detail/%i/" % event.treatment.id,
# 'body': event.SUMMARY,
# 'attributes': {
# 'Oncologist': event.treatment.oncologist.name,
# 'Surgeon': event.treatment.surgeon.name,
# },
# 'type': [event.get_mode_display(), event.get_mode_display()]
# }
# entries.append(entry)
# return HttpResponse(serializers.serialize("xml", entries, ensure_ascii=False))
@login_required
def event_drop(request):
id = request.GET.get('id' , '')
dayDelta = int(request.GET.get('dayDelta' , ''))
minuteDelta = int(request.GET.get('minuteDelta', ''))
vevent = VEVENT.objects.get(id=id)
t = vevent.DTSTART
start = mx.DateTime.DateTime(t.year,t.month,t.day,t.hour,t.minute,t.second+1e-6*t.microsecond)
start = start + mx.DateTime.RelativeDateTime(days=dayDelta) + mx.DateTime.RelativeDateTime(minutes=minuteDelta)
vevent.DTSTART = datetime.datetime.fromtimestamp(start)
vevent.save()
return HttpResponse(serializers.serialize("json", VEVENT.objects.filter(id=id), ensure_ascii=False))
@login_required
def event_resize(request):
id = request.GET.get('id' , '')
dayDelta = int(request.GET.get('dayDelta' , ''))
minuteDelta = int(request.GET.get('minuteDelta', ''))
vevent = VEVENT.objects.get(id=id)
t = vevent.DURATION
d = datetime.timedelta(days=dayDelta,minutes=minuteDelta)
dt = datetime.datetime.combine(datetime.date.today(), t) + d
vevent.DURATION = dt.time()
vevent.save()
return HttpResponse(serializers.serialize("json", VEVENT.objects.filter(id=id), ensure_ascii=False))
@login_required
def update_vevent(request):
# id = request.GET.get('id', '')
# starttime = request.GET.get('starttime', '')
# endtime = request.GET.get('endtime', '')
id = request.POST.get('id', '')
starttime = mx.DateTime.DateTimeFrom(request.POST.get('starttime', '')[:-6])
endtime = mx.DateTime.DateTimeFrom(request.POST.get('endtime', '')[:-6])
duration = mx.DateTime.Age(endtime, starttime)
duration = str(duration.hours)+':'+str(duration.minutes)
print id, starttime, endtime, duration
vevent = VEVENT.objects.get(id=id)
vevent.DTSTART = starttime
# vevent.DURATION = duration
vevent.save()
return HttpResponse(serializers.serialize("json", VEVENT.objects.filter(id=id), ensure_ascii=False))
# return HttpResponse("")
def listCalendarByRange(sd, ed, cnt):
# print ret
# $title = array('team meeting', 'remote meeting', 'project plan review', 'annual report', 'go to dinner');
# $location = array('Lodan', 'Newswer', 'Belion', 'Moore', 'Bytelin');
events = VEVENT.objects.extra(select={
'title' : "SUMMARY",
'allDay': "false",
# 'start' : "UNIX_TIMESTAMP(DATE_SUB(DTSTART, INTERVAL 8 HOUR))",
# 'end' : "UNIX_TIMESTAMP(ADDTIME(DATE_SUB(DTSTART, INTERVAL 8 HOUR),DURATION))",
'start' : "UNIX_TIMESTAMP(DTSTART)",
'end' : "UNIX_TIMESTAMP(ADDTIME(DTSTART,DURATION))",
# 'end' : "UNIX_TIMESTAMP(ADDTIME(DTSTART,DURATION))",
# 'end' : "UNIX_TIMESTAMP(ADDTIME(DTSTART,MAX(DURATION,'00:30:00')))",
'url' : "CONCAT('/event/update/',id,'/')",
})
events = events.filter(DTSTART__range=(sd, ed))
# print events
revents = []
for event in events:
d = event.DURATION
revent = (event.id,
event.title,
event.DTSTART.isoformat(),
(event.DTSTART+datetime.timedelta(minutes=d.minute, hours=d.hour)).isoformat(),
0, #IsAllDayEvent
0, #more than one day event
0, #Recurring event
event.id % 14, #Color
1, #editable
dict(event.MODE_CHOICES).get(event.mode,''), #Location
'', #attends
)
print revent
revents.append(revent)
ret = {}
ret['events'] = revents
ret["issort"] = True
ret["start"] = sd.isoformat()
ret["end"] = ed.isoformat()
ret['error'] = None
return ret
def listCalendar(day, type):
date = datetime.datetime.strptime(day, '%m/%d/%Y')
print date
if type == 'month':
st = date - datetime.timedelta(31)
et = date + datetime.timedelta(31)
cnt = 50
elif type == 'week':
st = date - datetime.timedelta(7)
et = date + datetime.timedelta(7)
cnt = 20
elif type == 'day':
st = date - datetime.timedelta(1)
et = date + datetime.timedelta(1)
cnt = 5
return listCalendarByRange(st, et, cnt)
#@login_required
def datafeed(request):
try:
# print request
method = request.GET['method']
# print method
if method == 'add':
pass
elif method == 'list':
ret = listCalendar(request.POST['showdate'], request.POST['viewtype'])
elif method == 'update':
pass
elif method == 'remove':
pass
elif method == 'adddetails':
pass
except:
ret = listCalendar('8/3/2011', 'month')
dumper = DataDumper()
return HttpResponse(dumper.dump(ret,'json'))