Skip to content

Commit fdad0a1

Browse files
authored
Merge pull request #108 from Geode-solutions/feat/save_and_load
feat(save_and_load): add import/export methods
2 parents 546a67b + 1b3455c commit fdad0a1

File tree

8 files changed

+115
-1
lines changed

8 files changed

+115
-1
lines changed

opengeodeweb_viewer_schemas.json

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1135,6 +1135,14 @@
11351135
"required": [],
11361136
"additionalProperties": false
11371137
},
1138+
"import_project": {
1139+
"$id": "opengeodeweb_viewer.import_project",
1140+
"rpc": "import_project",
1141+
"type": "object",
1142+
"properties": {},
1143+
"required": [],
1144+
"additionalProperties": false
1145+
},
11381146
"viewer": {
11391147
"update_data": {
11401148
"$id": "opengeodeweb_viewer.viewer.update_data",

requirements.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,4 +61,3 @@ wslink==1.12.4
6161
yarl>=1
6262
# via aiohttp
6363

64-
opengeodeweb-microservice==1.*,>=1.0.8
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
from .kill import *
2+
from .import_project import *
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
{
2+
"rpc": "import_project",
3+
"type": "object",
4+
"properties": {},
5+
"required": [],
6+
"additionalProperties": false
7+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
from dataclasses_json import DataClassJsonMixin
2+
from dataclasses import dataclass
3+
4+
5+
@dataclass
6+
class ImportProject(DataClassJsonMixin):
7+
pass

src/opengeodeweb_viewer/rpc/utils_protocols.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
# Standard library imports
22
import os
3+
from typing import cast
34

45
# Third party imports
56
from wslink import register as exportRpc # type: ignore
67

78
# Local application imports
89
from opengeodeweb_microservice.schemas import get_schemas_dict
910
from opengeodeweb_viewer.vtk_protocol import VtkView
11+
from opengeodeweb_microservice.database import connection
12+
from opengeodeweb_viewer.utils_functions import validate_schema, RpcParams
13+
from opengeodeweb_viewer.rpc.schemas.import_project import ImportProject
1014

1115

1216
class VtkUtilsView(VtkView):
@@ -25,3 +29,45 @@ def kill(self) -> None:
2529
)
2630
print("Manual viewer kill, shutting down...", flush=True)
2731
os._exit(0)
32+
33+
@exportRpc(utils_prefix + utils_schemas_dict["import_project"]["rpc"])
34+
def importProject(self, rpc_params: RpcParams) -> None:
35+
print(
36+
f"{self.utils_prefix + self.utils_schemas_dict['import_project']['rpc']}",
37+
flush=True,
38+
)
39+
validate_schema(
40+
rpc_params,
41+
self.utils_schemas_dict["import_project"],
42+
self.utils_prefix,
43+
)
44+
45+
widget = self.get_widget()
46+
if widget is not None:
47+
try:
48+
widget.EnabledOff()
49+
except Exception:
50+
pass
51+
self.coreServer.setSharedObject("widget", None)
52+
self.coreServer.setSharedObject("grid_scale", None)
53+
self.coreServer.setSharedObject("axes", None)
54+
55+
self.get_data_base().clear()
56+
57+
self._release_database()
58+
59+
db_full_path = os.path.join(self.DATA_FOLDER_PATH, "project.db")
60+
connection.init_database(db_full_path, create_tables=False)
61+
62+
@exportRpc(utils_prefix + "release_database")
63+
def releaseDatabase(self, rpc_params: RpcParams) -> None:
64+
self._release_database()
65+
66+
def _release_database(self) -> None:
67+
if connection.scoped_session_registry is not None:
68+
connection.scoped_session_registry.remove()
69+
if connection.engine is not None:
70+
connection.engine.dispose()
71+
connection.engine = connection.session_factory = (
72+
connection.scoped_session_registry
73+
) = None
10.5 KB
Loading

tests/test_utils_protocols.py

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
from typing import Callable
2+
from opengeodeweb_viewer.rpc.utils_protocols import VtkUtilsView
3+
from opengeodeweb_viewer.rpc.viewer.viewer_protocols import VtkViewerView
4+
from opengeodeweb_viewer.rpc.mesh.mesh_protocols import VtkMeshView
5+
from opengeodeweb_microservice.database.connection import get_session
6+
from opengeodeweb_microservice.database.data import Data
7+
from tests.conftest import ServerMonitor
8+
9+
10+
def test_reset_project_after_import(
11+
server: ServerMonitor, dataset_factory: Callable[..., str]
12+
) -> None:
13+
# Mock
14+
pre_id = "123456789"
15+
dataset_factory(id=pre_id, viewable_file_name="hat.vtp")
16+
server.call(
17+
VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"],
18+
[{"id": pre_id}],
19+
)
20+
assert server.compare_image("mesh/register.jpeg") is True
21+
22+
# Import
23+
with get_session() as session:
24+
session.query(Data).delete()
25+
session.commit()
26+
27+
post_id = "987654321"
28+
dataset_factory(id=post_id, viewable_file_name="hat.vtp")
29+
30+
server.call(
31+
VtkUtilsView.utils_prefix
32+
+ VtkUtilsView.utils_schemas_dict["import_project"]["rpc"]
33+
)
34+
server.get_response()
35+
36+
server.call(
37+
VtkViewerView.viewer_prefix
38+
+ VtkViewerView.viewer_schemas_dict["reset_visualization"]["rpc"]
39+
)
40+
assert server.compare_image("viewer/reset_visualization.jpeg") is True
41+
42+
server.call(
43+
VtkMeshView.mesh_prefix + VtkMeshView.mesh_schemas_dict["register"]["rpc"],
44+
[{"id": post_id}],
45+
)
46+
assert server.compare_image("viewer/import_project.jpeg") is True

0 commit comments

Comments
 (0)