diff --git a/openbb_terminal/account/account_model.py b/openbb_terminal/account/account_model.py index 9e78b45d639..53e14d68865 100644 --- a/openbb_terminal/account/account_model.py +++ b/openbb_terminal/account/account_model.py @@ -1,4 +1,5 @@ from typing import Dict, Any +from openbb_terminal.core.config import paths from openbb_terminal.rich_config import console from openbb_terminal import feature_flags as obbff from openbb_terminal import config_terminal as cfg @@ -74,6 +75,10 @@ def get_diff_settings(settings: dict) -> dict: old, new = get_var_diff(cfg_plot, k, v) if new is not None: diff[k] = (old, new) + elif hasattr(paths, k): + old, new = get_var_diff(paths, k, v) + if new is not None: + diff[k] = (old, new) return diff diff --git a/openbb_terminal/helper_funcs.py b/openbb_terminal/helper_funcs.py index d21ae26e2dd..1cd79887428 100644 --- a/openbb_terminal/helper_funcs.py +++ b/openbb_terminal/helper_funcs.py @@ -82,21 +82,6 @@ def set_command_location(cmd_loc: str): command_location = cmd_loc -# pylint: disable=global-statement -def set_user_data_folder(env_file: str = ".env", path_folder: str = ""): - """Set user data folder location. - - Parameters - ---------- - env_file : str - Env file to be updated - path_folder: str - Path folder location - """ - dotenv.set_key(env_file, "OPENBB_USER_DATA_DIRECTORY", path_folder) - paths.USER_DATA_DIRECTORY = Path(path_folder) - - def check_path(path: str) -> str: """Check that path file exists. diff --git a/openbb_terminal/session/local_model.py b/openbb_terminal/session/local_model.py index 405e747a807..5f5a2d64c78 100644 --- a/openbb_terminal/session/local_model.py +++ b/openbb_terminal/session/local_model.py @@ -2,6 +2,7 @@ import os from pathlib import Path import json from typing import Optional +from openbb_terminal.core.config import paths from openbb_terminal.core.config.paths import ( HIST_FILE_PATH, SETTINGS_DIRECTORY, @@ -112,6 +113,11 @@ def apply_configs(configs: dict): configs : dict The configurations. """ + + # TODO: Here I'm assuming that obbff, cfg, cfg_plot and paths don't have variables + # with the same name. If they do, then this assignment will hit the first variable + # that matches the name. + if configs: settings = configs.get("features_settings", {}) sync = update_sync_flag(settings) @@ -124,6 +130,8 @@ def apply_configs(configs: dict): cast_set_attr(cfg, k, v) elif hasattr(cfg_plot, k): cast_set_attr(cfg_plot, k, v) + elif hasattr(paths, k): + cast_set_attr(paths, k, v) keys = configs.get("features_keys", {}) if keys: diff --git a/openbb_terminal/settings_controller.py b/openbb_terminal/settings_controller.py index d8c1459aa83..f485db56842 100644 --- a/openbb_terminal/settings_controller.py +++ b/openbb_terminal/settings_controller.py @@ -16,10 +16,10 @@ from dotenv import set_key # IMPORTATION INTERNAL from openbb_terminal import config_plot as cfg_plot from openbb_terminal import feature_flags as obbff +from openbb_terminal.core.config import paths from openbb_terminal import featflags_controller as obbff_ctrl from openbb_terminal.core.config.paths import ( USER_ENV_FILE, - USER_DATA_DIRECTORY, USER_DATA_SOURCES_DEFAULT_FILE, ) from openbb_terminal.custom_prompt_toolkit import NestedCompleter @@ -28,8 +28,7 @@ from openbb_terminal.helper_funcs import ( get_flair, get_user_timezone_or_invalid, parse_and_split_input, - set_user_data_folder, -) + ) from openbb_terminal.menu import session from openbb_terminal.parent_classes import BaseController from openbb_terminal.rich_config import console, MenuText @@ -124,7 +123,7 @@ class SettingsController(BaseController): mt.add_raw("\n") mt.add_param( "_user_data_folder", - USER_DATA_DIRECTORY, + paths.USER_DATA_DIRECTORY, ) mt.add_raw("\n") mt.add_cmd("tz") @@ -194,6 +193,37 @@ class SettingsController(BaseController): auth_header=User.get_auth_header(), ) + @staticmethod + def set_path_config(name: str, value: Optional[Union[Path, str]]): + """Set path config attribute + + Parameters + ---------- + name : str + Environment variable name + value : str + Environment variable value + """ + + if User.is_guest(): + set_key(str(USER_ENV_FILE), name, str(value)) + + # Remove "OPENBB_" prefix from env_var + if name.startswith("OPENBB_"): + name = name[7:] + + # Set obbff.env_var_name = not env_var_value + setattr(paths, name, value) + + # Send feature flag to server + if not User.is_guest() and User.is_sync_enabled(): + patch_user_configs( + key=name, + value=str(value), + type_="settings", + auth_header=User.get_auth_header(), + ) + @log_start_end(log=logger) def call_colors(self, _): """Process colors command""" @@ -551,9 +581,7 @@ class SettingsController(BaseController): console.print( f"User data to be saved in the default folder: '{default_path}'" ) - set_user_data_folder( - self.env_file, path_folder=str(default_path) - ) + self.set_path_config("OPENBB_USER_DATA_DIRECTORY", default_path) success_userdata = True else: # If the path selected does not start from the user root, give relative location from root @@ -567,8 +595,8 @@ class SettingsController(BaseController): console.print( f"User data to be saved in the selected folder: '{userdata_path}'" ) - set_user_data_folder( - self.env_file, path_folder=userdata_path + self.set_path_config( + "OPENBB_USER_DATA_DIRECTORY", userdata_path ) success_userdata = True else: @@ -586,14 +614,14 @@ class SettingsController(BaseController): console.print( f"[green]Folder '{userdata_path}' successfully created.[/green]" ) - set_user_data_folder( - self.env_file, path_folder=userdata_path + self.set_path_config( + "OPENBB_USER_DATA_DIRECTORY", userdata_path ) else: # Do not update userdata_folder path since we will keep the same as before console.print( "[yellow]User data to keep being saved in " - + f"the selected folder: {str(USER_DATA_DIRECTORY)}[/yellow]" + + f"the selected folder: {str(paths.USER_DATA_DIRECTORY)}[/yellow]" ) success_userdata = True