66from sqlalchemy .orm import joinedload , selectinload
77
88from connect_ext_ppr .client .exception import CBCClientError
9- from connect_ext_ppr .constants import PPR_FILE_NAME_DELEGATION_L2 , PPR_FILE_NAME_UPDATE_MARKETPLACES
9+ from connect_ext_ppr .constants import (
10+ DELAY_SECONDS_BETWEEN_TASKS ,
11+ PPR_FILE_NAME_DELEGATION_L2 ,
12+ PPR_FILE_NAME_UPDATE_MARKETPLACES ,
13+ )
1014from connect_ext_ppr .db import get_cbc_extension_db , get_cbc_extension_db_engine , get_db_ctx_manager
1115from connect_ext_ppr .models .configuration import Configuration
1216from connect_ext_ppr .models .enums import (
@@ -65,7 +69,10 @@ def _execute_with_retries(function, func_kwargs, num_retries=5):
6569 num_retries = num_retries ,
6670 )
6771 except CBCClientError as ex :
68- raise TaskException (str (ex ))
72+ message = ex .message
73+ if ex .json :
74+ message += f' - { ex .json .get ("message" )} '
75+ raise TaskException (message )
6976
7077
7178def _send_ppr (cbc_service , file : BufferedReader ):
@@ -89,11 +96,11 @@ def _check_cbc_task_status(cbc_service, tracking_id):
8996 task_log = _execute_with_retries (
9097 cbc_service .search_task_logs_by_name , func_kwargs = {'partial_name' : tracking_id },
9198 )
92- # Setting this first default value in case takes time to create it in extenal system.
99+ # Setting this first default value in case takes time to create it in external system.
93100 task_log = task_log [0 ] if task_log else {'status' : CBCTaskLogStatus .not_started }
94101
95102 while task_log ['status' ] in (CBCTaskLogStatus .not_started , CBCTaskLogStatus .running ):
96- time .sleep (10 )
103+ time .sleep (DELAY_SECONDS_BETWEEN_TASKS )
97104 task_log = _execute_with_retries (
98105 cbc_service .search_task_logs_by_name , {'partial_name' : tracking_id })[0 ]
99106
@@ -103,6 +110,29 @@ def _check_cbc_task_status(cbc_service, tracking_id):
103110 raise TaskException (f'Something went wrong with task: { tracking_id } ' )
104111
105112
113+ def check_and_update_product (deployment_request , cbc_service , ** kwargs ):
114+ if not deployment_request .manually :
115+
116+ product_id = deployment_request .deployment .product_id
117+
118+ response = _execute_with_retries (
119+ cbc_service .get_product_details , func_kwargs = {'product_id' : product_id },
120+ )
121+
122+ if 'error' in response .keys ():
123+ raise Exception (response ['error' ])
124+
125+ if response .get ('isUpdateAvailable' ):
126+ response = _execute_with_retries (
127+ cbc_service .update_product , func_kwargs = {'product_id' : product_id },
128+ )
129+
130+ if 'error' in response .keys ():
131+ raise Exception (response ['error' ])
132+
133+ return True
134+
135+
106136def prepare_ppr_file_for_task (
107137 connect_client ,
108138 file_data ,
@@ -153,8 +183,6 @@ def prepare_ppr_file_for_task(
153183 file_obj .read (),
154184 file_size ,
155185 )
156-
157- file_obj .seek (0 )
158186 return file_obj
159187
160188 except (FileNotFoundError , ValueError , KeyError ) as e :
@@ -163,34 +191,12 @@ def prepare_ppr_file_for_task(
163191 raise TaskException (f'Error while connecting to Connect: { e .message } ' )
164192
165193
166- def check_and_update_product (deployment_request , cbc_service , ** kwargs ):
167- if not deployment_request .manually :
168-
169- product_id = deployment_request .deployment .product_id
170-
171- response = _execute_with_retries (
172- cbc_service .get_product_details , func_kwargs = {'product_id' : product_id },
173- )
174-
175- if 'error' in response .keys ():
176- raise Exception (response ['error' ])
177-
178- if response .get ('isUpdateAvailable' ):
179- response = _execute_with_retries (
180- cbc_service .update_product , func_kwargs = {'product_id' : product_id },
181- )
182-
183- if 'error' in response .keys ():
184- raise Exception (response ['error' ])
185-
186- return True
187-
188-
189194def apply_ppr_and_delegate_to_marketplaces (
190195 deployment_request ,
191196 cbc_service ,
192197 connect_client ,
193198 db ,
199+ logger ,
194200 ** kwargs ,
195201):
196202 """Task sends PPR to the Commerce and updates marketplaces in DB
@@ -199,6 +205,7 @@ def apply_ppr_and_delegate_to_marketplaces(
199205 :param cbc_service: CBC service
200206 :param connect_client: Connect client
201207 :param db: dbsession
208+ :param logger: logger
202209 :rtype bool
203210 :raises TaskException
204211 """
@@ -255,6 +262,10 @@ def apply_ppr_and_delegate_to_marketplaces(
255262 )
256263
257264 tracking_id = _send_ppr (cbc_service , file )
265+ logger .debug (
266+ f'apply_ppr_and_delegate_to_marketplaces dr_id: { deployment_request .id } ,'
267+ f' tracking_id: { tracking_id } ' ,
268+ )
258269 file .close ()
259270 _check_cbc_task_status (cbc_service , tracking_id )
260271
@@ -267,6 +278,47 @@ def apply_ppr_and_delegate_to_marketplaces(
267278 return True
268279
269280
281+ def delegate_to_l2 (deployment_request , cbc_service , connect_client , logger , ** kwargs ):
282+ """Task delegates PPR to L2 in Commerce
283+
284+ :param deployment_request: DeploymentRequest model
285+ :param cbc_service: CBC service
286+ :param connect_client: Connect client
287+ :param logger: logger
288+ :rtype bool
289+ :raises TaskException
290+ """
291+ if deployment_request .manually :
292+ return True
293+
294+ ppr_file_id = deployment_request .ppr .file
295+ deployment = deployment_request .deployment
296+ try :
297+ file_data = get_ppr_from_media (
298+ connect_client ,
299+ deployment .account_id ,
300+ deployment .id ,
301+ ppr_file_id ,
302+ )
303+ except ClientError as e :
304+ raise TaskException (f'Error while connecting to Connect: { e .message } ' )
305+
306+ file = prepare_ppr_file_for_task (
307+ connect_client = connect_client ,
308+ file_data = file_data ,
309+ file_name_template = PPR_FILE_NAME_DELEGATION_L2 ,
310+ deployment_request = deployment_request ,
311+ deployment = deployment ,
312+ process_func = process_ppr_file_for_delelegate_l2 ,
313+ )
314+
315+ tracking_id = _send_ppr (cbc_service , file )
316+ logger .debug (f'delegate_to_l2 dr_id: { deployment_request .id } , tracking_id: { tracking_id } ' )
317+ file .close ()
318+ _check_cbc_task_status (cbc_service , tracking_id )
319+ return True
320+
321+
270322def apply_pricelist_task (
271323 deployment_request ,
272324 cbc_service ,
@@ -343,44 +395,6 @@ def validate_pricelists_task(
343395 return True
344396
345397
346- def delegate_to_l2 (deployment_request , cbc_service , connect_client , ** kwargs ):
347- """Task delegates PPR to L2 in Commerce
348-
349- :param deployment_request: DeploymentRequest model
350- :param cbc_service: CBC service
351- :param connect_client: Connect client
352- :rtype bool
353- :raises TaskException
354- """
355- if deployment_request .manually :
356- return True
357-
358- ppr_file_id = deployment_request .ppr .file
359- deployment = deployment_request .deployment
360- try :
361- file_data = get_ppr_from_media (
362- connect_client ,
363- deployment .account_id ,
364- deployment .id ,
365- ppr_file_id ,
366- )
367- except ClientError as e :
368- raise TaskException (f'Error while connecting to Connect: { e .message } ' )
369-
370- file = prepare_ppr_file_for_task (
371- connect_client = connect_client ,
372- file_data = file_data ,
373- file_name_template = PPR_FILE_NAME_DELEGATION_L2 ,
374- deployment_request = deployment_request ,
375- deployment = deployment ,
376- process_func = process_ppr_file_for_delelegate_l2 ,
377- )
378-
379- tracking_id = _send_ppr (cbc_service , file )
380- file .close ()
381- return _check_cbc_task_status (cbc_service , tracking_id )
382-
383-
384398TASK_PER_TYPE = {
385399 TaskTypesChoices .product_setup : check_and_update_product ,
386400 TaskTypesChoices .apply_and_delegate : apply_ppr_and_delegate_to_marketplaces ,
@@ -414,10 +428,12 @@ def execute_tasks(db, config, tasks, connect_client, logger):
414428 connect_client = connect_client ,
415429 marketplace = task .marketplace ,
416430 db = db ,
431+ logger = logger ,
417432 )
418433 task .status = TasksStatusChoices .done
419434
420435 except TaskException as ex :
436+ logger .error (f'Task ID: { task .id } - { ex } ' )
421437 was_succesfull = False
422438 task .error_message = str (ex )[:4000 ]
423439 except Exception as ex :
0 commit comments