This commit is contained in:
Ross Kruger
2025-11-24 10:35:48 +00:00
parent 66b4fffb7b
commit ae4d127e89
+59 -12
View File
@@ -34,6 +34,12 @@ from fastapi import Request
from fastapi.responses import RedirectResponse
from starlette.middleware.base import BaseHTTPMiddleware
import typer
import logging
import traceback
# TODO fix ssl
VERIFY_SSL = False
SOCKET_PATH = "tcp://localhost:9976"
@@ -57,12 +63,14 @@ LOGGED_IN_USER = "None"
REFRESH_TRIGGERED = True
RELOAD_ANON_FILES = False
SHUTDOWN = False
DELETE_FILES_ON_UPLOAD = True
DEBUG = False
logging.getLogger('niceGUI').setLevel(logging.INFO)
if DEBUG:
BASE_SITE_URL = "http://localhost:8000"
@@ -98,6 +106,7 @@ async def read_nng_messages():
ui.notify("Export done", color="positive")
global REFRESH_TRIGGERED
REFRESH_TRIGGERED = True
await sub.asend(b"done")
logger.debug("loaded")
case _:
logger.error("invalid message")
@@ -188,7 +197,11 @@ async def reload_anonymized_start(progress_bar, queue):
)
progress_bar.visible = False
ui.notify(f"Files reloaded: {len(loaded_files)}, [Series: {len(loaded_series)}] ", color="positive")
for client in Client.instances.values():
if not client.has_socket_connection:
continue
with client:
ui.notify(f"Files reloaded: {len(loaded_files)}, [Series: {len(loaded_series)}] ", color="positive")
# load_series_view(loaded_series, loaded_series_data)
loaded_series_ui.refresh()
loaded_files_ui.refresh()
@@ -273,17 +286,21 @@ def load_files(q: Queue, src_path: Path | None = None):
dataset, output_file = anonymizer.anonymize_file(file, remove_original=True)
# with processed_files:
# ui.item(f"{datetime.now().strftime('%H:%M:%S')} - {file.name} -> {output_file.name}")
try:
series_description = dataset.SeriesDescription
except AttributeError:
series_description = ""
loaded_files[output_file] = (
dataset.StudyDescription,
dataset.SeriesDescription,
series_description,
str(dataset.SeriesInstanceUID),
)
loaded_series[dataset.SeriesInstanceUID].append(output_file)
loaded_series_data[dataset.SeriesInstanceUID] = (
dataset.StudyDescription,
dataset.SeriesDescription,
series_description
)
q.put_nowait((n + 1) / to_process_len)
@@ -333,12 +350,15 @@ def reload_anonymized(q: Queue):
def clear_anonymized_files():
global RELOAD_ANON_FILES
for file in ANON_PATH.iterdir():
if file.is_file():
file.unlink()
logger.debug("Deleted all files in ANON_PATH")
RELOAD_ANON_FILES = True
return
@@ -380,6 +400,7 @@ def upload_files(q, rqst):
f"{BASE_SITE_URL}/api/atlas/upload_dicom",
# data=data,
files=files,
verify=VERIFY_SSL
)
logger.debug(f"Resp: {resp}")
@@ -447,9 +468,11 @@ def login() -> Optional[RedirectResponse]:
global rqst, LOGIN_SUCCESS, LOGGED_IN_USER
rqst = requests.session()
try:
rsp = rqst.get(LOGIN_URL)
except requests.exceptions.ConnectionError:
rsp = rqst.get(LOGIN_URL, verify=VERIFY_SSL)
except requests.exceptions.ConnectionError as e:
ui.notify("Connection error!", color="negative")
logger.debug(e)
print(traceback.format_exc())
return
token = (
@@ -474,6 +497,7 @@ def login() -> Optional[RedirectResponse]:
data=data,
# headers=header,
# cookies=cookies
verify=VERIFY_SSL
)
print(rsp.content)
@@ -543,7 +567,9 @@ def main_page():
# typer_app()
# Create a queue to communicate with the heavy computation process
logger.debug("PRE QUEUE")
queue = Manager().Queue()
logger.debug("POST QUEUE")
# Update the progress bar on the main process
ui.timer(
0.1,
@@ -551,6 +577,7 @@ def main_page():
queue.get() if not queue.empty() else progressbar.value
),
)
logger.debug("POST TImER")
# Create a queue to communicate with the heavy computation process
upload_queue = Manager().Queue()
@@ -561,6 +588,7 @@ def main_page():
upload_queue.get() if not upload_queue.empty() else upload_progressbar.value
),
)
logger.debug("POST TImER")
upload_progress = ui.row().classes("w-full place-content-center bg-blue-900")
@@ -622,11 +650,14 @@ def main_page():
ui.run_javascript("window.close()")
async def watch_for_refresh():
global REFRESH_TRIGGERED
global REFRESH_TRIGGERED, RELOAD_ANON_FILES
while not app.is_stopped:
if REFRESH_TRIGGERED:
REFRESH_TRIGGERED = False
await load_files_start(anon_progress, queue)
if RELOAD_ANON_FILES:
RELOAD_ANON_FILES = False
await reload_anonymized_start(anon_progress, queue)
await asyncio.sleep(1)
asyncio.create_task(watch_for_refresh())
@@ -651,32 +682,48 @@ def launch_app(
work_dir: Path = typer.Option(WORK_DIR, help="Working directory"),
nng: bool = typer.Option(True, help="Use nng"),
native_mode: bool = typer.Option(False, help="Use native mode"),
debug: bool = typer.Option(False, help="Debug mode")
):
global WORK_DIR, EXPORT_PATH, PROCESS_PATH, ANON_PATH
global WORK_DIR, EXPORT_PATH, PROCESS_PATH, ANON_PATH, DEBUG
WORK_DIR = work_dir
EXPORT_PATH = WORK_DIR / Path("export/")
PROCESS_PATH = WORK_DIR / Path("to_process/")
ANON_PATH = WORK_DIR / Path("anon/")
DEBUG = debug
logger.debug(f"Work dir: {WORK_DIR}")
if nng:
socket_error = False
try:
with pynng.Pair0(listen=SOCKET_PATH) as sub:
pass
except pynng.exceptions.AddressInUse:
logger.debug("Address in use")
with pynng.Pair0(dial=SOCKET_PATH) as sub:
sub.send(b"loaded")
sys.exit(0)
try:
with pynng.Pair0(dial=SOCKET_PATH, send_timeout=4000, recv_timeout=4000) as sub:
sub.send(b"loaded")
msg = sub.recv()
print(msg)
sys.exit(0)
except pynng.exceptions.Timeout:
logger.error(f"Socket timeout: {SOCKET_PATH}")
# Happens when the socket is locked
socket_error = True
pass
app.on_startup(read_nng_messages)
if not socket_error:
app.on_startup(read_nng_messages)
app.on_exception(logger.debug)
try:
ui.run(reload=False, show=True, port=native.find_open_port(), native=native_mode, favicon="icon/icon1.ico")
port = native.find_open_port()
#port = 8001
logger.debug(f"Run on port {port}")
#ui.run(reload=False, show=True, port=port, native=native_mode, favicon="icon/icon1.ico")
ui.run(reload=False, show=True, port=port, native=native_mode)
except Exception as e:
logger.error(e)
pass