Exemple #1
0
    def test_request_complaint_search(self, requests):
        complaint_pretty_id = "TEST-PRETTY-ID"

        url = get_cdb_complaint_search_url(complaint_pretty_id)
        headers = get_cdb_request_headers(authorization=True)
        timeout = (CONNECT_TIMEOUT, READ_TIMEOUT)

        result = request_cdb_complaint_search(complaint_pretty_id)

        self.assertEqual(result, requests.get.return_value)

        requests.get.assert_called_once_with(url,
                                             headers=headers,
                                             timeout=timeout,
                                             cookies=None)
Exemple #2
0
    def test_request_complaint_search_with_optional_args(self, requests):
        complaint_pretty_id = "TEST-PRETTY-ID"
        client_request_id = "test-client-req-id"
        host = "https://test.host"
        cookies = {"test_cookie_name": "test_cookie_value"}

        url = get_cdb_complaint_search_url(complaint_pretty_id)
        headers = get_cdb_request_headers(client_request_id=client_request_id,
                                          authorization=True)
        timeout = (CONNECT_TIMEOUT, READ_TIMEOUT)

        result = request_cdb_complaint_search(
            complaint_pretty_id,
            client_request_id=client_request_id,
            cookies=cookies,
        )

        self.assertEqual(result, requests.get.return_value)

        requests.get.assert_called_once_with(url,
                                             headers=headers,
                                             timeout=timeout,
                                             cookies=cookies)
Exemple #3
0
    def post(self):
        """
        Receive a payment link.
        """
        data = marshal(api.payload, model_checkout, skip_none=True)
        description = data.get("description", "")
        extra = {"PAYMENT_DESCRIPTION": description}
        logger.info("Payment checkout requested.", extra=extra)
        payment_data = dict(description=description)
        server_id = request.headers.get("X-Server-ID")
        try:
            payment_params = get_payment_params(description)
            if not payment_params:
                raise PaymentInvalidHTTPException()

            complaint_pretty_id = payment_params.get("complaint")
            cookies = {
                "SERVER_ID": server_id
            } if server_id else request_cdb_cookies()

            response = request_cdb_complaint_search(complaint_pretty_id,
                                                    cookies=cookies)
            if response.status_code == 412:
                raise ProzorroApiPreconditionFailedHTTPException()
            if response.status_code != 200:
                raise PaymentComplaintNotFoundHTTPException()

            search_complaints_data = response.json()["data"]
            if len(search_complaints_data) == 0:
                raise PaymentComplaintNotFoundHTTPException()

            search_complaint_data = search_complaints_data[0]
            if not check_complaint_code(search_complaint_data, payment_params):
                raise PaymentComplaintInvalidCodeHTTPException()

            complaint_params = search_complaint_data.get("params", {})
            tender_id = complaint_params.get("tender_id")
            item_type = complaint_params.get("item_type")
            item_id = complaint_params.get("item_id")
            complaint_id = complaint_params.get("complaint_id")

            response = request_cdb_complaint_data(tender_id=tender_id,
                                                  item_type=item_type,
                                                  item_id=item_id,
                                                  complaint_id=complaint_id,
                                                  cookies=cookies)
            if response.status_code == 412:
                raise ProzorroApiPreconditionFailedHTTPException()
            if response.status_code != 200:
                raise PaymentComplaintNotFoundHTTPException()

            complaint_data = response.json()["data"]

            if not check_complaint_status(complaint_data):
                raise PaymentComplaintInvalidStatusHTTPException()
            if not check_complaint_value(complaint_data):
                raise PaymentComplaintInvalidValueHTTPException()

        except (Timeout, ConnectionError):
            abort(code=HTTPStatus.SERVICE_UNAVAILABLE)
        else:
            sandbox = parser_query.parse_args().get("sandbox")
            params = generate_liqpay_checkout_params(data,
                                                     payment_params,
                                                     complaint_data,
                                                     sandbox=sandbox)
            try:
                resp_json = liqpay_request_data(data=params, sandbox=sandbox)
            except (Timeout, ConnectionError):
                logger.warning("Liqpay api request failed.", extra=extra)
                abort(code=HTTPStatus.SERVICE_UNAVAILABLE)
            else:
                if not resp_json:
                    raise LiqpayResponseErrorHTTPException()
                if resp_json.get("result") != "ok":
                    raise LiqpayResponseErrorHTTPException(
                        liqpay_err_description=resp_json.get("err_code"))
                return {
                    "url_checkout": resp_json.get("url_checkout"),
                    "order_id": params.get("order_id")
                }
