Files
OpenBB/openbb_terminal/core/session/credentials_handler.py
montezdesousa bea21dff28 Handle pydantic ValidationError reading .env (#4456)
* move tradier to data providers

* handle env load errors

* improve message

* detail model in message
2023-03-10 23:07:40 +00:00

83 lines
1.9 KiB
Python

# IMPORTS STANDARD
import dataclasses
# IMPORTS THIRDPARTY
from dotenv import set_key
# IMPORTS INTERNAL
from openbb_terminal.core.config.paths import SETTINGS_ENV_FILE
from openbb_terminal.core.session.current_user import (
get_current_user,
is_local,
set_current_user,
)
from openbb_terminal.core.session.hub_model import patch_user_configs
LOCAL_KEYS = [
"RH_USERNAME",
"RH_PASSWORD",
"DG_USERNAME",
"DG_PASSWORD",
"DG_TOTP_SECRET",
"OANDA_ACCOUNT_TYPE",
"OANDA_ACCOUNT",
"OANDA_TOKEN",
"API_BINANCE_KEY",
"API_BINANCE_SECRET",
"API_COINBASE_KEY",
"API_COINBASE_SECRET",
"API_COINBASE_PASS_PHRASE",
]
def set_credential(
name: str,
value: str,
persist: bool = False,
login: bool = False,
):
"""Set credential
Parameters
----------
name : str
Credential name
value : str
Credential value
persist : bool
Force saving to .env file
login : bool
If preference set during login
"""
current_user = get_current_user()
sync_enabled = current_user.preferences.SYNC_ENABLED
local_user = is_local()
if persist and local_user:
set_key(str(SETTINGS_ENV_FILE), name, str(value))
# Remove "OPENBB_" prefix from env_var
if name.startswith("OPENBB_"):
name = name[7:]
# Set credential in current user
updated_credentials = dataclasses.replace(current_user.credentials, **{name: value})
updated_user = dataclasses.replace(current_user, credentials=updated_credentials)
set_current_user(updated_user)
# Send credential to cloud
if (
not local_user
and sync_enabled
and name not in LOCAL_KEYS
and (name.startswith("API_") or name.startswith("OPENBB_"))
and not login
):
patch_user_configs(
key=name,
value=str(value),
type_="keys",
auth_header=current_user.profile.get_auth_header(),
)