diff --git a/opengeodeweb_viewer_schemas.json b/opengeodeweb_viewer_schemas.json index c39d37d..319ed44 100644 --- a/opengeodeweb_viewer_schemas.json +++ b/opengeodeweb_viewer_schemas.json @@ -1143,6 +1143,14 @@ "required": [], "additionalProperties": false }, + "import_project": { + "$id": "opengeodeweb_viewer.import_project", + "rpc": "import_project", + "type": "object", + "properties": {}, + "required": [], + "additionalProperties": false + }, "viewer": { "update_data": { "$id": "opengeodeweb_viewer.viewer.update_data", diff --git a/requirements.txt b/requirements.txt index 9e24baf..065674a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -61,4 +61,3 @@ wslink==1.12.4 yarl>=1 # via aiohttp -opengeodeweb-microservice==1.*,>=1.0.6rc1 diff --git a/src/opengeodeweb_viewer/rpc/schemas/__init__.py b/src/opengeodeweb_viewer/rpc/schemas/__init__.py index 4452316..451f1fc 100644 --- a/src/opengeodeweb_viewer/rpc/schemas/__init__.py +++ b/src/opengeodeweb_viewer/rpc/schemas/__init__.py @@ -1 +1,2 @@ from .kill import * +from .import_project import * diff --git a/src/opengeodeweb_viewer/rpc/schemas/import_project.json b/src/opengeodeweb_viewer/rpc/schemas/import_project.json new file mode 100644 index 0000000..16201f6 --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/schemas/import_project.json @@ -0,0 +1,7 @@ +{ + "rpc": "import_project", + "type": "object", + "properties": {}, + "required": [], + "additionalProperties": false +} \ No newline at end of file diff --git a/src/opengeodeweb_viewer/rpc/schemas/import_project.py b/src/opengeodeweb_viewer/rpc/schemas/import_project.py new file mode 100644 index 0000000..2fd045e --- /dev/null +++ b/src/opengeodeweb_viewer/rpc/schemas/import_project.py @@ -0,0 +1,7 @@ +from dataclasses_json import DataClassJsonMixin +from dataclasses import dataclass + + +@dataclass +class ImportProject(DataClassJsonMixin): + pass diff --git a/src/opengeodeweb_viewer/rpc/utils_protocols.py b/src/opengeodeweb_viewer/rpc/utils_protocols.py index 8dbd70f..73969b5 100644 --- a/src/opengeodeweb_viewer/rpc/utils_protocols.py +++ b/src/opengeodeweb_viewer/rpc/utils_protocols.py @@ -1,5 +1,6 @@ # Standard library imports import os +from typing import cast # Third party imports from wslink import register as exportRpc # type: ignore @@ -7,6 +8,9 @@ # Local application imports from opengeodeweb_microservice.schemas import get_schemas_dict from opengeodeweb_viewer.vtk_protocol import VtkView +from opengeodeweb_microservice.database import connection +from opengeodeweb_viewer.utils_functions import validate_schema +from opengeodeweb_viewer.rpc.schemas.import_project import ImportProject class VtkUtilsView(VtkView): @@ -25,3 +29,40 @@ def kill(self) -> None: ) print("Manual viewer kill, shutting down...", flush=True) os._exit(0) + + @exportRpc(utils_prefix + utils_schemas_dict["import_project"]["rpc"]) + def importProject(self, rpc_params: ImportProject) -> None: + print( + f"{self.utils_prefix + self.utils_schemas_dict['import_project']['rpc']}", + flush=True, + ) + validate_schema( + cast(dict[str, str], rpc_params), + self.utils_schemas_dict["import_project"], + self.utils_prefix, + ) + + widget = self.get_widget() + if widget is not None: + try: + widget.EnabledOff() + except Exception: + pass + self.coreServer.setSharedObject("widget", None) + self.coreServer.setSharedObject("grid_scale", None) + self.coreServer.setSharedObject("axes", None) + + self.get_data_base().clear() + + # Clean up any existing database session + if connection.scoped_session_registry is not None: + connection.scoped_session_registry.remove() + if connection.engine is not None: + connection.engine.dispose() + # Reset all connection attributes to None + connection.engine = connection.session_factory = ( + connection.scoped_session_registry + ) = None + + db_full_path = os.path.join(self.DATA_FOLDER_PATH, "project.db") + connection.init_database(db_full_path, create_tables=False) diff --git a/tests/data/images/viewer/import_project.jpeg b/tests/data/images/viewer/import_project.jpeg new file mode 100644 index 0000000..6ca64aa Binary files /dev/null and b/tests/data/images/viewer/import_project.jpeg differ diff --git a/tests/test_utils_protocols.py b/tests/test_utils_protocols.py new file mode 100644 index 0000000..a7c373d --- /dev/null +++ b/tests/test_utils_protocols.py @@ -0,0 +1,46 @@ +from typing import Callable +from opengeodeweb_viewer.rpc.utils_protocols import VtkUtilsView +from opengeodeweb_viewer.rpc.viewer.viewer_protocols import VtkViewerView +from opengeodeweb_viewer.rpc.mesh.mesh_protocols import VtkMeshView +from opengeodeweb_microservice.database.connection import get_session +from opengeodeweb_microservice.database.data import Data +from tests.conftest import ServerMonitor + + +def test_reset_project_after_import( + server: ServerMonitor, dataset_factory: Callable[..., str] +) -> None: + # Mock + pre_id = "123456789" + dataset_factory(id=pre_id, viewable_file_name="hat.vtp") + server.call( + VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], + [{"id": pre_id}], + ) + assert server.compare_image(3, "mesh/register.jpeg") is True + + # Import + with get_session() as session: + session.query(Data).delete() + session.commit() + + post_id = "987654321" + dataset_factory(id=post_id, viewable_file_name="hat.vtp") + + server.call( + VtkUtilsView.utils_prefix + + VtkUtilsView.utils_schemas_dict["import_project"]["rpc"] + ) + server.get_response() + + server.call( + VtkViewerView.viewer_prefix + + VtkViewerView.viewer_schemas_dict["reset_visualization"]["rpc"] + ) + assert server.compare_image(3, "viewer/reset_visualization.jpeg") is True + + server.call( + VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"], + [{"id": post_id}], + ) + assert server.compare_image(3, "viewer/import_project.jpeg") is True