bw-essentials-core 0.1.10__py3-none-any.whl → 0.1.11__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of bw-essentials-core might be problematic. Click here for more details.

@@ -80,6 +80,19 @@ class ApiClient:
80
80
  env_key = f"{service_name.upper()}_BASE_URL"
81
81
  return self._get_env_var(env_key)
82
82
 
83
+ def get_api_key(self, service_name: str) -> str:
84
+ """
85
+ Resolve the service API Key for a given service name using environment variables.
86
+
87
+ Args:
88
+ service_name (str): The logical name of the service.
89
+
90
+ Returns:
91
+ str: The resolved api key from the environment.
92
+ """
93
+ env_key = f"{service_name.upper()}_API_KEY"
94
+ return self._get_env_var(env_key)
95
+
83
96
  def set_tenant_id(self, tenant_id: str) -> None:
84
97
  """
85
98
  Set the tenant ID in the request headers.
@@ -62,7 +62,8 @@ class Broker(ApiClient):
62
62
  "authorised_holdings": "brokers/{}/holdings/authorise",
63
63
  "user_instructions": "brokers/{}/user/instructions",
64
64
  "details": "brokers/{}/trade/details",
65
- "surveillance_orders": "brokers/{}/surveillance/orders"
65
+ "surveillance_orders": "brokers/{}/surveillance/orders",
66
+ "profile": "brokers/{}/profile"
66
67
  }
67
68
 
68
69
  def authenticate(self, broker_name: str, user_id: str, entity_id: str,
@@ -118,6 +119,26 @@ class Broker(ApiClient):
118
119
  logger.info(f"{response =}")
119
120
  return response["data"]["balance"]
120
121
 
122
+ def get_profile(self, broker_name: str, user_id: str) -> dict:
123
+ """
124
+ Fetch user profile from the broker service.
125
+
126
+ Args:
127
+ broker_name (str): Broker name.
128
+ user_id (str): User ID.
129
+
130
+ Returns:
131
+ Dict: User Profile.
132
+ """
133
+ logger.info(f"In - get_profile {user_id =}")
134
+ response = self._get(
135
+ url=self.base_url,
136
+ endpoint=self.urls["profile"].format(broker_name),
137
+ params={"user_id": user_id}
138
+ )
139
+ logger.info(f"{response =}")
140
+ return response["data"]
141
+
121
142
  def get_holdings(self, broker_name: str, user_id: str) -> list:
122
143
  """
123
144
  Fetch user holdings from the broker service.
@@ -34,16 +34,20 @@ class PrometheusUserApp(ApiClient):
34
34
  urls (Dict[str, str]): A dictionary of endpoint path templates
35
35
  """
36
36
 
37
- def __init__(self, service_user: str):
37
+ def __init__(self, service_user: str, tenant_id: str = None):
38
38
  """
39
- Initialize the PrometheusUserApp client with the given service user.
39
+ Initialize the PrometheusUserApp client with the given service user and tenant id.
40
40
 
41
41
  Args:
42
42
  service_user (str): Username or service identifier for authentication.
43
+ tenant_id (str, optional): Tenant identifier for multi-tenant usage.
44
+ Defaults to None if not applicable.
43
45
  """
44
46
  super().__init__(user=service_user)
45
47
  self.base_url = self.get_base_url(Services.PROMETHEUS_USER_APP.value)
48
+ self.api_key = self.get_api_key(Services.PROMETHEUS_USER_APP.value)
46
49
  self.name = Services.PROMETHEUS_USER_APP.value
50
+ self.tenant_id = tenant_id
47
51
  self.urls = {
48
52
  "user_details": "user/details",
49
53
  "profile": "user/profile",
@@ -60,6 +64,20 @@ class PrometheusUserApp(ApiClient):
60
64
  "sso": "user/{}/sso"
61
65
  }
62
66
 
67
+
68
+ def _headers(self):
69
+ """
70
+ Prepares headers for API calls.
71
+
72
+ Returns:
73
+ dict: Headers
74
+ """
75
+ return {
76
+ 'Content-Type': 'application/json',
77
+ **({'X-Tenant-ID': self.tenant_id} if self.tenant_id else {}),
78
+ 'x-api-key': self.api_key
79
+ }
80
+
63
81
  def get_user_details(self, user_id: str) -> Optional[Dict[str, Any]]:
64
82
  """
65
83
  Fetch detailed user information by user ID.
@@ -71,10 +89,11 @@ class PrometheusUserApp(ApiClient):
71
89
  Optional[Dict[str, Any]]: Parsed user data if found, else None.
