"""
Fichier de création des commandes geonature
Ce module ne doit en aucun cas faire appel à des models ou au coeur de geonature
dans les imports d'entête de fichier pour garantir un bon fonctionnement des fonctions
d'administration de l'application GeoNature (génération des fichiers de configuration, des
fichiers de routing du frontend etc...). Ces dernières doivent pouvoir fonctionner même si
un paquet PIP du requirement GeoNature n'a pas été bien installé
"""
import os
import json
from subprocess import run, DEVNULL
from contextlib import nullcontext
from jinja2 import Template
from geonature import create_app
from geonature.utils.env import FRONTEND_DIR
from geonature.utils.config import config_frontend
from geonature.utils.module import get_dist_from_code, get_module_config
__all__ = [
"run",
"create_frontend_module_config",
"nvm_available",
"install_frontend_dependencies",
"build_frontend",
]
[docs]
def create_frontend_module_config(module_code, output_file=None):
"""
Create the frontend config
"""
module_frontend_dir = FRONTEND_DIR / "external_modules" / module_code.lower()
# for modules without frontend or with disabled frontend
if not module_frontend_dir.exists():
return
module_config = get_module_config(get_dist_from_code(module_code.upper()))
if output_file is None:
output_file = (module_frontend_dir / "app/module.config.ts").open("w")
else:
output_file = nullcontext(output_file)
with output_file as f:
f.write("export const ModuleConfig = ")
json.dump(module_config, f, indent=True, sort_keys=True)
[docs]
def nvm_available():
return run(["/usr/bin/env", "bash", "-i", "-c", "type -t nvm"], stdout=DEVNULL).returncode == 0
[docs]
def install_frontend_dependencies(module_frontend_path):
cmd = ["npm", "ci", "--omit=dev", "--omit=peer"]
if nvm_available():
with (FRONTEND_DIR / ".nvmrc").open("r") as f:
node_version = f.read().strip()
cmd = ["/usr/bin/env", "bash", "-i", "-c", f"nvm exec {node_version} {' '.join(cmd)}"]
run(cmd, check=True, cwd=module_frontend_path)
[docs]
def build_frontend():
cmd = ["npm", "run", "build"]
if nvm_available():
cmd = ["/usr/bin/env", "bash", "-i", "-c", f"nvm exec {' '.join(cmd)}"]
run(cmd, check=True, cwd=str(FRONTEND_DIR))