bw-essentials-core 0.1.10__py3-none-any.whl → 0.1.12__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.

@@ -20,6 +20,7 @@ class Services(Enum):
20
20
  PROMETHEUS_USER_APP = "Prometheus_User_App"
21
21
  PORTFOLIO_CATALOGUE = "Portfolio_Catalogue"
22
22
  PORTFOLIO_CONTENT = "Portfolio_Content"
23
+ JOB_SCHEDULER = "Job_Scheduler"
23
24
 
24
25
  class PortfolioStatus(Enum):
25
26
  """
@@ -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.
@@ -0,0 +1,60 @@
1
+ import logging
2
+ from bw_essentials.constants.services import Services
3
+ from bw_essentials.services.api_client import ApiClient
4
+
5
+ logger = logging.getLogger(__name__)
6
+
7
+
8
+ class JobScheduler(ApiClient):
9
+ """
10
+ Class for making API calls to the Job Scheduler Service.
11
+
12
+ Args:
13
+ user (str): The user for whom the API calls are being made.
14
+ """
15
+
16
+ def __init__(self, user):
17
+ """
18
+ Initialize the Job Scheduler object.
19
+
20
+ Args:
21
+ user (str): The user for whom the API calls are being made.
22
+ """
23
+ super().__init__(user)
24
+ self.base_url = self.get_base_url(Services.JOB_SCHEDULER.value)
25
+ self.api_key = self.get_api_key(Services.JOB_SCHEDULER.value)
26
+ self.name = Services.JOB_SCHEDULER.value
27
+ self.urls = {
28
+ "process_user_profile": "taskmanager/process/user-portfolios/"
29
+ }
30
+
31
+ def _headers(self):
32
+ """
33
+ Prepares headers for API calls.
34
+
35
+ Returns:
36
+ dict: Headers
37
+ """
38
+ return {
39
+ 'Content-Type': 'application/json',
40
+ 'x-api-key': self.api_key
41
+ }
42
+
43
+ def process_user_profile(self, data):
44
+ """
45
+ Send a request to process a user profile.
46
+
47
+ This method prepares the required headers and sends a POST request
48
+ to the `process_user_profile` endpoint with the provided user data.
49
+
50
+ Args:
51
+ data (dict): A dictionary containing user profile information
52
+ to be sent in the request body.
53
+
54
+ Returns:
55
+ None: The method does not return a value.
56
+ """
57
+ logger.info(f"In - process_user_profile {self.user =}")
58
+ self.headers = self._headers()
59
+ self._post(url=self.base_url, endpoint=self.urls.get('process_user_profile'), json=data)
60
+ logger.info(f"Out - process_user_profile")
@@ -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.12
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
@@ -1,6 +1,6 @@
1
1
  bw_essentials/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
2
2
  bw_essentials/constants/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
- bw_essentials/constants/services.py,sha256=jFP9QnzgYK-PUJT3oigpdaesYnnzLN-D5REe3Bdkwms,864
3
+ bw_essentials/constants/services.py,sha256=HxeM05zJP1oCqwLRLb9wLxAOCmbdu-jWgtlmnPE4KFU,900
4
4
  bw_essentials/data_loch/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
5
5
  bw_essentials/data_loch/data_loch.py,sha256=iJO0oPhZyQjoUZOaeBP1nsbuc5iR9ZNWoAXj2pGEpT8,11716
6
6
  bw_essentials/email_client/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -11,8 +11,9 @@ 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
+ bw_essentials/services/job_scheduler.py,sha256=AmlaYJsCCjHxTg9MQ58dMuiZOUDfxmbd43jzN4L-lNU,1834
16
17
  bw_essentials/services/market_pricer.py,sha256=Qc9lxzAjhefAvjyEKsBPDu60bF6_61cnSpZNfjGMyDg,11755
17
18
  bw_essentials/services/master_data.py,sha256=2o_r2gdhIKBeTFgn5IIY-becgCEpYBymO4BKmixdV1g,11987
18
19
  bw_essentials/services/model_portfolio_reporting.py,sha256=iOtm4gyfU8P7C0R1gp6gUJI4ZRxJD5K2GLOalI_gToM,3249
@@ -21,10 +22,10 @@ bw_essentials/services/payment.py,sha256=Em8Lvg7aX1Ga4CJDpJimyE_ByZhJZKM6W6rw2cU
21
22
  bw_essentials/services/portfolio_catalogue.py,sha256=F4ne1eF6Koj0CCV1j07ebIgIlRCc2I0mlL6-gmxbIGg,7189
22
23
  bw_essentials/services/portfolio_content.py,sha256=rdFTTsUUIt-AgFfA1SAItqg2njakVOm4dUKU0FHZQ2E,2148
23
24
  bw_essentials/services/trade_placement.py,sha256=PrzeU2XXC9HF1IQ1dMDM_ZHxmC491sOl-JbA6GWPwII,20772
24
- bw_essentials/services/user_app.py,sha256=_Y2NgDq6kEoco7ZRJ3-MMYJ-K2HGStJoFoeGOH_HotQ,11107
25
+ bw_essentials/services/user_app.py,sha256=jEpdT2W0Bj65xwQG2X1wnsQQEvjMHMbtjuvuYlzhJ6Q,11773
25
26
  bw_essentials/services/user_portfolio.py,sha256=G3PrMOryqEXSERodP4hwbrxV2JHiXUVwxdFri_E1v3k,22179
26
27
  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,,
28
+ bw_essentials_core-0.1.12.dist-info/METADATA,sha256=zhRpYnIMNGxmU4egniYRl2MngKnoCn7b-X92bYcU1bs,7502
29
+ bw_essentials_core-0.1.12.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
30
+ bw_essentials_core-0.1.12.dist-info/top_level.txt,sha256=gDc5T_y5snwKGXDQUusEus-FEt0RFwG644Yn_58wQOQ,14
31
+ bw_essentials_core-0.1.12.dist-info/RECORD,,