72
90
  """
73
91
  logger.info("Fetching user details for user_id=%s", user_id)
92
+ self.headers = self._headers()
74
93
  response = self._get(
75
94
  endpoint=self.urls["user_details"],
76
95
  url=self.base_url,
77
- params={'user_id': user_id}
96
+ params={'user_id': user_id},
78
97
  )
79
98
  return response.get('data')
80
99
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: bw-essentials-core
3
- Version: 0.1.10
3
+ Version: 0.1.11
4
4
  Summary: Reusable utilities for S3, email, Data Loch, Microsoft Teams Notifications and more.
5
5
  Author: InvestorAI
6
6
  Author-email: support+tech@investorai.in
@@ -11,8 +11,8 @@ bw_essentials/notifications/teams_notifications.py,sha256=1tkS3tTJQZ5ByMwK2WXpFg
11
11
  bw_essentials/s3_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
12
12
  bw_essentials/s3_utils/s3_utils.py,sha256=wzjVrTX22_8PMX86svKFYGMZwgjBHbOaeEsxO-lR7BY,12922
13
13
  bw_essentials/services/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
14
- bw_essentials/services/api_client.py,sha256=U_4CybxBH-A3lh_oLZhVXMosB3a7AHkUazXq_Vg2-Zw,7795
15
- bw_essentials/services/broker.py,sha256=As-VT1MxkCD9p-13dQJDwf0_aEJVA6H0wNqL-EYHO4g,8718
14
+ bw_essentials/services/api_client.py,sha256=5XFbdw5gfxXz7mQlLWNC8efDrvZgAztM-Oo0Dp1jDF8,8215
15
+ bw_essentials/services/broker.py,sha256=W4y31K7dF4LHfQSvnAwVWfGoYKkdz-W2TXqTLhkUxn8,9348
16
16
  bw_essentials/services/market_pricer.py,sha256=Qc9lxzAjhefAvjyEKsBPDu60bF6_61cnSpZNfjGMyDg,11755
17
17
  bw_essentials/services/master_data.py,sha256=2o_r2gdhIKBeTFgn5IIY-becgCEpYBymO4BKmixdV1g,11987
18
18
  bw_essentials/services/model_portfolio_reporting.py,sha256=iOtm4gyfU8P7C0R1gp6gUJI4ZRxJD5K2GLOalI_gToM,3249
@@ -21,10 +21,10 @@ bw_essentials/services/payment.py,sha256=Em8Lvg7aX1Ga4CJDpJimyE_ByZhJZKM6W6rw2cU
21
21
  bw_essentials/services/portfolio_catalogue.py,sha256=F4ne1eF6Koj0CCV1j07ebIgIlRCc2I0mlL6-gmxbIGg,7189
22
22
  bw_essentials/services/portfolio_content.py,sha256=rdFTTsUUIt-AgFfA1SAItqg2njakVOm4dUKU0FHZQ2E,2148
23
23
  bw_essentials/services/trade_placement.py,sha256=PrzeU2XXC9HF1IQ1dMDM_ZHxmC491sOl-JbA6GWPwII,20772
24
- bw_essentials/services/user_app.py,sha256=_Y2NgDq6kEoco7ZRJ3-MMYJ-K2HGStJoFoeGOH_HotQ,11107
24
+ bw_essentials/services/user_app.py,sha256=jEpdT2W0Bj65xwQG2X1wnsQQEvjMHMbtjuvuYlzhJ6Q,11773
25
25
  bw_essentials/services/user_portfolio.py,sha256=G3PrMOryqEXSERodP4hwbrxV2JHiXUVwxdFri_E1v3k,22179
26
26
  bw_essentials/services/user_portfolio_reporting.py,sha256=pwqfW95LTiGOGufcTphljFxPlOd-G4Q263UtoQURPxM,6772
27
- bw_essentials_core-0.1.10.dist-info/METADATA,sha256=zF9QWn5XFMH4V0iyV6UwK8bcazsAf_C6DwlZJN-5pvQ,7502
28
- bw_essentials_core-0.1.10.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
29
- bw_essentials_core-0.1.10.dist-info/top_level.txt,sha256=gDc5T_y5snwKGXDQUusEus-FEt0RFwG644Yn_58wQOQ,14
30
- bw_essentials_core-0.1.10.dist-info/RECORD,,
27
+ bw_essentials_core-0.1.11.dist-info/METADATA,sha256=ZQXEqpqVlQmlTiFB7kl2v1p8rif8JBTWGH3ba0njS6Y,7502
28
+ bw_essentials_core-0.1.11.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
29
+ bw_essentials_core-0.1.11.dist-info/top_level.txt,sha256=gDc5T_y5snwKGXDQUusEus-FEt0RFwG644Yn_58wQOQ,14
30
+ bw_essentials_core-0.1.11.dist-info/RECORD,,