Skip to content

Commit a985ba5

Browse files
committed
id and data infos set by database
1 parent a70ef53 commit a985ba5

File tree

5 files changed

+88
-65
lines changed

5 files changed

+88
-65
lines changed

src/opengeodeweb_back/app_config.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
# Third party imports
66
# Local application imports
7+
from .database import DATABASE_FILENAME
78

89

910
class Config(object):
@@ -25,7 +26,7 @@ class ProdConfig(Config):
2526
SECONDS_BETWEEN_SHUTDOWNS = "10"
2627
DATA_FOLDER_PATH = "/data"
2728
SQLALCHEMY_DATABASE_URI = f"sqlite:///{os.path.abspath(
28-
os.path.join(DATA_FOLDER_PATH, 'db.sqlite3')
29+
os.path.join(DATA_FOLDER_PATH, DATABASE_FILENAME)
2930
)}"
3031

3132

@@ -37,5 +38,5 @@ class DevConfig(Config):
3738
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
3839
DATA_FOLDER_PATH = os.path.join(BASE_DIR, "data")
3940
SQLALCHEMY_DATABASE_URI = f"sqlite:///{os.path.join(
40-
BASE_DIR, DATA_FOLDER_PATH, 'db.sqlite3'
41+
BASE_DIR, DATA_FOLDER_PATH, DATABASE_FILENAME
4142
)}"

src/opengeodeweb_back/data.py

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,33 @@
11
from sqlalchemy import String, JSON
2-
from .database import db
2+
from .database import database
3+
import uuid
34

45

5-
class Data(db.Model):
6+
class Data(database.Model):
67
__tablename__ = "datas"
78

8-
id = db.Column(String, primary_key=True)
9-
name = db.Column(String, nullable=False)
10-
native_file_name = db.Column(String, nullable=False)
11-
viewable_file_name = db.Column(String, nullable=False)
12-
light_viewable = db.Column(String, nullable=True)
13-
geode_object = db.Column(String, nullable=False)
14-
input_file = db.Column(JSON, nullable=True)
15-
additional_files = db.Column(JSON, nullable=True)
9+
id = database.Column(
10+
String,
11+
primary_key=True,
12+
default=lambda: str(uuid.uuid4()).replace("-", "")
13+
)
14+
name = database.Column(String, nullable=False)
15+
native_file_name = database.Column(String, nullable=False)
16+
viewable_file_name = database.Column(String, nullable=False)
17+
light_viewable = database.Column(String, nullable=True)
18+
geode_object = database.Column(String, nullable=False)
19+
input_file = database.Column(JSON, nullable=True)
20+
additional_files = database.Column(JSON, nullable=True)
21+
22+
@staticmethod
23+
def create(name, geode_object, input_file, additional_files=[]):
24+
data_entry = Data(
25+
name=name,
26+
geode_object=geode_object,
27+
input_file=input_file,
28+
additional_files=additional_files,
29+
)
30+
31+
database.session.add(data_entry)
32+
database.session.flush()
33+
return data_entry

src/opengeodeweb_back/database.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
11
from flask_sqlalchemy import SQLAlchemy
22

3-
db = SQLAlchemy()
3+
DATABASE_FILENAME = "project.db"
4+
5+
database = SQLAlchemy()
46

57

68
def initialize_database(app):
7-
db.init_app(app)
9+
database.init_app(app)
810
with app.app_context():
9-
db.create_all()
10-
return db
11+
database.create_all()
12+
return database

src/opengeodeweb_back/utils_functions.py

Lines changed: 33 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import os
33
import threading
44
import time
5-
import uuid
65
import zipfile
76

87
# Third party imports
@@ -15,7 +14,7 @@
1514
# Local application imports
1615
from . import geode_functions
1716
from .data import Data
18-
from .database import db
17+
from .database import database
1918

2019

2120
def increment_request_counter(current_app):
@@ -147,17 +146,23 @@ def handle_exception(e):
147146
return response
148147

149148

