Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
54 changes: 54 additions & 0 deletions requirements-internal.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
#
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# pip-compile --cert=None --client-cert=None --index-url=None --pip-args=None requirements-internal.in
#
blinker==1.9.0
# via
# flask
# opengeodeweb-microservice
click==8.3.0
# via
# flask
# opengeodeweb-microservice
fastjsonschema==2.21.1
# via opengeodeweb-microservice
flask==3.1.2
# via
# flask-sqlalchemy
# opengeodeweb-microservice
flask-sqlalchemy==3.1.1
# via opengeodeweb-microservice
greenlet==3.2.4
# via
# opengeodeweb-microservice
# sqlalchemy
itsdangerous==2.2.0
# via
# flask
# opengeodeweb-microservice
jinja2==3.1.6
# via
# flask
# opengeodeweb-microservice
markupsafe==3.0.3
# via
# flask
# jinja2
# opengeodeweb-microservice
# werkzeug
opengeodeweb-microservice==1.0.3
# via -r requirements-internal.in
sqlalchemy==2.0.43
# via
# flask-sqlalchemy
# opengeodeweb-microservice
typing-extensions==4.15.0
# via
# opengeodeweb-microservice
# sqlalchemy
werkzeug==3.1.3
# via
# flask
# opengeodeweb-microservice
2 changes: 1 addition & 1 deletion requirements.in
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ geode-viewables==3.3.0
flask[async]==3.1.2
flask-cors==6.0.1
werkzeug==3.1.2
flask-sqlalchemy==3.1.1
flask-sqlalchemy==3.1.1
43 changes: 10 additions & 33 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -2,57 +2,41 @@
# This file is autogenerated by pip-compile with Python 3.12
# by the following command:
#
# pip-compile --output-file=./requirements.txt --pre ./requirements-internal.in ./requirements.in
# pip-compile --output-file=./requirements.txt --pre ./requirements.in
#
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
opengeode-core==15.29.0
# via
# -r requirements.in
# geode-common
Expand All @@ -75,19 +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
# opengeodeweb-microservice
# sqlalchemy
# via sqlalchemy
werkzeug==3.1.2
# via
# -r requirements.in
# flask
# flask-cors
# opengeodeweb-microservice
27 changes: 9 additions & 18 deletions src/opengeodeweb_back/app.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,28 @@
"""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_back.routes.create import blueprint_create
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"
Expand All @@ -38,29 +33,34 @@
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",
)
app.register_blueprint(
blueprint_create.routes,
url_prefix="/opengeodeweb_back/create",
name="opengeodeweb_create",
)

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.errorhandler(Exception)
def handle_generic_exception(e: Exception) -> Response:
return flask.make_response({"error": str(e)}, 500)

@app.route(
"/error",
Expand All @@ -70,20 +70,17 @@ 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"
Expand Down Expand Up @@ -126,31 +123,25 @@ def run_server() -> None:
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()
28 changes: 2 additions & 26 deletions src/opengeodeweb_back/routes/blueprint_routes.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@

# Local application imports
from .. import geode_functions, utils_functions

from opengeodeweb_microservice.database.data import Data
from opengeodeweb_microservice.database.connection import get_session
from .models import blueprint_models

routes = flask.Blueprint("routes", __name__, url_prefix="/opengeodeweb_back")
Expand All @@ -36,7 +37,6 @@ def teardown_request(exception):
name=blueprint_models.routes.name,
)


schemas = os.path.join(os.path.dirname(__file__), "schemas")

with open(
Expand Down Expand Up @@ -258,30 +258,6 @@ def save_viewable_file():
)


with open(os.path.join(schemas, "create_point.json"), "r") as file:
create_point_json = json.load(file)


@routes.route(create_point_json["route"], methods=create_point_json["methods"])
def create_point():
utils_functions.validate_request(flask.request, create_point_json)
title = flask.request.get_json()["title"]
x = flask.request.get_json()["x"]
y = flask.request.get_json()["y"]
z = flask.request.get_json()["z"]
class_ = geode_functions.geode_object_class("PointSet3D")
PointSet3D = class_.create()
builder = geode_functions.create_builder("PointSet3D", PointSet3D)
builder.create_point(opengeode.Point3D([x, y, z]))
builder.set_name(title)
return flask.make_response(
utils_functions.generate_native_viewable_and_light_viewable_from_object(
"PointSet3D", PointSet3D
),
200,
)


with open(os.path.join(schemas, "texture_coordinates.json"), "r") as file:
texture_coordinates_json = json.load(file)

Expand Down
Loading