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.
- bw_essentials/constants/services.py +1 -0
- bw_essentials/services/api_client.py +13 -0
- bw_essentials/services/broker.py +22 -1
- bw_essentials/services/job_scheduler.py +60 -0
- bw_essentials/services/user_app.py +22 -3
- {bw_essentials_core-0.1.10.dist-info → bw_essentials_core-0.1.12.dist-info}/METADATA +1 -1
- {bw_essentials_core-0.1.10.dist-info → bw_essentials_core-0.1.12.dist-info}/RECORD +9 -8
- {bw_essentials_core-0.1.10.dist-info → bw_essentials_core-0.1.12.dist-info}/WHEEL +0 -0
- {bw_essentials_core-0.1.10.dist-info → bw_essentials_core-0.1.12.dist-info}/top_level.txt +0 -0
|
@@ -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.
|
bw_essentials/services/broker.py
CHANGED
|
@@ -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
|
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=
|
|
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=
|
|
15
|
-
bw_essentials/services/broker.py,sha256=
|
|
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=
|
|
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.
|
|
28
|
-
bw_essentials_core-0.1.
|
|
29
|
-
bw_essentials_core-0.1.
|
|
30
|
-
bw_essentials_core-0.1.
|
|
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,,
|
|
File without changes
|
|
File without changes
|