diff --git a/misc/generate_random_prediction.py b/misc/generate_random_prediction.py index edb87f4..61376fd 100644 --- a/misc/generate_random_prediction.py +++ b/misc/generate_random_prediction.py @@ -5,8 +5,8 @@ from pathlib import Path from dotenv import load_dotenv from shared.data_store import connect_minio -from shared.database import connect_mongodb -from shared.database.classes import VisualCommunication +from shared.mongodb import connect_mongodb +from shared.mongodb.classes import VisualCommunication from shared.utils import check_env, setup_logging from web_ui.src.main import NECESSARY_ENV_VAR_LIST diff --git a/misc/get_visual_communication.py b/misc/get_visual_communication.py index 725390e..7b62f8d 100644 --- a/misc/get_visual_communication.py +++ b/misc/get_visual_communication.py @@ -5,7 +5,7 @@ from pathlib import Path from dotenv import load_dotenv from shared.data_store import connect_minio -from shared.database import connect_mongodb, get_visual_communication +from shared.mongodb import connect_mongodb, get_visual_communication from shared.utils import check_env, setup_logging from web_ui.src.main import NECESSARY_ENV_VAR_LIST diff --git a/misc/image_download.py b/misc/image_download.py index f84cd25..cc8f28f 100644 --- a/misc/image_download.py +++ b/misc/image_download.py @@ -5,8 +5,8 @@ from pathlib import Path from dotenv import load_dotenv -from shared.database import connect_mongodb -from shared.database.classes import VisualCommunication +from shared.mongodb import connect_mongodb +from shared.mongodb.classes import VisualCommunication if __name__ == '__main__': # prepare env vars diff --git a/misc/image_upload.py b/misc/image_upload.py index 11fa16a..7dcf67b 100644 --- a/misc/image_upload.py +++ b/misc/image_upload.py @@ -6,8 +6,8 @@ from dotenv import load_dotenv from pymongo.errors import DuplicateKeyError from shared.data_store import connect_minio -from shared.database import connect_mongodb -from shared.database.classes import VisualCommunication +from shared.mongodb import connect_mongodb +from shared.mongodb.classes import VisualCommunication from shared.utils import check_env, setup_logging from web_ui.src.main import NECESSARY_ENV_VAR_LIST diff --git a/misc/image_upload_to_server.py b/misc/image_upload_to_server.py index 797e6cb..bef91af 100644 --- a/misc/image_upload_to_server.py +++ b/misc/image_upload_to_server.py @@ -6,7 +6,8 @@ from dotenv import load_dotenv from pymongo.errors import DuplicateKeyError from shared.data_store import connect_minio -from shared.database import VisualCommunication, connect_mongodb +from shared.mongodb import connect_mongodb +from shared.mongodb.classes import VisualCommunication from shared.utils import check_env, setup_logging from web_ui.src.main import NECESSARY_ENV_VAR_LIST diff --git a/misc/model_outputs_from_annotation.py b/misc/model_outputs_from_annotation.py index 1e1ee35..1406b48 100644 --- a/misc/model_outputs_from_annotation.py +++ b/misc/model_outputs_from_annotation.py @@ -1,6 +1,4 @@ -from __future__ import annotations - -from shared.dto import ModelData +from shared.mongodb.classes import ModelData if __name__ == '__main__': # instantiate data object diff --git a/misc/prediction_upload.py b/misc/prediction_upload.py index a6793ae..4590ede 100644 --- a/misc/prediction_upload.py +++ b/misc/prediction_upload.py @@ -5,8 +5,8 @@ from pathlib import Path from dotenv import load_dotenv from shared.data_store import connect_minio -from shared.database import connect_mongodb, upsert_prediction -from shared.database.classes import VisualCommunication +from shared.mongodb import connect_mongodb, upsert_prediction +from shared.mongodb.classes import VisualCommunication from shared.utils import check_env, setup_logging from web_ui.src.main import NECESSARY_ENV_VAR_LIST diff --git a/misc/total_annotated.py b/misc/total_annotated.py index 12c41ad..66f6b04 100644 --- a/misc/total_annotated.py +++ b/misc/total_annotated.py @@ -5,7 +5,7 @@ from pathlib import Path from dotenv import load_dotenv -from shared.database import connect_mongodb, count_documents +from shared.mongodb import connect_mongodb, count_documents if __name__ == '__main__': # prepare env vars diff --git a/misc/total_documents.py b/misc/total_documents.py index fffe1f4..fa8b1c8 100644 --- a/misc/total_documents.py +++ b/misc/total_documents.py @@ -5,7 +5,7 @@ from pathlib import Path from dotenv import load_dotenv -from shared.database import connect_mongodb, count_documents +from shared.mongodb import connect_mongodb, count_documents if __name__ == '__main__': # prepare env vars diff --git a/model/src/main.py b/model/src/main.py index b122345..40c6639 100644 --- a/model/src/main.py +++ b/model/src/main.py @@ -10,7 +10,7 @@ from tqdm import tqdm from utils import DEVICE, VCDADataset, load_model from shared.data_store import connect_minio -from shared.dto import ModelData +from shared.mongodb.classes import ModelData from shared.utils import setup_logging if __name__ == '__main__': diff --git a/model/src/models/visual_communication.py b/model/src/models/visual_communication.py index c7403bb..0a841d2 100644 --- a/model/src/models/visual_communication.py +++ b/model/src/models/visual_communication.py @@ -4,7 +4,7 @@ from __future__ import annotations from torch import nn -from shared.dto import ModelData +from shared.mongodb.classes import ModelData from .angle import AngleTail from .contact import ContactTail diff --git a/other/transfer_images_mongo_minio.py b/other/transfer_images_mongo_minio.py index aae76a1..d308eed 100644 --- a/other/transfer_images_mongo_minio.py +++ b/other/transfer_images_mongo_minio.py @@ -11,7 +11,8 @@ from dotenv import load_dotenv from pymongo.collection import Collection from shared.data_store import connect_minio, put -from shared.database import VisualCommunication, connect_mongodb +from shared.mongodb import connect_mongodb +from shared.mongodb.classes import VisualCommunication from shared.utils import check_env, setup_logging from web_ui.src.main import NECESSARY_ENV_VAR_LIST diff --git a/pyproject.toml b/pyproject.toml index b96fd85..9783a98 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -114,3 +114,7 @@ ignore_missing_imports = true [[tool.mypy.overrides]] module = "models.*" ignore_missing_imports = true + +[[tool.mypy.overrides]] +module = "shared.mongodb.*" +ignore_missing_imports = true diff --git a/shared/database/__init__.py b/shared/database/__init__.py deleted file mode 100644 index ed187bd..0000000 --- a/shared/database/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -"""Database module content.""" - -from __future__ import annotations - -from .classes.dataset import Dataset -from .classes.exceptions import NoDocumentFoundException -from .classes.visual_communication import VisualCommunication -from .utils.connect_mongodb import connect_mongodb -from .utils.count_documents import count_documents -from .utils.get_visual_communication import get_visual_communication -from .utils.list_names import list_names -from .utils.upsert_annotation import upsert_annotation -from .utils.upsert_prediction import upsert_prediction -from .utils.upsert_visual_communication import upsert_visual_communication diff --git a/shared/database/classes/__init__.py b/shared/database/classes/__init__.py deleted file mode 100755 index 9e260cd..0000000 --- a/shared/database/classes/__init__.py +++ /dev/null @@ -1,6 +0,0 @@ -"""Database classes module content.""" -from __future__ import annotations - -from .dataset import Dataset -from .exceptions import NoDocumentFoundException -from .visual_communication import VisualCommunication diff --git a/shared/database/classes/dataset.py b/shared/database/classes/dataset.py deleted file mode 100755 index 0c3fa1a..0000000 --- a/shared/database/classes/dataset.py +++ /dev/null @@ -1,71 +0,0 @@ -"""Definition of database Dataset class.""" -from __future__ import annotations - -import logging -import random -from datetime import datetime -from datetime import UTC - -from pydantic import BaseModel -from pydantic import Field -from pymongo.collection import Collection - - -class Dataset(BaseModel): - """Database Dataset model.""" - create_time: datetime = Field(default_factory=lambda: datetime.now(UTC)) - train_names: list[str] - test_names: list[str] - validation_names: list[str] - - @classmethod - def fraction_map(cls) -> dict[str, float]: - """Dict with train, test and validation fractions.""" - # define map - split_map = { - 'train': 0.7, - 'test': 0.2, - 'validation': 0.1, - } - # sanity check - assert sum(split_map.values()) == 1.0 - return split_map - - @classmethod - def new_from_name_list( - cls, - name_list: list[str], - ) -> Dataset: - """Generate new dataset from list of filenames.""" - # calculate split fractions - fraction_map = cls.fraction_map() - num_total = len(name_list) - num_validation = round(num_total * fraction_map['validation']) - num_test = round(num_total * fraction_map['test']) - # split data - validation_name_list = random.choices(name_list, k=num_validation) - name_list = [ - name for name in name_list if name not in validation_name_list - ] - test_name_list = random.choices(name_list, k=num_test) - train_name_list = [ - name for name in name_list if name not in test_name_list - ] - # instantiate object - dataset = Dataset( - train_names=train_name_list, - test_names=test_name_list, - validation_names=validation_name_list, - ) - logging.debug('finished') - return dataset - - def save( - self, - collection: Collection, - ) -> None: - """Save dataset to database.""" - res = collection.insert_one( - document=self.model_dump(), - ) - logging.debug('inserted document: %s', res) diff --git a/shared/database/utils/save_dataset.py b/shared/database/utils/save_dataset.py deleted file mode 100755 index 0759152..0000000 --- a/shared/database/utils/save_dataset.py +++ /dev/null @@ -1,38 +0,0 @@ -from __future__ import annotations - -import logging - -from pymongo.collection import Collection - -from shared.database import Dataset - - -def save_dataset( - collection: Collection, - dataset: Dataset, -) -> None: - """Save dataset to database.""" - res = collection.insert_one( - document=dataset.model_dump(), - ) - logging.debug('inserted document: %s', res) - - -if __name__ == '__main__': - from dotenv import load_dotenv - - load_dotenv('local.env') - from shared.database import connect_mongodb, list_names - - # connect to database - collection, db, client = connect_mongodb() - print(client.server_info()) - - name_list = list_names(collection=collection, only_with_annotation=True) - ds = Dataset.new_from_name_list(name_list=name_list) - - print(ds) - # save_dataset( - # collection=collection, - # dataset=ds - # ) diff --git a/shared/mongodb/__init__.py b/shared/mongodb/__init__.py new file mode 100644 index 0000000..6ca8e30 --- /dev/null +++ b/shared/mongodb/__init__.py @@ -0,0 +1,8 @@ +from .src import classes, exceptions +from .src.connect_mongodb import connect_mongodb +from .src.count_documents import count_documents +from .src.get_visual_communication import get_visual_communication +from .src.list_names import list_names +from .src.upsert_annotation import upsert_annotation +from .src.upsert_prediction import upsert_prediction +from .src.upsert_visual_communication import upsert_visual_communication diff --git a/shared/database/utils/__init__.py b/shared/mongodb/src/__init__.py similarity index 100% rename from shared/database/utils/__init__.py rename to shared/mongodb/src/__init__.py diff --git a/shared/dto/__init__.py b/shared/mongodb/src/classes/__init__.py old mode 100644 new mode 100755 similarity index 85% rename from shared/dto/__init__.py rename to shared/mongodb/src/classes/__init__.py index be1cd38..84090da --- a/shared/dto/__init__.py +++ b/shared/mongodb/src/classes/__init__.py @@ -1,6 +1,3 @@ -"""Data transfer objects module content.""" -from __future__ import annotations - from .angle import AngleData from .contact import ContactData from .distance import DistanceData @@ -12,4 +9,5 @@ from .modality_lighting import ModalityLightingData from .model_data import ModelData from .point_of_view import PointOfViewData from .salience import SalienceData +from .visual_communication import VisualCommunication from .visual_syntax import VisualSyntaxData diff --git a/shared/dto/angle.py b/shared/mongodb/src/classes/angle.py similarity index 99% rename from shared/dto/angle.py rename to shared/mongodb/src/classes/angle.py index 5ce2ea0..12491da 100644 --- a/shared/dto/angle.py +++ b/shared/mongodb/src/classes/angle.py @@ -1,4 +1,5 @@ """Definition of Angle data model.""" + from __future__ import annotations from .data_model import DataModel @@ -6,6 +7,7 @@ from .data_model import DataModel class AngleData(DataModel): """Angle data model.""" + high: float eye_level: float low: float diff --git a/shared/dto/contact.py b/shared/mongodb/src/classes/contact.py similarity index 99% rename from shared/dto/contact.py rename to shared/mongodb/src/classes/contact.py index 9a5f1cd..fc08a0a 100644 --- a/shared/dto/contact.py +++ b/shared/mongodb/src/classes/contact.py @@ -1,4 +1,5 @@ """Definition of ContactData data model.""" + from __future__ import annotations from .data_model import DataModel diff --git a/shared/dto/data_model.py b/shared/mongodb/src/classes/data_model.py similarity index 100% rename from shared/dto/data_model.py rename to shared/mongodb/src/classes/data_model.py diff --git a/shared/dto/distance.py b/shared/mongodb/src/classes/distance.py similarity index 99% rename from shared/dto/distance.py rename to shared/mongodb/src/classes/distance.py index efd9461..0aebbe6 100644 --- a/shared/dto/distance.py +++ b/shared/mongodb/src/classes/distance.py @@ -1,4 +1,5 @@ """Definition of DistanceData data model.""" + from __future__ import annotations from .data_model import DataModel diff --git a/shared/dto/framing.py b/shared/mongodb/src/classes/framing.py similarity index 99% rename from shared/dto/framing.py rename to shared/mongodb/src/classes/framing.py index 2381ebc..eca22e3 100644 --- a/shared/dto/framing.py +++ b/shared/mongodb/src/classes/framing.py @@ -1,4 +1,5 @@ """Definition of FramingData data model.""" + from __future__ import annotations from .data_model import DataModel diff --git a/shared/dto/information_value.py b/shared/mongodb/src/classes/information_value.py similarity index 99% rename from shared/dto/information_value.py rename to shared/mongodb/src/classes/information_value.py index 45d10f3..fd4bf48 100644 --- a/shared/dto/information_value.py +++ b/shared/mongodb/src/classes/information_value.py @@ -1,4 +1,5 @@ """Definition of InformationValueData data model.""" + from __future__ import annotations from .data_model import DataModel diff --git a/shared/dto/modality_color.py b/shared/mongodb/src/classes/modality_color.py similarity index 99% rename from shared/dto/modality_color.py rename to shared/mongodb/src/classes/modality_color.py index a34d6be..458e568 100644 --- a/shared/dto/modality_color.py +++ b/shared/mongodb/src/classes/modality_color.py @@ -1,4 +1,5 @@ """Definition of ModalityColorData data model.""" + from __future__ import annotations from .data_model import DataModel diff --git a/shared/dto/modality_depth.py b/shared/mongodb/src/classes/modality_depth.py similarity index 99% rename from shared/dto/modality_depth.py rename to shared/mongodb/src/classes/modality_depth.py index 3f8fbe6..e0446f4 100644 --- a/shared/dto/modality_depth.py +++ b/shared/mongodb/src/classes/modality_depth.py @@ -1,4 +1,5 @@ """Definition of ModalityDepthData data model.""" + from __future__ import annotations from .data_model import DataModel diff --git a/shared/dto/modality_lighting.py b/shared/mongodb/src/classes/modality_lighting.py similarity index 99% rename from shared/dto/modality_lighting.py rename to shared/mongodb/src/classes/modality_lighting.py index fb04f4c..508ad57 100644 --- a/shared/dto/modality_lighting.py +++ b/shared/mongodb/src/classes/modality_lighting.py @@ -1,4 +1,5 @@ """Definition of ModalityLightingData data model.""" + from __future__ import annotations from .data_model import DataModel diff --git a/shared/dto/model_data.py b/shared/mongodb/src/classes/model_data.py similarity index 100% rename from shared/dto/model_data.py rename to shared/mongodb/src/classes/model_data.py diff --git a/shared/dto/point_of_view.py b/shared/mongodb/src/classes/point_of_view.py similarity index 99% rename from shared/dto/point_of_view.py rename to shared/mongodb/src/classes/point_of_view.py index 98d67c5..b1e4543 100644 --- a/shared/dto/point_of_view.py +++ b/shared/mongodb/src/classes/point_of_view.py @@ -1,4 +1,5 @@ """Definition of PointOfViewData data model.""" + from __future__ import annotations from .data_model import DataModel diff --git a/shared/dto/salience.py b/shared/mongodb/src/classes/salience.py similarity index 99% rename from shared/dto/salience.py rename to shared/mongodb/src/classes/salience.py index 580100d..186132c 100644 --- a/shared/dto/salience.py +++ b/shared/mongodb/src/classes/salience.py @@ -1,4 +1,5 @@ """Definition of SalienceData data model.""" + from __future__ import annotations from .data_model import DataModel diff --git a/shared/database/classes/visual_communication.py b/shared/mongodb/src/classes/visual_communication.py similarity index 98% rename from shared/database/classes/visual_communication.py rename to shared/mongodb/src/classes/visual_communication.py index 4049a4a..c7ed7ef 100755 --- a/shared/database/classes/visual_communication.py +++ b/shared/mongodb/src/classes/visual_communication.py @@ -13,7 +13,7 @@ from pydantic import BaseModel, ConfigDict from pymongo.collection import Collection from shared.data_store import get, put -from shared.dto import ModelData +from shared.mongodb.classes import ModelData class VisualCommunication(BaseModel): diff --git a/shared/dto/visual_syntax.py b/shared/mongodb/src/classes/visual_syntax.py similarity index 99% rename from shared/dto/visual_syntax.py rename to shared/mongodb/src/classes/visual_syntax.py index fd38639..4483e7f 100644 --- a/shared/dto/visual_syntax.py +++ b/shared/mongodb/src/classes/visual_syntax.py @@ -1,4 +1,5 @@ """Definition of VisualSyntaxData data model.""" + from __future__ import annotations from .data_model import DataModel diff --git a/shared/database/utils/connect_mongodb.py b/shared/mongodb/src/connect_mongodb.py similarity index 100% rename from shared/database/utils/connect_mongodb.py rename to shared/mongodb/src/connect_mongodb.py diff --git a/shared/database/utils/count_documents.py b/shared/mongodb/src/count_documents.py similarity index 83% rename from shared/database/utils/count_documents.py rename to shared/mongodb/src/count_documents.py index 53a4a1c..eb9af6b 100755 --- a/shared/database/utils/count_documents.py +++ b/shared/mongodb/src/count_documents.py @@ -1,4 +1,5 @@ """Definition of function to count documents in database.""" + from __future__ import annotations from pymongo.collection import Collection @@ -8,10 +9,8 @@ def count_documents( collection: Collection, only_with_annotation: bool = False, ) -> int: - """ - Get the total number of documents - in database that matches the filters. - """ + """Get the total number of documents in database that matches the + filters.""" assert isinstance(collection, Collection) assert isinstance(only_with_annotation, bool) # build query diff --git a/shared/mongodb/src/exceptions/__init__.py b/shared/mongodb/src/exceptions/__init__.py new file mode 100644 index 0000000..6daba63 --- /dev/null +++ b/shared/mongodb/src/exceptions/__init__.py @@ -0,0 +1 @@ +from .no_document_found import NoDocumentFoundException diff --git a/shared/database/classes/exceptions.py b/shared/mongodb/src/exceptions/no_document_found.py similarity index 80% rename from shared/database/classes/exceptions.py rename to shared/mongodb/src/exceptions/no_document_found.py index 5372031..dfe1c99 100755 --- a/shared/database/classes/exceptions.py +++ b/shared/mongodb/src/exceptions/no_document_found.py @@ -1,5 +1,4 @@ """Definition of database exception.""" -from __future__ import annotations class NoDocumentFoundException(Exception): diff --git a/shared/database/utils/get_dataset.py b/shared/mongodb/src/get_dataset.py similarity index 100% rename from shared/database/utils/get_dataset.py rename to shared/mongodb/src/get_dataset.py diff --git a/shared/database/utils/get_visual_communication.py b/shared/mongodb/src/get_visual_communication.py similarity index 74% rename from shared/database/utils/get_visual_communication.py rename to shared/mongodb/src/get_visual_communication.py index 739d1df..b9c0dbb 100755 --- a/shared/database/utils/get_visual_communication.py +++ b/shared/mongodb/src/get_visual_communication.py @@ -1,12 +1,13 @@ """Definition of function to get visual communication from database.""" + from __future__ import annotations import logging from pymongo.collection import Collection -from shared.database import NoDocumentFoundException -from shared.database import VisualCommunication +from shared.mongodb.classes import VisualCommunication +from shared.mongodb.exceptions import NoDocumentFoundException def get_visual_communication( @@ -22,16 +23,16 @@ def get_visual_communication( data = collection.aggregate( pipeline=[ { - '$match': query, # find using filters + '$match': query, # find using filters }, { '$sample': { - 'size': 1, # get one random + 'size': 1, # get one random }, }, ], ) - data_list = list(data) # read data from cursor object + data_list = list(data) # read data from cursor object if len(data_list) == 0: raise NoDocumentFoundException() vis_com = VisualCommunication.model_validate(data_list[0]) diff --git a/shared/database/utils/list_names.py b/shared/mongodb/src/list_names.py similarity index 88% rename from shared/database/utils/list_names.py rename to shared/mongodb/src/list_names.py index 6184166..86e09dc 100755 --- a/shared/database/utils/list_names.py +++ b/shared/mongodb/src/list_names.py @@ -1,7 +1,6 @@ -""" -Definition of function to list names -of all visual communication documents in database. -""" +"""Definition of function to list names of all visual communication documents +in database.""" + from __future__ import annotations from pymongo.collection import Collection diff --git a/shared/database/utils/upsert_annotation.py b/shared/mongodb/src/upsert_annotation.py similarity index 92% rename from shared/database/utils/upsert_annotation.py rename to shared/mongodb/src/upsert_annotation.py index ea7c8ae..9e61bcc 100755 --- a/shared/database/utils/upsert_annotation.py +++ b/shared/mongodb/src/upsert_annotation.py @@ -4,7 +4,7 @@ import logging from pymongo.collection import Collection -from shared.dto import ModelData +from shared.mongodb.classes import ModelData def upsert_annotation( diff --git a/shared/database/utils/upsert_prediction.py b/shared/mongodb/src/upsert_prediction.py similarity index 92% rename from shared/database/utils/upsert_prediction.py rename to shared/mongodb/src/upsert_prediction.py index 88388d3..0f4d628 100755 --- a/shared/database/utils/upsert_prediction.py +++ b/shared/mongodb/src/upsert_prediction.py @@ -4,7 +4,7 @@ import logging from pymongo.collection import Collection -from shared.dto import ModelData +from shared.mongodb.classes import ModelData def upsert_prediction( diff --git a/shared/database/utils/upsert_visual_communication.py b/shared/mongodb/src/upsert_visual_communication.py similarity index 59% rename from shared/database/utils/upsert_visual_communication.py rename to shared/mongodb/src/upsert_visual_communication.py index 30c2e7e..a69b9fa 100755 --- a/shared/database/utils/upsert_visual_communication.py +++ b/shared/mongodb/src/upsert_visual_communication.py @@ -2,22 +2,18 @@ from __future__ import annotations from pymongo.collection import Collection -from shared.database import VisualCommunication +from shared.mongodb.classes import VisualCommunication def upsert_visual_communication( collection: Collection, visual_communication_list: list[VisualCommunication], ) -> bool: - """ - Upsert VisualCommunication object in the database. + """Upsert VisualCommunication object in the database. + Returns bool stating success. """ response = collection.insert_many( - [ - vis_com.model_dump() - for vis_com - in visual_communication_list - ], + [vis_com.model_dump() for vis_com in visual_communication_list], ) return response.acknowledged diff --git a/web_ui/src/app/init_app.py b/web_ui/src/app/init_app.py index 481b9b7..632d3d4 100644 --- a/web_ui/src/app/init_app.py +++ b/web_ui/src/app/init_app.py @@ -1,28 +1,23 @@ """Definition of init_app function.""" + from __future__ import annotations import logging import os import dash_bootstrap_components as dbc -from dash import ALL -from dash import Dash -from dash import Input -from dash import Output -from dash import State +from dash import ALL, Dash, Input, Output, State from dash_auth import BasicAuth from minio import Minio from pydantic import ValidationError from pymongo.collection import Collection -from .layout import app_layout from shared.data_store import delete as delete_from_minio -from shared.database import count_documents -from shared.database import get_visual_communication -from shared.database import NoDocumentFoundException -from shared.database import upsert_annotation -from shared.database import VisualCommunication -from shared.dto import ModelData +from shared.mongodb import count_documents, get_visual_communication, upsert_annotation +from shared.mongodb.classes import ModelData, VisualCommunication +from shared.mongodb.exceptions import NoDocumentFoundException + +from .layout import app_layout def init_app( @@ -101,10 +96,8 @@ def init_app( collection=mongo_collection, only_with_annotation=True, ) - limit = int(num_total/20) - label_str = f"{ - num_handled - }/{num_total}" if num_handled >= limit else '' + limit = int(num_total / 20) + label_str = f'{num_handled}/{num_total}' if num_handled >= limit else '' return num_handled, num_total, label_str # define callback: upload image @@ -122,9 +115,7 @@ def init_app( """Upload image to database through web ui.""" try: # stop if no input - assert ( - content_list is not None - ) and ( + assert (content_list is not None) and ( filename_list is not None ), 'nothing to upload' # handle input @@ -159,7 +150,9 @@ def init_app( client=minio_client, object_name=vis_com.object_name, ) - assert len(failed_filename_list) == 0, f"failed uploading:{ + assert ( + len(failed_filename_list) == 0 + ), f"failed uploading:{ '\n'.join(failed_filename_list) }" except Exception as exc: @@ -208,30 +201,19 @@ def init_app( logging.info('saving annotations to database: %s', vis_com_name) try: # extract option keys - annotation_keys = [ - elem['index'] - for elem in annotation_keys - ] + annotation_keys = [elem['index'] for elem in annotation_keys] # ensure all options are set logging.info(annotation_keys) for option, value in zip(annotation_keys, annotation_values): if value is None: raise ValueError(f"{option} is not set") # prepare data to save - annotation_keys = [ - elem.replace(' ', '_') - for elem - in annotation_keys - ] + annotation_keys = [elem.replace(' ', '_') for elem in annotation_keys] annotation_values = [ - elem.replace(' ', '_').lower() - for elem - in annotation_values + elem.replace(' ', '_').lower() for elem in annotation_values ] annotation_map = { - key: value - for key, value - in zip(annotation_keys, annotation_values) + key: value for key, value in zip(annotation_keys, annotation_values) } # instantiate ModelOutputs object annotations = ModelData.from_annotations(**annotation_map) @@ -273,8 +255,10 @@ def init_app( response[2] = image_src response[3] = annotation_values logging.info( - 'finished getting visual communication: %s', vis_com_name, + 'finished getting visual communication: %s', + vis_com_name, ) return tuple(response) + logging.info('initialised app') return app diff --git a/web_ui/src/app/layout/labels.py b/web_ui/src/app/layout/labels.py index c87f4a0..a4ec822 100644 --- a/web_ui/src/app/layout/labels.py +++ b/web_ui/src/app/layout/labels.py @@ -1,20 +1,21 @@ from __future__ import annotations import dash_mantine_components as dmc -from dash import dcc -from dash import html +from dash import dcc, html -from shared.dto import AngleData -from shared.dto import ContactData -from shared.dto import DistanceData -from shared.dto import FramingData -from shared.dto import InformationValueData -from shared.dto import ModalityColorData -from shared.dto import ModalityDepthData -from shared.dto import ModalityLightingData -from shared.dto import PointOfViewData -from shared.dto import SalienceData -from shared.dto import VisualSyntaxData +from shared.mongodb.classes import ( + AngleData, + ContactData, + DistanceData, + FramingData, + InformationValueData, + ModalityColorData, + ModalityDepthData, + ModalityLightingData, + PointOfViewData, + SalienceData, + VisualSyntaxData, +) def generate_visual_syntax_options_map(): @@ -54,54 +55,63 @@ experiential_map = generate_visual_syntax_options_map() experiential_container = dmc.Col( children=[ html.H4('experiential'.title()), - ], span=5, + ], + span=5, ) for title, options in experiential_map.items(): id_dict = {'type': 'annotation', 'index': title.replace('_', '-')} experiential_container.children.append( - dmc.Container([ - html.B(title.title()), - dcc.RadioItems( - options=[text.replace('_', ' ') for text in options], - id=id_dict, - ), - ]), + dmc.Container( + [ + html.B(title.title()), + dcc.RadioItems( + options=[text.replace('_', ' ') for text in options], + id=id_dict, + ), + ], + ), ) # prepare interpersonal container interpersonal_map = generate_interpersonal_options_map() interpersonal_container = dmc.Col( children=[ html.H4('interpersonal'.title()), - ], span=3, + ], + span=3, ) for title, options in interpersonal_map.items(): id_dict = {'type': 'annotation', 'index': title.replace('_', '-')} interpersonal_container.children.append( - dmc.Container([ - html.B(title.title()), - dcc.RadioItems( - options=[text.replace('_', ' ') for text in options], - id=id_dict, - ), - ]), + dmc.Container( + [ + html.B(title.title()), + dcc.RadioItems( + options=[text.replace('_', ' ') for text in options], + id=id_dict, + ), + ], + ), ) # prepare textual container textual_map = generate_textual_options_map() textual_container = dmc.Col( children=[ html.H4('textual'.title()), - ], span=4, + ], + span=4, ) for title, options in textual_map.items(): id_dict = {'type': 'annotation', 'index': title.replace('_', '-')} textual_container.children.append( - dmc.Container([ - html.B(title.title()), - dcc.RadioItems( - options=[text.replace('_', ' ') for text in options], - id=id_dict, - ), - ]), + dmc.Container( + [ + html.B(title.title()), + dcc.RadioItems( + options=[text.replace('_', ' ') for text in options], + id=id_dict, + ), + ], + ), ) labels_element = dmc.Grid( diff --git a/web_ui/src/main.py b/web_ui/src/main.py index ea48325..6d6fbd5 100644 --- a/web_ui/src/main.py +++ b/web_ui/src/main.py @@ -5,7 +5,7 @@ from __future__ import annotations import os from shared.data_store import connect_minio -from shared.database import connect_mongodb +from shared.mongodb import connect_mongodb from shared.utils import check_env, setup_logging from .app import init_app