Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
496d4b9
sql alchemy replacing flask sql alchemy
MaxNumerique Sep 18, 2025
f967f9b
fix(database): use SQLAlchemy database to fit new version of OGW-Micr…
MaxNumerique Sep 19, 2025
d324cba
removed debug logs, moved SQLAlchemy variables to Vease Back.
MaxNumerique Sep 30, 2025
75ab1d1
Merge branch 'next' of https://github.com/Geode-solutions/OpenGeodeWe…
MaxNumerique Oct 1, 2025
5294752
Apply prepare changes
MaxNumerique Oct 1, 2025
9d2c21e
Merge branch 'next' of https://github.com/Geode-solutions/OpenGeodeWe…
MaxNumerique Oct 1, 2025
5c3d2a5
Apply prepare changes
MaxNumerique Oct 1, 2025
6cc055e
removed dep : Flask-SQLAlchemy
MaxNumerique Oct 1, 2025
eedd720
Apply prepare changes
MaxNumerique Oct 1, 2025
2a51cbf
Merge branch 'next' of https://github.com/Geode-solutions/OpenGeodeWe…
MaxNumerique Oct 2, 2025
d0d5324
Apply prepare changes
MaxNumerique Oct 2, 2025
74b0b3d
Merge branch 'next' of https://github.com/Geode-solutions/OpenGeodeWe…
MaxNumerique Oct 3, 2025
6519da6
Merge branch 'next' of https://github.com/Geode-solutions/OpenGeodeWe…
MaxNumerique Oct 3, 2025
1ca693b
refacto app.py & conftest
MaxNumerique Oct 3, 2025
e20995e
moving tests folder into src folder
MaxNumerique Oct 3, 2025
582c05c
requirements
MaxNumerique Oct 3, 2025
900689b
requirements ?
MaxNumerique Oct 3, 2025
66162b0
test
MaxNumerique Oct 5, 2025
b6b6e3b
tests' paths fixed
MaxNumerique Oct 6, 2025
78398b5
fix(refacto): app and app config from Vease-back
MaxNumerique Oct 6, 2025
6da9952
Apply prepare changes
MaxNumerique Oct 6, 2025
d6f313d
revert moving tests folder
MaxNumerique Oct 6, 2025
b2ff0a4
Merge branch 'feat/refacto_web_server' of https://github.com/Geode-so…
MaxNumerique Oct 6, 2025
c0e82c4
finished moving tests, better app.py
MaxNumerique Oct 6, 2025
2c9badb
Apply prepare changes
MaxNumerique Oct 6, 2025
638fdcb
type app.py
MaxNumerique Oct 6, 2025
2352ce4
Merge branch 'feat/refacto_web_server' of https://github.com/Geode-so…
MaxNumerique Oct 6, 2025
39e2bb5
typ app.py
MaxNumerique Oct 6, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 0 additions & 63 deletions app.py

This file was deleted.

4 changes: 3 additions & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
requires = ["setuptools"]
build-backend = "setuptools.build_meta"


