First
This commit is contained in:
63
ext_note.py
Normal file
63
ext_note.py
Normal file
@@ -0,0 +1,63 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import re
|
||||
import datetime
|
||||
import util
|
||||
import autoproc
|
||||
|
||||
import logging
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def isnew(text):
|
||||
return text.startswith('\r\n\r\nNOTE DATED: ') or re.match(r'\x1b\[H\x1b\[J\x1b\[2J\x1b\[H\r(-{10,})\r\n.*?Progress Notes\r\n\1\r\nNOTE DATED: ', text)
|
||||
|
||||
def collapse(text):
|
||||
return re.sub(r'\x1b\[H\x1b\[J\x1b\[2J\x1b\[H\r(-{10,})\r\n.*?Progress Notes\r\n\1\r\n(.*?\*\* CONTINUED FROM PREVIOUS SCREEN \*\*\r\n)?', '', text).strip()
|
||||
|
||||
local_tzinfo = datetime.datetime.now(datetime.timezone.utc).astimezone().tzinfo
|
||||
def parse(text):
|
||||
data = re.match(r'NOTE DATED: (?P<note_dated>.*?)\r\n(?:LOCAL TITLE: (?P<local_title>.*?)\r\n)?(?:STANDARD TITLE: (?P<standard_title>.*?)\r\n)?(?:VISIT: (?P<visit>.*?)\r\n)?(?:ADMITTED: (?P<admitted>.*?)\r\n)?', text).groupdict()
|
||||
data['note_dated'] = datetime.datetime.strptime(data['note_dated'], '%m/%d/%Y %H:%M').replace(tzinfo=local_tzinfo) if ':' in data['note_dated'] else datetime.datetime.strptime(data['note_dated'], '%m/%d/%Y').replace(tzinfo=local_tzinfo)
|
||||
data['body'] = text
|
||||
return data
|
||||
|
||||
async def cmd_reports(proc, mrn, alpha, omega):
|
||||
"""Fetch progress notes"""
|
||||
async with proc.sendline, autoproc.expect_async(proc) as expect:
|
||||
proc.sendline('^PNPT')
|
||||
assert await expect.endswith('\r\nSelect PATIENT NAME: ')
|
||||
proc.sendline(mrn)
|
||||
assert await expect.endswith('\r\nPrint Notes Beginning: ')
|
||||
proc.sendline(util.vista_strftime(omega))
|
||||
assert await expect.endswith('\r\n Thru: ')
|
||||
proc.sendline(util.vista_strftime(alpha))
|
||||
assert await expect.endswith('\r\nDo you want WORK copies or CHART copies? CHART// ')
|
||||
proc.sendline() # default CHART
|
||||
if await expect.endswith('\r\nDo you want to start each note on a new page? NO// '):
|
||||
proc.sendline() # default NO
|
||||
assert await expect.endswith('\r\nDEVICE: HOME// ')
|
||||
proc.sendline('HOME;;1023')
|
||||
assert await expect.earliest(' HOME(CRT)\r\n')
|
||||
pages = []
|
||||
while True:
|
||||
match m_delimiter := await expect.endswith('\r\nType <Enter> to continue or \'^\' to exit: ', '\r\nSelect PATIENT NAME: '):
|
||||
case autoproc.ExpectMatch(index=0, before=before):
|
||||
if isnew(before) and len(pages) > 0:
|
||||
yield parse(collapse('\r\n'.join(pages)))
|
||||
pages = []
|
||||
pages.append(before)
|
||||
proc.sendline()
|
||||
case autoproc.ExpectMatch(index=1, before=before):
|
||||
if isnew(before) and len(pages) > 0:
|
||||
yield parse(collapse('\r\n'.join(pages)))
|
||||
pages = []
|
||||
pages.append(before)
|
||||
yield parse(collapse('\r\n'.join(pages)))
|
||||
proc.sendline('^')
|
||||
assert await expect.endswith('\r\nSelect Progress Notes Print Options Option: ')
|
||||
break
|
||||
case _: assert False
|
||||
proc.sendline('^')
|
||||
proc.sendline('^Patient information AND OE/RR')
|
||||
assert await expect.endswith('\r\nSelect Patient Information and OE/RR Option: ', '\r\nSelect Patient Information and OE/RR <TEST ACCOUNT> Option: ')
|
||||
expect.clear()
|
Reference in New Issue
Block a user