start repo
This commit is contained in:
+193
@@ -0,0 +1,193 @@
|
||||
import webview
|
||||
import time
|
||||
|
||||
import sys
|
||||
|
||||
from datauri import DataURI
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
import pydicom
|
||||
import dicognito.anonymizer
|
||||
|
||||
import typer
|
||||
from typing import List
|
||||
|
||||
from watchdog.observers import Observer
|
||||
|
||||
# from watchdog.events import LoggingEventHandler
|
||||
from watchdog.events import PatternMatchingEventHandler
|
||||
|
||||
|
||||
anonymizer = dicognito.anonymizer.Anonymizer()
|
||||
|
||||
app = typer.Typer()
|
||||
|
||||
|
||||
def anonymize_file(filepath):
|
||||
try:
|
||||
with pydicom.dcmread(filepath) as dataset:
|
||||
anonymizer.anonymize(dataset)
|
||||
p = Path(filepath)
|
||||
new_filename = Path(p.parent, f"{p.stem}_anon{p.suffix}")
|
||||
dataset.save_as(new_filename)
|
||||
return new_filename
|
||||
except:
|
||||
# Cannot anonymise so just return the same path
|
||||
return filepath
|
||||
|
||||
|
||||
class PythonJavascriptApi:
|
||||
def __init__(self):
|
||||
self.cancel_heavy_stuff_flag = False
|
||||
|
||||
def init(self):
|
||||
response = {"message": "Hello from Python {0}".format(sys.version)}
|
||||
return response
|
||||
|
||||
def sayHelloTo(self, name):
|
||||
response = {"message": "Hello {0}!".format(name)}
|
||||
return response
|
||||
|
||||
def error(self):
|
||||
raise Exception("This is a Python exception")
|
||||
|
||||
|
||||
class Watcher:
|
||||
def __init__(self, window, anonymise: bool) -> None:
|
||||
self.window = window
|
||||
self.anonymise = anonymise
|
||||
|
||||
def on_created(self, event):
|
||||
print(f"hey, {event.src_path} has been created!")
|
||||
path = event.src_path
|
||||
if self.anonymise:
|
||||
path = anonymize_file(path)
|
||||
|
||||
try:
|
||||
file_uri = DataURI.from_file(path)
|
||||
except FileNotFoundError:
|
||||
print("File deleted...")
|
||||
return
|
||||
|
||||
file_name = Path(path).name
|
||||
self.injectFile(file_uri, file_name)
|
||||
|
||||
def on_deleted(self, event):
|
||||
print(f"what the f**k! Someone deleted {event.src_path}!")
|
||||
|
||||
def on_modified(self, event):
|
||||
print(f"hey buddy, {event.src_path} has been modified")
|
||||
|
||||
def on_moved(self, event):
|
||||
print(f"ok ok ok, someone moved {event.src_path} to {event.dest_path}")
|
||||
|
||||
def injectFile(self, file_uri: DataURI, file_name: str):
|
||||
current_url = webview.windows[0].get_current_url()
|
||||
if current_url == "https://www.penracourses.org.uk/rapids/create/":
|
||||
print(f"inject {file_name}")
|
||||
self.window.evaluate_js(
|
||||
f"""
|
||||
function urltoFile(url, filename, mimeType){{
|
||||
return (fetch(url)
|
||||
.then(function(res){{ return res.arrayBuffer(); }})
|
||||
.then(function(buf){{return new File([buf], filename,{{type:mimeType}});}})
|
||||
);
|
||||
}}
|
||||
|
||||
|
||||
$(document).ready(() => {{
|
||||
//Usage example:
|
||||
urltoFile('{file_uri}', '{file_name}', '{file_uri.mimetype}')
|
||||
.then(function(file){{
|
||||
|
||||
console.log(file);
|
||||
|
||||
//inputs = $("#rapid-form input[type=file][id^=id_images-]");
|
||||
inputs = extendInputs(1);
|
||||
console.log(inputs);
|
||||
el = inputs.get(0);
|
||||
console.log(el);
|
||||
|
||||
let dT = new DataTransfer();
|
||||
dT.clearData();
|
||||
dT.items.add(file);
|
||||
|
||||
el.files = dT.files;
|
||||
|
||||
// Manually fire the change event (qt doesn't seem to...)
|
||||
$(el).change();
|
||||
|
||||
|
||||
}});
|
||||
|
||||
}});
|
||||
"""
|
||||
)
|
||||
|
||||
|
||||
@app.command()
|
||||
def anatomy(filepath: str):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
@app.command()
|
||||
def rapid(watch_path: Path = "/home/ross/watch", anonymise: bool = True):
|
||||
|
||||
api = PythonJavascriptApi()
|
||||
window = webview.create_window(
|
||||
"Upload Rapid", "https://www.penracourses.org.uk/rapids/create/", js_api=api
|
||||
)
|
||||
|
||||
# def on_loaded():
|
||||
# print('DOM is ready')
|
||||
# current_url = webview.windows[0].get_current_url()
|
||||
|
||||
# if current_url == "https://www.penracourses.org.uk/rapids/create/":
|
||||
# #window.evaluate_js("alert('tent')")
|
||||
|
||||
# for file_uri, file_name in uri_name_list:
|
||||
# #time.sleep(2)
|
||||
|
||||
# ## unsubscribe event listener
|
||||
# #webview.windows[0].loaded -= on_loaded
|
||||
# #webview.windows[0].load_url('https://google.com')
|
||||
|
||||
# window.loaded += on_loaded
|
||||
# window = upload_rapid(["/home/ross/Downloads/DICOM CT/DICOM CXR/STD1/SER1/CXR.dcm"])
|
||||
|
||||
patterns = ["*"]
|
||||
ignore_patterns = ["*anon*"]
|
||||
ignore_directories = False
|
||||
case_sensitive = True
|
||||
my_event_handler = PatternMatchingEventHandler(
|
||||
patterns, ignore_patterns, ignore_directories, case_sensitive
|
||||
)
|
||||
|
||||
watcher = Watcher(window, anonymise)
|
||||
my_event_handler.on_created = watcher.on_created
|
||||
my_event_handler.on_deleted = watcher.on_deleted
|
||||
my_event_handler.on_modified = watcher.on_modified
|
||||
my_event_handler.on_moved = watcher.on_moved
|
||||
my_observer = Observer()
|
||||
|
||||
Path(watch_path).mkdir(parents=True, exist_ok=True)
|
||||
my_observer.schedule(my_event_handler, watch_path, recursive=True)
|
||||
|
||||
my_observer.start()
|
||||
# try:
|
||||
# while True:
|
||||
# time.sleep(1)
|
||||
# except KeyboardInterrupt:
|
||||
# my_observer.stop()
|
||||
# my_observer.join()
|
||||
webview.start(None, window, debug=True, gui="qt")
|
||||
|
||||
|
||||
|
||||
# f = "/media/ross/f6200b79-c343-4882-a245-28fc06d43006/Downloads/temp/breasts.jpg"
|
||||
f = "/home/ross/Downloads/DICOM CT/DICOM CXR/STD1/SER1/CXR.dcm"
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app()
|
||||
Reference in New Issue
Block a user