import traceback import time import uuid from fwd_api.celery_worker.worker import app from fwd_api.models import SubscriptionRequest from django.utils.crypto import get_random_string from fwd_api.exception.exceptions import InvalidException def aggregate_result(src_result, des_result, doc_type): if src_result["status"] != 200: return src_result if not des_result: return src_result des_result["content"]["total_pages"] += 1 des_result["content"]["ocr_num_pages"] += 1 des_result["content"]["document"][0]["end_page"] += 1 if doc_type == "imei": des_result["content"]["document"][0]["content"][3]["value"] += src_result["content"]["document"][0]["content"][3]["value"] elif doc_type == "invoice": des_result["content"]["document"][0]["content"][0]["value"] = src_result["content"]["document"][0]["content"][0]["value"] des_result["content"]["document"][0]["content"][1]["value"] = src_result["content"]["document"][0]["content"][1]["value"] des_result["content"]["document"][0]["content"][2]["value"] += src_result["content"]["document"][0]["content"][2]["value"] elif doc_type == "all": des_result.update(src_result) else: raise InvalidException(f"doc_type: {doc_type}") return des_result def print_id(rq_id): print(" [x] Received {rq}".format(rq=rq_id)) def to_status(result): print('X') if 'status' in result and result['status'] not in [200, 201, 202]: return 4 return 3 def update_user(rq: SubscriptionRequest): sub = rq.subscription predict_status = rq.status if predict_status == 3: from fwd_api.utils import ProcessUtil sub.current_token += ProcessUtil.token_value(int(rq.process_type)) sub.save() @app.task(name='process_sap_invoice_result') def process_invoice_sap_result(rq_id, result): from fwd_api.models import SubscriptionRequest from fwd_api.constant.common import ProcessType print_id(rq_id) try: rq: SubscriptionRequest = \ SubscriptionRequest.objects.filter(request_id=rq_id, process_type=ProcessType.INVOICE.value)[0] status = to_status(result) rq.predict_result = result rq.status = status rq.save() update_user(rq) except IndexError as e: print(e) print("NotFound request by requestId, %d", rq_id) except Exception as e: print(e) print("Fail Invoice %d", rq_id) return "FailInvoice" @app.task(name='process_fi_invoice_result') def process_invoice_fi_result(rq_id, result): from fwd_api.models import SubscriptionRequest from fwd_api.constant.common import ProcessType print_id(rq_id) print(result) try: rq: SubscriptionRequest = \ SubscriptionRequest.objects.filter(request_id=rq_id, process_type=ProcessType.FI_INVOICE.value)[0] status = to_status(result) rq.predict_result = result rq.status = status rq.save() update_user(rq) except IndexError as e: print(e) print("NotFound request by requestId, %d", rq_id) except Exception as e: print(e) print("Fail Invoice %d", rq_id) return "FailInvoice" @app.task(name='process_manulife_invoice_result') def process_invoice_manulife_result(rq_id, result): from fwd_api.models import SubscriptionRequest from fwd_api.constant.common import ProcessType print_id(f"[DEBUG]: Received manulife request with id {rq_id}") try: rq: SubscriptionRequest = \ SubscriptionRequest.objects.filter(request_id=rq_id, process_type=ProcessType.MANULIFE_INVOICE.value)[0] status = to_status(result) rq.predict_result = result rq.status = status rq.save() update_user(rq) except IndexError as e: print(e) print("NotFound request by requestId, %d", rq_id) except Exception as e: print(e) print("Fail Invoice %d", rq_id) return "FailInvoice" @app.task(name='process_sbt_invoice_result') def process_invoice_sbt_result(rq_id, result): from fwd_api.models import SubscriptionRequest from fwd_api.constant.common import ProcessType print_id(f"[DEBUG]: Received SBT request with id {rq_id}") print_id(f"[DEBUG]: result: {result}") try: page_index = int(rq_id.split("_sub_")[1]) rq_id = rq_id.split("_sub_")[0] rq: SubscriptionRequest = \ SubscriptionRequest.objects.filter(request_id=rq_id, process_type=ProcessType.SBT_INVOICE.value)[0] # status = to_status(result) status = result.get("status", 200) rq.pages_left = rq.pages_left - 1 done = rq.pages_left <= 0 # aggregate results from multiple pages rq.predict_result = aggregate_result(result, rq.predict_result, rq.doc_type.split(",")[page_index]) print_id(f"[DEBUG]: status: {status}") if status == 200: if not done: rq.status = 100 # continue else: rq.status = 200 # stop waiting else: rq.status = 404 # stop waiting rq.save() update_user(rq) except IndexError as e: print(e) print("NotFound request by requestId, %d", rq_id) except Exception as e: print(e) print("Fail Invoice %d", rq_id) return "FailInvoice" # @app.task(name='process_id_result', queue='id_card_rs') # def process_id_result(rq_id, result): # from fwd_api.models import SubscriptionRequest # from fwd_api.constant.common import ProcessType # from fwd_api.models import SubscriptionRequestFile # from fwd_api.constant.common import FileCategory # print_id(rq_id) # try: # s_time = time.time() # print("Start") # j_time = time.time() # print("Json {}".format(j_time - s_time)) # rq: SubscriptionRequest = \ # SubscriptionRequest.objects.filter(request_id=rq_id, process_type=ProcessType.ID_CARD.value)[0] # if 'content' in result and 'pages' in result['content']: # pages = result['content']['pages'] # if isinstance(pages, list): # new_pages = [] # for idx, page in enumerate(pages): # if 'path_image_croped' in page: # img_name = f'crop_{idx}_{get_random_string(3)}.jpg' # path = page['path_image_croped'] # rq_file: SubscriptionRequestFile = SubscriptionRequestFile(file_name=img_name, request=rq, # file_category=FileCategory.CROP.value, # file_path=path, # code=f'IDC{uuid.uuid4().hex}') # rq_file.save() # page['path_image_croped'] = rq_file.code # l_time = time.time() # print("Save {}".format(l_time - j_time)) # status = to_status(result) # rq.predict_result = result # rq.status = status # rq.save() # update_user(rq) # e_time = time.time() # print("End {}".format(e_time - l_time)) # except IndexError as e: # traceback.format_exc() # print(e) # except Exception as e: # traceback.format_exc() # print(e) # print("Fail ID %d", rq_id) # return "Fail" # return "Success" # @app.task(name='process_driver_license_result') # def process_driver_license_result(rq_id, result): # from fwd_api.models import SubscriptionRequest # from fwd_api.models import SubscriptionRequestFile # from fwd_api.constant.common import FileCategory # from fwd_api.constant.common import ProcessType # print_id(rq_id) # try: # rq: SubscriptionRequest = \ # SubscriptionRequest.objects.filter(request_id=rq_id, process_type=ProcessType.DRIVER_LICENSE.value)[0] # if 'content' in result and 'pages' in result['content']: # pages = result['content']['pages'] # if isinstance(pages, list): # new_pages = [] # for idx, page in enumerate(pages): # if 'path_image_croped' in page: # img_name = f'crop_{idx}_{get_random_string(3)}.jpg' # path = page['path_image_croped'] # rq_file: SubscriptionRequestFile = SubscriptionRequestFile(file_name=img_name, request=rq, # file_category=FileCategory.CROP.value, # file_path=path, # code=f'DLC{uuid.uuid4().hex}') # rq_file.save() # page['path_image_croped'] = rq_file.code # status = to_status(result) # rq.predict_result = result # rq.status = status # rq.save() # update_user(rq) # except IndexError as e: # print(e) # except Exception as e: # print(e) # print("Fail DL %d", rq_id) # return "Fail" # return "Success" # @app.task(name='process_invoice_result') # def process_invoice_result(rq_id, result): # from fwd_api.models import SubscriptionRequest # from fwd_api.constant.common import ProcessType # print_id(rq_id) # try: # rq: SubscriptionRequest = \ # SubscriptionRequest.objects.filter(request_id=rq_id, process_type=ProcessType.INVOICE.value) # print(rq) # rq: SubscriptionRequest = \ # SubscriptionRequest.objects.filter(request_id=rq_id, process_type=ProcessType.INVOICE.value)[0] # status = to_status(result) # rq.predict_result = result # rq.status = status # rq.save() # update_user(rq) # except IndexError as e: # print(e) # print("NotFound request by requestId, %d", rq_id) # except Exception as e: # print(e) # traceback.format_exc() # print("Fail Invoice %d", rq_id) # return "FailInvoice" # return "Success" # @app.task(name='process_ocr_with_box_result') # def process_ocr_with_box_result(rq_id, result): # from fwd_api.models import SubscriptionRequest # from fwd_api.constant.common import ProcessType # print_id(rq_id) # try: # rq: SubscriptionRequest = \ # SubscriptionRequest.objects.filter(request_id=rq_id, process_type=ProcessType.OCR_WITH_BOX.value)[0] # status = to_status(result) # rq.predict_result = result # rq.status = status # rq.save() # update_user(rq) # except IndexError as e: # traceback.format_exc() # print(e) # except Exception as e: # traceback.format_exc() # print(e) # print("Fail OCR %d", rq_id) # return "FailOCR" # return "Success" # @app.task(name='process_template_matching_result') # def template_matching_result(rq_id, result, align_img): # from fwd_api.models import SubscriptionRequest # from fwd_api.constant.common import ProcessType # from fwd_api.constant.common import FileCategory # from fwd_api.models import SubscriptionRequestFile # print_id(rq_id) # try: # rq: SubscriptionRequest = \ # SubscriptionRequest.objects.filter(request_id=rq_id, process_type=ProcessType.TEMPLATE_MATCHING.value)[0] # if align_img: # from fwd_api.constant.common import IMAGE_NAME # rq_file: SubscriptionRequestFile = SubscriptionRequestFile(file_name=IMAGE_NAME, request=rq, # file_category=FileCategory.CROP.value, # file_path=align_img) # rq_file.save() # status = to_status(result) # rq.predict_result = result # rq.status = status # rq.save() # update_user(rq) # except IndexError as e: # traceback.format_exc() # print(e) # except Exception as e: # traceback.format_exc() # print(e) # print("Fail Template %d", rq_id) # return "FailTemplate" # return "Success"