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

1381 lines
49 KiB
Python
Executable file

# -*- coding: utf-8 -*-
# Create your views here.
from multiprocessing import Process
from django.contrib.auth import *
from django.contrib.auth.decorators import *
from django.core import serializers
from django.http import *
from django.shortcuts import *
from django.views.decorators.csrf import *
from django.utils import *
from django.views.generic import CreateView, DeleteView
from django.db.models import Q
from categories.models import *
from dateutil.relativedelta import *
from excel_response import ExcelResponse
from haystack.inputs import AutoQuery
from haystack.query import SearchQuerySet
from ntuh import settings
from registry.models import *
from .utils import RenewSchedule
#from multiuploader.models import *
import calendar, datetime, json, os
import io as StringIO
import ck.models
try:
from collections import OrderedDict
except:
from ordereddict import OrderedDict
ROOT = lambda base : os.path.join(os.path.dirname(__file__), base).replace('\\','/')
@login_required
def op_category(request):
# source_array = [{'value': 0, 'text': "None"}]
source_array = [(0, "None")]
array = OrderedDict()
array[0] = 'None'
# L = list(Category.objects.get(name='手術').get_children())
# L.sort(key=lambda c: (c.order, c.id))
L = [Category.objects.get(name='手術')]
for d in L[0].get_descendants():
array[d.id] = str(d).replace('手術 > ', '')
# source_array.append({'value': d.id, 'text': str(d).replace('手術 > ', '')})
source_array.append((d.id, str(d).replace('手術 > ', '')))
return HttpResponse(json.dumps(source_array), content_type='application/json')
return HttpResponse(json.dumps(array), content_type='application/json')
while L:
c = L[0]
del L[0]
if c.is_leaf_node():
array[c.id] = str(c).replace('手術 > ', '')
else:
if c.name.lower().find('others') != -1:
array[c.id] = str(c).replace('手術 > ', '')
# L[:0] = c.get_children()
children = list(c.get_children())
L[:0] = sorted(children, key=lambda c: (c.order, c.id))
# L = list(Category.objects.get(name='手術').get_children())
# L.sort(key=lambda c: (c.order, c.id))
# while L:
# c = L[0]
# del L[0]
# array.append(c)
# if c.is_leaf_node():
# pass
# else:
# children = list(c.get_children())
# L[:0] = sorted(children, key=lambda c: (c.order, c.id))
# for c in Category.objects.filter(tree_id=1):
# if c.is_leaf_node():
# array[c.id] = str(c)
return HttpResponse(json.dumps(array), content_type='application/json')
#@csrf_exempt
def op_edit(request):
field, id = request.POST.get('id', '').split('_')
# print field, id
value = request.POST.get('value', '').strip()
if value in ('', 'None', '0'):
value = None
op = OPSchedule.objects.get(id=id)
if field == 'category':
op.category_id = value
if value:
op.save()
return HttpResponse(Category.objects.get(id=value))
elif field == 'Memo':
op.Memo = value
elif field == 'Morbidity':
op.Morbidity = value
elif field == 'Mortality':
op.Mortality = value
elif field == 'PatDignosis':
op.PatDignosis = value
op.save()
return HttpResponse(value)
@login_required
def op_note(request, PatChartNo, date):
display = request.GET.get('display', False) # display 時間資訊 & 醫令資訊
pdf = request.GET.get('pdf', False)
for op in OPNote.objects.filter(PatChartNo = PatChartNo, date = date):
pattern = '\\"Yellow\\">(?P<first>.)(?P<name>.*?)\\((?P<sex>.*?),(?P<dob>.*?),(?P<age>.*?)\\)</TD>'
repl = '"Yellow">\g<first>**(\g<sex>,****/**/**,\g<age>,%s)</TD>' % PatChartNo
if pdf:
import xhtml2pdf.pisa as pisa
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont
pdfmetrics.registerFont(TTFont('ArialUni', ROOT('../static/ArialUni.ttf')))
from xhtml2pdf import default
default.DEFAULT_FONT["helvetica"]="ArialUni"
content = op.content.replace('style="display: none"', '')
html = re.sub(pattern, repl, content)
result = StringIO.StringIO()
# pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("ISO-8859-1")), result)
# pisa.showLogging(debug=True)
# pdf = pisa.pisaDocument(StringIO.StringIO(html.encode("UTF-8")), result, encoding='UTF-8', raise_exception = False)
# pdf = pisa.CreatePDF(StringIO.StringIO(html.encode("UTF-8")), result, encoding='UTF-8')
# pdf = pisa.CreatePDF(StringIO.StringIO(html.encode("UTF-8")), result, encoding='UTF-8', raise_exception = True)
pdf = pisa.CreatePDF(StringIO.StringIO(html.encode("UTF-8")), result, encoding='UTF-8', raise_exception = False)
return HttpResponse(result.getvalue(), content_type='application/pdf')
# if not pdf.err:
# return HttpResponse(result.getvalue(), mimetype='application/pdf')
# return HttpResponse('We had some errors<pre>%s</pre>' % cgi.escape(html))
elif display:
return HttpResponse(op.content.replace('style="display: none"', ''))
else:
return HttpResponse(op.content)
return HttpResponse()
@login_required
def patho_report(request, PatChartNo, date):
for patho in PathologyReport.objects.filter(ChartNo = PatChartNo).order_by('-SpecimenGetDate'):
matches = re.findall('(<table id="rReportTab.*?</table>)', patho.html, re.DOTALL)
return HttpResponse(matches[0])
return HttpResponse()
#@login_required
#def op_images(request, PatChartNo, date):
#
# items = MultiuploaderImage.objects.all()
# return render_to_response('registry/op_images.html',
## {'oplist': oplist},
# {'items':items},
# context_instance=RequestContext(request))
@login_required
@csrf_exempt
def op_prepare(request):
date1 = request.GET.get('date1', '0')
print1 = request.GET.get('print1', False)
renew1 = request.GET.get('renew1', False)
rooms1 = request.GET.get('rooms1', False)
delete1 = request.GET.get('delete1', False)
if delete1:
# print delete1
obj = OPSchedule.objects.get(id=delete1)
obj.delete()
if renew1:
p = Process(target=RenewSchedule)
p.start()
p.join()
if date1 != '0':
oplist = OPSchedule.objects.filter(OPDate=date1).order_by('OPDate', 'OpRoomNo', 'OpSeqNo')
date2 = datetime.datetime.strptime(date1,'%Y-%m-%d').strftime('%Y-%m-%d(W%w,%a)')
# print date2
else:
date1 = 'Upcoming'
date2 = 'Upcoming'
oplist = OPSchedule.objects.filter(OPDate__gte=datetime.date.today()).order_by('OPDate', 'OpRoomNo', 'OpSeqNo')
dates = oplist.values_list('OPDate', flat=True)
dates=set(dates)
dates=list(dates)
dates=sorted(dates)
rooms = oplist.values_list('OpRoomNo', flat=True)
rooms=set(rooms)
rooms=rooms-set([None])
rooms=list(rooms)
rooms=sorted(rooms)
# print rooms
if print1:
# print type(rooms1), rooms1
# return render_to_response('registry/op_prepare_print.html',
# {
# 'oplist': oplist,
# 'content_type': ContentType.objects.get(app_label="registry", model="OPSchedule").model,
# 'dates': dates,
# 'rooms': json.loads(rooms1),
# 'NOADS': settings.NOADS,
# 'date1': date1,
# 'date2': date2,
# },
# context_instance=RequestContext(request))
return render(request, 'registry/op_prepare_print.html', {
'oplist': oplist,
'content_type': ContentType.objects.get(app_label="registry", model="OPSchedule").model,
'dates': dates,
'rooms': json.loads(rooms1),
'NOADS': settings.NOADS,
'date1': date1,
'date2': date2,
})
else:
HTTP_USER_AGENT = request.META['HTTP_USER_AGENT']
if 'Chrome' in HTTP_USER_AGENT:
HTTP_USER_AGENT = 'Good! You are using %s' % HTTP_USER_AGENT.replace('Chrome', '<span class="label label-success">Chrome</span>')
else:
HTTP_USER_AGENT = '<span class="label label-warning">Chrome</span> is suggested, but you are using %s' % HTTP_USER_AGENT
# return render_to_response('registry/op_prepare.html',
# {
# 'oplist': oplist,
# 'content_type': ContentType.objects.get(app_label="registry", model="OPSchedule").model,
# 'dates': dates,
# 'rooms': rooms,
# 'rooms_json': json.dumps(rooms),
# 'NOADS': settings.NOADS,
# 'HTTP_USER_AGENT': HTTP_USER_AGENT,
# },
# context_instance=RequestContext(request))
return render(request, 'registry/op_prepare.html', {
'oplist': oplist,
'content_type': ContentType.objects.get(app_label="registry", model="OPSchedule").model,
'dates': dates,
'rooms': rooms,
'rooms_json': json.dumps(rooms),
'NOADS': settings.NOADS,
'HTTP_USER_AGENT': HTTP_USER_AGENT,
})
@login_required
def op_schedule(request):
month = request.POST.get('month', False)
if month:
mm, yy = month.split('/')
m = int(mm)
y = int(yy)
weakday, number = calendar.monthrange(y, m)
start_date = datetime.date(y, m, 1)
end_date = datetime.date(y, m, number)
oplist = OPSchedule.objects.filter(Complete='完成').filter(OPDate__range=(start_date, end_date)).order_by('OPDate', 'OpRoomNo', 'OpSeqNo')
else:
oplist = OPSchedule.objects.filter(Complete='完成').order_by('-OPDate', 'OpRoomNo', 'OpSeqNo')[0:200]
# content_type = ContentType.objects.get(app_label="registry", model="OPSchedule").model
# return render_to_response('registry/op_schedule.html',
# {
# 'oplist': oplist,
# 'content_type': ContentType.objects.get(app_label="registry", model="OPSchedule").model,
# 'NOADS': settings.NOADS,
# },
# context_instance=RequestContext(request))
return render(request, 'registry/op_schedule.html', {
'oplist': oplist,
'content_type': ContentType.objects.get(app_label="registry", model="OPSchedule").model,
'NOADS': settings.NOADS,
})
@login_required
def op_uncategorized(request):
month = request.POST.get('month', False)
if month:
mm, yy = month.split('/')
m = int(mm)
y = int(yy)
weakday, number = calendar.monthrange(y, m)
start_date = datetime.date(y, m, 1)
end_date = datetime.date(y, m, number)
oplist = OPSchedule.objects.filter(OPDate__range=(start_date, end_date)).filter(category=None).filter(Complete='完成').order_by('OPDate', 'OpRoomNo', 'OpSeqNo')
else:
end_date = datetime.datetime.now() - datetime.timedelta(days=3*365)
# print end_date
oplist = OPSchedule.objects.filter(OPDate__gt= end_date).filter(category=None).filter(Complete='完成').order_by('-OPDate', 'OpRoomNo', 'OpSeqNo')[0:100]
# return render_to_response('registry/op_schedule.html',
# {
# 'oplist': oplist,
# 'content_type': ContentType.objects.get(app_label="registry", model="OPSchedule").model,
# },
# context_instance=RequestContext(request))
return render(request, 'registry/op_schedule.html', {
'oplist': oplist,
'content_type': ContentType.objects.get(app_label="registry", model="OPSchedule").model,
})
def SRSCount(icd9s, year, month = False):
count = 0
for icd in icd9s:
query = ck.models.Treatment.objects.using('ck').filter(icd9__code__istartswith=icd)
if month:
count += query.filter(date_completed__year=year).filter(date_completed__month=month).count()
else:
count += query.filter(date_completed__year=year).count()
return count
def SRSCountAll(year, month = False):
count = 0
L = list(Category.objects.get(name='手術').get_children())
L.sort(key=lambda c: (c.order, c.id))
while L:
c = L[0]
del L[0]
if c.is_leaf_node():
pass
else:
children = list(c.get_children())
L[:0] = sorted(children, key=lambda c: (c.order, c.id))
try: # SRS
desc = json.loads(c.description)
except:
desc = {}
if 'icd9' in desc:
count += SRSCount(desc['icd9'], year, month)
return count
def SRSC():
if settings.SPECIALTY == '新竹分院' or True:
return 0
else:
return SRSCountAll(year, month)
def CategoryMonthCount(year, month, cat): # including subcat and SRS
if month:
weakday, number = calendar.monthrange(year, month)
start_date = datetime.date(year, month, 1)
end_date = datetime.date(year, month, number)
else:
start_date = datetime.date(year, 1, 1)
end_date = datetime.date(year, 12, 31)
# if settings.SPECIALTY == '新竹分院' or True:
# SRSC = 0
# else:
# SRSC = SRSCountAll(year, month)
if cat in [u'手術總數', None]:
return OPSchedule.objects.filter(Complete='完成').filter(OPDate__range=(start_date, end_date)).count() + SRSC()
if cat in [u'手術病人數']:
return OPSchedule.objects.filter(Complete='完成').filter(OPDate__range=(start_date, end_date)).values('PatChartNo').distinct().count() + SRSC()
count = 0
L = [cat]
while L:
c = L[0]
del L[0]
if c.is_leaf_node():
pass
else:
children = list(c.get_children())
L[:0] = sorted(children, key=lambda c: (c.order, c.id))
try: # SRS
desc = json.loads(c.description)
except:
desc = {}
if 'icd9' in desc:
if settings.SPECIALTY != '新竹分院':
count += SRSCount(desc['icd9'], year, month)
else:
count += OPSchedule.objects.filter(Complete='完成').filter(OPDate__range=(start_date, end_date)).filter(category=c).count()
return count
def CategoryMonthCountMM(year, month, cat): # return count, include morbidity & mortality, not including subcat
if month:
weakday, number = calendar.monthrange(year, month)
start_date = datetime.date(year, month, 1)
end_date = datetime.date(year, month, number)
else:
start_date = datetime.date(year, 1, 1)
end_date = datetime.date(year, 12, 31)
memos = []
morbs = []
morts = []
if cat == u'手術總數':
case = OPSchedule.objects.filter(Complete='完成').filter(OPDate__range=(start_date, end_date)).count()
emergency = OPSchedule.objects.filter(Complete='完成').filter(OPDate__range=(start_date, end_date)).exclude(OpTypeName=u'').count()
morbidity = OPSchedule.objects.filter(Complete='完成').filter(OPDate__range=(start_date, end_date)).filter(Morbidity__isnull=False).count()
mortality = OPSchedule.objects.filter(Complete='完成').filter(OPDate__range=(start_date, end_date)).filter(Mortality__isnull=False).count()
else:
cases = OPSchedule.objects.filter(Complete='完成').filter(OPDate__range=(start_date, end_date)).filter(category=cat)
case = cases.count()
emergency = cases.exclude(OpTypeName=u'').count()
morbidity = cases.filter(Morbidity__isnull=False).count()
mortality = cases.filter(Mortality__isnull=False).count()
for c in cases:
if c.Memo:
memos.append("%s %s" % (c.PatChartNo, c.Memo.replace(str(c.PatChartNo), '')))
if c.Morbidity:
morbs.append("%s %s" % (c.PatChartNo, c.Morbidity.replace(str(c.PatChartNo), '')))
if c.Mortality:
morts.append("%s %s" % (c.PatChartNo, c.Mortality.replace(str(c.PatChartNo), '')))
return {
'case': case,
'emergency': emergency,
'morbidity': morbidity,
'mortality': mortality,
'memos': '\n'.join(memos),
'morbs': '\n'.join(morbs),
'morts': '\n'.join(morts),
}
def CategoryMonthMM(year, month, cat): # return records
if month:
weakday, number = calendar.monthrange(year, month)
start_date = datetime.date(year, month, 1)
end_date = datetime.date(year, month, number)
else:
start_date = datetime.date(year, 1, 1)
end_date = datetime.date(year, 12, 31)
return OPSchedule.objects.filter(Complete='完成').filter(OPDate__range=(start_date, end_date)).filter(category=cat)
def xls_to_response(xls, fname):
response = HttpResponse(content_type="application/ms-excel")
response['Content-Disposition'] = 'attachment; filename=%s' % fname
xls.save(response)
return response
#return xls_to_response(xls,'foo.xls')
def data_to_xls(data, fname, blank_zero = True ):
from tempfile import TemporaryFile
import xlwt
# algn1 = xlwt.Alignment()
# algn1.wrap = 1
# style1 = xlwt.XFStyle()
# style1.alignment = algn1
style1 = xlwt.easyxf("alignment: wrap on")
book = xlwt.Workbook()
sheet1 = book.add_sheet('Sheet 1')
row = 0
for r in data:
col = 0
for c in r:
if blank_zero and c == 0:
col += 1
continue
# print (type(c))
# if unicode(c).find('\n') != -1: #UnicodeDecodeError
# if type(c) in [str, unicode] and '\n' in c:
if type(c) is str and '\n' in c:
sheet1.write(row, col, c, style1)
else:
sheet1.write(row, col, c)
col += 1
row += 1
return xls_to_response(book, fname)
@login_required
def op_month_old(request):
last_month = datetime.date.today() + relativedelta( months = -1 )
month = last_month.strftime('%m/%Y')
month = request.GET.get('month', month)
month = request.POST.get('month', month)
mm, yy = month.split('/')
L0 = list(Category.objects.get(name='手術').get_children())
L0.sort(key=lambda c: (c.order, c.id))
LOP = []
LSRS = []
for l in L0: #OP then SRS
if l.name.find('SRS') != -1:
LSRS.append(l)
else:
LOP.append(l)
L0 = LOP + LSRS
data = []
T = CategoryMonthCountMM(int(yy), int(mm), u'手術總數')
data.append([u'項目', u'手術', u'', '', 'Morbidity', '', 'Mortality', ''])
data.append([u'手術總數', T['case'], T['emergency'], '', T['morbidity'], '', T['mortality'], ''])
data.append([''])
for L1 in L0:
L = [L1]
array = []
while L:
c = L[0]
del L[0]
array.append(c)
if c.is_leaf_node():
pass
else:
children = list(c.get_children())
L[:0] = sorted(children, key=lambda c: (c.order, c.id))
caseS = 0
emergencyS = 0
morbidityS = 0
mortalityS = 0
data.append([u'項目', u'手術', u'', '', 'Morbidity', '', 'Mortality', ''])
for cat in array:
try:
row = [' ' * cat.level + cat.name]
except:
row = [cat]
try: # SRS
desc = json.loads(cat.description)
except:
desc = {}
if 'icd9' in desc:
C = {
'case': SRSCount(desc['icd9'], int(yy), int(mm)),
'emergency': 0,
'morbidity': 0,
'mortality': 0,
'memos': '',
'morbs': '',
'morts': '',
}
else: # surgery
C = CategoryMonthCountMM(int(yy), int(mm), cat)
caseS += C['case']
emergencyS += C['emergency']
morbidityS += C['morbidity']
mortalityS += C['mortality']
row.extend([C['case'], C['emergency'], C['memos'], C['morbidity'], C['morbs'], C['mortality'], C['morts']])
data.append(row)
if len(array)>1:
data.append([' Subtotal', caseS, emergencyS, '', morbidityS, '', mortalityS, ''])
data.append([''])
# data.append([u'項目', u'手術', u'急', 'Morbidity', 'Mortality'])
data.append([u'未分類', CategoryMonthCountMM(int(yy), int(mm), None)['case']])
data.append([u'手術總數', T['case'], T['emergency'], '', T['morbidity'], '', T['mortality'], ''])
data.append([u'含CyberKnife', T['case'] + SRSCountAll(int(yy), int(mm))])
if request.GET.get('xls', False):
return data_to_xls(data, '%s.xls' % month)
else:
# return render_to_response('registry/op_month.html',
# {
# 'data': data,
# 'month': month,
# },
# context_instance=RequestContext(request))
return render(request, 'registry/op_month.html', {
'data': data,
'month': month,
})
@login_required
def op_month(request):
last_month = datetime.date.today() + relativedelta( months = -1 )
month = last_month.strftime('%m/%Y')
month = request.GET.get('month', month)
month = request.POST.get('month', month)
mm, yy = month.split('/')
L0 = list(Category.objects.get(name='手術').get_children())
L0.sort(key=lambda c: (c.order, c.id))
LOP = []
LSRS = []
for l in L0: #OP then SRS
if l.name.find('SRS') != -1:
LSRS.append(l)
else:
LOP.append(l)
L0 = LOP + LSRS
data = []
T = CategoryMonthCountMM(int(yy), int(mm), u'手術總數')
data.append([u'項目', u'手術', u'', '', 'Morbidity', '', 'Mortality', ''])
data.append([u'手術總數', T['case'], T['emergency'], '', T['morbidity'], '', T['mortality'], ''])
data.append([''])
cats = []
for L1 in L0:
L = [L1]
array = []
while L:
c = L[0]
del L[0]
array.append(c)
if c.is_leaf_node():
pass
else:
children = list(c.get_children())
L[:0] = sorted(children, key=lambda c: (c.order, c.id))
caseSum = 0
emergencySum = 0
morbiditySum = 0
mortalitySum = 0
data.append([u'項目', u'手術', u'', '', 'Morbidity', '', 'Mortality', ''])
for cat in array:
try:
rowtitle = ' ' * cat.level + cat.name
except:
rowtitle = cat
try: # SRS
desc = json.loads(cat.description)
except:
desc = {}
MemoS = []
MorbidityS = []
MortalityS = []
if 'icd9' in desc:
records = None
if settings.SPECIALTY == '新竹分院':
count = 0
else:
count = SRSCount(desc['icd9'], int(yy), int(mm))
emergency = 0
morbidity = 0
mortality = 0
else: # surgery
records = CategoryMonthMM(int(yy), int(mm), cat)
count = records.count()
emergency = records.exclude(OpTypeName=u'').count()
morbidity = records.exclude(Morbidity__isnull=True).count()
mortality = records.exclude(Mortality__isnull=True).count()
for r in records:
chartno = str(r.PatChartNo)
if r.Memo:
if chartno in r.Memo:
r.Memo= r.Memo.replace(chartno, '').strip()
r.save()
MemoS.append(r.Memo)
if r.Morbidity:
if chartno in r.Morbidity:
r.Morbidity= r.Morbidity.replace(chartno, '').strip()
r.save()
MorbidityS.append(r.Morbidity)
if r.Mortality:
if chartno in r.Mortality:
r.Mortality= r.Mortality.replace(chartno, '').strip()
r.save()
MortalityS.append(r.Mortality)
cats.append({
'title': rowtitle,
'desc': desc,
'records': records,
'count': count if count else '',
'emergency': emergency if emergency else '',
'morbidity': morbidity if morbidity else '',
'mortality': mortality if mortality else '',
})
data.append([rowtitle, count, emergency,
'\n'.join(MemoS),
morbidity,
'\n'.join(MorbidityS),
mortality,
'\n'.join(MortalityS),
])
caseSum += count
emergencySum += emergency
morbiditySum += morbidity
mortalitySum += mortality
if len(array)>1:
data.append([' Subtotal', caseSum, emergencySum, '', morbiditySum, '', mortalitySum, ''])
data.append([''])
uncategorized = CategoryMonthCountMM(int(yy), int(mm), None)['case']
if uncategorized:
cats.append({
'title': '未分類',
'count': CategoryMonthCountMM(int(yy), int(mm), None)['case'],
})
cats.append({
'title': '手術總數',
'count': T['case'],
'emergency': T['emergency'],
'morbidity': T['morbidity'],
'mortality': T['mortality'],
})
if settings.SPECIALTY != '新竹分院':
cats.append({
'title': '含CyberKnife',
'count': T['case'] + SRSCountAll(int(yy), int(mm)),
})
# print json.dumps(cats)
data.append([u'未分類', uncategorized])
data.append([u'手術總數', T['case'], T['emergency'], '', T['morbidity'], '', T['mortality'], ''])
if settings.SPECIALTY != '新竹分院':
data.append([u'含CyberKnife', T['case'] + SRSCountAll(int(yy), int(mm))])
if request.GET.get('xls', False):
return data_to_xls(data, '%s.xls' % month)
else:
# return render_to_response('registry/op_month.html',
# {
# 'cats': cats,
# 'data': data,
# 'month': month,
# },
# context_instance=RequestContext(request))
return render(request,'registry/op_month.html',
{
'cats': cats,
'data': data,
'month': month,
})
@login_required
def op_year(request):
year = int(request.POST.get('year', datetime.date.today().year))
year = int(request.GET.get('year', year))
array = []
L = list(Category.objects.get(name='手術').get_children())
L.sort(key=lambda c: (c.order, c.id))
while L:
c = L[0]
del L[0]
array.append(c)
if c.is_leaf_node():
pass
else:
children = list(c.get_children())
L[:0] = sorted(children, key=lambda c: (c.order, c.id))
data = []
# data.append([u'項目', u'一月', u'二月', u'三月', u'四月', u'五月', u'六月', u'七月', u'八月', u'九月', u'十月', u'十一', u'十二', u'年度總計']);
# array.extend([u'手術總數', None])
# SRS = {}
# for month in range(1, 13):
# SRS[month] = 0
for cat in array:
try:
row = [' ' * cat.level + cat.name]
except:
row = [cat]
# try: # SRS
# desc = json.loads(cat.description)
# except:
# desc = {}
for month in range(1, 13):
# if desc.has_key('icd9'):
# srs = SRSCount(desc['icd9'], year, month)
# row.append(srs)
# SRS[month] += srs
# else: # surgery
row.append(CategoryMonthCount(year, month, cat))
# if desc.has_key('icd9'):
# row.append(SRSCount(desc['icd9'], year, False))
# else:
row.append(CategoryMonthCount(year, False, cat))
data.append(row)
# 手術總數
row = [u'手術總數']
Ytotal = 0
for month in range(1, 13):
Mtotal = CategoryMonthCount(year, month, None)
row.append(Mtotal)
Ytotal += Mtotal
row.append(Ytotal)
data.append(row)
row = [u'手術病人數']
Ytotal = 0
for month in range(1, 13):
Mtotal = CategoryMonthCount(year, month, u'手術病人數')
row.append(Mtotal)
Ytotal += Mtotal
row.append(Ytotal)
data.append(row)
# print data
if request.GET.get('xls', False):
data.insert(0, [u'項目', u'一月', u'二月', u'三月', u'四月', u'五月', u'六月', u'七月', u'八月', u'九月', u'十月', u'十一', u'十二', u'年度總計']);
return data_to_xls(data, '%d.xls' % year)
else:
# return render_to_response('registry/op_year.html',
# {
# 'data': data,
# 'year': year,
# },
# context_instance=RequestContext(request))
return render(request, 'registry/op_year.html',
{
'data': data,
'year': year,
})
#102 年度 1 月至 12 月脊椎、腦血管、腦瘤手術記錄報表(序號、日期、病歷號碼、年齡、Diagnosis 、Operation) 造冊。
@login_required
def op_report(request):
year = int(request.POST.get('year', datetime.date.today().year))
year = int(request.GET.get('year', year))
start_date = datetime.date(year, 1, 1)
end_date = datetime.date(year, 12, 31)
query = OPSchedule.objects.filter(Complete='完成').filter(OPDate__range = (start_date, end_date))
data = []
for obj in query:
try:
ancestors = obj.category.get_ancestors()
anc = unicode(ancestors[1])
except:
ancestors = []
anc = unicode(obj.category)
row = [obj.id, obj.OPDate.strftime('%Y-%m-%d'), obj.PatChartNo, obj.PatAge, obj.PatDignosis, obj.MainOpModeTitle, obj.MainOpMode, unicode(obj.category), anc]
data.append(row)
# print dir(obj.category)
# print obj.category
# print obj.category.get_ancestors()
return data_to_xls(data, '%d.xls' % year)
# using haystack
@login_required
def op_search(request):
q = request.GET.get('q', '')
q = request.POST.get('q', q)
search_submit = request.POST.get('search_submit', None)
search_xls = request.POST.get('search_xls', None)
search_category = request.POST.get('search_category', None)
data = []
if q and len(q) >= 2:
results = SearchQuerySet().filter(content=AutoQuery(q)).load_all()
PK = results.values_list('pk', flat=True)
PK = set(PK)
objs = OPNote.objects.filter(pk__in=PK).order_by('-date','PatChartNo')
if search_xls:
# objs = OPNote.objects.filter(content__icontains=q).order_by('-date','PatChartNo')
obj2 = objs.extra(
select = {
'PatName': 'registry_opschedule.PatName',
'PatSex': 'registry_opschedule.PatSex',
'PatAge': 'registry_opschedule.PatAge',
'PatDignosis': 'registry_opschedule.PatDignosis',
'MainOpMode': 'registry_opschedule.MainOpMode',
'MainOpModeTitle': 'registry_opschedule.MainOpModeTitle',
'OpDoctorName': 'registry_opschedule.OpDoctorName',
},
tables = ['registry_opschedule'],
where = [
'registry_opschedule.PatChartNo=registry_opnote.PatChartNo',
'registry_opschedule.OPDate=registry_opnote.date',
]
)[:2000]
return ExcelResponse(obj2,
# auto_adjust_width=False
)
# elif search_category:
# pass
else:
ids = []
for note in objs[:2000]:
enddate = note.date
startdate = enddate + datetime.timedelta(days=-1)
schedule = OPSchedule.objects.filter(Complete='完成').filter(PatChartNo=note.PatChartNo, OPDate__range=[startdate, enddate]).order_by('-OPDate', '-StartTime')
if schedule:
for s in schedule:
if s.id not in ids:
ids.append(s.id)
data.append([note, s])
break
else:
data.append([note, None])
if search_category:
objs = OPSchedule.objects.filter(pk__in=list(ids))
array = []
L = list(Category.objects.get(name='手術').get_children())
L.sort(key=lambda c: (c.order, c.id))
while L:
c = L[0]
del L[0]
array.append(c)
if c.is_leaf_node():
pass
else:
children = list(c.get_children())
L[:0] = sorted(children, key=lambda c: (c.order, c.id))
# print array
data = []
for cat in array:
try:
row = [' ' * cat.level + cat.name]
except:
row = [cat]
row.append(objs.filter(category=cat).count())
data.append(row)
return data_to_xls(data, 'search.xls')
return render(request, 'registry/op_search.html',
{
'data': data,
'q': q,
})
# using mysql icontain
@login_required
def op_search2(request):
q = request.GET.get('q', '')
q = request.POST.get('q', q)
search_submit = request.POST.get('search_submit', None)
search_xls = request.POST.get('search_xls', None)
search_category = request.POST.get('search_category', None)
data = []
if q and len(q) >= 2:
objs = OPNote.objects.filter(content__icontains=q).order_by('-date','PatChartNo')
if search_xls:
obj2 = objs.extra(
select = {
'PatName': 'registry_opschedule.PatName',
'PatSex': 'registry_opschedule.PatSex',
'PatAge': 'registry_opschedule.PatAge',
'PatDignosis': 'registry_opschedule.PatDignosis',
'MainOpMode': 'registry_opschedule.MainOpMode',
'MainOpModeTitle': 'registry_opschedule.MainOpModeTitle',
'OpDoctorName': 'registry_opschedule.OpDoctorName',
},
tables = ['registry_opschedule'],
where = [
'registry_opschedule.PatChartNo=registry_opnote.PatChartNo',
'registry_opschedule.OPDate=registry_opnote.date',
]
)[:2000]
return ExcelResponse(obj2,
# auto_adjust_width=False
)
else:
ids = []
for note in objs[:2000]:
enddate = note.date
startdate = enddate + datetime.timedelta(days=-1)
schedule = OPSchedule.objects.filter(Complete='完成').filter(PatChartNo=note.PatChartNo, OPDate__range=[startdate, enddate]).order_by('-OPDate', '-StartTime')
if schedule:
for s in schedule:
if s.id not in ids:
ids.append(s.id)
data.append([note, s])
break
else:
data.append([note, None])
if search_category:
objs = OPSchedule.objects.filter(pk__in=list(ids))
array = []
L = list(Category.objects.get(name='手術').get_children())
L.sort(key=lambda c: (c.order, c.id))
while L:
c = L[0]
del L[0]
array.append(c)
if c.is_leaf_node():
pass
else:
children = list(c.get_children())
L[:0] = sorted(children, key=lambda c: (c.order, c.id))
# print array
data = []
for cat in array:
try:
row = [' ' * cat.level + cat.name]
except:
row = [cat]
row.append(objs.filter(category=cat).count())
data.append(row)
return data_to_xls(data, 'search.xls')
# return render_to_response('registry/op_search.html',
# {
# 'data': data,
# 'q': q,
# },
# context_instance=RequestContext(request))
return render(request, 'registry/op_search.html',
{
'data': data,
'q': q,
})
def handling_charge(start, end): # calculate and fix start end time
if start.hour < 6:
return (start, end, 2000)
if start.date() != end.date():
return (start, end, 2000)
if start.hour < 8:
return (start, end, 1500)
if start.hour >= 17:
return (start, end, 1500)
try:
holiday = Holiday.objects.get(date=start.date())
except:
holiday = False
if holiday:
if holiday.worktill:
if start.time() >= holiday.worktill:
return (start, end, 1500)
return (start, end, 0)
return (start, end, 1500)
if start.isoweekday() == 7: #Sunday
return (start, end, 1500)
if start.isoweekday() == 6: #Saturday
if start.hour >= 12:
return (start, end, 1500)
if end.hour >= 12:
start = datetime.datetime.combine(start.date(), datetime.time(12,00))
if end.hour == 12:
end = datetime.datetime.combine(start.date(), datetime.time(13,00))
return (start, end, 1500) # fix start time for W6
return (start, end, 0)
@login_required
def op_charge(request):
last_month = datetime.date.today() + relativedelta( months = -1 )
# month = request.REQUEST.get('month', last_month.strftime('%m/%Y'))
month = request.POST.get('month', last_month.strftime('%m/%Y'))
# q = request.POST.get('q', False)
mm, yy = month.split('/')
m = int(mm)
y = int(yy)
weakday, number = calendar.monthrange(y, m)
start_date = datetime.date(y, m, 1)
end_date = datetime.date(y, m, number)
oplist = OPSchedule.objects.filter(Complete='完成').filter(OPDate__range=(start_date, end_date)).order_by('OpDoctorName', 'id')
# if q and len(q) > 2:
# oplist = oplist.filter(content__contains=q)
data = []
xls = request.GET.get('xls', False)
for op in oplist:
if op.OpTypeName == u'':
continue
StartTime = datetime.datetime.combine(op.OPDate, op.StartTime)
EndTime = StartTime + datetime.timedelta(minutes=op.SpendTime)
start, end, charge = handling_charge(StartTime, EndTime)
hours = round((end - start).seconds / 360 /10.0, 1)
if hours < 1:
hours = 1.0
if charge:
data.append([
'',
op.OpDoctorName,
u'緊急手術',
# op.OPDate.strftime('%m-%d(%a)') if xls else op.OPDate.strftime('%Y-%m-%d'),
# op.OPDate.strftime('%m-%d(%a)').decode('utf-8'),
op.OPDate.strftime('%m-%d(%a)'),
'%s-%s' % (start.strftime('%H:%M'), end.strftime('%H:%M')),
hours,
op.PatChartNo,
charge,
'',
])
if xls:
data.insert(0, [u'員工代號', u'醫師姓名', u'緊急到院處理事由', u'日期', u'起/迄時間', u'時數', u'病歷號碼', u'應領金額', u'蓋 章'])
return data_to_xls(data, '%d-%d.xls' % (y, m))
else:
# return render_to_response('registry/op_charge.html',
# {
# 'data': data,
# 'year': yy,
# 'month': mm,
# # 'q': q,
# },
# context_instance=RequestContext(request))
return render(request, 'registry/op_charge.html',
{
'data': data,
'year': yy,
'month': mm,
})
#fileupload
@login_required
def op_charge1(request):
from collections import defaultdict
dict2d = defaultdict(lambda: defaultdict(int))
doctors = set()
years = set()
oplist = OPSchedule.objects.filter(Complete='完成').filter(~Q(OpTypeName = ''))
# if q and len(q) > 2:
# oplist = oplist.filter(content__contains=q)
xls = request.GET.get('xls', False)
for op in oplist:
StartTime = datetime.datetime.combine(op.OPDate, op.StartTime)
EndTime = StartTime + datetime.timedelta(minutes=op.SpendTime)
start, end, charge = handling_charge(StartTime, EndTime)
if charge:
doctor = op.OpDoctorName
year = op.OPDate.year
# print doctor, year
doctors.add(doctor)
years.add(year)
dict2d[doctor][year] = dict2d[doctor][year] + 1
data = []
row = [u'醫師姓名']
for year in sorted(years)[-5:]:
row.append(year)
data.append(row)
for doctor in sorted(doctors):
row = [doctor]
for year in sorted(years)[-5:]:
row.append(dict2d[doctor][year])
data.append(row)
if xls:
return data_to_xls(data, 'op_ch1.xls')
else:
# return render_to_response('registry/op_charge1.html',
# {
# 'data': data,
# # 'year': yy,
# # 'month': mm,
# # 'q': q,
# },
# context_instance=RequestContext(request))
return render(request, 'registry/op_charge1.html',
{
'data': data,
})
def response_mimetype(request):
if "application/json" in request.META['HTTP_ACCEPT']:
return "application/json"
else:
return "text/plain"
#class PictureCreateView(CreateView):
# model = Picture
#
# def form_valid(self, form):
# self.object = form.save()
# f = self.request.FILES.get('file')
# data = [{'name': f.name, 'url': settings.MEDIA_URL + "pictures/" + f.name.replace(" ", "_"), 'thumbnail_url': settings.MEDIA_URL + "pictures/" + f.name.replace(" ", "_"), 'delete_url': reverse('upload-delete', args=[self.object.id]), 'delete_type': "DELETE"}]
# response = JSONResponse(data, {}, response_mimetype(self.request))
# response['Content-Disposition'] = 'inline; filename=files.json'
# return response
def multiple_uploader(request, PatChartNo, date):
if request.POST:
if request.FILES == None:
raise Http404("No objects uploaded")
f = request.FILES['file']
a = Picture()
# a.creator = request.user
a.OPDate = date
a.PatChartNo = PatChartNo
a.file.save(f.name, f)
a.save()
result = [{'name': f.name,
'size': f.size,
'url': a.file.url,
},]
response_data = json.dumps(result)
if "application/json" in request.META['HTTP_ACCEPT_ENCODING']:
mimetype = 'application/json'
else:
mimetype = 'text/plain'
return HttpResponse(response_data, content_type=mimetype)
else:
return HttpResponse('Only POST accepted')
#class PictureDeleteView(DeleteView):
# model = Picture
#
# def delete(self, request, *args, **kwargs):
# """
# This does not actually delete the file, only the database record. But
# that is easy to implement.
# """
# self.object = self.get_object()
# self.object.delete()
# response = JSONResponse(True, {}, response_mimetype(self.request))
# response['Content-Disposition'] = 'inline; filename=files.json'
# return response
class JSONResponse(HttpResponse):
"""JSON response class."""
def __init__(self,obj='',json_opts={},mimetype="application/json",*args,**kwargs):
content = json.dumps(obj,**json_opts)
super(JSONResponse,self).__init__(content,mimetype,*args,**kwargs)
def op_picture(request, PatChartNo, date):
pics = Picture.objects.filter(PatChartNo = PatChartNo, OPDate = date).order_by('id')
# return render_to_response('registry/op_picture.html',
# {
# 'pics': pics,
# },
# context_instance=RequestContext(request))
return render(request, 'registry/op_picture.html',
{
'pics': pics,
})
def Default_Dr(request, ChartNo):
from ntuhgov.portal_selenium import Login, QueryModifyPatBase
pat = QueryModifyPatBase({'ChartNo':ChartNo})
# print pat
import json
data = json.dumps(pat)
return HttpResponse(data)
return HttpResponse('Only POST accepted')