Skip to content

Commit 7e3b13f

Browse files
committed
Merge branch 'next' of https://github.com/Geode-solutions/OpenGeodeWeb-Back into fix/refactor_kill
2 parents f79986e + bc2a014 commit 7e3b13f

File tree

13 files changed

+226
-128
lines changed

13 files changed

+226
-128
lines changed

app.py

Lines changed: 0 additions & 63 deletions
This file was deleted.

pyproject.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
requires = ["setuptools"]
33
build-backend = "setuptools.build_meta"
44

5-
65
[project]
76
name = "OpenGeodeWeb-Back"
87
version = "0.0.0"
@@ -21,6 +20,9 @@ classifiers = [
2120
"Homepage" = "https://github.com/Geode-solutions/OpenGeodeWeb-Back"
2221
"Bug Tracker" = "https://github.com/Geode-solutions/OpenGeodeWeb-Back/issues"
2322

23+
[project.scripts]
24+
opengeodeweb-back = "opengeodeweb_back.app:run_server"
25+
2426
[tool.setuptools.dynamic]
2527
dependencies = { file = ["requirements.txt"] }
2628

requirements-internal.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
opengeodeweb-microservice
1+
opengeodeweb-microservice

requirements.in

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ opengeode-geosciences==9.4.1
55
opengeode-geosciencesio==5.8.0
66
geode-common==33.11.0
77
geode-viewables==3.3.0
8-
Flask[async]==3.0.3
9-
Flask-Cors==6.0.1
10-
werkzeug==3.0.3
11-
Flask-SQLAlchemy==3.1.1
8+
flask[async]==3.1.2
9+
flask-cors==6.0.1
10+
werkzeug==3.1.2
11+
flask-sqlalchemy==3.1.1

requirements.txt

Lines changed: 17 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,38 +2,38 @@
22
# This file is autogenerated by pip-compile with Python 3.12
33
# by the following command:
44
#
5-
# pip-compile --output-file=./requirements.txt --pre ./requirements.in
5+
# pip-compile --output-file=./requirements.txt ./requirements.in
66
#
7-
asgiref~=3.0
7+
asgiref==3.10.0
88
# via flask
9-
blinker~=1.0
9+
blinker==1.9.0
1010
# via flask
11-
click~=8.0
11+
click==8.3.0
1212
# via flask
13-
flask[async]~=3.0
13+
flask[async]==3.1.2
1414
# via
1515
# -r requirements.in
16-
# flask
1716
# flask-cors
1817
# flask-sqlalchemy
19-
flask-cors~=6.0
18+
flask-cors==6.0.1
2019
# via -r requirements.in
21-
flask-sqlalchemy~=3.0
20+
flask-sqlalchemy==3.1.1
2221
# via -r requirements.in
2322
geode-common==33.11.0
2423
# via
2524
# -r requirements.in
2625
# geode-viewables
2726
geode-viewables==3.3.0
2827
# via -r requirements.in
29-
greenlet~=3.0
28+
greenlet==3.2.4
3029
# via sqlalchemy
31-
itsdangerous~=2.0
30+
itsdangerous==2.2.0
3231
# via flask
33-
jinja2~=3.0
32+
jinja2==3.1.6
3433
# via flask
35-
markupsafe~=3.0
34+
markupsafe==3.0.3
3635
# via
36+
# flask
3737
# jinja2
3838
# werkzeug
3939
opengeode-core==15.27.4
@@ -59,12 +59,14 @@ opengeode-io==7.4.0
5959
# -r requirements.in
6060
# geode-viewables
6161
# opengeode-geosciencesio
62-
sqlalchemy~=2.0
62+
sqlalchemy==2.0.43
6363
# via flask-sqlalchemy
64-
typing-extensions~=4.0
64+
typing-extensions==4.15.0
6565
# via sqlalchemy
66-
werkzeug==3.0.3
66+
werkzeug==3.1.2
6767
# via
6868
# -r requirements.in
6969
# flask
7070
# flask-cors
71+
72+
opengeodeweb-microservice~=1.0

src/opengeodeweb_back/app.py

Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
1+
"""Packages"""
2+
3+
import argparse
4+
import os
5+
import time
6+
from typing import Any
7+
8+
import flask
9+
import flask_cors # type: ignore
10+
from flask import Flask, Response
11+
from flask_cors import cross_origin
12+
from werkzeug.exceptions import HTTPException
13+
14+
from opengeodeweb_back import utils_functions, app_config
15+
from opengeodeweb_back.routes import blueprint_routes
16+
from opengeodeweb_back.routes.models import blueprint_models
17+
from opengeodeweb_microservice.database.connection import init_database
18+
19+
20+
""" Global config """
21+
app: Flask = flask.Flask(__name__)
22+
23+
""" Config variables """
24+
FLASK_DEBUG = True if os.environ.get("FLASK_DEBUG", default=None) == "True" else False
25+
26+
if FLASK_DEBUG == False:
27+
app.config.from_object(app_config.ProdConfig)
28+
else:
29+
app.config.from_object(app_config.DevConfig)
30+
31+
DEFAULT_HOST: str = app.config.get("DEFAULT_HOST") or "localhost"
32+
DEFAULT_PORT: int = int(app.config.get("DEFAULT_PORT") or 5000)
33+
DEFAULT_DATA_FOLDER_PATH: str = app.config.get("DEFAULT_DATA_FOLDER_PATH") or "./data"
34+
ORIGINS: Any = app.config.get("ORIGINS")
35+
TIMEOUT: int = int(app.config.get("MINUTES_BEFORE_TIMEOUT") or 30)
36+
SSL: Any = app.config.get("SSL")
37+
SECONDS_BETWEEN_SHUTDOWNS: float = float(
38+
app.config.get("SECONDS_BETWEEN_SHUTDOWNS") or 60.0
39+
)
40+
41+
42+
app.register_blueprint(
43+
blueprint_routes.routes,
44+
url_prefix="/opengeodeweb_back",
45+
name="opengeodeweb_back",
46+
)
47+
48+
app.register_blueprint(
49+
blueprint_models.routes,
50+
url_prefix="/opengeodeweb_back/models",
51+
name="opengeodeweb_models",
52+
)
53+
54+
if FLASK_DEBUG == False:
55+
utils_functions.set_interval(
56+
utils_functions.kill_task, SECONDS_BETWEEN_SHUTDOWNS, app
57+
)
58+
59+
60+
@app.errorhandler(HTTPException)
61+
def errorhandler(e: HTTPException) -> tuple[dict[str, Any], int] | Response:
62+
return utils_functions.handle_exception(e)
63+
64+
65+
@app.route(
66+
"/error",
67+
methods=["POST"],
68+
)
69+
def return_error() -> Response:
70+
flask.abort(500, f"Test")
71+
return flask.make_response({}, 500)
72+
73+
74+
@app.route("/", methods=["POST"])
75+
@cross_origin()
76+
def root() -> Response:
77+
return flask.make_response({}, 200)
78+
79+
80+
@app.route("/kill", methods=["POST"])
81+
@cross_origin()
82+
def kill() -> None:
83+
print("Manual server kill, shutting down...", flush=True)
84+
os._exit(0)
85+
86+
87+
def run_server() -> None:
88+
parser = argparse.ArgumentParser(
89+
prog="OpenGeodeWeb-Back", description="Backend server for OpenGeodeWeb"
90+
)
91+
parser.add_argument("--host", type=str, default=DEFAULT_HOST, help="Host to run on")
92+
parser.add_argument(
93+
"-p", "--port", type=int, default=DEFAULT_PORT, help="Port to listen on"
94+
)
95+
parser.add_argument(
96+
"-d",
97+
"--debug",
98+
default=FLASK_DEBUG,
99+
help="Whether to run in debug mode",
100+
action="store_true",
101+
)
102+
parser.add_argument(
103+
"-dfp",
104+
"--data_folder_path",
105+
type=str,
106+
default=DEFAULT_DATA_FOLDER_PATH,
107+
help="Path to the folder where data is stored",
108+
)
109+
parser.add_argument(
110+
"-ufp",
111+
"--upload_folder_path",
112+
type=str,
113+
default=DEFAULT_DATA_FOLDER_PATH,
114+
help="Path to the folder where uploads are stored",
115+
)
116+
parser.add_argument(
117+
"-origins",
118+
"--allowed_origins",
119+
default=ORIGINS,
120+
help="Origins that are allowed to connect to the server",
121+
)
122+
parser.add_argument(
123+
"-t",
124+
"--timeout",
125+
default=TIMEOUT,
126+
help="Number of minutes before the server times out",
127+
)
128+
args = parser.parse_args()
129+
130+
app.config.update(DATA_FOLDER_PATH=args.data_folder_path)
131+
app.config.update(UPLOAD_FOLDER=args.upload_folder_path)
132+
app.config.update(MINUTES_BEFORE_TIMEOUT=args.timeout)
133+
134+
flask_cors.CORS(app, origins=args.allowed_origins)
135+
136+
print(
137+
f"Host: {args.host}, Port: {args.port}, Debug: {args.debug}, "
138+
f"Data folder path: {args.data_folder_path}, Timeout: {args.timeout}, "
139+
f"Origins: {args.allowed_origins}",
140+
flush=True,
141+
)
142+
143+
db_filename: str = app.config.get("DATABASE_FILENAME") or "database.db"
144+
db_path = os.path.join(args.data_folder_path, db_filename)
145+
os.makedirs(os.path.dirname(db_path), exist_ok=True)
146+
app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{db_path}"
147+
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
148+
init_database(app, db_filename)
149+
print(f"Database initialized at: {db_path}", flush=True)
150+
151+
app.run(debug=args.debug, host=args.host, port=args.port, ssl_context=SSL)
152+
153+
154+
# ''' Main '''
155+
if __name__ == "__main__":
156+
run_server()

src/opengeodeweb_back/app_config.py

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44

55
# Third party imports
66
# Local application imports
7-
from opengeodeweb_microservice.database.connection import get_database
8-
9-
DATABASE_FILENAME = "project.db"
107

118

129
class Config(object):
@@ -18,7 +15,7 @@ class Config(object):
1815
REQUEST_COUNTER = 0
1916
LAST_REQUEST_TIME = time.time()
2017
LAST_PING_TIME = time.time()
21-
SQLALCHEMY_TRACK_MODIFICATIONS = False
18+
DATABASE_FILENAME = "project.db"
2219

2320

2421
class ProdConfig(Config):
@@ -27,9 +24,6 @@ class ProdConfig(Config):
2724
MINUTES_BEFORE_TIMEOUT = "1"
2825
SECONDS_BETWEEN_SHUTDOWNS = "10"
2926
DATA_FOLDER_PATH = "/data"
30-
SQLALCHEMY_DATABASE_URI = f"sqlite:///{os.path.abspath(
31-
os.path.join(DATA_FOLDER_PATH, DATABASE_FILENAME)
32-
)}"
3327

3428

3529
class DevConfig(Config):
@@ -39,6 +33,3 @@ class DevConfig(Config):
3933
SECONDS_BETWEEN_SHUTDOWNS = "10"
4034
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
4135
DATA_FOLDER_PATH = os.path.join(BASE_DIR, "data")
42-
SQLALCHEMY_DATABASE_URI = f"sqlite:///{os.path.join(
43-
BASE_DIR, DATA_FOLDER_PATH, DATABASE_FILENAME
44-
)}"

src/opengeodeweb_back/utils_functions.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,6 @@ def validate_request(request: flask.Request, schema: dict[str, str]) -> None:
8888

8989
if json_data is None:
9090
json_data = {}
91-
9291
try:
9392
validate = fastjsonschema.compile(schema)
9493
validate(json_data)
@@ -259,10 +258,6 @@ def generate_native_viewable_and_light_viewable_from_file(
259258

260259
data = geode_functions.load(geode_object, copied_full_path)
261260

262-
# Remplacer :
263-
# database.session.delete(temp_data_entry)
264-
# database.session.flush()
265-
# Par :
266261
session = get_session()
267262
if session:
268263
session.delete(temp_data_entry)

0 commit comments

Comments
 (0)