コード例 #1
0
def send_change_xml(self, contract_id, change_id):
    context = get_contract_context(self, contract_id)

    for change in context["contract"]["changes"]:
        if change["id"] == change_id:
            break
    else:
        return logger.critical(
            f"Scheduled sending change {change_id} that is not in the context")

    # building request
    prepare_documents(self, change)
    context["change"] = change
    document = render_change_xml(context)

    # save xml to db
    save_xml_template(self, contract_id, document, xml_was_changed=True)

    # sign document
    sign = sign_data(self, document)

    # sending request
    message_id = uuid4().hex
    send_request(self,
                 document,
                 sign=sign,
                 message_id=message_id,
                 method_name="PrChange")
    logger.info("Contract change sent",
                extra={
                    "MESSAGE_ID": "TREASURY_CONTRACT_CHANGE_SENT",
                    "CONTRACT_ID": contract_id,
                    "CHANGE_ID": change_id,
                    "REQUEST_ID": message_id
                })
コード例 #2
0
    def test_send_request_error(self):
        task = Mock(retry=RetryExc, max_retries=42)
        task.request.retries = 0

        session_mock = Mock(post=Mock(
            return_value=Mock(status_code=500, content=b"Internal error")))
        with patch("treasury.api_requests.Session", lambda: session_mock):
            with self.assertRaises(RetryExc):
                send_request(task,
                             b"",
                             sign=b"",
                             message_id=1,
                             method_name="GetRef")
コード例 #3
0
 def test_send_request_exception(self):
     task = Mock(retry=RetryExc)
     session_mock = Mock(post=Mock(side_effect=SSLError("Unsafe bla bla")))
     with patch("treasury.api_requests.Session", lambda: session_mock):
         with patch(
                 "treasury.api_requests.get_exponential_request_retry_countdown",
                 Mock()):
             with self.assertRaises(RetryExc):
                 send_request(task,
                              b"",
                              sign=b"",
                              message_id=1,
                              method_name="GetRef")
コード例 #4
0
    def test_send_request(self):
        task = Mock()
        xml = b"<tag>Hi</tag>"
        sign = b"<sign>"
        message_id = 123
        method_name = "GetRef"
        with open("treasury/tests/fixtures/send_request_response.xml",
                  "rb") as f:
            session_mock = Mock(post=Mock(
                return_value=Mock(status_code=200, content=f.read())))

        with patch("treasury.api_requests.prepare_request_data"
                   ) as prepare_data_mock:
            prepare_data_mock.return_value = "<request></request>"
            with patch("treasury.api_requests.Session", lambda: session_mock):
                result = send_request(task,
                                      xml,
                                      sign=sign,
                                      message_id=message_id,
                                      method_name=method_name)

        prepare_data_mock.assert_called_once_with(task, xml, sign, message_id,
                                                  method_name)
        session_mock.post.assert_called_once_with(
            TREASURY_WSDL_URL,
            data='<request></request>',
            timeout=(CONNECT_TIMEOUT, READ_TIMEOUT),
            headers={'content-type': 'text/xml'},
        )
        self.assertEqual(result, (0, None))
コード例 #5
0
def request_org_catalog(self):
    document = render_catalog_xml(dict(catalog_id="RefOrgs"))
    message_id = uuid4().hex

    # sign document
    sign = sign_data(self, document)

    # send request
    send_request(self,
                 document,
                 sign=sign,
                 message_id=message_id,
                 method_name="GetRef")

    expected_response_time = get_now() + timedelta(seconds=3 * 60)
    receive_org_catalog.apply_async(
        eta=expected_response_time,  # requests earlier return 500 status code
        kwargs=dict(message_id=message_id, ))
コード例 #6
0
    def test_send_request_unsuccessful_code(self):
        task = Mock(retry=RetryExc)
        task.request.retries = 0

        session_mock = Mock(post=Mock(
            return_value=Mock(status_code=200, content=b"<spam></spam>")))
        with patch("treasury.api_requests.TREASURY_SKIP_REQUEST_VERIFY", True):
            with patch("treasury.api_requests.Session", lambda: session_mock):
                with patch("treasury.api_requests.parse_request_response",
                           lambda _: (100, "Duplicate msg_id"
                                      )):  # this will cause retry, should it?
                    with self.assertRaises(RetryExc):
                        send_request(task,
                                     b"",
                                     sign=b"",
                                     message_id=1,
                                     method_name="GetRef")
        self.assertIs(session_mock.verify, False,
                      "TREASURY_SKIP_REQUEST_VERIFY is True")
コード例 #7
0
def send_transactions_results(self, transactions_statuses, transactions_data,
                              message_id):
    successful_trans_quantity = transactions_statuses.count(True)
    transactions_quantity = len(transactions_data)

    if successful_trans_quantity == 0:
        status_id = -1  # no records processed
    elif successful_trans_quantity < transactions_quantity:
        status_id = 1  # some records are successfully processed
    elif successful_trans_quantity == transactions_quantity:
        status_id = 0  # all records are successfully processed
    else:
        raise TransactionsQuantityServerErrorHTTPException()

    transactions_values_sum = float(
        sum([Decimal(str(trans['doc_sq'])) for trans in transactions_data]))

    xml_document = render_transactions_confirmation_xml(
        register_id=str(message_id),
        status_id=str(status_id),
        date=get_now().isoformat(),
        rec_count=str(successful_trans_quantity),
        reg_sum=str(transactions_values_sum))
    sign = sign_data(self, xml_document)
    # sending changes
    message_id = uuid4().hex

    first_contract_id = transactions_data[0]['id_contract']

    logger.info(
        f'ConfirmPRTrans requested data for {first_contract_id} contract: {xml_document}',
        extra={"MESSAGE_ID": "CONFIRM_PR_TRANS_REQUESTED_DATA"})
    send_request(self,
                 xml_document,
                 sign,
                 message_id,
                 method_name="ConfirmPRTrans")

    logger.info(
        f"PRTrans confirmation xml for {first_contract_id} contract has been successful sent",
        extra={"MESSAGE_ID": "CONFIRM_PR_TRANS_SUCCESS_STATUS"})
コード例 #8
0
def send_contract_xml(self, contract_id):
    """
    Gets all api data from prepared mongodb document
    Downloads the documents
    Builds the xml
    Sends the xml to the treasury api
    :param self:
    :param contract_id:
    :return:
    """
    context = get_contract_context(self, contract_id)
    # b64 encode documents
    prepare_documents(self, context["contract"])
    for change in context["contract"].get("changes", ""):
        prepare_documents(self, change)
    # building request
    document = render_contract_xml(context)

    # save xml to db
    save_xml_template(self, contract_id, document)

    # sign document
    sign = sign_data(
        self, document)  # TODO: get ready to increase READ_TIMEOUT inside

    # sending changes
    message_id = uuid4().hex
    send_request(self,
                 document,
                 sign=sign,
                 message_id=message_id,
                 method_name="PrContract")
    logger.info("Contract details sent",
                extra={
                    "MESSAGE_ID": "TREASURY_CONTRACT_SENT",
                    "CONTRACT_ID": contract_id,
                    "REQUEST_ID": message_id
                })