[project]
name = "OpenGeodeWeb-Back"
version = "0.0.0"
Expand All @@ -21,6 +20,9 @@ classifiers = [
"Homepage" = "https://github.com/Geode-solutions/OpenGeodeWeb-Back"
"Bug Tracker" = "https://github.com/Geode-solutions/OpenGeodeWeb-Back/issues"

[project.scripts]
opengeodeweb-back = "opengeodeweb_back.app:run_server"

[tool.setuptools.dynamic]
dependencies = { file = ["requirements.txt"] }

Expand Down
1 change: 1 addition & 0 deletions requirements.in
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,5 @@ geode-common==33.11.0
geode-viewables==3.3.0
flask[async]==3.1.2
flask-cors==6.0.1
werkzeug==3.1.2
flask-sqlalchemy==3.1.1
46 changes: 12 additions & 34 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,55 +2,39 @@
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# pip-compile --output-file=./requirements.txt ./requirements-internal.in ./requirements.in
# pip-compile --output-file=./requirements.txt --pre ./requirements.in
#
asgiref~=3.9
asgiref~=3.10
# via flask
blinker~=1.9
# via
# flask
# opengeodeweb-microservice
# via flask
click~=8.3
# via
# flask
# opengeodeweb-microservice
fastjsonschema~=2.21
# via opengeodeweb-microservice
# via flask
flask[async]~=3.1
# via
# -r requirements.in
# flask-cors
# flask-sqlalchemy
# opengeodeweb-microservice
flask-cors==6.0.1
# via -r requirements.in
flask-sqlalchemy==3.1.1
# via
# -r requirements.in
# opengeodeweb-microservice
# via -r requirements.in
geode-common==33.11.0
# via
# -r requirements.in
# geode-viewables
geode-viewables==3.3.0
# via -r requirements.in
greenlet~=3.2
# via
# opengeodeweb-microservice
# sqlalchemy
# via sqlalchemy
itsdangerous~=2.2
# via
# flask
# opengeodeweb-microservice
# via flask
jinja2~=3.1
# via
# flask
# opengeodeweb-microservice
# via flask
markupsafe~=3.0
# via
# flask
# jinja2
# opengeodeweb-microservice
# werkzeug
opengeode-core==15.27.4
# via
Expand All @@ -75,18 +59,12 @@ opengeode-io==7.4.0
# -r requirements.in
# geode-viewables
# opengeode-geosciencesio
opengeodeweb-microservice~=1.0,>=1.0.3
# via -r requirements-internal.in
sqlalchemy~=2.0
# via
# flask-sqlalchemy
# opengeodeweb-microservice
# via flask-sqlalchemy
typing-extensions~=4.15
# via sqlalchemy
werkzeug==3.1.2
# via
# opengeodeweb-microservice
# sqlalchemy
werkzeug~=3.1
# via
# -r requirements.in
# flask
# flask-cors
# opengeodeweb-microservice
156 changes: 156 additions & 0 deletions src/opengeodeweb_back/app.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
"""Packages"""

import argparse
import os
import time
from typing import Any

import flask
import flask_cors # type: ignore
from flask import Flask, Response
from flask_cors import cross_origin
from werkzeug.exceptions import HTTPException

from opengeodeweb_back import utils_functions, app_config
from opengeodeweb_back.routes import blueprint_routes
from opengeodeweb_back.routes.models import blueprint_models
from opengeodeweb_microservice.database.connection import init_database


""" Global config """
app: Flask = flask.Flask(__name__)

""" Config variables """
FLASK_DEBUG = True if os.environ.get("FLASK_DEBUG", default=None) == "True" else False

if FLASK_DEBUG == False:
app.config.from_object(app_config.ProdConfig)
else:
app.config.from_object(app_config.DevConfig)

DEFAULT_HOST: str = app.config.get("DEFAULT_HOST") or "localhost"
DEFAULT_PORT: int = int(app.config.get("DEFAULT_PORT") or 5000)
DEFAULT_DATA_FOLDER_PATH: str = app.config.get("DEFAULT_DATA_FOLDER_PATH") or "./data"
ORIGINS: Any = app.config.get("ORIGINS")
TIMEOUT: int = int(app.config.get("MINUTES_BEFORE_TIMEOUT") or 30)
SSL: Any = app.config.get("SSL")
SECONDS_BETWEEN_SHUTDOWNS: float = float(
app.config.get("SECONDS_BETWEEN_SHUTDOWNS") or 60.0
)


app.register_blueprint(
blueprint_routes.routes,
url_prefix="/opengeodeweb_back",
name="opengeodeweb_back",
)

app.register_blueprint(
blueprint_models.routes,
url_prefix="/opengeodeweb_back/models",
name="opengeodeweb_models",
)

if FLASK_DEBUG == False:
utils_functions.set_interval(
utils_functions.kill_task, SECONDS_BETWEEN_SHUTDOWNS, app
)


@app.errorhandler(HTTPException)
def errorhandler(e: HTTPException) -> tuple[dict[str, Any], int] | Response:
return utils_functions.handle_exception(e)


@app.route(
"/error",
methods=["POST"],
)
def return_error() -> Response:
flask.abort(500, f"Test")
return flask.make_response({}, 500)


@app.route("/", methods=["POST"])
@cross_origin()
def root() -> Response:
return flask.make_response({}, 200)


@app.route("/kill", methods=["POST"])
@cross_origin()
def kill() -> None:
print("Manual server kill, shutting down...", flush=True)
os._exit(0)


def run_server() -> None:
parser = argparse.ArgumentParser(
prog="OpenGeodeWeb-Back", description="Backend server for OpenGeodeWeb"
)
parser.add_argument("--host", type=str, default=DEFAULT_HOST, help="Host to run on")
parser.add_argument(
"-p", "--port", type=int, default=DEFAULT_PORT, help="Port to listen on"
)
parser.add_argument(
"-d",
"--debug",
default=FLASK_DEBUG,
help="Whether to run in debug mode",
action="store_true",
)
parser.add_argument(
"-dfp",
"--data_folder_path",
type=str,
default=DEFAULT_DATA_FOLDER_PATH,
help="Path to the folder where data is stored",
)
parser.add_argument(
"-ufp",
"--upload_folder_path",
type=str,
default=DEFAULT_DATA_FOLDER_PATH,
help="Path to the folder where uploads are stored",
)
parser.add_argument(
"-origins",
"--allowed_origins",
default=ORIGINS,
help="Origins that are allowed to connect to the server",
)
parser.add_argument(
"-t",
"--timeout",
default=TIMEOUT,
help="Number of minutes before the server times out",
)
args = parser.parse_args()

app.config.update(DATA_FOLDER_PATH=args.data_folder_path)
app.config.update(UPLOAD_FOLDER=args.upload_folder_path)
app.config.update(MINUTES_BEFORE_TIMEOUT=args.timeout)

flask_cors.CORS(app, origins=args.allowed_origins)

print(
f"Host: {args.host}, Port: {args.port}, Debug: {args.debug}, "
f"Data folder path: {args.data_folder_path}, Timeout: {args.timeout}, "
f"Origins: {args.allowed_origins}",
flush=True,
)

db_filename: str = app.config.get("DATABASE_FILENAME") or "database.db"
db_path = os.path.join(args.data_folder_path, db_filename)
os.makedirs(os.path.dirname(db_path), exist_ok=True)
app.config["SQLALCHEMY_DATABASE_URI"] = f"sqlite:///{db_path}"
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False
init_database(app, db_filename)
print(f"Database initialized at: {db_path}", flush=True)

app.run(debug=args.debug, host=args.host, port=args.port, ssl_context=SSL)


# ''' Main '''
if __name__ == "__main__":
run_server()
11 changes: 1 addition & 10 deletions src/opengeodeweb_back/app_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@

# Third party imports
# Local application imports
from opengeodeweb_microservice.database.connection import get_database

DATABASE_FILENAME = "project.db"


class Config(object):
Expand All @@ -18,7 +15,7 @@ class Config(object):
REQUEST_COUNTER = 0
LAST_REQUEST_TIME = time.time()
LAST_PING_TIME = time.time()
SQLALCHEMY_TRACK_MODIFICATIONS = False
DATABASE_FILENAME = "project.db"


class ProdConfig(Config):
Expand All @@ -27,9 +24,6 @@ class ProdConfig(Config):
MINUTES_BEFORE_TIMEOUT = "1"
SECONDS_BETWEEN_SHUTDOWNS = "10"
DATA_FOLDER_PATH = "/data"
SQLALCHEMY_DATABASE_URI = f"sqlite:///{os.path.abspath(
os.path.join(DATA_FOLDER_PATH, DATABASE_FILENAME)
)}"


class DevConfig(Config):
Expand All @@ -39,6 +33,3 @@ class DevConfig(Config):
SECONDS_BETWEEN_SHUTDOWNS = "10"
BASE_DIR = os.path.dirname(os.path.abspath(__file__))
DATA_FOLDER_PATH = os.path.join(BASE_DIR, "data")
SQLALCHEMY_DATABASE_URI = f"sqlite:///{os.path.join(
BASE_DIR, DATA_FOLDER_PATH, DATABASE_FILENAME
)}"
5 changes: 0 additions & 5 deletions src/opengeodeweb_back/utils_functions.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,6 @@ def validate_request(request: flask.Request, schema: dict[str, str]) -> None:

if json_data is None:
json_data = {}

try:
validate = fastjsonschema.compile(schema)
validate(json_data)
Expand Down Expand Up @@ -259,10 +258,6 @@ def generate_native_viewable_and_light_viewable_from_file(

data = geode_functions.load(geode_object, copied_full_path)

# Remplacer :
# database.session.delete(temp_data_entry)
# database.session.flush()
# Par :
session = get_session()
if session:
session.delete(temp_data_entry)
Expand Down
Loading