diff --git a/API/Classes/Base/Config.py b/API/Classes/Base/Config.py index bbbe41ab..3c6e8c21 100644 --- a/API/Classes/Base/Config.py +++ b/API/Classes/Base/Config.py @@ -20,24 +20,28 @@ ALLOWED_EXTENSIONS = set(['zip', 'application/zip']) ALLOWED_EXTENSIONS_XLS = set(['xls', 'xlsx']) -UPLOAD_FOLDER = Path('WebAPP') -WebAPP_PATH = Path('WebAPP') -DATA_STORAGE = Path("WebAPP", 'DataStorage') -CLASS_FOLDER = Path("WebAPP", 'Classes') -EXTRACT_FOLDER = Path("") -SOLVERs_FOLDER = Path('WebAPP', 'SOLVERs') - - -#absolute paths -# OSEMOSYS_ROOT = os.path.abspath(os.getcwd()) -# UPLOAD_FOLDER = Path(OSEMOSYS_ROOT, 'WebAPP') -# WebAPP_PATH = Path(OSEMOSYS_ROOT, 'WebAPP') -# DATA_STORAGE = Path(OSEMOSYS_ROOT, "WebAPP", 'DataStorage') -# CLASS_FOLDER = Path(OSEMOSYS_ROOT, "WebAPP", 'Classes') -# EXTRACT_FOLDER = Path(OSEMOSYS_ROOT, "") -# SOLVERs_FOLDER = Path(OSEMOSYS_ROOT, 'WebAPP', 'SOLVERs') - -os.chmod(DATA_STORAGE, 0o777) +# ── Absolute paths derived from this file's location ── +# Config.py lives at API/Classes/Base/Config.py +# Repository root is 3 levels up: Base/ → Classes/ → API/ → root +_THIS_DIR = Path(__file__).resolve().parent # .../API/Classes/Base +MUIO_ROOT = _THIS_DIR.parent.parent.parent # .../MUIO (repo root) + +UPLOAD_FOLDER = MUIO_ROOT / 'WebAPP' +WebAPP_PATH = MUIO_ROOT / 'WebAPP' +DATA_STORAGE = MUIO_ROOT / 'WebAPP' / 'DataStorage' +CLASS_FOLDER = MUIO_ROOT / 'WebAPP' / 'Classes' +EXTRACT_FOLDER = MUIO_ROOT +SOLVERs_FOLDER = MUIO_ROOT / 'WebAPP' / 'SOLVERs' + +# ── Ensure DataStorage directory exists ── +os.makedirs(DATA_STORAGE, exist_ok=True) + +# ── Safe chmod (skip on Windows where octal modes are not supported) ── +if SYSTEM != 'Windows': + try: + os.chmod(DATA_STORAGE, 0o777) + except OSError: + pass # Non-fatal: permissions may already be sufficient HEROKU_DEPLOY = 0 AWS_SYNC = 0 diff --git a/API/Classes/Case/CaseClass.py b/API/Classes/Case/CaseClass.py index 6230de9b..17b9268f 100644 --- a/API/Classes/Case/CaseClass.py +++ b/API/Classes/Case/CaseClass.py @@ -613,8 +613,11 @@ def createCase(self): try: for group, array in self.PARAMETERS.items(): if array: + if group not in Config.DEFAULT_F: + print(f"[WARN] createCase: skipping unknown parameter group '{group}' (not in DEFAULT_F)") + continue func_name = Config.DEFAULT_F[group] - func = getattr(self,func_name) + func = getattr(self, func_name) func() except(IOError): diff --git a/API/app.py b/API/app.py index f2fc8c47..d6ff3a08 100644 --- a/API/app.py +++ b/API/app.py @@ -16,12 +16,12 @@ from Routes.Case.ViewDataRoute import viewdata_api from Routes.DataFile.DataFileRoute import datafile_api -#RADI -template_dir = os.path.abspath('WebAPP') -static_dir = os.path.abspath('WebAPP') +# ── Use absolute paths from Config (derived from __file__, CWD-independent) ── +template_dir = str(Config.WebAPP_PATH) +static_dir = str(Config.WebAPP_PATH) -# template_dir = Config.WebAPP_PATH.resolve() -# static_dir = Config.WebAPP_PATH.resolve() +# template_dir = os.path.abspath('WebAPP') +# static_dir = os.path.abspath('WebAPP') # template_dir = os.path.join(sys._MEIPASS, 'WebAPP') # static_dir = os.path.join(sys._MEIPASS, 'WebAPP') @@ -39,7 +39,7 @@ print(__name__) -app = Flask(__name__, static_url_path='', static_folder=static_dir, template_folder=template_dir) +app = Flask(__name__, static_url_path='', static_folder=static_dir, template_folder=template_dir) app.permanent_session_lifetime = timedelta(days=5) app.config['SECRET_KEY'] = '12345'