dana-python 2.0.0__tar.gz → 2.1.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {dana_python-2.0.0/dana_python.egg-info → dana_python-2.1.0}/PKG-INFO +1 -1
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/custom_validation.py +78 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/rest.py +6 -1
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/open_api_header.py +33 -8
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/api/widget_api.py +65 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/enum.py +11 -2
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/account_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/account_unbinding_request.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/account_unbinding_request_additional_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/account_unbinding_response.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/amount_detail.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_ott_request.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_ott_request_additional_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_ott_response.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_ott_response_user_resources_inner.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_token_authorization_code_request.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_token_refresh_token_request.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_token_response.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_token_response_additional_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_token_response_additional_info_user_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/balance_inquiry_request.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/balance_inquiry_request_additional_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/balance_inquiry_response.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/buyer.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/cancel_order_request.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/cancel_order_response.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/env_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/goods.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/international_order_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/international_order_info_exchange_rate.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/money.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/oauth2_url_data.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/oauth2_url_data_seamless_data.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/order.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/pay_option_detail.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/pay_option_detail_additional_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/pay_option_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/payment_promo_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/payment_view.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_payment_request.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_payment_response.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_payment_response_additional_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_user_profile_request.py +16 -7
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_user_profile_response.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_user_profile_response_response.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_user_profile_response_response_body.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_user_profile_response_response_head.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/refund_order_request.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/refund_order_request_additional_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/refund_order_response.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/refund_promo_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/result_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/seller.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/service_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/shipping_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/status_detail.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/time_detail.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/url_param.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/user_resource_info.py +12 -5
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/virtual_account_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/widget_payment_request.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/widget_payment_request_additional_info.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/widget_payment_response.py +10 -3
- {dana_python-2.0.0 → dana_python-2.1.0/dana_python.egg-info}/PKG-INFO +1 -1
- {dana_python-2.0.0 → dana_python-2.1.0}/pyproject.toml +1 -1
- {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_payment_gateway_api.py +84 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_widget_with_automation.py +180 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/LICENSE +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/README.md +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/api_client.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/api_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/base/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/base/configuration.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/base/model.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/base/types.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/api/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/api/disbursement_api.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/enum.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/bank_account_inquiry_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/bank_account_inquiry_request_additional_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/bank_account_inquiry_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/bank_account_inquiry_response_additional_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/dana_account_inquiry_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/dana_account_inquiry_request_additional_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/dana_account_inquiry_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/money.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_bank_inquiry_status_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_bank_inquiry_status_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_bank_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_bank_request_additional_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_bank_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_dana_inquiry_status_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_dana_inquiry_status_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_dana_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_dana_request_additional_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_dana_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/exceptions.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/api/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/api/merchant_management_api.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/enum.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/address_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/business_docs.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_division_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_division_request_ext_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_division_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_division_response_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_division_response_response_body.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_division_response_response_head.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_shop_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_shop_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_shop_response_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_shop_response_response_body.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_shop_response_response_head.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/division_resource_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/merchant_resource_information.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/mobile_no_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/pic_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_division_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_division_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_division_response_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_division_response_response_body.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_division_response_response_head.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_merchant_resource_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_merchant_resource_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_merchant_resource_response_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_merchant_resource_response_response_body.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_merchant_resource_response_response_head.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_shop_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_shop_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_shop_response_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_shop_response_response_body.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_shop_response_response_head.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/result_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/shop_resource_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_division_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_division_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_division_response_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_division_response_response_body.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_division_response_response_head.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_shop_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_shop_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_shop_response_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_shop_response_response_head.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/user_name.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/api/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/api/payment_gateway_api.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/enum.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/actor_context.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/amount_detail.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/audit_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/buyer.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/cancel_order_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/cancel_order_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/consult_pay_payment_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/consult_pay_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/consult_pay_request_additional_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/consult_pay_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/create_order_by_api_additional_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/create_order_by_api_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/create_order_by_redirect_additional_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/create_order_by_redirect_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/create_order_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/create_order_response_additional_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/env_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/goods.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/money.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/order_api_object.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/order_redirect_object.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/pay_option_additional_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/pay_option_detail.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/pay_option_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/payment_view.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/promo_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/query_payment_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/query_payment_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/query_payment_response_additional_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/refund_option_bill.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/refund_order_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/refund_order_request_additional_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/refund_order_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/seller.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/shipping_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/status_detail.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/time_detail.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/url_param.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/virtual_account_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/date_validation.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/models.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/open_api_configuration.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/script.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/snap_configuration.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/snap_header.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/url.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/finish_notify_payment_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/finish_notify_request.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/finish_notify_request_additional_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/finish_notify_response.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/money.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/pay_option_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/shop_info.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/webhook.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/api/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/custom_validation.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/__init__.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/util.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana_python.egg-info/SOURCES.txt +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana_python.egg-info/dependency_links.txt +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana_python.egg-info/requires.txt +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/dana_python.egg-info/top_level.txt +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/setup.cfg +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_disbursement_api.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_merchant_management_api.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_payment_gateway_with_automation.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_snap_header.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_webhook.py +0 -0
- {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_widget_api.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dana-python
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.1.0
|
|
4
4
|
Summary: API Client (SDK) for DANA APIs based on https://dashboard.dana.id/api-docs
|
|
5
5
|
Author-email: DANA Package Manager <package-manager@dana.id>
|
|
6
6
|
Maintainer-email: DANA Package Manager <package-manager@dana.id>
|
|
@@ -19,6 +19,7 @@ This module provides custom validation functions for Payment Gateway API request
|
|
|
19
19
|
Validations are registered in the validation_registry and executed via custom_validation().
|
|
20
20
|
"""
|
|
21
21
|
|
|
22
|
+
import os
|
|
22
23
|
import re
|
|
23
24
|
from typing import Any, Dict, List, Callable
|
|
24
25
|
from dana.utils.date_validation import validate_valid_up_to_date
|
|
@@ -27,6 +28,36 @@ from dana.exceptions import ApiException
|
|
|
27
28
|
# Money value pattern: digits (1-16) + "." + exactly 2 digits (e.g. 10000.00)
|
|
28
29
|
MONEY_VALUE_PATTERN = re.compile(r'^\d{1,16}\.\d{2}$')
|
|
29
30
|
|
|
31
|
+
# In sandbox, only these payMethods are available (Payment Gateway).
|
|
32
|
+
SANDBOX_ALLOWED_PAY_METHODS = frozenset({
|
|
33
|
+
'BALANCE', 'CREDIT_CARD', 'DEBIT_CARD', 'VIRTUAL_ACCOUNT', 'NETWORK_PAY',
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
# In sandbox, only these payOptions are available (Payment Gateway).
|
|
37
|
+
# API may send full identifiers (e.g. VIRTUAL_ACCOUNT_BRI); we accept exact match or suffix _OPTION.
|
|
38
|
+
SANDBOX_ALLOWED_PAY_OPTIONS = frozenset({
|
|
39
|
+
'CARD', 'QRIS', 'BRI', 'PANIN', 'CIMB', 'MANDIRI', 'BTPN',
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
def _is_sandbox() -> bool:
|
|
44
|
+
"""Return True if current environment is sandbox (DANA_ENV or ENV)."""
|
|
45
|
+
env = os.getenv('DANA_ENV', os.getenv('ENV', 'sandbox')).lower()
|
|
46
|
+
return env == 'sandbox'
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
def _pay_option_allowed_in_sandbox(value: str) -> bool:
|
|
50
|
+
"""Check if payOption value is allowed in sandbox (exact or suffix match, e.g. VIRTUAL_ACCOUNT_BRI)."""
|
|
51
|
+
if not value or not str(value).strip():
|
|
52
|
+
return False
|
|
53
|
+
s = str(value).strip()
|
|
54
|
+
if s in SANDBOX_ALLOWED_PAY_OPTIONS:
|
|
55
|
+
return True
|
|
56
|
+
for opt in SANDBOX_ALLOWED_PAY_OPTIONS:
|
|
57
|
+
if s.endswith('_' + opt):
|
|
58
|
+
return True
|
|
59
|
+
return False
|
|
60
|
+
|
|
30
61
|
|
|
31
62
|
def validate_additional_info_required(request: Any) -> None:
|
|
32
63
|
"""
|
|
@@ -137,6 +168,50 @@ def validate_external_store_id_for_qris(request: Any) -> None:
|
|
|
137
168
|
)
|
|
138
169
|
|
|
139
170
|
|
|
171
|
+
def validate_sandbox_pay_method_and_pay_option(request: Any) -> None:
|
|
172
|
+
"""
|
|
173
|
+
In sandbox, only certain payMethod and payOption values are available.
|
|
174
|
+
|
|
175
|
+
- payMethod: only BALANCE, CREDIT_CARD, DEBIT_CARD, VIRTUAL_ACCOUNT, NETWORK_PAY.
|
|
176
|
+
- payOption: only CARD, QRIS, BRI, PANIN, CIMB, MANDIRI, BTPN (exact or suffix, e.g. VIRTUAL_ACCOUNT_BRI).
|
|
177
|
+
|
|
178
|
+
Skipped when not in sandbox (DANA_ENV / ENV != sandbox).
|
|
179
|
+
|
|
180
|
+
Raises:
|
|
181
|
+
ApiException: If in sandbox and a payMethod or payOption is not allowed.
|
|
182
|
+
"""
|
|
183
|
+
if request is None or not _is_sandbox():
|
|
184
|
+
return
|
|
185
|
+
if not hasattr(request, 'pay_option_details') or request.pay_option_details is None:
|
|
186
|
+
return
|
|
187
|
+
if not isinstance(request.pay_option_details, list):
|
|
188
|
+
return
|
|
189
|
+
for idx, detail in enumerate(request.pay_option_details):
|
|
190
|
+
if hasattr(detail, 'pay_method') and detail.pay_method is not None:
|
|
191
|
+
pm = getattr(detail.pay_method, 'value', detail.pay_method) if hasattr(detail.pay_method, 'value') else detail.pay_method
|
|
192
|
+
pm_str = str(pm).strip()
|
|
193
|
+
if pm_str and pm_str not in SANDBOX_ALLOWED_PAY_METHODS:
|
|
194
|
+
raise ApiException(
|
|
195
|
+
status=0,
|
|
196
|
+
reason=(
|
|
197
|
+
f'In sandbox, payMethod must be one of {sorted(SANDBOX_ALLOWED_PAY_METHODS)}; '
|
|
198
|
+
f'got {pm_str!r} in payOptionDetails[{idx}]'
|
|
199
|
+
)
|
|
200
|
+
)
|
|
201
|
+
if hasattr(detail, 'pay_option') and detail.pay_option is not None:
|
|
202
|
+
po = getattr(detail.pay_option, 'value', detail.pay_option) if hasattr(detail.pay_option, 'value') else detail.pay_option
|
|
203
|
+
po_str = str(po).strip()
|
|
204
|
+
# Empty payOption is allowed (e.g. for BALANCE)
|
|
205
|
+
if po_str and not _pay_option_allowed_in_sandbox(po_str):
|
|
206
|
+
raise ApiException(
|
|
207
|
+
status=0,
|
|
208
|
+
reason=(
|
|
209
|
+
f'In sandbox, payOption must be one of {sorted(SANDBOX_ALLOWED_PAY_OPTIONS)} '
|
|
210
|
+
f'(or suffix like VIRTUAL_ACCOUNT_BRI); got {po!r} in payOptionDetails[{idx}]'
|
|
211
|
+
)
|
|
212
|
+
)
|
|
213
|
+
|
|
214
|
+
|
|
140
215
|
# Validation registry maps request class names to their validation functions
|
|
141
216
|
validation_registry: Dict[str, List[Callable[[Any], None]]] = {
|
|
142
217
|
'CreateOrderByApiRequest': [
|
|
@@ -144,17 +219,20 @@ validation_registry: Dict[str, List[Callable[[Any], None]]] = {
|
|
|
144
219
|
validate_money_value_pattern,
|
|
145
220
|
validate_valid_up_to_create_order_request,
|
|
146
221
|
validate_external_store_id_for_qris,
|
|
222
|
+
validate_sandbox_pay_method_and_pay_option,
|
|
147
223
|
],
|
|
148
224
|
'CreateOrderByRedirectRequest': [
|
|
149
225
|
validate_additional_info_required,
|
|
150
226
|
validate_money_value_pattern,
|
|
151
227
|
validate_valid_up_to_create_order_request,
|
|
228
|
+
validate_sandbox_pay_method_and_pay_option,
|
|
152
229
|
],
|
|
153
230
|
'CreateOrderRequest': [
|
|
154
231
|
validate_additional_info_required,
|
|
155
232
|
validate_money_value_pattern,
|
|
156
233
|
validate_valid_up_to_create_order_request,
|
|
157
234
|
validate_external_store_id_for_qris,
|
|
235
|
+
validate_sandbox_pay_method_and_pay_option,
|
|
158
236
|
],
|
|
159
237
|
# Add more request types and their validations here as needed
|
|
160
238
|
}
|
|
@@ -190,7 +190,12 @@ class RESTClientObject:
|
|
|
190
190
|
):
|
|
191
191
|
request_body = None
|
|
192
192
|
if body is not None:
|
|
193
|
-
|
|
193
|
+
# If body is already a string or bytes (e.g. pre-serialized JSON from OpenAPI widget),
|
|
194
|
+
# send as-is to avoid double JSON encoding. Otherwise serialize.
|
|
195
|
+
if isinstance(body, (str, bytes)):
|
|
196
|
+
request_body = body
|
|
197
|
+
else:
|
|
198
|
+
request_body = json.dumps(body)
|
|
194
199
|
r = self.pool_manager.request(
|
|
195
200
|
method,
|
|
196
201
|
url,
|
|
@@ -90,12 +90,37 @@ class OpenApiHeader:
|
|
|
90
90
|
elif private_key:
|
|
91
91
|
# Handle escaped newlines
|
|
92
92
|
private_key = private_key.replace("\\n", "\n")
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
93
|
+
|
|
94
|
+
# Check if private key already has PEM headers/footers
|
|
95
|
+
if not private_key.strip().startswith('-----BEGIN'):
|
|
96
|
+
# Raw base64 key content - add PEM headers and footers
|
|
97
|
+
private_key = f"-----BEGIN PRIVATE KEY-----\n{private_key}\n-----END PRIVATE KEY-----"
|
|
98
|
+
|
|
99
|
+
try:
|
|
100
|
+
private_key_obj = serialization.load_pem_private_key(
|
|
101
|
+
private_key.encode(),
|
|
102
|
+
password=None,
|
|
103
|
+
backend=default_backend()
|
|
104
|
+
)
|
|
105
|
+
return private_key_obj
|
|
106
|
+
except ValueError as e:
|
|
107
|
+
# If loading fails, try alternative PEM formats
|
|
108
|
+
if "BEGIN PRIVATE KEY" in private_key:
|
|
109
|
+
# Already in PKCS#8 format, try RSA format
|
|
110
|
+
rsa_key = private_key.replace("-----BEGIN PRIVATE KEY-----", "-----BEGIN RSA PRIVATE KEY-----")
|
|
111
|
+
rsa_key = rsa_key.replace("-----END PRIVATE KEY-----", "-----END RSA PRIVATE KEY-----")
|
|
112
|
+
try:
|
|
113
|
+
from cryptography.hazmat.primitives.serialization import load_pem_private_key
|
|
114
|
+
private_key_obj = load_pem_private_key(
|
|
115
|
+
rsa_key.encode(),
|
|
116
|
+
password=None,
|
|
117
|
+
backend=default_backend()
|
|
118
|
+
)
|
|
119
|
+
return private_key_obj
|
|
120
|
+
except:
|
|
121
|
+
pass
|
|
122
|
+
|
|
123
|
+
raise ValueError(f"Unable to load private key: {str(e)}. Please ensure the private key is in proper PEM format.")
|
|
99
124
|
else:
|
|
100
125
|
raise ValueError("Provide one of private_key or private_key_path")
|
|
101
126
|
|
|
@@ -155,14 +180,14 @@ class OpenApiHeader:
|
|
|
155
180
|
# Generate unique request message ID
|
|
156
181
|
req_msg_id = "sdk" + str(uuid.uuid4())[3:]
|
|
157
182
|
|
|
158
|
-
# Return auth settings following
|
|
183
|
+
# Return auth settings following correct field order: version, function, clientId, clientSecret, reqTime, reqMsgId, reserve
|
|
159
184
|
return {
|
|
160
185
|
VERSION: generateOpenApiSetting(key=VERSION, value=version),
|
|
161
186
|
FUNCTION: generateOpenApiSetting(key=FUNCTION, value=function_name),
|
|
162
187
|
CLIENT_ID: generateOpenApiSetting(key=CLIENT_ID, value=client_id),
|
|
188
|
+
CLIENT_SECRET: generateOpenApiSetting(key=CLIENT_SECRET, value=client_secret),
|
|
163
189
|
REQ_TIME: generateOpenApiSetting(key=REQ_TIME, value=timestamp),
|
|
164
190
|
REQ_MSG_ID: generateOpenApiSetting(key=REQ_MSG_ID, value=req_msg_id),
|
|
165
|
-
CLIENT_SECRET: generateOpenApiSetting(key=CLIENT_SECRET, value=client_secret),
|
|
166
191
|
RESERVE: generateOpenApiSetting(key=RESERVE, value="{}")
|
|
167
192
|
}
|
|
168
193
|
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
Generated by OpenAPI Generator (https://openapi-generator.tech)
|
|
22
22
|
Do not edit the class manually.
|
|
23
23
|
""" # noqa: E501
|
|
24
|
+
import json
|
|
24
25
|
import warnings
|
|
25
26
|
from pydantic import validate_call, Field, StrictFloat, StrictStr, StrictInt
|
|
26
27
|
from typing import Any, Dict, List, Optional, Tuple, Union, Type
|
|
@@ -1901,6 +1902,70 @@ class WidgetApi:
|
|
|
1901
1902
|
# authentication setting
|
|
1902
1903
|
_auth_settings: List[str] = [
|
|
1903
1904
|
]
|
|
1905
|
+
# For OPEN_API type, we use CLIENT_SECRET authentication with signature
|
|
1906
|
+
# merge list of auth settings with Open API runtime headers
|
|
1907
|
+
from dana.utils.open_api_header import OpenApiHeader
|
|
1908
|
+
_auth_settings = OpenApiHeader.merge_with_open_api_runtime_headers(_auth_settings)
|
|
1909
|
+
# Create the full request structure for OPEN_API
|
|
1910
|
+
# Wrap the simplified body parameters in the proper DANA request format
|
|
1911
|
+
# Extract accessToken from request body if available (widget-specific)
|
|
1912
|
+
request_body_dict = query_user_profile_request.to_dict()
|
|
1913
|
+
access_token = request_body_dict.get('accessToken', '')
|
|
1914
|
+
# Create body without accessToken (for queryUserProfile)
|
|
1915
|
+
body_without_access_token = {k: v for k, v in request_body_dict.items() if k != 'accessToken'}
|
|
1916
|
+
# Generate head parameters
|
|
1917
|
+
_generated_auth = OpenApiHeader.get_open_api_generated_headers(
|
|
1918
|
+
method='POST',
|
|
1919
|
+
resource_path='/dana/member/query/queryUserProfile.htm',
|
|
1920
|
+
body='{}', # Empty body for head generation
|
|
1921
|
+
function_name="dana.member.query.queryUserProfile",
|
|
1922
|
+
client_id=self.api_client.configuration.get_api_key_with_prefix('X_PARTNER_ID'),
|
|
1923
|
+
client_secret=self.api_client.configuration.get_api_key_with_prefix('CLIENT_SECRET')
|
|
1924
|
+
)
|
|
1925
|
+
# Extract values from auth settings for JSON body, ensuring correct field order
|
|
1926
|
+
head_params = {}
|
|
1927
|
+
# Add fields in the correct order: version, function, clientId, clientSecret, reqTime, reqMsgId
|
|
1928
|
+
for key in ['version', 'function', 'clientId', 'clientSecret', 'reqTime', 'reqMsgId']:
|
|
1929
|
+
if key in _generated_auth:
|
|
1930
|
+
head_params[key] = _generated_auth[key]['value']
|
|
1931
|
+
# Add accessToken before reserve if found in request body (widget-specific)
|
|
1932
|
+
if access_token:
|
|
1933
|
+
head_params['accessToken'] = access_token
|
|
1934
|
+
# Add reserve at the end
|
|
1935
|
+
if 'reserve' in _generated_auth:
|
|
1936
|
+
head_params['reserve'] = _generated_auth['reserve']['value']
|
|
1937
|
+
# Create the full request structure (use body without accessToken)
|
|
1938
|
+
request_body = {
|
|
1939
|
+
"request": {
|
|
1940
|
+
"head": head_params,
|
|
1941
|
+
"body": body_without_access_token
|
|
1942
|
+
}
|
|
1943
|
+
}
|
|
1944
|
+
# Generate signature (pass full structure, function will extract request part)
|
|
1945
|
+
_signature = OpenApiHeader.generate_open_api_signature(
|
|
1946
|
+
body=json.dumps(request_body),
|
|
1947
|
+
private_key=self.api_client.configuration.get_api_key_with_prefix('PRIVATE_KEY')
|
|
1948
|
+
)
|
|
1949
|
+
# Add signature to the request
|
|
1950
|
+
if _signature:
|
|
1951
|
+
request_body['signature'] = _signature
|
|
1952
|
+
# Convert final request to JSON string
|
|
1953
|
+
_body_params = json.dumps(request_body)
|
|
1954
|
+
return self.api_client.param_serialize(
|
|
1955
|
+
method='POST',
|
|
1956
|
+
resource_path='/dana/member/query/queryUserProfile.htm',
|
|
1957
|
+
path_params=_path_params,
|
|
1958
|
+
query_params=_query_params,
|
|
1959
|
+
header_params=_header_params,
|
|
1960
|
+
body=_body_params,
|
|
1961
|
+
post_params=_form_params,
|
|
1962
|
+
files=_files,
|
|
1963
|
+
auth_settings=_auth_settings,
|
|
1964
|
+
collection_formats=_collection_formats,
|
|
1965
|
+
_host=_host,
|
|
1966
|
+
_request_auth=_request_auth,
|
|
1967
|
+
_generated_auth=_generated_auth,
|
|
1968
|
+
)
|
|
1904
1969
|
@validate_call
|
|
1905
1970
|
def refund_order(
|
|
1906
1971
|
self,
|
|
@@ -41,11 +41,20 @@ class Mode(str, Enum):
|
|
|
41
41
|
|
|
42
42
|
class ResourceType(str, Enum):
|
|
43
43
|
BALANCE = "BALANCE"
|
|
44
|
-
TRANSACTION_URL = "TRANSACTION_URL"
|
|
45
|
-
MASK_DANA_ID = "MASK_DANA_ID"
|
|
46
44
|
TOPUP_URL = "TOPUP_URL"
|
|
45
|
+
TRANSACTION_URL = "TRANSACTION_URL"
|
|
47
46
|
OTT = "OTT"
|
|
47
|
+
MASK_DANA_ID = "MASK_DANA_ID"
|
|
48
48
|
USER_KYC = "USER_KYC"
|
|
49
|
+
LOGIN_ID = "LOGIN_ID"
|
|
50
|
+
CLEAR_TEXT_DANA_ID = "CLEAR_TEXT_DANA_ID"
|
|
51
|
+
NICKNAME = "NICKNAME"
|
|
52
|
+
FULLNAME = "FULLNAME"
|
|
53
|
+
KTP_NUMBER = "KTP_NUMBER"
|
|
54
|
+
KTP_PHOTO_DATA = "KTP_PHOTO_DATA"
|
|
55
|
+
SELFIE_PHOTO_DATA = "SELFIE_PHOTO_DATA"
|
|
56
|
+
AVATAR_URL = "AVATAR_URL"
|
|
57
|
+
MASKED_FULLNAME = "MASKED_FULLNAME"
|
|
49
58
|
|
|
50
59
|
class ResultStatus(str, Enum):
|
|
51
60
|
S = "S"
|
|
@@ -38,7 +38,7 @@ from pydantic import BaseModel, ConfigDict, Field
|
|
|
38
38
|
from typing import Any, ClassVar, Dict, List, Optional
|
|
39
39
|
from typing_extensions import Annotated
|
|
40
40
|
from dana.widget.v1.models.money import Money
|
|
41
|
-
from typing import Optional, Set
|
|
41
|
+
from typing import Optional, Set, Union
|
|
42
42
|
from typing_extensions import Self
|
|
43
43
|
from pydantic import AliasGenerator
|
|
44
44
|
from pydantic.alias_generators import to_camel
|
|
@@ -119,13 +119,20 @@ class AccountInfo(BaseModel, BaseSdkModel):
|
|
|
119
119
|
return _dict
|
|
120
120
|
|
|
121
121
|
@classmethod
|
|
122
|
-
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
|
122
|
+
def from_dict(cls, obj: Optional[Union[Dict[str, Any], str]]) -> Optional[Self]:
|
|
123
123
|
"""Create an instance of AccountInfo from a dict"""
|
|
124
124
|
if obj is None:
|
|
125
125
|
return None
|
|
126
126
|
|
|
127
127
|
if not isinstance(obj, dict):
|
|
128
|
-
|
|
128
|
+
# If it's a string (JSON), try to parse it
|
|
129
|
+
if isinstance(obj, str):
|
|
130
|
+
try:
|
|
131
|
+
obj = json.loads(obj)
|
|
132
|
+
except json.JSONDecodeError:
|
|
133
|
+
return cls.model_validate(obj)
|
|
134
|
+
else:
|
|
135
|
+
return cls.model_validate(obj)
|
|
129
136
|
|
|
130
137
|
_obj = cls.model_validate({
|
|
131
138
|
"balanceType": obj.get("balanceType"),
|
|
@@ -38,7 +38,7 @@ from pydantic import BaseModel, ConfigDict, Field
|
|
|
38
38
|
from typing import Any, ClassVar, Dict, List, Optional
|
|
39
39
|
from typing_extensions import Annotated
|
|
40
40
|
from dana.widget.v1.models.account_unbinding_request_additional_info import AccountUnbindingRequestAdditionalInfo
|
|
41
|
-
from typing import Optional, Set
|
|
41
|
+
from typing import Optional, Set, Union
|
|
42
42
|
from typing_extensions import Self
|
|
43
43
|
from pydantic import AliasGenerator
|
|
44
44
|
from pydantic.alias_generators import to_camel
|
|
@@ -101,13 +101,20 @@ class AccountUnbindingRequest(BaseModel, BaseSdkModel):
|
|
|
101
101
|
return _dict
|
|
102
102
|
|
|
103
103
|
@classmethod
|
|
104
|
-
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
|
104
|
+
def from_dict(cls, obj: Optional[Union[Dict[str, Any], str]]) -> Optional[Self]:
|
|
105
105
|
"""Create an instance of AccountUnbindingRequest from a dict"""
|
|
106
106
|
if obj is None:
|
|
107
107
|
return None
|
|
108
108
|
|
|
109
109
|
if not isinstance(obj, dict):
|
|
110
|
-
|
|
110
|
+
# If it's a string (JSON), try to parse it
|
|
111
|
+
if isinstance(obj, str):
|
|
112
|
+
try:
|
|
113
|
+
obj = json.loads(obj)
|
|
114
|
+
except json.JSONDecodeError:
|
|
115
|
+
return cls.model_validate(obj)
|
|
116
|
+
else:
|
|
117
|
+
return cls.model_validate(obj)
|
|
111
118
|
|
|
112
119
|
_obj = cls.model_validate({
|
|
113
120
|
"merchantId": obj.get("merchantId"),
|
|
@@ -37,7 +37,7 @@ from dana.base.model import BaseSdkModel
|
|
|
37
37
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
38
38
|
from typing import Any, ClassVar, Dict, List, Optional
|
|
39
39
|
from typing_extensions import Annotated
|
|
40
|
-
from typing import Optional, Set
|
|
40
|
+
from typing import Optional, Set, Union
|
|
41
41
|
from typing_extensions import Self
|
|
42
42
|
from pydantic import AliasGenerator
|
|
43
43
|
from pydantic.alias_generators import to_camel
|
|
@@ -116,13 +116,20 @@ class AccountUnbindingRequestAdditionalInfo(BaseModel, BaseSdkModel):
|
|
|
116
116
|
return _dict
|
|
117
117
|
|
|
118
118
|
@classmethod
|
|
119
|
-
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
|
119
|
+
def from_dict(cls, obj: Optional[Union[Dict[str, Any], str]]) -> Optional[Self]:
|
|
120
120
|
"""Create an instance of AccountUnbindingRequestAdditionalInfo from a dict"""
|
|
121
121
|
if obj is None:
|
|
122
122
|
return None
|
|
123
123
|
|
|
124
124
|
if not isinstance(obj, dict):
|
|
125
|
-
|
|
125
|
+
# If it's a string (JSON), try to parse it
|
|
126
|
+
if isinstance(obj, str):
|
|
127
|
+
try:
|
|
128
|
+
obj = json.loads(obj)
|
|
129
|
+
except json.JSONDecodeError:
|
|
130
|
+
return cls.model_validate(obj)
|
|
131
|
+
else:
|
|
132
|
+
return cls.model_validate(obj)
|
|
126
133
|
|
|
127
134
|
_obj = cls.model_validate({
|
|
128
135
|
"accessToken": obj.get("accessToken"),
|
|
@@ -37,7 +37,7 @@ from dana.base.model import BaseSdkModel
|
|
|
37
37
|
from pydantic import BaseModel, ConfigDict, Field
|
|
38
38
|
from typing import Any, ClassVar, Dict, List, Optional
|
|
39
39
|
from typing_extensions import Annotated
|
|
40
|
-
from typing import Optional, Set
|
|
40
|
+
from typing import Optional, Set, Union
|
|
41
41
|
from typing_extensions import Self
|
|
42
42
|
from pydantic import AliasGenerator
|
|
43
43
|
from pydantic.alias_generators import to_camel
|
|
@@ -100,13 +100,20 @@ class AccountUnbindingResponse(BaseModel, BaseSdkModel):
|
|
|
100
100
|
return _dict
|
|
101
101
|
|
|
102
102
|
@classmethod
|
|
103
|
-
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
|
103
|
+
def from_dict(cls, obj: Optional[Union[Dict[str, Any], str]]) -> Optional[Self]:
|
|
104
104
|
"""Create an instance of AccountUnbindingResponse from a dict"""
|
|
105
105
|
if obj is None:
|
|
106
106
|
return None
|
|
107
107
|
|
|
108
108
|
if not isinstance(obj, dict):
|
|
109
|
-
|
|
109
|
+
# If it's a string (JSON), try to parse it
|
|
110
|
+
if isinstance(obj, str):
|
|
111
|
+
try:
|
|
112
|
+
obj = json.loads(obj)
|
|
113
|
+
except json.JSONDecodeError:
|
|
114
|
+
return cls.model_validate(obj)
|
|
115
|
+
else:
|
|
116
|
+
return cls.model_validate(obj)
|
|
110
117
|
|
|
111
118
|
_obj = cls.model_validate({
|
|
112
119
|
"responseCode": obj.get("responseCode"),
|
|
@@ -37,7 +37,7 @@ from dana.base.model import BaseSdkModel
|
|
|
37
37
|
from pydantic import BaseModel, ConfigDict, Field
|
|
38
38
|
from typing import Any, ClassVar, Dict, List, Optional
|
|
39
39
|
from dana.widget.v1.models.money import Money
|
|
40
|
-
from typing import Optional, Set
|
|
40
|
+
from typing import Optional, Set, Union
|
|
41
41
|
from typing_extensions import Self
|
|
42
42
|
from pydantic import AliasGenerator
|
|
43
43
|
from pydantic.alias_generators import to_camel
|
|
@@ -119,13 +119,20 @@ class AmountDetail(BaseModel, BaseSdkModel):
|
|
|
119
119
|
return _dict
|
|
120
120
|
|
|
121
121
|
@classmethod
|
|
122
|
-
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
|
122
|
+
def from_dict(cls, obj: Optional[Union[Dict[str, Any], str]]) -> Optional[Self]:
|
|
123
123
|
"""Create an instance of AmountDetail from a dict"""
|
|
124
124
|
if obj is None:
|
|
125
125
|
return None
|
|
126
126
|
|
|
127
127
|
if not isinstance(obj, dict):
|
|
128
|
-
|
|
128
|
+
# If it's a string (JSON), try to parse it
|
|
129
|
+
if isinstance(obj, str):
|
|
130
|
+
try:
|
|
131
|
+
obj = json.loads(obj)
|
|
132
|
+
except json.JSONDecodeError:
|
|
133
|
+
return cls.model_validate(obj)
|
|
134
|
+
else:
|
|
135
|
+
return cls.model_validate(obj)
|
|
129
136
|
|
|
130
137
|
_obj = cls.model_validate({
|
|
131
138
|
"orderAmount": Money.from_dict(obj["orderAmount"]) if obj.get("orderAmount") is not None else None,
|
|
@@ -38,7 +38,7 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
|
38
38
|
from typing import Any, ClassVar, Dict, List
|
|
39
39
|
from typing_extensions import Annotated
|
|
40
40
|
from dana.widget.v1.models.apply_ott_request_additional_info import ApplyOTTRequestAdditionalInfo
|
|
41
|
-
from typing import Optional, Set
|
|
41
|
+
from typing import Optional, Set, Union
|
|
42
42
|
from typing_extensions import Self
|
|
43
43
|
from pydantic import AliasGenerator
|
|
44
44
|
from pydantic.alias_generators import to_camel
|
|
@@ -105,13 +105,20 @@ class ApplyOTTRequest(BaseModel, BaseSdkModel):
|
|
|
105
105
|
return _dict
|
|
106
106
|
|
|
107
107
|
@classmethod
|
|
108
|
-
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
|
108
|
+
def from_dict(cls, obj: Optional[Union[Dict[str, Any], str]]) -> Optional[Self]:
|
|
109
109
|
"""Create an instance of ApplyOTTRequest from a dict"""
|
|
110
110
|
if obj is None:
|
|
111
111
|
return None
|
|
112
112
|
|
|
113
113
|
if not isinstance(obj, dict):
|
|
114
|
-
|
|
114
|
+
# If it's a string (JSON), try to parse it
|
|
115
|
+
if isinstance(obj, str):
|
|
116
|
+
try:
|
|
117
|
+
obj = json.loads(obj)
|
|
118
|
+
except json.JSONDecodeError:
|
|
119
|
+
return cls.model_validate(obj)
|
|
120
|
+
else:
|
|
121
|
+
return cls.model_validate(obj)
|
|
115
122
|
|
|
116
123
|
_obj = cls.model_validate({
|
|
117
124
|
"userResources": obj.get("userResources"),
|
{dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_ott_request_additional_info.py
RENAMED
|
@@ -37,7 +37,7 @@ from dana.base.model import BaseSdkModel
|
|
|
37
37
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
38
38
|
from typing import Any, ClassVar, Dict, List, Optional
|
|
39
39
|
from typing_extensions import Annotated
|
|
40
|
-
from typing import Optional, Set
|
|
40
|
+
from typing import Optional, Set, Union
|
|
41
41
|
from typing_extensions import Self
|
|
42
42
|
from pydantic import AliasGenerator
|
|
43
43
|
from pydantic.alias_generators import to_camel
|
|
@@ -116,13 +116,20 @@ class ApplyOTTRequestAdditionalInfo(BaseModel, BaseSdkModel):
|
|
|
116
116
|
return _dict
|
|
117
117
|
|
|
118
118
|
@classmethod
|
|
119
|
-
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
|
119
|
+
def from_dict(cls, obj: Optional[Union[Dict[str, Any], str]]) -> Optional[Self]:
|
|
120
120
|
"""Create an instance of ApplyOTTRequestAdditionalInfo from a dict"""
|
|
121
121
|
if obj is None:
|
|
122
122
|
return None
|
|
123
123
|
|
|
124
124
|
if not isinstance(obj, dict):
|
|
125
|
-
|
|
125
|
+
# If it's a string (JSON), try to parse it
|
|
126
|
+
if isinstance(obj, str):
|
|
127
|
+
try:
|
|
128
|
+
obj = json.loads(obj)
|
|
129
|
+
except json.JSONDecodeError:
|
|
130
|
+
return cls.model_validate(obj)
|
|
131
|
+
else:
|
|
132
|
+
return cls.model_validate(obj)
|
|
126
133
|
|
|
127
134
|
_obj = cls.model_validate({
|
|
128
135
|
"accessToken": obj.get("accessToken"),
|
|
@@ -38,7 +38,7 @@ from pydantic import BaseModel, ConfigDict, Field
|
|
|
38
38
|
from typing import Any, ClassVar, Dict, List, Optional
|
|
39
39
|
from typing_extensions import Annotated
|
|
40
40
|
from dana.widget.v1.models.apply_ott_response_user_resources_inner import ApplyOTTResponseUserResourcesInner
|
|
41
|
-
from typing import Optional, Set
|
|
41
|
+
from typing import Optional, Set, Union
|
|
42
42
|
from typing_extensions import Self
|
|
43
43
|
from pydantic import AliasGenerator
|
|
44
44
|
from pydantic.alias_generators import to_camel
|
|
@@ -103,13 +103,20 @@ class ApplyOTTResponse(BaseModel, BaseSdkModel):
|
|
|
103
103
|
return _dict
|
|
104
104
|
|
|
105
105
|
@classmethod
|
|
106
|
-
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
|
106
|
+
def from_dict(cls, obj: Optional[Union[Dict[str, Any], str]]) -> Optional[Self]:
|
|
107
107
|
"""Create an instance of ApplyOTTResponse from a dict"""
|
|
108
108
|
if obj is None:
|
|
109
109
|
return None
|
|
110
110
|
|
|
111
111
|
if not isinstance(obj, dict):
|
|
112
|
-
|
|
112
|
+
# If it's a string (JSON), try to parse it
|
|
113
|
+
if isinstance(obj, str):
|
|
114
|
+
try:
|
|
115
|
+
obj = json.loads(obj)
|
|
116
|
+
except json.JSONDecodeError:
|
|
117
|
+
return cls.model_validate(obj)
|
|
118
|
+
else:
|
|
119
|
+
return cls.model_validate(obj)
|
|
113
120
|
|
|
114
121
|
_obj = cls.model_validate({
|
|
115
122
|
"responseCode": obj.get("responseCode"),
|
|
@@ -37,7 +37,7 @@ from dana.base.model import BaseSdkModel
|
|
|
37
37
|
from pydantic import BaseModel, ConfigDict, Field
|
|
38
38
|
from typing import Any, ClassVar, Dict, List, Optional
|
|
39
39
|
from typing_extensions import Annotated
|
|
40
|
-
from typing import Optional, Set
|
|
40
|
+
from typing import Optional, Set, Union
|
|
41
41
|
from typing_extensions import Self
|
|
42
42
|
from pydantic import AliasGenerator
|
|
43
43
|
from pydantic.alias_generators import to_camel
|
|
@@ -93,13 +93,20 @@ class ApplyOTTResponseUserResourcesInner(BaseModel, BaseSdkModel):
|
|
|
93
93
|
return _dict
|
|
94
94
|
|
|
95
95
|
@classmethod
|
|
96
|
-
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
|
96
|
+
def from_dict(cls, obj: Optional[Union[Dict[str, Any], str]]) -> Optional[Self]:
|
|
97
97
|
"""Create an instance of ApplyOTTResponseUserResourcesInner from a dict"""
|
|
98
98
|
if obj is None:
|
|
99
99
|
return None
|
|
100
100
|
|
|
101
101
|
if not isinstance(obj, dict):
|
|
102
|
-
|
|
102
|
+
# If it's a string (JSON), try to parse it
|
|
103
|
+
if isinstance(obj, str):
|
|
104
|
+
try:
|
|
105
|
+
obj = json.loads(obj)
|
|
106
|
+
except json.JSONDecodeError:
|
|
107
|
+
return cls.model_validate(obj)
|
|
108
|
+
else:
|
|
109
|
+
return cls.model_validate(obj)
|
|
103
110
|
|
|
104
111
|
_obj = cls.model_validate({
|
|
105
112
|
"resourceType": obj.get("resourceType"),
|
|
@@ -37,7 +37,7 @@ from dana.base.model import BaseSdkModel
|
|
|
37
37
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
38
38
|
from typing import Any, ClassVar, Dict, List, Optional
|
|
39
39
|
from typing_extensions import Annotated
|
|
40
|
-
from typing import Optional, Set
|
|
40
|
+
from typing import Optional, Set, Union
|
|
41
41
|
from typing_extensions import Self
|
|
42
42
|
from pydantic import AliasGenerator
|
|
43
43
|
from pydantic.alias_generators import to_camel
|
|
@@ -102,13 +102,20 @@ class ApplyTokenAuthorizationCodeRequest(BaseModel, BaseSdkModel):
|
|
|
102
102
|
return _dict
|
|
103
103
|
|
|
104
104
|
@classmethod
|
|
105
|
-
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
|
105
|
+
def from_dict(cls, obj: Optional[Union[Dict[str, Any], str]]) -> Optional[Self]:
|
|
106
106
|
"""Create an instance of ApplyTokenAuthorizationCodeRequest from a dict"""
|
|
107
107
|
if obj is None:
|
|
108
108
|
return None
|
|
109
109
|
|
|
110
110
|
if not isinstance(obj, dict):
|
|
111
|
-
|
|
111
|
+
# If it's a string (JSON), try to parse it
|
|
112
|
+
if isinstance(obj, str):
|
|
113
|
+
try:
|
|
114
|
+
obj = json.loads(obj)
|
|
115
|
+
except json.JSONDecodeError:
|
|
116
|
+
return cls.model_validate(obj)
|
|
117
|
+
else:
|
|
118
|
+
return cls.model_validate(obj)
|
|
112
119
|
|
|
113
120
|
_obj = cls.model_validate({
|
|
114
121
|
"additionalInfo": obj.get("additionalInfo"),
|
{dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_token_refresh_token_request.py
RENAMED
|
@@ -37,7 +37,7 @@ from dana.base.model import BaseSdkModel
|
|
|
37
37
|
from pydantic import BaseModel, ConfigDict, Field, field_validator
|
|
38
38
|
from typing import Any, ClassVar, Dict, List, Optional
|
|
39
39
|
from typing_extensions import Annotated
|
|
40
|
-
from typing import Optional, Set
|
|
40
|
+
from typing import Optional, Set, Union
|
|
41
41
|
from typing_extensions import Self
|
|
42
42
|
from pydantic import AliasGenerator
|
|
43
43
|
from pydantic.alias_generators import to_camel
|
|
@@ -102,13 +102,20 @@ class ApplyTokenRefreshTokenRequest(BaseModel, BaseSdkModel):
|
|
|
102
102
|
return _dict
|
|
103
103
|
|
|
104
104
|
@classmethod
|
|
105
|
-
def from_dict(cls, obj: Optional[Dict[str, Any]]) -> Optional[Self]:
|
|
105
|
+
def from_dict(cls, obj: Optional[Union[Dict[str, Any], str]]) -> Optional[Self]:
|
|
106
106
|
"""Create an instance of ApplyTokenRefreshTokenRequest from a dict"""
|
|
107
107
|
if obj is None:
|
|
108
108
|
return None
|
|
109
109
|
|
|
110
110
|
if not isinstance(obj, dict):
|
|
111
|
-
|
|
111
|
+
# If it's a string (JSON), try to parse it
|
|
112
|
+
if isinstance(obj, str):
|
|
113
|
+
try:
|
|
114
|
+
obj = json.loads(obj)
|
|
115
|
+
except json.JSONDecodeError:
|
|
116
|
+
return cls.model_validate(obj)
|
|
117
|
+
else:
|
|
118
|
+
return cls.model_validate(obj)
|
|
112
119
|
|
|
113
120
|
_obj = cls.model_validate({
|
|
114
121
|
"additionalInfo": obj.get("additionalInfo"),
|