sbt-idp/cope2n-api/fwd_api/celery_worker/process_result_tasks.py

361 lines
12 KiB
Python
Raw Normal View History

2023-11-30 11:19:06 +00:00
from fwd_api.celery_worker.worker import app
from fwd_api.models import SubscriptionRequest
2023-12-08 12:49:00 +00:00
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
2023-11-30 11:19:06 +00:00
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:
2023-12-08 12:49:00 +00:00
page_index = int(rq_id.split("_sub_")[1])
rq_id = rq_id.split("_sub_")[0]
2023-11-30 11:19:06 +00:00
rq: SubscriptionRequest = \
SubscriptionRequest.objects.filter(request_id=rq_id, process_type=ProcessType.SBT_INVOICE.value)[0]
2023-12-08 12:49:00 +00:00
# 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
2023-11-30 11:19:06 +00:00
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"