150-
def create_unique_data_folder() -> tuple[str, str]:
149+
def create_data_folder_from_id(data_id: str) -> str:
151150
base_data_folder = flask.current_app.config["DATA_FOLDER_PATH"]
152-
generated_id = str(uuid.uuid4()).replace("-", "")
153-
data_path = os.path.join(base_data_folder, generated_id)
151+
data_path = os.path.join(base_data_folder, data_id)
154152
os.makedirs(data_path, exist_ok=True)
155-
return generated_id, data_path
153+
return data_path
156154

157155

158156
def save_all_viewables_and_return_info(
159-
geode_object, data, generated_id, data_path, additional_files=None
157+
geode_object, data, input_file, additional_files=None
160158
):
159+
data_entry = Data.create(
160+
name=data.name(),
161+
geode_object=geode_object,
162+
input_file=input_file,
163+
additional_files=additional_files
164+
)
165+
data_path = create_data_folder_from_id(data_entry.id)
161166
saved_native_file_path = geode_functions.save(
162167
geode_object,
163168
data,
@@ -172,42 +177,35 @@ def save_all_viewables_and_return_info(
172177
)
173178
with open(saved_light_viewable_file_path, "rb") as f:
174179
binary_light_viewable = f.read()
175-
176-
data_entry = Data(
177-
id=generated_id,
178-
name=data.name(),
179-
native_file_name=os.path.basename(saved_native_file_path[0]),
180-
viewable_file_name=os.path.basename(saved_viewable_file_path),
181-
light_viewable=os.path.basename(saved_light_viewable_file_path),
182-
geode_object=geode_object,
183-
input_file=additional_files or [],
184-
additional_files=additional_files or [],
185-
)
186-
187-
db.session.add(data_entry)
188-
db.session.commit()
180+
data_entry.native_file_name = os.path.basename(saved_native_file_path[0])
181+
data_entry.viewable_file_name = os.path.basename(saved_viewable_file_path)
182+
data_entry.light_viewable = os.path.basename(saved_light_viewable_file_path)
183+
184+
database.session.commit()
189185

190186
return {
191-
"name": data.name(),
192-
"native_file_name": os.path.basename(saved_native_file_path[0]),
193-
"viewable_file_name": os.path.basename(saved_viewable_file_path),
187+
"name": data_entry.name,
188+
"native_file_name": data_entry.native_file_name,
189+
"viewable_file_name": data_entry.viewable_file_name,
194190
"id": data_entry.id,
195191
"object_type": geode_functions.get_object_type(geode_object),
196192
"binary_light_viewable": binary_light_viewable.decode("utf-8"),
197-
"geode_object": geode_object,
198-
"input_files": additional_files or [],
193+
"geode_object": data_entry.geode_object,
194+
"input_files": data_entry.additional_files,
199195
}
200196

201197

202198
def generate_native_viewable_and_light_viewable_from_object(geode_object, data):
203-
generated_id, data_path = create_unique_data_folder()
204-
return save_all_viewables_and_return_info(
205-
geode_object, data, generated_id, data_path
206-
)
199+
return save_all_viewables_and_return_info(geode_object, data)
207200

208201

209202
def generate_native_viewable_and_light_viewable_from_file(geode_object, input_filename):
210-
generated_id, data_path = create_unique_data_folder()
203+
temp_data_entry = Data.create_and_get_id(
204+
name="temp",
205+
geode_object=geode_object
206+
)
207+
208+
data_path = create_data_folder_from_id(temp_data_entry.id)
211209

212210
full_input_filename = geode_functions.upload_file_path(input_filename)
213211
copied_full_path = os.path.join(
@@ -230,12 +228,13 @@ def generate_native_viewable_and_light_viewable_from_file(geode_object, input_fi
230228
shutil.copy2(source_path, dest_path)
231229
additional_files_copied.append(additional_file.filename)
232230

233-
data = geode_functions.load_data(geode_object, generated_id, input_filename)
231+
data = geode_functions.load_data(geode_object, temp_data_entry.id, input_filename)
232+
233+
database.session.delete(temp_data_entry)
234+
database.session.flush()
234235

235236
return save_all_viewables_and_return_info(
236237
geode_object,
237238
data,
238-
generated_id,
239-
data_path,
240239
additional_files=additional_files_copied,
241240
)

tests/test_utils_functions.py

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,10 @@
55
# Third party imports
66
import flask
77
import shutil
8+
import uuid
89

910
# Local application imports
10-
from src.opengeodeweb_back.database import db
11+
from src.opengeodeweb_back.database import database
1112
from src.opengeodeweb_back.data import Data
1213
from src.opengeodeweb_back import geode_functions, utils_functions
1314

@@ -74,15 +75,15 @@ def test_handle_exception(client):
7475
assert type(data["code"]) is int
7576

7677

77-
def test_create_unique_data_folder(client):
78+
def test_create_data_folder_from_id(client):
7879
app = client.application
7980
with app.app_context():
80-
generated_id, data_path = utils_functions.create_unique_data_folder()
81-
assert isinstance(generated_id, str)
82-
assert re.fullmatch(r"[0-9a-f]{32}", generated_id)
81+
test_id = str(uuid.uuid4()).replace("-", "")
82+
data_path = utils_functions.create_data_folder_from_id(test_id)
83+
assert isinstance(data_path, str)
8384
assert os.path.exists(data_path)
8485
assert data_path.startswith(flask.current_app.config["DATA_FOLDER_PATH"])
85-
assert generated_id in data_path
86+
assert test_id in data_path
8687
shutil.rmtree(data_path, ignore_errors=True)
8788
assert not os.path.exists(data_path)
8889

@@ -99,35 +100,37 @@ def test_save_all_viewables_and_return_info(client):
99100

100101
geode_object = "BRep"
101102
data = geode_functions.load(geode_object, "./tests/data/test.og_brep")
102-
folder_id, data_path = utils_functions.create_unique_data_folder()
103+
input_file = ["test.og_brep"]
103104
additional_files = ["additional_file.txt"]
104105

105106
result = utils_functions.save_all_viewables_and_return_info(
106-
geode_object, data, folder_id, data_path, additional_files
107+
geode_object, data, input_file, additional_files
107108
)
108109

109110
assert isinstance(result, dict)
110111
assert result["name"] == data.name()
111112
assert result["native_file_name"].startswith("native.")
112113
assert result["viewable_file_name"].endswith(".vtm")
114+
assert isinstance(result["id"], str)
115+
assert len(result["id"]) == 32
113116
assert re.match(r"[0-9a-f]{32}", result["id"])
114117
assert isinstance(result["object_type"], str)
115118
assert isinstance(result["binary_light_viewable"], str)
116119
assert result["geode_object"] == geode_object
117-
assert result["input_files"] == additional_files
120+
assert result["input_files"] == input_file
118121

119122
db_entry = Data.query.get(result["id"])
120123
assert db_entry is not None
121124
assert db_entry.name == data.name()
122-
assert db_entry.native_file_name == os.path.basename(result["native_file_name"])
123-
assert db_entry.viewable_file_name == os.path.basename(
124-
result["viewable_file_name"]
125-
)
126-
assert db_entry.light_viewable == os.path.basename(db_entry.light_viewable)
125+
assert db_entry.native_file_name == result["native_file_name"]
126+
assert db_entry.viewable_file_name == result["viewable_file_name"]
127127
assert db_entry.geode_object == geode_object
128-
assert db_entry.input_file == additional_files
128+
assert db_entry.input_file == input_file
129129
assert db_entry.additional_files == additional_files
130130

131+
expected_data_path = os.path.join(app.config["DATA_FOLDER_PATH"], result["id"])
132+
assert os.path.exists(expected_data_path)
133+
131134

132135
def test_generate_native_viewable_and_light_viewable_from_object(client):
133136
app = client.application

0 commit comments

Comments
 (0)