Exemple #4
0
def process_payment_complaint_search(self,
                                     payment_data,
                                     payment_params,
                                     cookies=None,
                                     *args,
                                     **kwargs):
    complaint_pretty_id = payment_params.get("complaint")
    client_request_id = uuid4().hex
    try:
        response = request_cdb_complaint_search(
            complaint_pretty_id,
            client_request_id=client_request_id,
            cookies=cookies,
        )
    except RETRY_REQUESTS_EXCEPTIONS as exc:
        countdown = get_exponential_request_retry_countdown(self)
        logger.exception("Request failed: {}, next retry in {} seconds".format(
            str(exc), countdown),
                         payment_data=payment_data,
                         task=self,
                         extra={
                             "MESSAGE_ID": PAYMENTS_SEARCH_EXCEPTION,
                             "CDB_CLIENT_REQUEST_ID": client_request_id,
                         })
        raise self.retry(countdown=countdown, exc=exc)

    cookies = cookies or {}
    cookies.update(response.cookies.get_dict())

    if response.status_code != 200:
        logger.warning(
            "Unexpected status code {} while searching complaint {}".format(
                response.status_code, complaint_pretty_id),
            payment_data=payment_data,
            task=self,
            extra={
                "MESSAGE_ID": PAYMENTS_SEARCH_CODE_ERROR,
                "STATUS_CODE": response.status_code,
            })
        if response.status_code == 412:
            raise self.retry(countdown=0,
                             kwargs=dict(
                                 payment_data=payment_data,
                                 payment_params=payment_params,
                                 cookies=cookies,
                             ))
        countdown = get_exponential_request_retry_countdown(self, response)
        raise self.retry(countdown=countdown)

    search_complaints_data = response.json()["data"]

    if len(search_complaints_data) == 0:
        logger.warning(
            "Invalid payment complaint {}".format(complaint_pretty_id),
            payment_data=payment_data,
            task=self,
            extra={"MESSAGE_ID": PAYMENTS_SEARCH_FAILED})
        if self.request.retries >= COMPLAINT_NOT_FOUND_MAX_RETRIES:
            logger.warning(
                "Invalid payment complaint {}".format(complaint_pretty_id),
                payment_data=payment_data,
                task=self,
                extra={"MESSAGE_ID": PAYMENTS_SEARCH_INVALID_COMPLAINT})
            return
        countdown = get_exponential_request_retry_countdown(self)
        raise self.retry(countdown=countdown)

    search_complaint_data = search_complaints_data[0]

    complaint_params = search_complaint_data.get("params")

    try:
        set_payment_params(payment_data, complaint_params)
    except PyMongoError as exc:
        countdown = get_exponential_request_retry_countdown(self)
        raise self.retry(countdown=countdown, exc=exc)

    logger.info("Successfully found complaint {}".format(complaint_pretty_id),
                payment_data=payment_data,
                task=self,
                extra={"MESSAGE_ID": PAYMENTS_SEARCH_SUCCESS})

    if not check_complaint_code(search_complaint_data, payment_params):
        logger.info(
            "Invalid payment code {} while searching complaint {}".format(
                payment_params.get("code"), complaint_pretty_id),
            payment_data=payment_data,
            task=self,
            extra={"MESSAGE_ID": PAYMENTS_SEARCH_INVALID_CODE})
        return

    logger.info("Successfully matched payment code {} for complaint {}".format(
        payment_params.get("code"), complaint_pretty_id),
                payment_data=payment_data,
                task=self,
                extra={"MESSAGE_ID": PAYMENTS_SEARCH_VALID_CODE})

    process_payment_complaint_data.apply_async(
        kwargs=dict(complaint_params=complaint_params,
                    payment_data=payment_data,
                    cookies=cookies))
Exemple #5
0
def request_search():
    return request_cdb_complaint_search("health")