From 63aa41cd9f866d97b3550c2e9bfbc8e398dd51a0 Mon Sep 17 00:00:00 2001 From: daovietanh99 Date: Thu, 22 Feb 2024 09:06:41 +0700 Subject: [PATCH 1/6] refactor code --- cope2n-api/fwd_api/api/accuracy_view.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/cope2n-api/fwd_api/api/accuracy_view.py b/cope2n-api/fwd_api/api/accuracy_view.py index 8f7c798..d769f5a 100644 --- a/cope2n-api/fwd_api/api/accuracy_view.py +++ b/cope2n-api/fwd_api/api/accuracy_view.py @@ -341,7 +341,7 @@ class AccuracyViewSet(viewsets.ViewSet): location=OpenApiParameter.QUERY, description='Start date (YYYY-mm-DDTHH:MM:SSZ)', type=OpenApiTypes.DATE, - default='2023-01-02T00:00:00+0700', + default='2024-01-02T00:00:00+0700', ), OpenApiParameter( name='end_date', @@ -546,8 +546,6 @@ class AccuracyViewSet(viewsets.ViewSet): return response return JsonResponse({'error': 'Invalid request method.'}, status=405) -class RequestViewSet(viewsets.ViewSet): - lookup_field = "username" @extend_schema( request={ @@ -562,7 +560,7 @@ class RequestViewSet(viewsets.ViewSet): }, }, responses=None, - tags=['Request'] + tags=['Accuracy'] ) @action(detail=False, url_path=r"request/(?P[\w\-]+)", methods=["GET", "POST"]) def get_subscription_request(self, request, request_id=None): From 1bd7f6c81e33927688f1ac15f607067f05ab73ac Mon Sep 17 00:00:00 2001 From: daovietanh99 Date: Thu, 22 Feb 2024 09:18:13 +0700 Subject: [PATCH 2/6] UPDATE: add request id field to review object --- cope2n-api/fwd_api/api/accuracy_view.py | 1 + 1 file changed, 1 insertion(+) diff --git a/cope2n-api/fwd_api/api/accuracy_view.py b/cope2n-api/fwd_api/api/accuracy_view.py index d769f5a..890c515 100644 --- a/cope2n-api/fwd_api/api/accuracy_view.py +++ b/cope2n-api/fwd_api/api/accuracy_view.py @@ -679,6 +679,7 @@ class AccuracyViewSet(viewsets.ViewSet): for field in ['retailername', 'sold_to_party', 'purchase_date', 'imei_number']: if not field in reviewed_result.keys(): raise RequiredFieldException(excArgs=f'reviewed_result.{field}') + reviewed_result['request_id'] = request_id for subscription_request_file in subscription_request_files: if subscription_request_file.doc_type == 'invoice': From 3749cf83a8a54b591dcb7894aa33144e698470fc Mon Sep 17 00:00:00 2001 From: daovietanh99 Date: Thu, 22 Feb 2024 09:36:45 +0700 Subject: [PATCH 3/6] FIX: check the imei number array length --- cope2n-api/fwd_api/api/accuracy_view.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cope2n-api/fwd_api/api/accuracy_view.py b/cope2n-api/fwd_api/api/accuracy_view.py index 890c515..fe119f4 100644 --- a/cope2n-api/fwd_api/api/accuracy_view.py +++ b/cope2n-api/fwd_api/api/accuracy_view.py @@ -686,7 +686,13 @@ class AccuracyViewSet(viewsets.ViewSet): subscription_request_file.reviewed_result = reviewed_result subscription_request_file.reviewed_result['imei_number'] = [] elif subscription_request_file.doc_type == 'imei': - subscription_request_file.reviewed_result = {"retailername": None, "sold_to_party": None, "purchase_date": [], "imei_number": [reviewed_result["imei_number"][subscription_request_file.index_in_request]]} + subscription_request_file.reviewed_result = { + "retailername": None, + "sold_to_party": None, + "purchase_date": [], + "imei_number": []} + if len(reviewed_result["imei_number"]) - 1 >= subscription_request_file.index_in_request: + subscription_request_file.reviewed_result["imei_number"] = reviewed_result["imei_number"][subscription_request_file.index_in_request] subscription_request_file.save() subscription_request.reviewed_result = reviewed_result From f88afa54445d420e0107083698b28ff2b16f521e Mon Sep 17 00:00:00 2001 From: daovietanh99 Date: Thu, 22 Feb 2024 09:42:27 +0700 Subject: [PATCH 4/6] FIX: remove view --- cope2n-api/fwd_api/api_router.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cope2n-api/fwd_api/api_router.py b/cope2n-api/fwd_api/api_router.py index 322cc20..9a466dc 100755 --- a/cope2n-api/fwd_api/api_router.py +++ b/cope2n-api/fwd_api/api_router.py @@ -2,7 +2,7 @@ from django.conf import settings from rest_framework.routers import DefaultRouter, SimpleRouter from fwd_api.api.ctel_view import CtelViewSet -from fwd_api.api.accuracy_view import AccuracyViewSet, RequestViewSet +from fwd_api.api.accuracy_view import AccuracyViewSet from fwd_api.api.ctel_user_view import CtelUserViewSet @@ -16,7 +16,6 @@ else: router.register("ctel", CtelViewSet, basename="CtelAPI") router.register("ctel", CtelUserViewSet, basename="CtelUserAPI") router.register("ctel", AccuracyViewSet, basename="AccuracyAPI") -router.register("ctel", RequestViewSet, basename="RequestAPI") app_name = "api" urlpatterns = router.urls From d156c1d937b2d84384ac28edf768b8ce015f7f04 Mon Sep 17 00:00:00 2001 From: daovietanh99 Date: Thu, 22 Feb 2024 10:42:04 +0700 Subject: [PATCH 5/6] FIX: check invalid --- cope2n-api/fwd_api/api/accuracy_view.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/cope2n-api/fwd_api/api/accuracy_view.py b/cope2n-api/fwd_api/api/accuracy_view.py index fe119f4..4da0c0b 100644 --- a/cope2n-api/fwd_api/api/accuracy_view.py +++ b/cope2n-api/fwd_api/api/accuracy_view.py @@ -675,7 +675,10 @@ class AccuracyViewSet(viewsets.ViewSet): subscription_request_files = SubscriptionRequestFile.objects.filter(request=subscription_request.id) - reviewed_result = json.loads(data["reviewed_result"]) + if not data["reviewed_result"]: + raise InvalidException(excArgs=f'reviewed_result') + + reviewed_result = data["reviewed_result"] for field in ['retailername', 'sold_to_party', 'purchase_date', 'imei_number']: if not field in reviewed_result.keys(): raise RequiredFieldException(excArgs=f'reviewed_result.{field}') From 683ad1bec566c232bd7ca0d0bdb7be607a16643a Mon Sep 17 00:00:00 2001 From: daovietanh99 Date: Thu, 22 Feb 2024 14:53:33 +0700 Subject: [PATCH 6/6] FIX: fix request api --- cope2n-api/fwd_api/api/accuracy_view.py | 68 +++++++++++++++++++++---- cope2n-api/fwd_api/utils/accuracy.py | 2 + 2 files changed, 59 insertions(+), 11 deletions(-) diff --git a/cope2n-api/fwd_api/api/accuracy_view.py b/cope2n-api/fwd_api/api/accuracy_view.py index 4da0c0b..f0498cd 100644 --- a/cope2n-api/fwd_api/api/accuracy_view.py +++ b/cope2n-api/fwd_api/api/accuracy_view.py @@ -112,6 +112,7 @@ class AccuracyViewSet(viewsets.ViewSet): try: start_date = timezone.datetime.strptime(start_date_str, '%Y-%m-%d') # We care only about day precision only end_date = timezone.datetime.strptime(end_date_str, '%Y-%m-%d') + end_date = end_date + timezone.timedelta(days=1) # Round: # end_date_str to the beginning of the next day # start_date_str to the start of the date @@ -119,7 +120,7 @@ class AccuracyViewSet(viewsets.ViewSet): end_date = timezone.make_aware(end_date) start_date_str = start_date.strftime('%Y-%m-%dT%H:%M:%S%z') # inside logic will include second precision with timezone for calculation - end_date_str = (end_date + timezone.timedelta(days=1)).strftime('%Y-%m-%dT%H:%M:%S%z') + end_date_str = end_date.strftime('%Y-%m-%dT%H:%M:%S%z') base_query &= Q(created_at__range=(start_date, end_date)) except Exception as e: raise InvalidException(excArgs="Date format") @@ -128,15 +129,13 @@ class AccuracyViewSet(viewsets.ViewSet): base_query &= Q(request_id=request_id) if redemption_id: base_query &= Q(redemption_id=redemption_id) - base_query &= Q(is_test_request=False) if isinstance(include_test, str): include_test = True if include_test=="true" else False - if include_test: - # base_query = ~base_query - base_query.children = base_query.children[:-1] + if not include_test: + base_query &= Q(is_test_request=False) elif isinstance(include_test, bool): - if include_test: - base_query = ~base_query + if not include_test: + base_query &= Q(is_test_request=False) if isinstance(is_reviewed, str): if is_reviewed == "reviewed": base_query &= Q(is_reviewed=True) @@ -675,7 +674,7 @@ class AccuracyViewSet(viewsets.ViewSet): subscription_request_files = SubscriptionRequestFile.objects.filter(request=subscription_request.id) - if not data["reviewed_result"]: + if "reviewed_result" not in data: raise InvalidException(excArgs=f'reviewed_result') reviewed_result = data["reviewed_result"] @@ -690,9 +689,9 @@ class AccuracyViewSet(viewsets.ViewSet): subscription_request_file.reviewed_result['imei_number'] = [] elif subscription_request_file.doc_type == 'imei': subscription_request_file.reviewed_result = { - "retailername": None, - "sold_to_party": None, - "purchase_date": [], + "retailername": None, + "sold_to_party": None, + "purchase_date": [], "imei_number": []} if len(reviewed_result["imei_number"]) - 1 >= subscription_request_file.index_in_request: subscription_request_file.reviewed_result["imei_number"] = reviewed_result["imei_number"][subscription_request_file.index_in_request] @@ -706,3 +705,50 @@ class AccuracyViewSet(viewsets.ViewSet): return JsonResponse({'message': 'success.'}, status=200) else: return JsonResponse({'error': 'Invalid request method.'}, status=405) + + @extend_schema( + request={ + 'multipart/form-data': { + 'type': 'object', + 'properties': { + 'reason': { + 'type': 'string', + 'default': '''"Sample reason"''', + }, + }, + }, + }, + responses=None, + tags=['Accuracy'] + ) + @action(detail=False, url_path=r"request_image/(?P[\w\-]+)/(?P[\w\-]+)", methods=["POST"]) + def request_image(self, request, request_id=None, request_image_id=None): + if request.method == 'POST': + data = request.data + + base_query = Q(request_id=request_id) + + subscription_request = SubscriptionRequest.objects.filter(base_query) + + if subscription_request.count() == 0: + raise NotFoundException(excArgs=request_id) + + subscription_request = subscription_request.first() + + subscription_request_files = SubscriptionRequestFile.objects.filter(request=subscription_request.id) + + if "reason" not in data: + raise InvalidException(excArgs=f'reason') + + reason = data["reason"] + + is_available = False + for subscription_request_file in subscription_request_files: + if subscription_request_file.file_name.split(".")[0] == request_image_id: + subscription_request_file.reason = reason + subscription_request_file.save() + is_available = True + if not is_available: + raise NotFoundException(excArgs=request_id + "/" + request_image_id) + else: + return JsonResponse({'error': 'Invalid request method.'}, status=405) diff --git a/cope2n-api/fwd_api/utils/accuracy.py b/cope2n-api/fwd_api/utils/accuracy.py index 36a1e27..1e8016d 100644 --- a/cope2n-api/fwd_api/utils/accuracy.py +++ b/cope2n-api/fwd_api/utils/accuracy.py @@ -615,6 +615,8 @@ def predict_result_to_ready(result): "sold_to_party": "", "purchase_date": [], "imei_number": [],} + if not result: + return dict_result dict_result["retailername"] = result.get("content", {}).get("document", [{}])[0].get("content", [{}])[0].get("value", None) dict_result["sold_to_party"] = result.get("content", {}).get("document", [{}])[0].get("content", [{}, {}])[1].get("value", None) dict_result["purchase_date"] = result.get("content", {}).get("document", [{}])[0].get("content", [{}, {}, {}])[2].get("value", [])