Skip to content

Commit 8420abd

Browse files
revert blueprint
1 parent 4700067 commit 8420abd

3 files changed

Lines changed: 95 additions & 68 deletions

File tree

src/opengeodeweb_back/routes/blueprint_routes.py

Lines changed: 75 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -560,71 +560,78 @@ def import_project() -> flask.Response:
560560
return flask.make_response({"snapshot": snapshot}, 200)
561561

562562

563-
# @routes.route(
564-
# schemas_dict["import_extension"]["route"],
565-
# methods=schemas_dict["import_extension"]["methods"],
566-
# )
567-
# def import_extension() -> flask.Response:
568-
# """Import a .vext extension file and extract its contents."""
569-
# utils_functions.validate_request(flask.request, schemas_dict["import_extension"])
570-
571-
# if "file" not in flask.request.files:
572-
# flask.abort(400, "No .vext file provided under 'file'")
573-
574-
# vext_file = flask.request.files["file"]
575-
# assert vext_file.filename is not None
576-
# filename = werkzeug.utils.secure_filename(os.path.basename(vext_file.filename))
577-
578-
# if not filename.lower().endswith(".vext"):
579-
# flask.abort(400, "Uploaded file must be a .vext")
580-
581-
# # Create extensions directory in the data folder
582-
# extensions_folder = flask.current_app.config["EXTENSIONS_FOLDER_PATH"]
583-
# os.makedirs(extensions_folder, exist_ok=True)
584-
585-
# extension_name = (
586-
# filename.rsplit("-", 1)[0] if "-" in filename else filename.replace(".vext", "")
587-
# )
588-
# extension_path = os.path.join(extensions_folder, extension_name)
589-
590-
# # Remove existing extension if present
591-
# if os.path.exists(extension_path):
592-
# shutil.rmtree(extension_path)
593-
594-
# os.makedirs(extension_path, exist_ok=True)
595-
596-
# # Extract the .vext file
597-
# vext_file.stream.seek(0)
598-
# with zipfile.ZipFile(vext_file.stream) as zip_archive:
599-
# zip_archive.extractall(extension_path)
600-
601-
# # Look for the backend executable and frontend JS
602-
# backend_executable = None
603-
# frontend_file = None
604-
605-
# for file in os.listdir(extension_path):
606-
# file_path = os.path.join(extension_path, file)
607-
# if os.path.isfile(file_path):
608-
# if file.endswith(".es.js"):
609-
# frontend_file = file_path
610-
# elif not file.endswith(".js") and not file.endswith(".css"):
611-
# backend_executable = file_path
612-
# os.chmod(backend_executable, 0o755)
613-
614-
# if not frontend_file:
615-
# flask.abort(400, "Invalid .vext file: missing frontend JavaScript")
616-
# if not backend_executable:
617-
# flask.abort(400, "Invalid .vext file: missing backend executable")
618-
619-
# assert frontend_file is not None
620-
# with open(frontend_file, "r", encoding="utf-8") as f:
621-
# frontend_content = f.read()
622-
623-
# return flask.make_response(
624-
# {
625-
# "extension_name": extension_name,
626-
# "frontend_content": frontend_content,
627-
# "backend_path": backend_executable,
628-
# },
629-
# 200,
630-
# )
563+
@routes.route(
564+
schemas_dict["import_extension"]["route"],
565+
methods=schemas_dict["import_extension"]["methods"],
566+
)
567+
def import_extension() -> flask.Response:
568+
"""Import a .vext extension file and extract its contents."""
569+
utils_functions.validate_request(flask.request, schemas_dict["import_extension"])
570+
571+
if "file" not in flask.request.files:
572+
flask.abort(400, "No .vext file provided under 'file'")
573+
574+
vext_file = flask.request.files["file"]
575+
assert vext_file.filename is not None
576+
filename = werkzeug.utils.secure_filename(os.path.basename(vext_file.filename))
577+
578+
if not filename.lower().endswith(".vext"):
579+
flask.abort(400, "Uploaded file must be a .vext")
580+
581+
582+
# Create extensions directory in the data folder
583+
extensions_folder = flask.current_app.config["EXTENSIONS_FOLDER_PATH"]
584+
os.makedirs(extensions_folder, exist_ok=True)
585+
586+
archive_path = os.path.join(extensions_folder, filename)
587+
588+
# Remove existing extension if present
589+
unziped_extension_path = os.path.join(archive_path.replace(".vext", ""))
590+
if os.path.exists(unziped_extension_path):
591+
shutil.rmtree(unziped_extension_path)
592+
593+
os.makedirs(unziped_extension_path, exist_ok=True)
594+
595+
# Extract the .vext file
596+
vext_file.stream.seek(0)
597+
with zipfile.ZipFile(vext_file.stream) as zip_archive:
598+
zip_archive.extractall(unziped_extension_path)
599+
600+
metadata_path = os.path.join(unziped_extension_path, "metadata.json")
601+
if not os.path.isfile(metadata_path):
602+
flask.abort(400, "Invalid .vext file: missing metadata.json")
603+
with open(metadata_path, "r", encoding="utf-8") as f:
604+
metadata = flask.json.load(f)
605+
606+
607+
# Look for the backend executable and frontend JS
608+
backend_executable = None
609+
frontend_file = None
610+
611+
for file in os.listdir(unziped_extension_path):
612+
file_path = os.path.join(unziped_extension_path, file)
613+
if os.path.isfile(file_path):
614+
if file.endswith(".es.js"):
615+
frontend_file = file_path
616+
elif not file.endswith(".js") and not file.endswith(".css"):
617+
backend_executable = file_path
618+
os.chmod(backend_executable, 0o755)
619+
620+
if not frontend_file:
621+
flask.abort(400, "Invalid .vext file: missing frontend JavaScript")
622+
if not backend_executable:
623+
flask.abort(400, "Invalid .vext file: missing backend executable")
624+
625+
assert frontend_file is not None
626+
with open(frontend_file, "r", encoding="utf-8") as f:
627+
frontend_content = f.read()
628+
629+
return flask.make_response(
630+
{
631+
"extension_name": metadata["name"],
632+
"extension_version": metadata["version"],
633+
"frontend_content": frontend_content,
634+
"backend_path": metadata["microservice_executable"],
635+
},
636+
200,
637+
)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
{
2+
"route": "/import_extension",
3+
"methods": [
4+
"POST"
5+
],
6+
"type": "object",
7+
"properties": {},
8+
"required": [],
9+
"additionalProperties": false
10+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
from dataclasses_json import DataClassJsonMixin
2+
from dataclasses import dataclass
3+
4+
5+
@dataclass
6+
class ImportExtension(DataClassJsonMixin):
7+
def __post_init__(self) -> None:
8+
print(self, flush=True)
9+
10+
pass

0 commit comments

Comments
 (0)