diff options
author | Diogo Sousa <montezdesousa@gmail.com> | 2024-06-07 16:17:58 +0100 |
---|---|---|
committer | Diogo Sousa <montezdesousa@gmail.com> | 2024-06-07 16:17:58 +0100 |
commit | 957624363467c48d4e246f54af2d714447b44031 (patch) | |
tree | b608ef6916c7086b0297359691bda412d1cff214 | |
parent | aa7bccc4eccc67764ecd3a62f1e7c5f8323cbac0 (diff) |
feat: store defaults in hub account
4 files changed, 27 insertions, 10 deletions
diff --git a/openbb_platform/core/openbb_core/app/model/defaults.py b/openbb_platform/core/openbb_core/app/model/defaults.py index 1f4a176674f..a6eb632ac8e 100644 --- a/openbb_platform/core/openbb_core/app/model/defaults.py +++ b/openbb_platform/core/openbb_core/app/model/defaults.py @@ -44,3 +44,8 @@ class Defaults(BaseModel): v["provider"] = [provider] new_values["commands"][clean_k] = v return new_values + + def update(self, incoming: "Defaults"): + """Update current defaults.""" + incoming_commands = incoming.model_dump(exclude_none=True).get("commands", {}) + self.__dict__["commands"].update(incoming_commands) diff --git a/openbb_platform/core/openbb_core/app/model/hub/hub_user_settings.py b/openbb_platform/core/openbb_core/app/model/hub/hub_user_settings.py index 16ea348319e..edf52f3111e 100644 --- a/openbb_platform/core/openbb_core/app/model/hub/hub_user_settings.py +++ b/openbb_platform/core/openbb_core/app/model/hub/hub_user_settings.py @@ -1,6 +1,6 @@ """Hub user settings model.""" -from typing import Dict, Optional +from typing import Any, Dict, Optional from pydantic import BaseModel, ConfigDict, Field @@ -8,9 +8,9 @@ from pydantic import BaseModel, ConfigDict, Field class HubUserSettings(BaseModel): """Hub user settings model.""" - # features_settings: Dict[str, str] + features_settings: Dict[str, Any] = Field(default_factory=dict) features_keys: Dict[str, Optional[str]] = Field(default_factory=dict) - # features_sources: Dict[str, List[str]] + # features_sources: Dict[str, Any] # features_terminal_style: Dict[str, Union[str, Dict[str, str]]] model_config = ConfigDict(validate_assignment=True) diff --git a/openbb_platform/core/openbb_core/app/service/hub_service.py b/openbb_platform/core/openbb_core/app/service/hub_service.py index 3448eb8d52c..e1d75b262f3 100644 --- a/openbb_platform/core/openbb_core/app/service/hub_service.py +++ b/openbb_platform/core/openbb_core/app/service/hub_service.py @@ -1,12 +1,13 @@ """Hub manager class.""" -from typing import Optional +from typing import Optional, Tuple from warnings import warn from fastapi import HTTPException from jwt import ExpiredSignatureError, PyJWTError, decode, get_unverified_header from openbb_core.app.model.abstract.error import OpenBBError from openbb_core.app.model.credentials import Credentials +from openbb_core.app.model.defaults import Defaults from openbb_core.app.model.hub.hub_session import HubSession from openbb_core.app.model.hub.hub_user_settings import HubUserSettings from openbb_core.app.model.profile import Profile @@ -81,7 +82,9 @@ class HubService: """Push user settings to Hub.""" if self._session: if user_settings.credentials: - hub_user_settings = self.platform2hub(user_settings.credentials) + hub_user_settings = self.platform2hub( + user_settings.credentials, user_settings.defaults + ) return self._put_user_settings(self._session, hub_user_settings) return False raise OpenBBError( @@ -93,8 +96,10 @@ class HubService: if self._session: self._hub_user_settings = self._get_user_settings(self._session) profile = Profile(hub_session=self._session) - credentials = self.hub2platform(self._hub_user_settings) - return UserSettings(profile=profile, credentials=credentials) + credentials, defaults = self.hub2platform(self._hub_user_settings) + return UserSettings( + profile=profile, credentials=credentials, defaults=defaults + ) raise OpenBBError( "No session found. Login or provide a 'HubSession' on initialization." ) @@ -223,7 +228,7 @@ class HubService: detail = response.json().get("detail", None) raise HTTPException(status_code, detail) - def hub2platform(self, settings: HubUserSettings) -> Credentials: + def hub2platform(self, settings: HubUserSettings) -> Tuple[Credentials, Defaults]: """Convert Hub user settings to Platform models.""" if any(k in settings.features_keys for k in self.V3TOV4): deprecated = { @@ -242,9 +247,12 @@ class HubService: self.V3TOV4.get(k, k): settings.features_keys.get(self.V3TOV4.get(k, k), v) for k, v in settings.features_keys.items() } - return Credentials(**hub_credentials) + commands = settings.features_settings.get("defaults", {}) + return Credentials(**hub_credentials), Defaults(**commands) - def platform2hub(self, credentials: Credentials) -> HubUserSettings: + def platform2hub( + self, credentials: Credentials, defaults: Defaults + ) -> HubUserSettings: """Convert Platform models to Hub user settings.""" # Dump mode json ensures SecretStr values are serialized as strings credentials = credentials.model_dump(mode="json", exclude_none=True) @@ -254,6 +262,8 @@ class HubService: # If v3 key was in the hub already, we keep it k = v3_k if v3_k in settings.features_keys else v4_k settings.features_keys[k] = v + defaults = defaults.model_dump(mode="json", exclude_none=True) + settings.features_settings.update(defaults) return settings @staticmethod diff --git a/openbb_platform/core/openbb_core/app/static/account.py b/openbb_platform/core/openbb_core/app/static/account.py index 6195c85b781..8176c901052 100644 --- a/openbb_platform/core/openbb_core/app/static/account.py +++ b/openbb_platform/core/openbb_core/app/static/account.py @@ -125,6 +125,7 @@ class Account: # noqa: D205, D400 incoming = self._hub_service.pull() self._base_app.user.profile = incoming.profile self._base_app.user.credentials.update(incoming.credentials) + self._base_app.user.defaults.update(incoming.defaults) if remember_me: Path(self._openbb_directory).mkdir(parents=False, exist_ok=True) session_file = Path(self._openbb_directory, self.SESSION_FILE) @@ -187,6 +188,7 @@ class Account: # noqa: D205, D400 incoming = self._hub_service.pull() self._base_app.user.profile = incoming.profile self._base_app.user.credentials.update(incoming.credentials) + self._base_app.user.defaults.update(incoming.defaults) if return_settings: return self._base_app._command_runner.user_settings return None |