#!/usr/bin/python
# coding=utf-8
# 2010-09-16 move from project cyberknife
PASSWORD = 'n122119493'
from datetime import date
import mechanize
from urllib2 import urlopen
#from ClientForm import ParseResponse
import datetime
import hashlib
import re
import urllib
import urllib2
import pdb
import math
import pprint
pp = pprint.PrettyPrinter()
#br = mechanize.Browser(factory=mechanize.RobustFactory())
br = mechanize.Browser()
br.set_handle_robots(False)
def xtrace(R):
pdb.set_trace()
def remove_space(s):
return s.replace(' ','').strip()
#print remove_space(' 123 ')
def minguo2ce(minguo):
pattern = '(\d+)\.([ 0-9]{1,2})\.([ 0-9]{1,2})'
s = re.search(pattern, minguo)
if s:
yy = int(s.group(1))+1911
try:
mm = int(s.group(2))
except:
mm = 1
try:
dd = int(s.group(3))
except:
dd = 1
return date( yy, mm , dd )
pattern = '(\d+)/([ 0-9]{1,2})/([ 0-9]{1,2})'
s = re.search(pattern, minguo)
if s:
yy = int(s.group(1))+1911
try:
mm = int(s.group(2))
except:
mm = 1
try:
dd = int(s.group(3))
except:
dd = 1
return date( yy, mm , dd )
return
#print minguo2ce(' 75.01.25')
########## Old intra system
def Default_Dr(REQUEST):
if (REQUEST.has_key('ChartNo')) and REQUEST['ChartNo'] != "":
values = { 'ChartNo' : REQUEST['ChartNo'] }
elif (REQUEST.has_key('Name')) and REQUEST['Name'] != "":
values = { 'Name' : REQUEST['Name'].decode('utf_8').encode('big5') }
elif (REQUEST.has_key('idcode')) and REQUEST['idcode'] != "":
values = { 'idcode' : REQUEST['idcode'] }
else:
return ""
url = 'http://intra.mc.ntu.edu.tw/main/ChartNo/Default_Dr.asp'
data = urllib.urlencode(values)
req = urllib2.Request(url, data)
response = urllib2.urlopen(req)
the_page = response.read()
the_page = the_page.decode('big5','ignore').encode('utf_8')
pattern = ( '(?s)
(.*?) | (.*?)'
+ '(.*?)(.*?)'
+ ' | (.*?)(.*?)'
+ ' | (.*?) | (.*?)'
+ '(.*?) | (.*?)'
+ '(.*?) | (.*?)'
+ '(.*?) | (.*?)'
+ '(.*?) | ' )
matches = re.findall(pattern, the_page)
result = []
for match in matches:
r = {}
r['name'] = remove_space(match[2])
r['medical_records'] = remove_space(match[4])
r['gender'] = remove_space(match[6])
r['birthday'] = minguo2ce(match[8])
r['address'] = remove_space(match[10])
r['phone'] = remove_space(match[12])
r['id_cards'] = remove_space(match[14])
result.append(r)
return result
#print Default_Dr({ 'HIS' : '',
# 'firstname' : '',
# 'MIS' : 'N122119493' })
def percent_encoding(keys, REQUEST):
data = {}
for key in keys:
if REQUEST.__contains__(key):
data[key] = REQUEST[key]
return urllib.urlencode(data)
#print percent_encoding(['HIS','MIS'],
# { 'HIS' : '3009684',
# 'firstname' : '',
# 'MIS' : 'N122119493' })
def CheckUser():
br.open("http://intra.mc.ntu.edu.tw/CheckUser_Ehospital.asp?myurl=default_Ehospital.asp")
br.select_form(name="form1")
br["uid"] = 'dtsurg08'
br["pwd"] = 'x'
response = br.submit() # submit current form
return response.read()
def chinese2date(chinese):
pattern = '(\d+)(\D+)(\d{1,2})(\D+)(\d{1,2})'
s = re.search(pattern, chinese)
if s:
yy = int(s.group(1))
mm = int(s.group(3))
dd = int(s.group(5))
return date( yy, mm , dd )
return
def XrayExam(ChartNo):
url = "http://intra.mc.ntu.edu.tw/DigReport/Xray/XrayExam.asp"
url = 'http://portal.ntuh.gov.tw/DigReport/Xray/XrayExam.asp'
response = br.open(url)
if response.read().decode('big5','ignore').encode('utf_8').find('閒置時間超過六十分鐘'):
CheckUser()
response = br.open(url)
body = {}
print response.read().decode('big5','ignore').encode('utf_8')
br.select_form(name="FrontPage_Form1")
br["ChartNo"] = str(ChartNo)
br["durnum"] = ['12']
br["reptype"] = ['CT']
br["dattype"] = ['Y']
response = br.submit()
body['CT'] = response.read().decode('big5','ignore').encode('utf_8')
br.select_form(name="FrontPage_Form1")
br["ChartNo"] = str(ChartNo)
br["durnum"] = ['12']
br["reptype"] = ['MRI']
br["dattype"] = ['Y']
response = br.submit()
body['MRI'] = response.read().decode('big5','ignore').encode('utf_8')
# pattern="Pelvis: for THR"
pattern="(.*?)"
# pattern="Ximage/XrayReport.asp?reportseqno=(.*?)"
pattern = pattern.replace("'", "\\'")
pattern = pattern.replace('&', '\\&')
results = []
for m in ['CT', 'MRI']:
matches = re.findall(pattern, body[m])
for match in matches:
r = {}
r['reportseqno'] = remove_space(match[0])
r['ChartNo'] = remove_space(match[1])
r['ChineseName'] = remove_space(match[2])
r['Sex'] = remove_space(match[3])
r['Birthday'] = remove_space(match[4])
r['ExamDate'] = remove_space(match[5])
r['accessno'] = remove_space(match[6])
r['ReferNo'] = remove_space(match[7])
r['status'] = remove_space(match[8])
r['LinkOrderName'] = remove_space(match[9])
r['Modality'] = m
results.append(r)
pp.pprint(urllib2.unquote(match[0]))
# pp.pprint(results)
return results
########################################New portal systemn
def Login():
br.open("http://portal.ntuh.gov.tw/General/Login.aspx")
br.select_form(name="Form1")
# br["rdblQuickMenu"] = ['O']
br["txtUserID"] = '004552'
br["txtPass"] = hashlib.md5(PASSWORD).hexdigest()
# print br.possible_items("rdblQuickMenu")
# print br.form
response = br.submit() # submit current form
pattern = "http://hisaw.ntuh.gov.tw/WebApplication/Clinics/OpenClinics.aspx\?SESSION=(\w*)"
string = str(response.read())
# print string
matches = re.findall(pattern, string)
return matches[0]
def ReportResult(PersonID):
SESSION = Login()
url = "http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/ReportResultQuery.aspx?SESSION=%s&PersonID=%s" % (SESSION,PersonID)
response = br.open(url)
br.select_form(name="Form1")
response = br.submit() # submit current form
body = response.read()
print body
return
response = urlopen(url)
forms = ParseResponse(response, backwards_compat=False)
form = forms[0]
print form
form.set_all_readonly(False)
form["__EVENTTARGET"] = "LinkbuttonRadReport"
# form.click() returns a urllib2.Request object
# (see HTMLForm.click.__doc__ if you don't have urllib2)
print urlopen(form.click()).read()
def icd_query(ChartNo):
Login()
br.select_form(name="Form1")
br["NTUHWeb1:QueryPersonIDByChartNo2:txbChartNoInput"] = str(ChartNo)
br["NTUHWeb1:QueryPersonIDByChartNo2:AutoShowRecord"] = True
response = br.submit() # submit current form
return response.read()
################## os.getcwd()##############
def get_path():
import os,sys
return os.path.realpath(os.path.dirname(sys.argv[0]))
###############################
vs = {}
def unf_byDisDate(deptcode, StartDate, EndDate):
import csv
reader = csv.reader(open(get_path()+"/vs.csv", "rb"))
for row in reader:
# print row[1], row[0]
vs[row[1]]=row[0]
url = "http://intra.mc.ntu.edu.tw/main/Discharge/unf_byDisDate.asp"
response = br.open(url)
br.select_form(nr=0)
br["deptcode"] = [deptcode]
br["StartDate"] = StartDate
br["EndDate"] = EndDate
response = br.submit()
body = response.read().decode('big5','ignore').encode('utf_8')
pattern = """
\s*
| (.*?) |
(.*?) |
(.*?) |
(.*?) |
(.*?)
|
(.*?)
|
(.*?) |
(.*?) |
(.*?) |
(.*?)
|
(.*?) |
(.*?) |
"""
pattern = pattern.replace('"', '\\"')
pattern = pattern.replace('\n', '\\s*')
matches = re.findall(pattern, body)
result = []
for match in matches:
r = {}
r['no'] = remove_space(match[0])
r['doctor_code'] = remove_space(match[1])
r['doctor_name'] = remove_space(match[2])
r['discharge_date'] = remove_space(match[3])
r['patients_name'] = remove_space(match[4])
r['medical_record_number'] = remove_space(match[5])
r['account'] = remove_space(match[6])
r['admission_date'] = remove_space(match[7])
r['hospital_ bed'] = remove_space(match[8])
r['category'] = remove_space(match[9])
r['dr'] = remove_space(match[10])
r['resident'] = remove_space(match[11])
if vs.has_key(r['dr']):
r['division'] = vs[r['dr']]
else:
r['division'] = 'Others'
result.append(r)
return result
def formatDate(sDate):
dScrap = sDate
iDay = dScrap.day
iMon = dScrap.month
iYea = dScrap.year
sDay = str(iDay)
sMon = str(iMon)
sYea = str(iYea - 1911)
if len(sDay) == 1:
sDay = "0" + sDay
if len(sMon) == 1:
sMon = "0" + sMon
if len(sYea) == 2:
sYea = "0" + sYea;
sScrap = sYea + sMon + sDay;
return sScrap;
def unf_sort(StartDay, EndDay):
StartDate = datetime.date.today() + datetime.timedelta(days=StartDay)
EndDate = datetime.date.today() + datetime.timedelta(days=EndDay)
result = unf_byDisDate('SURG', formatDate(StartDate), formatDate(EndDate))
dr = []
resident = []
division = []
for r in result:
dr.append(r['dr'])
resident.append(r['resident'])
division.append(r['division'])
# The count is doubled, so we div it by 2
dr_freq = [(a, dr.count(a)/2) for a in set(dr)]
dr_sort = sorted(dr_freq, key=lambda x: -x[1])
resident_freq = [(a, resident.count(a)/2) for a in set(resident)]
resident_sort = sorted(resident_freq, key=lambda x: -x[1])
division_freq = [(a, division.count(a)/2) for a in set(division)]
division_sort = sorted(division_freq, key=lambda x: -x[1])
# print "\n¦ᄌᄏ₩ᄇᄏ←ニᆱ¥ᄌᆱ,¦ᄏᄑ₩ユᄌ"
# for dr in dr_sort:
# print "%s,%s" % dr
#
# print "\n¦ᄑマ←ルᄁ←ニᆱ¥ᄌᆱ,¦ᄏᄑ₩ユᄌ"
# for resident in resident_sort:
# print "%s,%s" % resident
return {'dr': dr_sort,
'resident': resident_sort,
'division': division_sort,
}
def doPostBack(form, eventTarget, eventArgument):
#Creates a new __EVENTTARGET control and adds the value specified
#.NET doesn't generate this in mechanize for some reason -- suspect maybe is
#normally generated by javascript or some useragent thing?
form.new_control('hidden','__EVENTTARGET',attrs = dict(name='__EVENTTARGET'))
form.new_control('hidden','__EVENTARGUMENT',attrs = dict(name='__EVENTARGUMENT'))
form.set_all_readonly(False)
form["__EVENTTARGET"] = eventTarget
form["__EVENTARGUMENT"] = eventArgument
def dischargenotelist(Chart, SESSION = Login()):
url = "http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/PatientMedicalRecordListQuery.aspx?QueryBySelf=N&SESSION=%s" % SESSION
br.open(url)
br.select_form(name="Form1")
br["NTUHWeb1$ChartInputTextBox"] = Chart
response = br.submit('NTUHWeb1$ButtonQuery')
Notes = re.findall('NTUHWeb1\$.*?ShowDischargeNote',
response.read())
# print Notes
'''
'''
pattern = 'name="KeyCodeList" value=(.*?)>'
key = []
for Note in Notes:
# print Note
br.select_form(name="Form1")
response = br.submit(Note)
body = response.read()
matches=re.findall(pattern, body)
for match in matches:
# print match
key.append(match)
return key
def ShowDischargeNote(KeyCodeList, KeyNameList, AccountIDSE, SESSION=Login()):
url = 'http://ihisaw.ntuh.gov.tw/WebApplication/OtherIndependentProj/PatientBasicInfoEdit/SimpleInfoShowUsingPlaceHolder.aspx?SESSION=%s' % SESSION
data = {
'KeyCodeList': KeyCodeList,
'KeyNameList': KeyNameList,
'AccountIDSE': AccountIDSE,
'Func' : 'DischargeSummary',
}
response = br.open(url, urllib.urlencode(data))
body = response.read()
pattern ='(.*?
)\\s*?'
matches=re.findall(pattern, body, re.DOTALL)
return matches[0]
def oncrt_query(ChartNo):
# url = "http://intra.mc.ntu.edu.tw/DigReport/ONC_RT/oncrt_query.asp"
url = "http://intra.mc.ntu.edu.tw/DigReport/ONC_RT/oncrt_query_only.asp"
response = br.open(url)
if response.read().decode('big5','ignore').encode('utf_8').find('閒置時間超過六十分鐘'):
CheckUser()
response = br.open(url)
br.select_form(name="FrontPage_Form1")
br["ChartNo"] = str(ChartNo)
response = br.submit()
body = response.read().decode('big5','ignore').encode('utf_8')
htmlcomments = re.compile('\')
body = htmlcomments.sub('', body)
# print body
# body = body[body.find('部位'):]
pattern = (
'(?s)(\s*?)'
+'| (.*?) | (\s*?)'
+'(.*?) | (\s*?)'
+'(.*?) | (\s*?)'
+'(.*?) | (\s*?)'
+'(.*?) | (\s*?)'
+'(.*?) | (\s*?)'
+'(.*?) | (\s*?)'
+'(.*?) | (\s*?)'
+'(.*?) | '
)
matches = re.findall(pattern, body)
result = []
for match in matches:
r = {}
r['site'] = remove_space(match[1])
r['way'] = remove_space(match[3])
r['radiation_energy'] = remove_space(match[5])
r['number_of_treatment'] = remove_space(match[7])
r['total_dose'] = remove_space(match[9])
r['start_date'] = chinese2date(match[11])
r['end_date'] = chinese2date(match[13])
r['the_number_of_treatment'] = remove_space(match[15])
r['remarks'] = remove_space(match[17])
result.append(r)
return result
if __name__ == "__main__":
#PatientMedicalRecordListQuery('A101116124') #已死亡
#PatientMedicalRecordListQuery('R100260467')
#PatientMedicalRecordListQuery('L200772263') #已死亡
#pp.pprint(PatientMedicalRecordListQuery('4582056'))
XrayExam('5621920')
pass