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.
Files changed (229) hide show
  1. {dana_python-2.0.0/dana_python.egg-info → dana_python-2.1.0}/PKG-INFO +1 -1
  2. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/custom_validation.py +78 -0
  3. {dana_python-2.0.0 → dana_python-2.1.0}/dana/rest.py +6 -1
  4. {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/open_api_header.py +33 -8
  5. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/api/widget_api.py +65 -0
  6. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/enum.py +11 -2
  7. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/account_info.py +10 -3
  8. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/account_unbinding_request.py +10 -3
  9. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/account_unbinding_request_additional_info.py +10 -3
  10. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/account_unbinding_response.py +10 -3
  11. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/amount_detail.py +10 -3
  12. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_ott_request.py +10 -3
  13. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_ott_request_additional_info.py +10 -3
  14. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_ott_response.py +10 -3
  15. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_ott_response_user_resources_inner.py +10 -3
  16. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_token_authorization_code_request.py +10 -3
  17. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_token_refresh_token_request.py +10 -3
  18. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_token_response.py +10 -3
  19. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_token_response_additional_info.py +10 -3
  20. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/apply_token_response_additional_info_user_info.py +10 -3
  21. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/balance_inquiry_request.py +10 -3
  22. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/balance_inquiry_request_additional_info.py +10 -3
  23. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/balance_inquiry_response.py +10 -3
  24. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/buyer.py +10 -3
  25. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/cancel_order_request.py +10 -3
  26. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/cancel_order_response.py +10 -3
  27. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/env_info.py +10 -3
  28. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/goods.py +10 -3
  29. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/international_order_info.py +10 -3
  30. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/international_order_info_exchange_rate.py +10 -3
  31. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/money.py +10 -3
  32. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/oauth2_url_data.py +10 -3
  33. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/oauth2_url_data_seamless_data.py +10 -3
  34. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/order.py +10 -3
  35. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/pay_option_detail.py +10 -3
  36. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/pay_option_detail_additional_info.py +10 -3
  37. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/pay_option_info.py +10 -3
  38. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/payment_promo_info.py +10 -3
  39. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/payment_view.py +10 -3
  40. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_payment_request.py +10 -3
  41. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_payment_response.py +10 -3
  42. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_payment_response_additional_info.py +10 -3
  43. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_user_profile_request.py +16 -7
  44. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_user_profile_response.py +10 -3
  45. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_user_profile_response_response.py +10 -3
  46. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_user_profile_response_response_body.py +10 -3
  47. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/query_user_profile_response_response_head.py +10 -3
  48. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/refund_order_request.py +10 -3
  49. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/refund_order_request_additional_info.py +10 -3
  50. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/refund_order_response.py +10 -3
  51. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/refund_promo_info.py +10 -3
  52. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/result_info.py +10 -3
  53. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/seller.py +10 -3
  54. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/service_info.py +10 -3
  55. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/shipping_info.py +10 -3
  56. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/status_detail.py +10 -3
  57. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/time_detail.py +10 -3
  58. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/url_param.py +10 -3
  59. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/user_resource_info.py +12 -5
  60. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/virtual_account_info.py +10 -3
  61. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/widget_payment_request.py +10 -3
  62. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/widget_payment_request_additional_info.py +10 -3
  63. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/widget_payment_response.py +10 -3
  64. {dana_python-2.0.0 → dana_python-2.1.0/dana_python.egg-info}/PKG-INFO +1 -1
  65. {dana_python-2.0.0 → dana_python-2.1.0}/pyproject.toml +1 -1
  66. {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_payment_gateway_api.py +84 -0
  67. {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_widget_with_automation.py +180 -0
  68. {dana_python-2.0.0 → dana_python-2.1.0}/LICENSE +0 -0
  69. {dana_python-2.0.0 → dana_python-2.1.0}/README.md +0 -0
  70. {dana_python-2.0.0 → dana_python-2.1.0}/dana/__init__.py +0 -0
  71. {dana_python-2.0.0 → dana_python-2.1.0}/dana/api_client.py +0 -0
  72. {dana_python-2.0.0 → dana_python-2.1.0}/dana/api_response.py +0 -0
  73. {dana_python-2.0.0 → dana_python-2.1.0}/dana/base/__init__.py +0 -0
  74. {dana_python-2.0.0 → dana_python-2.1.0}/dana/base/configuration.py +0 -0
  75. {dana_python-2.0.0 → dana_python-2.1.0}/dana/base/model.py +0 -0
  76. {dana_python-2.0.0 → dana_python-2.1.0}/dana/base/types.py +0 -0
  77. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/__init__.py +0 -0
  78. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/__init__.py +0 -0
  79. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/api/__init__.py +0 -0
  80. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/api/disbursement_api.py +0 -0
  81. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/enum.py +0 -0
  82. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/__init__.py +0 -0
  83. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/bank_account_inquiry_request.py +0 -0
  84. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/bank_account_inquiry_request_additional_info.py +0 -0
  85. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/bank_account_inquiry_response.py +0 -0
  86. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/bank_account_inquiry_response_additional_info.py +0 -0
  87. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/dana_account_inquiry_request.py +0 -0
  88. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/dana_account_inquiry_request_additional_info.py +0 -0
  89. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/dana_account_inquiry_response.py +0 -0
  90. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/money.py +0 -0
  91. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_bank_inquiry_status_request.py +0 -0
  92. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_bank_inquiry_status_response.py +0 -0
  93. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_bank_request.py +0 -0
  94. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_bank_request_additional_info.py +0 -0
  95. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_bank_response.py +0 -0
  96. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_dana_inquiry_status_request.py +0 -0
  97. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_dana_inquiry_status_response.py +0 -0
  98. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_dana_request.py +0 -0
  99. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_dana_request_additional_info.py +0 -0
  100. {dana_python-2.0.0 → dana_python-2.1.0}/dana/disbursement/v1/models/transfer_to_dana_response.py +0 -0
  101. {dana_python-2.0.0 → dana_python-2.1.0}/dana/exceptions.py +0 -0
  102. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/__init__.py +0 -0
  103. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/__init__.py +0 -0
  104. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/api/__init__.py +0 -0
  105. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/api/merchant_management_api.py +0 -0
  106. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/enum.py +0 -0
  107. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/__init__.py +0 -0
  108. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/address_info.py +0 -0
  109. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/business_docs.py +0 -0
  110. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_division_request.py +0 -0
  111. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_division_request_ext_info.py +0 -0
  112. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_division_response.py +0 -0
  113. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_division_response_response.py +0 -0
  114. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_division_response_response_body.py +0 -0
  115. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_division_response_response_head.py +0 -0
  116. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_shop_request.py +0 -0
  117. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_shop_response.py +0 -0
  118. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_shop_response_response.py +0 -0
  119. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_shop_response_response_body.py +0 -0
  120. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/create_shop_response_response_head.py +0 -0
  121. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/division_resource_info.py +0 -0
  122. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/merchant_resource_information.py +0 -0
  123. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/mobile_no_info.py +0 -0
  124. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/pic_info.py +0 -0
  125. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_division_request.py +0 -0
  126. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_division_response.py +0 -0
  127. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_division_response_response.py +0 -0
  128. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_division_response_response_body.py +0 -0
  129. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_division_response_response_head.py +0 -0
  130. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_merchant_resource_request.py +0 -0
  131. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_merchant_resource_response.py +0 -0
  132. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_merchant_resource_response_response.py +0 -0
  133. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_merchant_resource_response_response_body.py +0 -0
  134. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_merchant_resource_response_response_head.py +0 -0
  135. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_shop_request.py +0 -0
  136. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_shop_response.py +0 -0
  137. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_shop_response_response.py +0 -0
  138. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_shop_response_response_body.py +0 -0
  139. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/query_shop_response_response_head.py +0 -0
  140. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/result_info.py +0 -0
  141. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/shop_resource_info.py +0 -0
  142. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_division_request.py +0 -0
  143. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_division_response.py +0 -0
  144. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_division_response_response.py +0 -0
  145. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_division_response_response_body.py +0 -0
  146. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_division_response_response_head.py +0 -0
  147. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_shop_request.py +0 -0
  148. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_shop_response.py +0 -0
  149. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_shop_response_response.py +0 -0
  150. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/update_shop_response_response_head.py +0 -0
  151. {dana_python-2.0.0 → dana_python-2.1.0}/dana/merchant_management/v1/models/user_name.py +0 -0
  152. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/__init__.py +0 -0
  153. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/__init__.py +0 -0
  154. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/api/__init__.py +0 -0
  155. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/api/payment_gateway_api.py +0 -0
  156. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/enum.py +0 -0
  157. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/__init__.py +0 -0
  158. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/actor_context.py +0 -0
  159. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/amount_detail.py +0 -0
  160. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/audit_info.py +0 -0
  161. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/buyer.py +0 -0
  162. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/cancel_order_request.py +0 -0
  163. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/cancel_order_response.py +0 -0
  164. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/consult_pay_payment_info.py +0 -0
  165. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/consult_pay_request.py +0 -0
  166. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/consult_pay_request_additional_info.py +0 -0
  167. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/consult_pay_response.py +0 -0
  168. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/create_order_by_api_additional_info.py +0 -0
  169. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/create_order_by_api_request.py +0 -0
  170. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/create_order_by_redirect_additional_info.py +0 -0
  171. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/create_order_by_redirect_request.py +0 -0
  172. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/create_order_response.py +0 -0
  173. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/create_order_response_additional_info.py +0 -0
  174. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/env_info.py +0 -0
  175. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/goods.py +0 -0
  176. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/money.py +0 -0
  177. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/order_api_object.py +0 -0
  178. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/order_redirect_object.py +0 -0
  179. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/pay_option_additional_info.py +0 -0
  180. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/pay_option_detail.py +0 -0
  181. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/pay_option_info.py +0 -0
  182. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/payment_view.py +0 -0
  183. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/promo_info.py +0 -0
  184. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/query_payment_request.py +0 -0
  185. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/query_payment_response.py +0 -0
  186. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/query_payment_response_additional_info.py +0 -0
  187. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/refund_option_bill.py +0 -0
  188. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/refund_order_request.py +0 -0
  189. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/refund_order_request_additional_info.py +0 -0
  190. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/refund_order_response.py +0 -0
  191. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/seller.py +0 -0
  192. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/shipping_info.py +0 -0
  193. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/status_detail.py +0 -0
  194. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/time_detail.py +0 -0
  195. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/url_param.py +0 -0
  196. {dana_python-2.0.0 → dana_python-2.1.0}/dana/payment_gateway/v1/models/virtual_account_info.py +0 -0
  197. {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/date_validation.py +0 -0
  198. {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/models.py +0 -0
  199. {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/open_api_configuration.py +0 -0
  200. {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/script.py +0 -0
  201. {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/snap_configuration.py +0 -0
  202. {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/snap_header.py +0 -0
  203. {dana_python-2.0.0 → dana_python-2.1.0}/dana/utils/url.py +0 -0
  204. {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/__init__.py +0 -0
  205. {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/finish_notify_payment_info.py +0 -0
  206. {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/finish_notify_request.py +0 -0
  207. {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/finish_notify_request_additional_info.py +0 -0
  208. {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/finish_notify_response.py +0 -0
  209. {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/money.py +0 -0
  210. {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/pay_option_info.py +0 -0
  211. {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/shop_info.py +0 -0
  212. {dana_python-2.0.0 → dana_python-2.1.0}/dana/webhook/webhook.py +0 -0
  213. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/__init__.py +0 -0
  214. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/__init__.py +0 -0
  215. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/api/__init__.py +0 -0
  216. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/custom_validation.py +0 -0
  217. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/models/__init__.py +0 -0
  218. {dana_python-2.0.0 → dana_python-2.1.0}/dana/widget/v1/util.py +0 -0
  219. {dana_python-2.0.0 → dana_python-2.1.0}/dana_python.egg-info/SOURCES.txt +0 -0
  220. {dana_python-2.0.0 → dana_python-2.1.0}/dana_python.egg-info/dependency_links.txt +0 -0
  221. {dana_python-2.0.0 → dana_python-2.1.0}/dana_python.egg-info/requires.txt +0 -0
  222. {dana_python-2.0.0 → dana_python-2.1.0}/dana_python.egg-info/top_level.txt +0 -0
  223. {dana_python-2.0.0 → dana_python-2.1.0}/setup.cfg +0 -0
  224. {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_disbursement_api.py +0 -0
  225. {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_merchant_management_api.py +0 -0
  226. {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_payment_gateway_with_automation.py +0 -0
  227. {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_snap_header.py +0 -0
  228. {dana_python-2.0.0 → dana_python-2.1.0}/tests/test_webhook.py +0 -0
  229. {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.0.0
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
- request_body = json.dumps(body)
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
- private_key_obj = serialization.load_pem_private_key(
94
- private_key.encode(),
95
- password=None,
96
- backend=default_backend()
97
- )
98
- return private_key_obj
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 snap_header pattern
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
- return cls.model_validate(obj)
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
- return cls.model_validate(obj)
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
- return cls.model_validate(obj)
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
- return cls.model_validate(obj)
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
- return cls.model_validate(obj)
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
- return cls.model_validate(obj)
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"),
@@ -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
- return cls.model_validate(obj)
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
- return cls.model_validate(obj)
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
- return cls.model_validate(obj)
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
- return cls.model_validate(obj)
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"),
@@ -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
- return cls.model_validate(obj)
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"),