diff --git a/openbb_terminal/account/account_controller.py b/openbb_terminal/account/account_controller.py index 53d7b60eeef..c2e7940cbda 100644 --- a/openbb_terminal/account/account_controller.py +++ b/openbb_terminal/account/account_controller.py @@ -155,7 +155,7 @@ class AccountController(BaseController): if ns_parser: i = console.input( "[bold red]This action is irreversible![/bold red]\n" - "Are you sure you want to permanently delete your keys? (y/n): " + "Are you sure you want to permanently delete your keys from OpenBB hub? (y/n): " ) console.print("") if i.lower() in ["y", "yes"]: diff --git a/openbb_terminal/core/session/constants.py b/openbb_terminal/core/session/constants.py index ca6ff820ede..b928b52cb3b 100644 --- a/openbb_terminal/core/session/constants.py +++ b/openbb_terminal/core/session/constants.py @@ -3,6 +3,7 @@ BASE_URL = "https://payments.openbb.dev/" HUB_URL = "https://my.openbb.dev/" REGISTER_URL = HUB_URL + "register" +SUPPORT_URL = HUB_URL + "app/terminal/support" SOURCES_URL = HUB_URL + "app/terminal/data-sources" KEYS_URL = HUB_URL + "app/terminal/api-keys" COLORS_URL = HUB_URL + "app/terminal/theme" diff --git a/openbb_terminal/core/session/env_handler.py b/openbb_terminal/core/session/env_handler.py index 9ebb6fc8246..424c665434b 100644 --- a/openbb_terminal/core/session/env_handler.py +++ b/openbb_terminal/core/session/env_handler.py @@ -19,14 +19,25 @@ DEFAULT_ORDER = [ ] -def read_env() -> Dict[str, Any]: - __env_dict: Dict[str, Optional[str]] = {} - local_order = DEFAULT_ORDER.copy() +def get_reading_order() -> list: + """Get order of .env files. If we are on frozen app, we reverse the order to + read the SETTINGS_ENV_FILE last. + Returns + ------- + list + List of .env files. + """ + local_order = DEFAULT_ORDER.copy() if getattr(sys, "frozen", False) and hasattr(sys, "_MEIPASS"): local_order.reverse() + return local_order - for env_file in local_order: + +def read_env() -> Dict[str, Any]: + __env_dict: Dict[str, Optional[str]] = {} + + for env_file in get_reading_order(): if env_file.exists(): __env_dict.update(**dotenv_values(env_file)) diff --git a/openbb_terminal/core/session/hub_model.py b/openbb_terminal/core/session/hub_model.py index 618c5b4224b..8bf1be91ea1 100644 --- a/openbb_terminal/core/session/hub_model.py +++ b/openbb_terminal/core/session/hub_model.py @@ -338,7 +338,7 @@ def upload_user_field( def upload_config( key: str, value: str, - type_: Literal["keys", "settings", "terminal_style"], + type_: Literal["settings", "terminal_style"], auth_header: str, base_url: str = BASE_URL, timeout: int = TIMEOUT, @@ -351,7 +351,7 @@ def upload_config( The key to patch. value : str The value to patch. - type_ : Literal["keys", "settings", "terminal_style"] + type_ : Literal["settings", "terminal_style"] The type of the patch. auth_header : str The authorization header, e.g. "Bearer ". @@ -365,7 +365,7 @@ def upload_config( Optional[requests.Response] The response from the patch request. """ - if type_ not in ["keys", "settings", "terminal_style"]: + if type_ not in ["settings", "terminal_style"]: console.print("[red]\nInvalid patch type.[/red]") return None diff --git a/openbb_terminal/core/session/session_controller.py b/openbb_terminal/core/session/session_controller.py index 0d9408b6816..c30e4a54a85 100644 --- a/openbb_terminal/core/session/session_controller.py +++ b/openbb_terminal/core/session/session_controller.py @@ -4,7 +4,7 @@ from prompt_toolkit import PromptSession import openbb_terminal.core.session.local_model as Local from openbb_terminal.core.config.paths import PACKAGE_DIRECTORY -from openbb_terminal.core.session.constants import REGISTER_URL +from openbb_terminal.core.session.constants import REGISTER_URL, SUPPORT_URL from openbb_terminal.core.session.session_model import ( LoginStatus, create_session, @@ -19,7 +19,7 @@ def display_welcome_message(): with open(PACKAGE_DIRECTORY / "core" / "session" / "banner.txt") as f: console.print(f"[menu]{f.read()}[/menu]\n") console.print(f"Register : [cmds]{REGISTER_URL}[/cmds]") - console.print("Ask support : [cmds]https://openbb.co/support[/cmds]") + console.print(f"Ask support : [cmds]{SUPPORT_URL}[/cmds]") console.print( "[yellow]\nWARNING: This is a pre-release version published for testing.[/yellow]" "[yellow]\nBeware that your account will be deleted without notice.[/yellow]" diff --git a/openbb_terminal/core/session/session_model.py b/openbb_terminal/core/session/session_model.py index 9c5bf9b64a1..f41c1cbc9e8 100644 --- a/openbb_terminal/core/session/session_model.py +++ b/openbb_terminal/core/session/session_model.py @@ -11,7 +11,6 @@ from openbb_terminal.base_helpers import ( ) from openbb_terminal.core.config.paths import HIST_FILE_PATH, SESSION_FILE_PATH from openbb_terminal.core.models.user_model import ( - CredentialsModel, ProfileModel, SourcesModel, UserModel, @@ -82,13 +81,13 @@ def login(session: dict) -> LoginStatus: The session info. """ # Create a new user: - # credentials: stored in hub, so we set default here + # credentials: stored in hub, but we fallback to local (.env) # profile: stored in hub, so we set default here # preferences: stored locally, so we use the current user preferences # sources: stored in hub, so we set default here hub_user = UserModel( # type: ignore - credentials=CredentialsModel(), + credentials=get_current_user().credentials, profile=ProfileModel(), preferences=get_current_user().preferences, sources=SourcesModel(), diff --git a/openbb_terminal/keys_controller.py b/openbb_terminal/keys_controller.py index 0fa48ab871c..223fce83fbc 100644 --- a/openbb_terminal/keys_controller.py +++ b/openbb_terminal/keys_controller.py @@ -11,13 +11,9 @@ from openbb_terminal import ( keys_model, keys_view, ) -from openbb_terminal.core.config.paths import ( - PACKAGE_ENV_FILE, - REPOSITORY_ENV_FILE, - SETTINGS_ENV_FILE, -) from openbb_terminal.core.session.constants import KEYS_URL from openbb_terminal.core.session.current_user import get_current_user, is_local +from openbb_terminal.core.session.env_handler import get_reading_order from openbb_terminal.custom_prompt_toolkit import NestedCompleter from openbb_terminal.decorators import log_start_end from openbb_terminal.helper_funcs import EXPORT_ONLY_RAW_DATA_ALLOWED @@ -72,15 +68,25 @@ class KeysController(BaseController): # pylint: disable=too-many-public-methods keys_model.KeyStatus.DEFINED_TEST_INCONCLUSIVE ) + def get_source_hierarchy(self) -> str: + """Hierarchy is equivalent to reverse order of reading .env files. + + Returns + ------- + str + Source priority string. + """ + reading_order = get_reading_order() + hierarchy = "\n ".join(list(map(str, reversed(reading_order)))) + return hierarchy if is_local() else f"{KEYS_URL}\n {hierarchy}" + def print_help(self, update_status: bool = False, reevaluate: bool = False): """Print help""" self.check_keys_status(reevaluate=reevaluate) mt = MenuText("keys/") mt.add_param( "_source", - f"{SETTINGS_ENV_FILE}\n {PACKAGE_ENV_FILE}\n {REPOSITORY_ENV_FILE}" - if is_local() - else KEYS_URL, + self.get_source_hierarchy(), ) mt.add_raw("\n") mt.add_info("_keys_") diff --git a/openbb_terminal/keys_model.py b/openbb_terminal/keys_model.py index 74809b23049..c64bee69bb4 100644 --- a/openbb_terminal/keys_model.py +++ b/openbb_terminal/keys_model.py @@ -24,14 +24,11 @@ from oandapyV20 import API as oanda_API from prawcore.exceptions import ResponseException from tokenterminal import TokenTerminal -from openbb_terminal.core.models.credentials_model import LOCAL_CREDENTIALS from openbb_terminal.core.session.current_user import ( get_current_user, - is_local, set_credential, ) from openbb_terminal.core.session.env_handler import write_to_dotenv -from openbb_terminal.core.session.hub_model import upload_config from openbb_terminal.cryptocurrency.coinbase_helpers import ( CoinbaseApiException, CoinbaseProAuth, @@ -251,7 +248,7 @@ def get_keys(show: bool = False) -> pd.DataFrame: def handle_credential(name: str, value: str, persist: bool = False): - """Handle credential + """Handle credential: set it for current user and optionally write to .env file. Parameters ---------- @@ -262,20 +259,9 @@ def handle_credential(name: str, value: str, persist: bool = False): persist: bool, optional Write to .env file. By default, False. """ - current_user = get_current_user() - local_user = is_local() - set_credential(name, value) - - if local_user and persist: + if persist: write_to_dotenv("OPENBB_" + name, value) - elif not local_user and name not in LOCAL_CREDENTIALS: - upload_config( - key=name, - value=str(value), - type_="keys", - auth_header=current_user.profile.get_auth_header(), - ) def set_av_key(key: str, persist: bool = False, show_output: bool = False) -> str: diff --git a/tests/openbb_terminal/session/test_hub_model.py b/tests/openbb_terminal/session/test_hub_model.py index f915a59ddae..c1805e38205 100644 --- a/tests/openbb_terminal/session/test_hub_model.py +++ b/tests/openbb_terminal/session/test_hub_model.py @@ -356,7 +356,6 @@ def test_fetch_user_configs_exception(): @pytest.mark.parametrize( "key, value, type_, auth_header", [ - ("key", "value", "keys", "auth_header"), ("key", "value", "settings", "auth_header"), ], ) @@ -387,14 +386,14 @@ def test_upload_config_failure(): "openbb_terminal.core.session.hub_model.requests.patch", return_value=mock_response, ) as requests_patch_mock: - result = hub_model.upload_config("key", "value", "keys", "auth_header") + result = hub_model.upload_config("key", "value", "settings", "auth_header") assert result.status_code == mock_response.status_code requests_patch_mock.assert_called_once() _, kwargs = requests_patch_mock.call_args assert kwargs["url"] == hub_model.BASE_URL + "terminal/user" assert kwargs["headers"] == {"Authorization": "auth_header"} - assert kwargs["json"] == {"key": "features_keys.key", "value": "value"} + assert kwargs["json"] == {"key": "features_settings.key", "value": "value"} assert kwargs["timeout"] == hub_model.TIMEOUT @@ -404,14 +403,14 @@ def test_upload_config_connection_error(): ) as requests_patch_mock: requests_patch_mock.side_effect = requests.exceptions.ConnectionError() - result = hub_model.upload_config("key", "value", "keys", "auth_header") + result = hub_model.upload_config("key", "value", "settings", "auth_header") assert result is None requests_patch_mock.assert_called_once() _, kwargs = requests_patch_mock.call_args assert kwargs["url"] == hub_model.BASE_URL + "terminal/user" assert kwargs["headers"] == {"Authorization": "auth_header"} - assert kwargs["json"] == {"key": "features_keys.key", "value": "value"} + assert kwargs["json"] == {"key": "features_settings.key", "value": "value"} assert kwargs["timeout"] == hub_model.TIMEOUT @@ -421,14 +420,14 @@ def test_upload_config_timeout(): ) as requests_patch_mock: requests_patch_mock.side_effect = requests.exceptions.Timeout() - result = hub_model.upload_config("key", "value", "keys", "auth_header") + result = hub_model.upload_config("key", "value", "settings", "auth_header") assert result is None requests_patch_mock.assert_called_once() _, kwargs = requests_patch_mock.call_args assert kwargs["url"] == hub_model.BASE_URL + "terminal/user" assert kwargs["headers"] == {"Authorization": "auth_header"} - assert kwargs["json"] == {"key": "features_keys.key", "value": "value"} + assert kwargs["json"] == {"key": "features_settings.key", "value": "value"} assert kwargs["timeout"] == hub_model.TIMEOUT @@ -438,14 +437,14 @@ def test_upload_config_exception(): ) as requests_patch_mock: requests_patch_mock.side_effect = Exception() - result = hub_model.upload_config("key", "value", "keys", "auth_header") + result = hub_model.upload_config("key", "value", "settings", "auth_header") assert result is None requests_patch_mock.assert_called_once() _, kwargs = requests_patch_mock.call_args assert kwargs["url"] == hub_model.BASE_URL + "terminal/user" assert kwargs["headers"] == {"Authorization": "auth_header"} - assert kwargs["json"] == {"key": "features_keys.key", "value": "value"} + assert kwargs["json"] == {"key": "features_settings.key", "value": "value"} assert kwargs["timeout"] == hub_model.TIMEOUT diff --git a/tests/openbb_terminal/session/txt/test_session_controller/test_display_welcome_message.txt b/tests/openbb_terminal/session/txt/test_session_controller/test_display_welcome_message.txt index 0b564f74a44..f5d49eedac0 100644 --- a/tests/openbb_terminal/session/txt/test_session_controller/test_display_welcome_message.txt +++ b/tests/openbb_terminal/session/txt/test_session_controller/test_display_welcome_message.txt @@ -19,7 +19,7 @@ [/menu] Register : [cmds]https://my.openbb.dev/register[/cmds] -Ask support : [cmds]https://openbb.co/support[/cmds] +Ask support : [cmds]https://my.openbb.dev/app/terminal/support[/cmds] [yellow] WARNING: This is a pre-release version published for testing.[/yellow][yellow] Beware that your account will be deleted without notice.[/yellow]