From f14585df54019393806068b40b6ae6a56562230d Mon Sep 17 00:00:00 2001 From: Brian Bjarke Jensen Date: Tue, 27 Feb 2024 21:09:13 +0100 Subject: [PATCH] added upload functionality --- src/web/app.py | 68 ++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 66 insertions(+), 2 deletions(-) diff --git a/src/web/app.py b/src/web/app.py index b6ece1c..57b1cc9 100644 --- a/src/web/app.py +++ b/src/web/app.py @@ -18,6 +18,8 @@ from src.database import get_visual_communication from src.database import ModelOutputs from src.database import NoDocumentFoundException from src.database import upsert_annotations +from src.database import upsert_visual_communication +from src.database import VisualCommunication # setup app app = Dash(__name__, external_stylesheets=[dbc.themes.BOOTSTRAP]) @@ -46,12 +48,74 @@ def show_alert( ): if msg is None or msg == '': return False, '' - logging.info(f"updated alert message: {msg}") + logging.info(f'updated alert message: {msg}') return True, msg @app.callback( - Output('alert-message', 'data'), + Output('success-element', 'is_open'), + Output('success-element', 'children'), + Input('success-message', 'data'), +) +def show_success( + msg: str | None, +): + if msg is None or msg == '': + return False, '' + logging.info(f"updated success message: {msg}") + return True, msg + + +@app.callback( + Output('success-message', 'data', allow_duplicate=True), + Output('alert-message', 'data', allow_duplicate=True), + Input('upload-data', 'contents'), + State('upload-data', 'filename'), + prevent_initial_call=True, +) +def upload_images( + content_list: list[str] | None, + filename_list: list[str] | None, +): + logging.info('began uploading images') + global collection + # stop early if possible + if content_list is None or filename_list is None: + logging.warning('content_list is None -> nothing to upload') + return None, 'nothing selected to upload'.title() + # build list of visual communication + visual_communication_list = [] + for content, filename in zip(content_list, filename_list): + try: + image = VisualCommunication.decode_image(content) + vis_com = VisualCommunication( + name=filename, + image=image, + ) + except Exception as exc: + logging.warning( + ( + 'failed creating VisualCommunication object ' + f"from file {filename}" + ), + exc, + ) + else: + visual_communication_list.append(vis_com) + # upsert documents + success = upsert_visual_communication( + collection=collection, + visual_communication_list=visual_communication_list, + ) + if success: + logging.info(f"succesfully uploaded {len(filename_list)} images") + return 'successfully uploaded images'.title(), None + logging.warning('failed inserting images into database') + return None, 'failed uploading images'.title() + + +@app.callback( + Output('alert-message', 'data', allow_duplicate=True), Output('vis-com-name', 'data'), Output('image-container', 'src'), Output({'type': 'annotation', 'index': ALL}, 'value'),