wbportfolio 1.55.9__tar.gz → 1.56.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.

Potentially problematic release.


This version of wbportfolio might be problematic. Click here for more details.

Files changed (574) hide show
  1. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/PKG-INFO +1 -1
  2. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/api_clients/ubs.py +11 -9
  3. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/configs/display.py +4 -4
  4. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/configs/previews.py +3 -3
  5. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/filters.py +10 -10
  6. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/scripts.py +7 -2
  7. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/product_groups.py +3 -3
  8. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/products.py +3 -3
  9. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/assets.py +0 -1
  10. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/positions.py +0 -1
  11. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/transactions/fees.py +0 -2
  12. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/transactions/trades.py +0 -1
  13. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/handlers/asset_position.py +3 -3
  14. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/handlers/dividend.py +1 -1
  15. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/handlers/fees.py +2 -2
  16. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/handlers/trade.py +4 -4
  17. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/default_mapping.py +1 -1
  18. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/jpmorgan/customer_trade.py +2 -2
  19. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/jpmorgan/fees.py +2 -2
  20. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/jpmorgan/strategy.py +2 -2
  21. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/jpmorgan/valuation.py +2 -2
  22. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/leonteq/trade.py +2 -1
  23. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/natixis/equity.py +21 -3
  24. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/natixis/utils.py +13 -19
  25. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/equity.py +4 -3
  26. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/sylk.py +12 -11
  27. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/valuation.py +4 -2
  28. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/societe_generale/strategy.py +3 -3
  29. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/tellco/customer_trade.py +2 -1
  30. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/tellco/valuation.py +4 -3
  31. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/ubs/equity.py +2 -1
  32. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/ubs/valuation.py +2 -1
  33. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/utils.py +3 -1
  34. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/metric/backends/base.py +2 -2
  35. wbportfolio-1.56.0/wbportfolio/migrations/0090_dividendtransaction_price_fx_portfolio_and_more.py +44 -0
  36. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/asset.py +3 -2
  37. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/builder.py +0 -1
  38. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/custodians.py +3 -3
  39. wbportfolio-1.56.0/wbportfolio/models/exceptions.py +2 -0
  40. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/graphs/utils.py +11 -11
  41. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/mixins/liquidity_stress_test.py +1 -1
  42. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/orders/order_proposals.py +11 -8
  43. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/orders/orders.py +84 -62
  44. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/portfolio.py +7 -7
  45. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/portfolio_relationship.py +6 -0
  46. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/products.py +3 -0
  47. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/rebalancing.py +3 -0
  48. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/roles.py +4 -10
  49. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/transactions/claim.py +6 -5
  50. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/transactions/dividends.py +1 -0
  51. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/transactions/trades.py +1 -0
  52. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/transactions/transactions.py +16 -4
  53. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/pms/typing.py +1 -1
  54. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/rebalancing/models/market_capitalization_weighted.py +1 -5
  55. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/backends/controversy_portfolio.py +1 -1
  56. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/backends/exposure_portfolio.py +2 -2
  57. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/backends/instrument_list_portfolio.py +1 -1
  58. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/tests/test_exposure_portfolio.py +1 -1
  59. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/tests/test_stop_loss_instrument.py +2 -2
  60. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/tests/test_stop_loss_portfolio.py +1 -1
  61. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/orders/orders.py +56 -23
  62. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/transactions/claim.py +2 -2
  63. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/orders/test_order_proposals.py +27 -7
  64. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_portfolios.py +5 -5
  65. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_splits.py +1 -6
  66. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/viewsets/test_products.py +1 -0
  67. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/charts/assets.py +8 -4
  68. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/buttons/mixins.py +2 -2
  69. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/reconciliations.py +4 -4
  70. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/orders.py +22 -4
  71. wbportfolio-1.55.9/wbportfolio/models/exceptions.py +0 -2
  72. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/.gitignore +0 -0
  73. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/LICENSE +0 -0
  74. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/pyproject.toml +0 -0
  75. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/__init__.py +0 -0
  76. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/__init__.py +0 -0
  77. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/asset.py +0 -0
  78. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/custodians.py +0 -0
  79. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/indexes.py +0 -0
  80. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/orders/__init__.py +0 -0
  81. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/orders/order_proposals.py +0 -0
  82. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/orders/orders.py +0 -0
  83. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/portfolio.py +0 -0
  84. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/portfolio_relationships.py +0 -0
  85. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/product_groups.py +0 -0
  86. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/products.py +0 -0
  87. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/rebalancing.py +0 -0
  88. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/reconciliations.py +0 -0
  89. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/registers.py +0 -0
  90. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/roles.py +0 -0
  91. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/transactions/__init__.py +0 -0
  92. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/transactions/claim.py +0 -0
  93. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/transactions/dividends.py +0 -0
  94. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/transactions/fees.py +0 -0
  95. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/admin/transactions/trades.py +0 -0
  96. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/analysis/__init__.py +0 -0
  97. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/analysis/claims.py +0 -0
  98. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/api_clients/__init__.py +0 -0
  99. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/apps.py +0 -0
  100. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/constants.py +0 -0
  101. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/__init__.py +0 -0
  102. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/__init__.py +0 -0
  103. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/admin.py +0 -0
  104. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/apps.py +0 -0
  105. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/configs/__init__.py +0 -0
  106. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/configs/endpoints.py +0 -0
  107. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/constants.py +0 -0
  108. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/dynamic_preferences_registry.py +0 -0
  109. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/factories.py +0 -0
  110. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/management.py +0 -0
  111. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/migrations/0001_initial.py +0 -0
  112. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/migrations/__init__.py +0 -0
  113. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/models.py +0 -0
  114. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/serializers.py +0 -0
  115. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/tasks.py +0 -0
  116. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/tests/__init__.py +0 -0
  117. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/tests/conftest.py +0 -0
  118. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/tests/test_models.py +0 -0
  119. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/urls.py +0 -0
  120. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/contrib/company_portfolio/viewsets.py +0 -0
  121. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/defaults/__init__.py +0 -0
  122. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/defaults/fees/__init__.py +0 -0
  123. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/defaults/fees/default.py +0 -0
  124. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/dynamic_preferences_registry.py +0 -0
  125. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/__init__.py +0 -0
  126. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/adjustments.py +0 -0
  127. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/assets.py +0 -0
  128. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/claim.py +0 -0
  129. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/custodians.py +0 -0
  130. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/dividends.py +0 -0
  131. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/fees.py +0 -0
  132. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/indexes.py +0 -0
  133. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/orders/__init__.py +0 -0
  134. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/orders/order_proposals.py +0 -0
  135. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/orders/orders.py +0 -0
  136. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/portfolio_cash_flow.py +0 -0
  137. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/portfolio_cash_targets.py +0 -0
  138. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/portfolio_swing_pricings.py +0 -0
  139. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/portfolios.py +0 -0
  140. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/rebalancing.py +0 -0
  141. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/reconciliations.py +0 -0
  142. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/roles.py +0 -0
  143. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/factories/trades.py +0 -0
  144. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/__init__.py +0 -0
  145. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/assets_and_net_new_money_progression.py +0 -0
  146. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/custodians.py +0 -0
  147. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/esg.py +0 -0
  148. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/orders/__init__.py +0 -0
  149. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/orders/order_proposals.py +0 -0
  150. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/orders/orders.py +0 -0
  151. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/performances.py +0 -0
  152. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/portfolios.py +0 -0
  153. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/products.py +0 -0
  154. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/roles.py +0 -0
  155. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/signals.py +0 -0
  156. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/transactions/__init__.py +0 -0
  157. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/transactions/claim.py +0 -0
  158. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/transactions/mixins.py +0 -0
  159. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/filters/transactions/utils.py +0 -0
  160. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/fixtures/product_factsheets.yaml +0 -0
  161. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/fixtures/wbportfolio.yaml.gz +0 -0
  162. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/fixtures/wbrisk_management.yaml.gz +0 -0
  163. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/__init__.py +0 -0
  164. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/backends/__init__.py +0 -0
  165. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/backends/refinitiv/adjustment.py +0 -0
  166. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/backends/ubs/__init__.py +0 -0
  167. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/backends/ubs/asset_position.py +0 -0
  168. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/backends/ubs/fees.py +0 -0
  169. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/backends/ubs/instrument_price.py +0 -0
  170. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/backends/ubs/mixin.py +0 -0
  171. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/backends/utils.py +0 -0
  172. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/backends/wbfdm/__init__.py +0 -0
  173. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/backends/wbfdm/adjustment.py +0 -0
  174. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/backends/wbfdm/dividend.py +0 -0
  175. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/backends/wbfdm/mixin.py +0 -0
  176. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/handlers/__init__.py +0 -0
  177. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/handlers/adjustment.py +0 -0
  178. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/handlers/orders.py +0 -0
  179. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/handlers/portfolio_cash_flow.py +0 -0
  180. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/handlers/register.py +0 -0
  181. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/__init__.py +0 -0
  182. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/jpmorgan/__init__.py +0 -0
  183. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/leonteq/__init__.py +0 -0
  184. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/leonteq/customer_trade.py +0 -0
  185. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/leonteq/equity.py +0 -0
  186. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/leonteq/fees.py +0 -0
  187. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/leonteq/valuation.py +0 -0
  188. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/natixis/__init__.py +0 -0
  189. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/natixis/customer_trade.py +0 -0
  190. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/natixis/d1_customer_trade.py +0 -0
  191. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/natixis/d1_equity.py +0 -0
  192. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/natixis/d1_fees.py +0 -0
  193. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/natixis/d1_trade.py +0 -0
  194. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/natixis/d1_valuation.py +0 -0
  195. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/natixis/dividend.py +0 -0
  196. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/natixis/fees.py +0 -0
  197. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/natixis/trade.py +0 -0
  198. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/natixis/valuation.py +0 -0
  199. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/refinitiv/__init__.py +0 -0
  200. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/refinitiv/adjustment.py +0 -0
  201. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/__init__.py +0 -0
  202. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/custodian_positions.py +0 -0
  203. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/customer_trade.py +0 -0
  204. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/customer_trade_pending_slk.py +0 -0
  205. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/customer_trade_slk.py +0 -0
  206. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/customer_trade_without_pw.py +0 -0
  207. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/fees.py +0 -0
  208. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/perf_fees.py +0 -0
  209. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/portfolio_cash_flow.py +0 -0
  210. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/portfolio_future_cash_flow.py +0 -0
  211. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/registers.py +0 -0
  212. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/sg_lux/utils.py +0 -0
  213. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/societe_generale/__init__.py +0 -0
  214. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/societe_generale/customer_trade.py +0 -0
  215. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/societe_generale/valuation.py +0 -0
  216. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/tellco/__init__.py +0 -0
  217. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/tellco/equity.py +0 -0
  218. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/ubs/__init__.py +0 -0
  219. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/ubs/api/__init__.py +0 -0
  220. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/ubs/api/asset_position.py +0 -0
  221. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/ubs/api/fees.py +0 -0
  222. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/ubs/api/instrument_price.py +0 -0
  223. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/ubs/api/utils.py +0 -0
  224. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/ubs/customer_trade.py +0 -0
  225. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/ubs/historical_customer_trade.py +0 -0
  226. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/vontobel/__init__.py +0 -0
  227. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/vontobel/asset_position.py +0 -0
  228. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/vontobel/customer_trade.py +0 -0
  229. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/vontobel/historical_customer_trade.py +0 -0
  230. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/vontobel/instrument.py +0 -0
  231. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/vontobel/management_fees.py +0 -0
  232. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/vontobel/performance_fees.py +0 -0
  233. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/vontobel/trade.py +0 -0
  234. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/vontobel/utils.py +0 -0
  235. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/vontobel/valuation.py +0 -0
  236. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/parsers/vontobel/valuation_api.py +0 -0
  237. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/resources/__init__.py +0 -0
  238. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/resources/assets.py +0 -0
  239. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/import_export/resources/trades.py +0 -0
  240. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/jinja2/wbportfolio/sql/aum_nnm.sql +0 -0
  241. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/kpi_handlers/nnm.py +0 -0
  242. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/locale/de/LC_MESSAGES/django.mo +0 -0
  243. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/locale/de/LC_MESSAGES/django.po +0 -0
  244. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/locale/en/LC_MESSAGES/django.mo +0 -0
  245. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/locale/en/LC_MESSAGES/django.po +0 -0
  246. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/locale/fr/LC_MESSAGES/django.mo +0 -0
  247. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/locale/fr/LC_MESSAGES/django.po +0 -0
  248. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/metric/__init__.py +0 -0
  249. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/metric/backends/__init__.py +0 -0
  250. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/metric/backends/constants.py +0 -0
  251. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/metric/backends/portfolio_base.py +0 -0
  252. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/metric/backends/portfolio_esg.py +0 -0
  253. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/metric/tests/__init__.py +0 -0
  254. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/metric/tests/conftest.py +0 -0
  255. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/metric/tests/test_portfolio_base.py +0 -0
  256. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/metric/tests/test_portfolio_esg.py +0 -0
  257. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0001_initial_squashed.py +0 -0
  258. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0002_product_default_sub_account_squashed_0039_alter_assetallocation_company_and_more.py +0 -0
  259. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0040_instrument_financial_instrument.py +0 -0
  260. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0041_remove_listresearch_research_ptr_and_more.py +0 -0
  261. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0042_instrumentlist_instrumentlistthroughmodel_and_more.py +0 -0
  262. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0043_alter_instrumentlistthroughmodel_options_and_more.py +0 -0
  263. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0044_alter_instrumentlist_identifier.py +0 -0
  264. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0045_alter_instrument_financial_instrument.py +0 -0
  265. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0046_add_product_default_account.py +0 -0
  266. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0047_remove_product_default_sub_account.py +0 -0
  267. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0048_alter_trade_status.py +0 -0
  268. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0049_trade_claimed_shares.py +0 -0
  269. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0050_fees_fee_date_fees_wbportfolio_transac_1f7a29_idx.py +0 -0
  270. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0051_delete_macroreview.py +0 -0
  271. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0052_remove_cash_instrument_ptr_and_more.py +0 -0
  272. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0053_remove_product_group.py +0 -0
  273. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0054_portfolioinstrumentpreferredclassificationthroughmodel_and_more.py +0 -0
  274. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0055_remove_product__custom_management_rebates_and_more.py +0 -0
  275. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0056_remove_companyportfoliodata_assets_under_management_currency_and_more.py +0 -0
  276. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0057_alter_portfolio_preferred_instrument_classifications_and_more.py +0 -0
  277. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0058_pmsinstrument.py +0 -0
  278. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0059_fees_unique_fees.py +0 -0
  279. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0060_alter_portfolioportfoliothroughmodel_type.py +0 -0
  280. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0061_portfolio_bank_accounts_product_bank_account_and_more.py +0 -0
  281. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0062_alter_dailyportfoliocashflow_options.py +0 -0
  282. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0063_accountreconciliation_accountreconciliationline_and_more.py +0 -0
  283. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0064_alter_portfolio_managers_portfolio_is_tracked_and_more.py +0 -0
  284. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0065_alter_portfolio_managers_claim_as_shares_and_more.py +0 -0
  285. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0066_assetposition_initial_shares_at_custodian_and_more.py +0 -0
  286. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0067_assetposition_unique_asset_position.py +0 -0
  287. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0068_trade_internal_trade_trade_marked_as_internal_and_more.py +0 -0
  288. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0069_remove_portfolio_is_invested_and_more.py +0 -0
  289. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0070_remove_assetposition_unique_asset_position_and_more.py +0 -0
  290. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0071_alter_trade_options_alter_trade_order.py +0 -0
  291. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0072_trade_diff_shares.py +0 -0
  292. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0073_remove_product_price_computation_and_more.py +0 -0
  293. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0074_alter_rebalancer_frequency_and_more.py +0 -0
  294. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0075_portfolio_initial_position_date_and_more.py +0 -0
  295. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0076_alter_dividendtransaction_price_and_more.py +0 -0
  296. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0077_remove_transaction_currency_and_more.py +0 -0
  297. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0078_trade_drift_factor.py +0 -0
  298. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0079_alter_trade_drift_factor.py +0 -0
  299. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0080_alter_trade_drift_factor_alter_trade_weighting.py +0 -0
  300. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0081_alter_trade_drift_factor.py +0 -0
  301. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0082_remove_tradeproposal_creator_and_more.py +0 -0
  302. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0083_order_alter_trade_options_and_more.py +0 -0
  303. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0084_orderproposal_min_order_value.py +0 -0
  304. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0085_order_desired_target_weight.py +0 -0
  305. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0086_orderproposal_total_cash_weight.py +0 -0
  306. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0087_product_order_routing_custodian_adapter.py +0 -0
  307. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0088_orderproposal_total_effective_portfolio_contribution.py +0 -0
  308. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/0089_orderproposal_min_weighting.py +0 -0
  309. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/migrations/__init__.py +0 -0
  310. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/__init__.py +0 -0
  311. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/adjustments.py +0 -0
  312. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/graphs/__init__.py +0 -0
  313. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/graphs/portfolio.py +0 -0
  314. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/indexes.py +0 -0
  315. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/llm/wbcrm/analyze_relationship.py +0 -0
  316. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/mixins/__init__.py +0 -0
  317. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/mixins/instruments.py +0 -0
  318. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/orders/__init__.py +0 -0
  319. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/orders/routing.py +0 -0
  320. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/portfolio_cash_flow.py +0 -0
  321. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/portfolio_cash_targets.py +0 -0
  322. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/portfolio_swing_pricings.py +0 -0
  323. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/product_groups.py +0 -0
  324. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/reconciliations/__init__.py +0 -0
  325. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/reconciliations/account_reconciliation_lines.py +0 -0
  326. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/reconciliations/account_reconciliations.py +0 -0
  327. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/reconciliations/reconciliations.py +0 -0
  328. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/registers.py +0 -0
  329. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/signals.py +0 -0
  330. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/transactions/__init__.py +0 -0
  331. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/transactions/fees.py +0 -0
  332. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/models/utils.py +0 -0
  333. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/order_routing/__init__.py +0 -0
  334. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/order_routing/adapters/__init__.py +0 -0
  335. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/order_routing/adapters/ubs.py +0 -0
  336. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/permissions.py +0 -0
  337. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/pms/__init__.py +0 -0
  338. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/pms/analytics/__init__.py +0 -0
  339. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/pms/analytics/portfolio.py +0 -0
  340. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/pms/analytics/utils.py +0 -0
  341. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/pms/statistics/__init__.py +0 -0
  342. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/pms/trading/__init__.py +0 -0
  343. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/pms/trading/handler.py +0 -0
  344. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/preferences.py +0 -0
  345. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/rebalancing/__init__.py +0 -0
  346. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/rebalancing/base.py +0 -0
  347. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/rebalancing/decorators.py +0 -0
  348. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/rebalancing/models/__init__.py +0 -0
  349. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/rebalancing/models/composite.py +0 -0
  350. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/rebalancing/models/equally_weighted.py +0 -0
  351. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/rebalancing/models/model_portfolio.py +0 -0
  352. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/reports/__init__.py +0 -0
  353. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/reports/monthly_position_report.py +0 -0
  354. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/__init__.py +0 -0
  355. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/backends/__init__.py +0 -0
  356. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/backends/accounts.py +0 -0
  357. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/backends/liquidity_risk.py +0 -0
  358. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/backends/liquidity_stress_instrument.py +0 -0
  359. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/backends/mixins.py +0 -0
  360. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/backends/product_integrity.py +0 -0
  361. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/backends/stop_loss_instrument.py +0 -0
  362. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/backends/stop_loss_portfolio.py +0 -0
  363. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/backends/ucits_portfolio.py +0 -0
  364. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/tests/__init__.py +0 -0
  365. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/tests/conftest.py +0 -0
  366. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/tests/test_accounts.py +0 -0
  367. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/tests/test_controversy_portfolio.py +0 -0
  368. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/tests/test_instrument_list_portfolio.py +0 -0
  369. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/tests/test_liquidity_risk.py +0 -0
  370. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/tests/test_product_integrity.py +0 -0
  371. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/risk_management/tests/test_ucits_portfolio.py +0 -0
  372. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/__init__.py +0 -0
  373. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/adjustments.py +0 -0
  374. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/assets.py +0 -0
  375. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/custodians.py +0 -0
  376. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/orders/__init__.py +0 -0
  377. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/orders/order_proposals.py +0 -0
  378. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/portfolio_cash_flow.py +0 -0
  379. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/portfolio_cash_targets.py +0 -0
  380. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/portfolio_relationship.py +0 -0
  381. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/portfolio_swing_pricing.py +0 -0
  382. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/portfolios.py +0 -0
  383. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/positions.py +0 -0
  384. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/product_group.py +0 -0
  385. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/products.py +0 -0
  386. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/rebalancing.py +0 -0
  387. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/reconciliations.py +0 -0
  388. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/registers.py +0 -0
  389. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/roles.py +0 -0
  390. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/signals.py +0 -0
  391. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/transactions/__init__.py +0 -0
  392. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/transactions/dividends.py +0 -0
  393. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/transactions/fees.py +0 -0
  394. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/serializers/transactions/trades.py +0 -0
  395. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/static/wbportfolio/css/macro_review.css +0 -0
  396. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/static/wbportfolio/markdown/documentation/account_holding_reconciliation.md +0 -0
  397. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/static/wbportfolio/markdown/documentation/aggregate_asset_position_liquidity.md +0 -0
  398. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/static/wbportfolio/markdown/documentation/company.md +0 -0
  399. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/static/wbportfolio/markdown/documentation/earnings_instrument.md +0 -0
  400. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/static/wbportfolio/markdown/documentation/financial_analysis_instrument_ratios.md +0 -0
  401. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/static/wbportfolio/markdown/documentation/financial_statistics.md +0 -0
  402. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/static/wbportfolio/markdown/documentation/person.md +0 -0
  403. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tasks.py +0 -0
  404. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/templates/portfolio/email/customer_report.html +0 -0
  405. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/templates/portfolio/email/customer_trade_notification.html +0 -0
  406. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/templates/portfolio/email/email_base_template.html +0 -0
  407. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/templates/portfolio/email/rebalancing_report.html +0 -0
  408. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/templates/portfolio/macro/macro_review.html +0 -0
  409. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/__init__.py +0 -0
  410. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/analysis/__init__.py +0 -0
  411. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/analysis/test_claims.py +0 -0
  412. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/conftest.py +0 -0
  413. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/__init__.py +0 -0
  414. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/orders/__init__.py +0 -0
  415. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_account_reconciliation.py +0 -0
  416. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_assets.py +0 -0
  417. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_custodians.py +0 -0
  418. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_customer_trades.py +0 -0
  419. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_dividends.py +0 -0
  420. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_imports.py +0 -0
  421. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_instrument_mixins.py +0 -0
  422. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_merge.py +0 -0
  423. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_portfolio_cash_flow.py +0 -0
  424. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_portfolio_cash_targets.py +0 -0
  425. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_portfolio_swing_pricings.py +0 -0
  426. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_product_groups.py +0 -0
  427. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_products.py +0 -0
  428. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/test_roles.py +0 -0
  429. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/transactions/__init__.py +0 -0
  430. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/transactions/test_claim.py +0 -0
  431. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/transactions/test_fees.py +0 -0
  432. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/transactions/test_rebalancing.py +0 -0
  433. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/transactions/test_trades.py +0 -0
  434. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/models/utils.py +0 -0
  435. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/pms/__init__.py +0 -0
  436. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/pms/test_analytics.py +0 -0
  437. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/rebalancing/__init__.py +0 -0
  438. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/rebalancing/test_models.py +0 -0
  439. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/serializers/__init__.py +0 -0
  440. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/serializers/test_claims.py +0 -0
  441. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/signals.py +0 -0
  442. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/tests.py +0 -0
  443. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/viewsets/__init__.py +0 -0
  444. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/viewsets/test_assets.py +0 -0
  445. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/viewsets/test_performances.py +0 -0
  446. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/viewsets/transactions/__init__.py +0 -0
  447. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/tests/viewsets/transactions/test_claims.py +0 -0
  448. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/urls.py +0 -0
  449. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/utils.py +0 -0
  450. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/__init__.py +0 -0
  451. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/adjustments.py +0 -0
  452. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/assets.py +0 -0
  453. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/assets_and_net_new_money_progression.py +0 -0
  454. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/charts/__init__.py +0 -0
  455. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/__init__.py +0 -0
  456. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/buttons/__init__.py +0 -0
  457. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/buttons/adjustments.py +0 -0
  458. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/buttons/assets.py +0 -0
  459. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/buttons/claims.py +0 -0
  460. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/buttons/custodians.py +0 -0
  461. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/buttons/fees.py +0 -0
  462. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/buttons/portfolios.py +0 -0
  463. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/buttons/products.py +0 -0
  464. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/buttons/reconciliations.py +0 -0
  465. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/buttons/registers.py +0 -0
  466. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/buttons/signals.py +0 -0
  467. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/buttons/trades.py +0 -0
  468. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/__init__.py +0 -0
  469. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/adjustments.py +0 -0
  470. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/assets.py +0 -0
  471. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/claim.py +0 -0
  472. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/custodians.py +0 -0
  473. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/esg.py +0 -0
  474. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/fees.py +0 -0
  475. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/portfolio_cash_flow.py +0 -0
  476. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/portfolio_relationship.py +0 -0
  477. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/portfolios.py +0 -0
  478. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/positions.py +0 -0
  479. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/product_groups.py +0 -0
  480. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/product_performance.py +0 -0
  481. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/products.py +0 -0
  482. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/rebalancing.py +0 -0
  483. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/registers.py +0 -0
  484. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/roles.py +0 -0
  485. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/display/trades.py +0 -0
  486. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/__init__.py +0 -0
  487. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/adjustments.py +0 -0
  488. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/assets.py +0 -0
  489. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/claim.py +0 -0
  490. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/custodians.py +0 -0
  491. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/esg.py +0 -0
  492. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/fees.py +0 -0
  493. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/portfolio_relationship.py +0 -0
  494. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/portfolios.py +0 -0
  495. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/positions.py +0 -0
  496. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/product_groups.py +0 -0
  497. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/product_performance.py +0 -0
  498. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/products.py +0 -0
  499. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/rebalancing.py +0 -0
  500. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/reconciliations.py +0 -0
  501. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/roles.py +0 -0
  502. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/endpoints/trades.py +0 -0
  503. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/__init__.py +0 -0
  504. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/adjustments.py +0 -0
  505. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/assets.py +0 -0
  506. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/claim.py +0 -0
  507. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/custodians.py +0 -0
  508. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/fees.py +0 -0
  509. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/instrument_prices.py +0 -0
  510. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/orders.py +0 -0
  511. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/portfolio_cash_flow.py +0 -0
  512. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/portfolios.py +0 -0
  513. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/positions.py +0 -0
  514. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/product_groups.py +0 -0
  515. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/product_performance.py +0 -0
  516. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/products.py +0 -0
  517. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/reconciliations.py +0 -0
  518. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/registers.py +0 -0
  519. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/roles.py +0 -0
  520. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/menu/trades.py +0 -0
  521. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/previews/__init__.py +0 -0
  522. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/previews/portfolios.py +0 -0
  523. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/__init__.py +0 -0
  524. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/adjustments.py +0 -0
  525. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/assets.py +0 -0
  526. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/assets_and_net_new_money_progression.py +0 -0
  527. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/claim.py +0 -0
  528. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/custodians.py +0 -0
  529. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/esg.py +0 -0
  530. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/fees.py +0 -0
  531. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/instrument_prices.py +0 -0
  532. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/portfolios.py +0 -0
  533. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/positions.py +0 -0
  534. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/product_groups.py +0 -0
  535. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/product_performance.py +0 -0
  536. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/products.py +0 -0
  537. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/registers.py +0 -0
  538. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/roles.py +0 -0
  539. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/configs/titles/trades.py +0 -0
  540. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/custodians.py +0 -0
  541. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/esg.py +0 -0
  542. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/mixins.py +0 -0
  543. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/__init__.py +0 -0
  544. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/configs/__init__.py +0 -0
  545. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/configs/buttons/__init__.py +0 -0
  546. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/configs/buttons/order_proposals.py +0 -0
  547. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/configs/buttons/orders.py +0 -0
  548. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/configs/displays/__init__.py +0 -0
  549. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/configs/displays/order_proposals.py +0 -0
  550. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/configs/displays/orders.py +0 -0
  551. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/configs/endpoints/__init__.py +0 -0
  552. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/configs/endpoints/order_proposals.py +0 -0
  553. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/configs/endpoints/orders.py +0 -0
  554. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/configs/titles/__init__.py +0 -0
  555. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/configs/titles/orders.py +0 -0
  556. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/orders/order_proposals.py +0 -0
  557. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/portfolio_cash_flow.py +0 -0
  558. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/portfolio_cash_targets.py +0 -0
  559. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/portfolio_relationship.py +0 -0
  560. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/portfolio_swing_pricing.py +0 -0
  561. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/portfolios.py +0 -0
  562. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/positions.py +0 -0
  563. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/product_groups.py +0 -0
  564. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/product_performance.py +0 -0
  565. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/products.py +0 -0
  566. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/rebalancing.py +0 -0
  567. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/reconciliations.py +0 -0
  568. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/registers.py +0 -0
  569. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/roles.py +0 -0
  570. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/transactions/__init__.py +0 -0
  571. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/transactions/claim.py +0 -0
  572. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/transactions/fees.py +0 -0
  573. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/transactions/mixins.py +0 -0
  574. {wbportfolio-1.55.9 → wbportfolio-1.56.0}/wbportfolio/viewsets/transactions/trades.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbportfolio
3
- Version: 1.55.9
3
+ Version: 1.56.0
4
4
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
5
5
  License-File: LICENSE
6
6
  Requires-Dist: cryptography==3.4.*
@@ -62,21 +62,21 @@ class UBSNeoAPIClient:
62
62
  def _raise_for_status(self, response):
63
63
  try:
64
64
  response.raise_for_status()
65
- except HTTPError:
65
+ except HTTPError as e:
66
66
  json_response = response.json()
67
- raise HTTPError(json_response.get("errors", json_response.get("message")))
67
+ raise HTTPError(json_response.get("errors", json_response.get("message"))) from e
68
68
 
69
69
  def get_rebalance_service_status(self) -> dict:
70
70
  """Check API connection status."""
71
71
  url = f"{self.BASE_URL}/ged-amc/external/rebalance/v1/status"
72
- response = requests.get(url, headers=self._get_headers())
72
+ response = requests.get(url, headers=self._get_headers(), timeout=10)
73
73
  self._raise_for_status(response)
74
74
  return self._get_json(response)
75
75
 
76
76
  def get_rebalance_status_for_isin(self, isin: str) -> dict:
77
77
  """Check certificate accessibility and workflow status for given ISIN."""
78
78
  url = f"{self.BASE_URL}/ged-amc/external/rebalance/v1/status/{isin}"
79
- response = requests.get(url, headers=self._get_headers())
79
+ response = requests.get(url, headers=self._get_headers(), timeout=10)
80
80
  self._raise_for_status(response)
81
81
  return self._get_json(response)
82
82
 
@@ -90,7 +90,7 @@ class UBSNeoAPIClient:
90
90
  isin = self._validate_isin(isin, test=test)
91
91
  url = f"{self.BASE_URL}/ged-amc/external/rebalance/v1/submit/{isin}"
92
92
  payload = {"items": items}
93
- response = requests.post(url, json=payload, headers=self._get_headers())
93
+ response = requests.post(url, json=payload, headers=self._get_headers(), timeout=10)
94
94
  self._raise_for_status(response)
95
95
  return self._get_json(response)
96
96
 
@@ -99,7 +99,7 @@ class UBSNeoAPIClient:
99
99
  isin = self._validate_isin(isin)
100
100
  url = f"{self.BASE_URL}/ged-amc/external/rebalance/v1/savedraft/{isin}"
101
101
  payload = {"items": items}
102
- response = requests.post(url, json=payload, headers=self._get_headers())
102
+ response = requests.post(url, json=payload, headers=self._get_headers(), timeout=10)
103
103
  self._raise_for_status(response)
104
104
  return self._get_json(response)
105
105
 
@@ -107,20 +107,20 @@ class UBSNeoAPIClient:
107
107
  """Cancel a rebalance request."""
108
108
  isin = self._validate_isin(isin)
109
109
  url = f"{self.BASE_URL}/ged-amc/external/rebalance/v1/cancel/{isin}"
110
- response = requests.delete(url, headers=self._get_headers())
110
+ response = requests.delete(url, headers=self._get_headers(), timeout=10)
111
111
  self._raise_for_status(response)
112
112
  return self._get_json(response)
113
113
 
114
114
  def get_current_rebalance_request(self, isin: str) -> dict:
115
115
  """Fetch the current rebalance request for a certificate."""
116
116
  url = f"{self.BASE_URL}/ged-amc/external/rebalance/v1/currentRebalanceRequest/{isin}"
117
- response = requests.get(url, headers=self._get_headers())
117
+ response = requests.get(url, headers=self._get_headers(), timeout=10)
118
118
  self._raise_for_status(response)
119
119
  return self._get_json(response)
120
120
 
121
121
  def get_portfolio_at_date(self, isin: str, val_date: date) -> dict:
122
122
  url = f"https://neo.ubs.com/api/ged-amc/external/report/v1/valuation/{isin}/{val_date:%Y-%m-%d}"
123
- response = requests.get(url, headers=self._get_headers())
123
+ response = requests.get(url, headers=self._get_headers(), timeout=10)
124
124
  self._raise_for_status(response)
125
125
  return self._get_json(response)
126
126
 
@@ -130,6 +130,7 @@ class UBSNeoAPIClient:
130
130
  url,
131
131
  headers=self._get_headers(),
132
132
  params={"fromDate": from_date.strftime("%Y-%m-%d"), "toDate": to_date.strftime("%Y-%m-%d")},
133
+ timeout=10,
133
134
  )
134
135
  self._raise_for_status(response)
135
136
  return self._get_json(response)
@@ -140,6 +141,7 @@ class UBSNeoAPIClient:
140
141
  url,
141
142
  headers=self._get_headers(),
142
143
  params={"fromDate": from_date.strftime("%Y-%m-%d"), "toDate": to_date.strftime("%Y-%m-%d")},
144
+ timeout=10,
143
145
  )
144
146
  self._raise_for_status(response)
145
147
  return self._get_json(response)
@@ -1,8 +1,8 @@
1
1
  from typing import Optional
2
2
 
3
3
  from django.utils.translation import gettext as _
4
- from wbcore.contrib.directory.viewsets.display.entries import CompanyModelDisplay as CMD
5
- from wbcore.contrib.directory.viewsets.display.entries import PersonModelDisplay as PMD
4
+ from wbcore.contrib.directory.viewsets.display.entries import CompanyModelDisplay as BaseCompanyModelDisplay
5
+ from wbcore.contrib.directory.viewsets.display.entries import PersonModelDisplay as BasePersonModelDisplay
6
6
  from wbcore.metadata.configs import display as dp
7
7
  from wbcore.metadata.configs.display.instance_display import (
8
8
  Inline,
@@ -62,7 +62,7 @@ AUM_FIELDS = Section(
62
62
  )
63
63
 
64
64
 
65
- class CompanyModelDisplay(CMD):
65
+ class CompanyModelDisplay(BaseCompanyModelDisplay):
66
66
  def get_list_display(self) -> Optional[dp.ListDisplay]:
67
67
  list_display = super().get_list_display()
68
68
  list_display.fields = (
@@ -134,7 +134,7 @@ class CompanyModelDisplay(CMD):
134
134
  return instance_display
135
135
 
136
136
 
137
- class PersonModelDisplay(PMD):
137
+ class PersonModelDisplay(BasePersonModelDisplay):
138
138
  def get_list_display(self) -> Optional[dp.ListDisplay]:
139
139
  list_display = super().get_list_display()
140
140
 
@@ -1,3 +1,5 @@
1
+ from contextlib import suppress
2
+
1
3
  from wbcore.contrib.directory.viewsets.previews import EntryPreviewConfig
2
4
  from wbcore.contrib.icons import WBIcon
3
5
  from wbcore.metadata.configs import buttons as bt
@@ -17,12 +19,10 @@ class CompanyPreviewConfig(EntryPreviewConfig):
17
19
  ["asset_under_management", "invested_assets_under_management_usd"],
18
20
  [repeat_field(2, "potential")],
19
21
  ]
20
- try:
22
+ with suppress(Exception):
21
23
  entry = self.view.get_object()
22
24
  if entry.profile_image:
23
25
  fields.insert(0, [repeat_field(2, "profile_image")])
24
- except Exception:
25
- pass
26
26
 
27
27
  return create_simple_display(fields)
28
28
 
@@ -1,6 +1,6 @@
1
1
  from wbcore import filters
2
- from wbcore.contrib.directory.filters import CompanyFilter as CF
3
- from wbcore.contrib.directory.filters import PersonFilter as PF
2
+ from wbcore.contrib.directory.filters import CompanyFilter as BaseCompanyFilter
3
+ from wbcore.contrib.directory.filters import PersonFilter as BasePersonFilter
4
4
  from wbcore.contrib.directory.models import Company, Person
5
5
 
6
6
 
@@ -99,29 +99,29 @@ class EntryPortfolioFilter(filters.FilterSet):
99
99
  return queryset
100
100
 
101
101
 
102
- class CompanyFilter(CF, EntryPortfolioFilter):
102
+ class CompanyFilter(BaseCompanyFilter, EntryPortfolioFilter):
103
103
  @classmethod
104
104
  def get_filter_class_for_remote_filter(cls):
105
105
  """
106
106
  Define which filterset class sender to user for remote filter registration
107
107
  """
108
- return CF
108
+ return BaseCompanyFilter
109
109
 
110
- class Meta(CF.Meta):
110
+ class Meta(BaseCompanyFilter.Meta):
111
111
  fields = {
112
- **CF.Meta.fields,
112
+ **BaseCompanyFilter.Meta.fields,
113
113
  }
114
114
 
115
115
 
116
- class PersonFilter(PF, EntryPortfolioFilter):
116
+ class PersonFilter(BasePersonFilter, EntryPortfolioFilter):
117
117
  @classmethod
118
118
  def get_filter_class_for_remote_filter(cls):
119
119
  """
120
120
  Define which filterset class sender to user for remote filter registration
121
121
  """
122
- return PF
122
+ return BasePersonFilter
123
123
 
124
- class Meta(PF.Meta):
124
+ class Meta(BasePersonFilter.Meta):
125
125
  fields = {
126
- **PF.Meta.fields,
126
+ **BasePersonFilter.Meta.fields,
127
127
  }
@@ -1,8 +1,11 @@
1
+ import logging
1
2
  import re
2
3
 
3
4
  from wbcore.contrib.currency.models import Currency
4
5
  from wbcore.contrib.directory.models import Company
5
6
 
7
+ logger = logging.getLogger("pms")
8
+
6
9
 
7
10
  def get_currency_and_assets_under_management(
8
11
  aum_string, currency_mapping, default_currency, multiplier_mapping, default_multiplier
@@ -72,5 +75,7 @@ def assign_aum():
72
75
  portfolio_data.assets_under_management_currency = currency
73
76
  try:
74
77
  portfolio_data.save()
75
- except Exception:
76
- pass
78
+ except Exception as e:
79
+ logger.error(
80
+ f"while we try to save the customer portfolio aum data for {company}, we encounter the error: {e}"
81
+ )
@@ -21,10 +21,10 @@ class ProductGroupFactory(InstrumentFactory):
21
21
  paying_agent = factory.SubFactory("wbcore.contrib.directory.factories.entries.CompanyFactory")
22
22
 
23
23
  @factory.post_generation
24
- def create_initial_portfolio(product_group, *args, **kwargs):
25
- if product_group.id and not product_group.portfolios.exists():
24
+ def create_initial_portfolio(self, *args, **kwargs):
25
+ if self.id and not self.portfolios.exists():
26
26
  portfolio = PortfolioFactory.create()
27
- InstrumentPortfolioThroughModel.objects.create(instrument=product_group, portfolio=portfolio)
27
+ InstrumentPortfolioThroughModel.objects.create(instrument=self, portfolio=portfolio)
28
28
 
29
29
 
30
30
  class ProductGroupRepresentantFactory(factory.django.DjangoModelFactory):
@@ -40,10 +40,10 @@ class ProductFactory(InstrumentFactory):
40
40
  instrument_type = factory.LazyAttribute(lambda o: InstrumentTypeFactory.create(name="Product", key="product"))
41
41
 
42
42
  @factory.post_generation
43
- def create_initial_portfolio(product, *args, **kwargs):
44
- if product.id and not product.portfolios.exists():
43
+ def create_initial_portfolio(self, *args, **kwargs):
44
+ if self.id and not self.portfolios.exists():
45
45
  portfolio = PortfolioFactory.create()
46
- InstrumentPortfolioThroughModel.objects.create(instrument=product, portfolio=portfolio)
46
+ InstrumentPortfolioThroughModel.objects.create(instrument=self, portfolio=portfolio)
47
47
 
48
48
  # wbportfolio = factory.SubFactory(PortfolioFactory)
49
49
  # portfolio_computed = factory.SubFactory(PortfolioFactory)
@@ -456,7 +456,6 @@ def get_default_hedged_currency(field, request, view):
456
456
 
457
457
  class ContributionChartFilter(wb_filters.FilterSet):
458
458
  date = wb_filters.FinancialPerformanceDateRangeFilter(
459
- method=wb_filters.DateRangeFilter.base_date_range_filter_method,
460
459
  label="Date Range",
461
460
  required=True,
462
461
  clearable=False,
@@ -76,7 +76,6 @@ class AssetPositionPandasFilter(DateFilterMixin, PandasFilterSetMixin, wb_filter
76
76
  date = total_value_fx_usd = total_value_fx_usd__gte = total_value_fx_usd__lte = None
77
77
 
78
78
  date = wb_filters.FinancialPerformanceDateRangeFilter(
79
- method=wb_filters.DateRangeFilter.base_date_range_filter_method,
80
79
  label="Date Range",
81
80
  required=True,
82
81
  clearable=False,
@@ -16,7 +16,6 @@ class FeesFilter(wb_filters.FilterSet):
16
16
  """
17
17
 
18
18
  fee_date = wb_filters.DateRangeFilter(
19
- method=wb_filters.DateRangeFilter.base_date_range_filter_method,
20
19
  label="Date Range",
21
20
  initial=get_transaction_default_date_range,
22
21
  required=True,
@@ -52,7 +51,6 @@ class FeesProductFilterSet(FeesFilter):
52
51
  class FeesAggregatedFilter(PandasFilterSetMixin, wb_filters.FilterSet):
53
52
  fee_date = wb_filters.DateRangeFilter(
54
53
  label="Date Range",
55
- method=wb_filters.DateRangeFilter.base_date_range_filter_method,
56
54
  required=True,
57
55
  clearable=False,
58
56
  initial=current_quarter_date_range,
@@ -14,7 +14,6 @@ from .utils import get_transaction_default_date_range
14
14
 
15
15
  class TradeFilter(OppositeSharesFieldMethodMixin, wb_filters.FilterSet):
16
16
  transaction_date = wb_filters.DateRangeFilter(
17
- method=wb_filters.DateRangeFilter.base_date_range_filter_method,
18
17
  label="Date Range",
19
18
  initial=get_transaction_default_date_range,
20
19
  )
@@ -78,14 +78,14 @@ class AssetPositionImportHandler(ImportExportHandler):
78
78
  data["initial_price"] = data["underlying_quote"].get_price(
79
79
  data["date"], price_date_timedelta=self.MAX_PRICE_DATE_TIMEDELTA
80
80
  )
81
- except ValueError:
82
- raise DeserializationError("Price not provided but can not be found automatically")
81
+ except ValueError as e:
82
+ raise DeserializationError("Price not provided but can not be found automatically") from e
83
83
 
84
84
  # number type deserialization and sanitization
85
85
  # ensure the provided Decimal field are of type Decimal
86
86
  decimal_fields = ["initial_currency_fx_rate", "initial_price", "initial_shares", "weighting"]
87
87
  for field in decimal_fields:
88
- if not (value := data.get(field, None)) is None:
88
+ if (value := data.get(field, None)) is not None:
89
89
  data[field] = Decimal(value)
90
90
 
91
91
  if data["weighting"] == 0:
@@ -36,7 +36,7 @@ class DividendImportHandler(ImportExportHandler):
36
36
  data["currency"] = self.currency_handler.process_object(data["currency"], read_only=True)[0]
37
37
 
38
38
  for field in self.model._meta.get_fields():
39
- if not (value := data.get(field.name, None)) is None and isinstance(field, models.DecimalField):
39
+ if (value := data.get(field.name, None)) is not None and isinstance(field, models.DecimalField):
40
40
  q = 1 / (math.pow(10, 4))
41
41
  data[field.name] = Decimal(value).quantize(Decimal(str(q)))
42
42
 
@@ -24,8 +24,8 @@ class FeesImportHandler(ImportExportHandler):
24
24
  data["product"] = Product.objects.get(**product_data)
25
25
  else:
26
26
  data["product"] = Product.objects.get(id=product_data)
27
- except Product.DoesNotExist:
28
- raise DeserializationError("There is no valid linked product for in this row.")
27
+ except Product.DoesNotExist as e:
28
+ raise DeserializationError("There is no valid linked product for in this row.") from e
29
29
 
30
30
  if "currency" not in data:
31
31
  data["currency"] = data["product"].currency
@@ -65,15 +65,15 @@ class TradeImportHandler(ImportExportHandler):
65
65
  try:
66
66
  product = Product.objects.get(id=underlying_instrument.id)
67
67
  data["shares"] = nominal / product.share_price
68
- except Product.DoesNotExist:
68
+ except Product.DoesNotExist as e:
69
69
  raise DeserializationError(
70
70
  "We cannot compute the number of shares from the nominal value as we cannot find the product share price."
71
- )
71
+ ) from e
72
72
  else:
73
73
  raise DeserializationError("We couldn't find a valid underlying instrument this row.")
74
74
 
75
75
  for field in self.model._meta.get_fields():
76
- if not (value := data.get(field.name, None)) is None and isinstance(field, models.DecimalField):
76
+ if (value := data.get(field.name, None)) is not None and isinstance(field, models.DecimalField):
77
77
  q = (
78
78
  1 / (math.pow(10, 4))
79
79
  ) # we need that convertion mechanism otherwise there is floating point approximation error while casting to decimal and get_instance does not work as expected
@@ -86,7 +86,7 @@ class TradeImportHandler(ImportExportHandler):
86
86
  data["transaction_date"] = data["book_date"]
87
87
  return self.model.objects.create(**data, import_source=self.import_source)
88
88
 
89
- def _get_instance(self, data: Dict[str, Any], history: Optional[models.QuerySet] = None, **kwargs) -> models.Model:
89
+ def _get_instance(self, data: Dict[str, Any], history: Optional[models.QuerySet] = None, **kwargs) -> models.Model: # noqa: C901
90
90
  self.import_source.log += "\nGet Trade Instance."
91
91
  if transaction_date := data.get("transaction_date"):
92
92
  dates_lookup = {"transaction_date": transaction_date}
@@ -7,7 +7,7 @@ def parse(import_source):
7
7
  if (
8
8
  (data_backend := import_source.source.data_backend)
9
9
  and (backend_class := data_backend.backend_class)
10
- and (default_mapping := getattr(backend_class, "DEFAULT_MAPPING"))
10
+ and (default_mapping := backend_class.DEFAULT_MAPPING)
11
11
  ):
12
12
  df = pd.read_json(import_source.file, orient="records")
13
13
  if not df.empty:
@@ -11,8 +11,8 @@ from wbportfolio.models import Product, Trade
11
11
  def file_name_parse(file_name):
12
12
  dates = re.findall("([0-9]{8})", file_name)
13
13
 
14
- assert len(dates) > 0
15
-
14
+ if len(dates) <= 0:
15
+ raise ValueError("No dates found in the filename")
16
16
  parts_dict = {"valuation_date": datetime.datetime.strptime(dates[0], "%Y%m%d").date()}
17
17
 
18
18
  isin = re.findall("([A-Z]{2}[A-Z0-9]{9}[0-9]{1})", file_name)
@@ -14,8 +14,8 @@ logger = logging.getLogger("importers.parsers.jpmorgan.fee")
14
14
  def file_name_parse(file_name):
15
15
  dates = re.findall("([0-9]{8})", file_name)
16
16
 
17
- assert len(dates) == 1, "Not exactly 1 date found in the filename"
18
-
17
+ if len(dates) != 1:
18
+ raise ValueError("Not exactly 1 date found in the filename")
19
19
  return {"valuation_date": datetime.datetime.strptime(dates[0], "%Y%m%d").date()}
20
20
 
21
21
 
@@ -13,8 +13,8 @@ logger = logging.getLogger("importers.parsers.jp_morgan.strategy")
13
13
  def file_name_parse(file_name):
14
14
  dates = re.findall("([0-9]{8})", file_name)
15
15
 
16
- assert len(dates) == 1, "Not exactly 1 date found in the filename"
17
-
16
+ if len(dates) != 1:
17
+ raise ValueError("Not exactly 1 date found in the filename")
18
18
  return {"valuation_date": datetime.datetime.strptime(dates[0], "%Y%m%d").date()}
19
19
 
20
20
 
@@ -13,8 +13,8 @@ logger = logging.getLogger("importers.parsers.jpmorgan.index")
13
13
  def file_name_parse(file_name):
14
14
  dates = re.findall("([0-9]{8})", file_name)
15
15
 
16
- assert len(dates) == 1, "Not exactly 1 date found in the filename"
17
-
16
+ if len(dates) != 1:
17
+ raise ValueError("Not exactly 1 date found in the filename")
18
18
  return {"valuation_date": datetime.datetime.strptime(dates[0], "%Y%m%d").date()}
19
19
 
20
20
 
@@ -10,7 +10,8 @@ from wbportfolio.models import Product
10
10
  def file_name_parse(file_name):
11
11
  isin = re.findall("([A-Z]{2}[A-Z0-9]{9}[0-9]{1})", file_name)
12
12
 
13
- assert len(isin) == 1, "Not exactly 1 isin found in the filename"
13
+ if len(isin) != 1:
14
+ raise ValueError("Not exactly 1 isin found in the filename")
14
15
 
15
16
  return {"isin": isin[0]}
16
17
 
@@ -1,3 +1,5 @@
1
+ from zipfile import BadZipFile
2
+
1
3
  import numpy as np
2
4
  import pandas as pd
3
5
 
@@ -29,13 +31,26 @@ def _apply_adjusting_factor(row):
29
31
  def parse(import_source):
30
32
  # Parse the Parts of the filename into the different parts
31
33
  parts = file_name_parse_isin(import_source.file.name)
32
-
33
34
  # Get the valuation date and investment from the parts list
34
35
  valuation_date = parts["valuation_date"]
35
36
  product_data = parts["product"]
36
37
 
37
38
  # Load file into a CSV DictReader
38
- df = pd.read_csv(import_source.file, encoding="utf-16", delimiter=";")
39
+ if import_source.file.name.lower().endswith(".csv"):
40
+ df = pd.read_csv(import_source.file, encoding="utf-16", delimiter=";")
41
+ else:
42
+ try:
43
+ df = pd.read_excel(import_source.file, engine="openpyxl", sheet_name="Basket Valuation")
44
+ except BadZipFile:
45
+ df = pd.read_excel(import_source.file, engine="xlrd", sheet_name="Basket Valuation")
46
+ xx, yy = np.where(df == "Ticker")
47
+ if not xx and not yy:
48
+ xx, yy = np.where(df == "Code")
49
+ df = df.iloc[xx[0] :, yy[0] :]
50
+ df = df.rename(columns=df.iloc[0]).drop(df.index[0]).dropna(how="all")
51
+ df["Quotity/Adj. factor"] = 1.0
52
+ df = df.rename(columns={"Code": "Ticker"})
53
+
39
54
  df = df.rename(columns=FIELD_MAP)
40
55
  df = df.dropna(subset=["initial_price"])
41
56
  df["initial_price"] = df["initial_price"].astype("str").str.replace(" ", "").astype("float")
@@ -50,7 +65,10 @@ def parse(import_source):
50
65
  df = df.drop(columns=df.columns.difference(FIELD_MAP.values()))
51
66
 
52
67
  df["portfolio__instrument_type"] = "product"
53
- df["portfolio__isin"] = product_data["isin"]
68
+ if "isin" in product_data:
69
+ df["portfolio__isin"] = product_data["isin"]
70
+ if "ticker" in product_data:
71
+ df["portfolio__ticker"] = product_data["ticker"]
54
72
  df["is_estimated"] = False
55
73
  df["date"] = valuation_date.strftime("%Y-%m-%d")
56
74
  df["asset_valuation_date"] = pd.to_datetime(df["asset_valuation_date"], dayfirst=True).dt.strftime("%Y-%m-%d")
@@ -1,6 +1,7 @@
1
- import datetime
2
1
  import re
3
2
 
3
+ from django.utils.dateparse import parse_date
4
+
4
5
  from wbportfolio.models import Product
5
6
 
6
7
  INSTRUMENT_MAP_NAME = {"EDA23_AtonRa Z class": "LU2170995018"}
@@ -53,21 +54,14 @@ def _get_underlying_instrument(bbg_code, name, currency, instrument_type="equity
53
54
 
54
55
 
55
56
  def file_name_parse_isin(file_name):
56
- dates = re.findall(r"_([0-9]{4}-?[0-9]{2}-?[0-9]{2})", file_name)
57
- identifier = re.findall(r"([A-Z]{2}(?![A-Z]{10}\b)[A-Z0-9]{10})_", file_name)
58
- assert len(dates) == 2, "Not 2 dates found in the filename"
59
- assert len(identifier) == 1, "Not exactly 1 identifier found in the filename"
60
- try:
61
- valuation_date = datetime.datetime.strptime(dates[0], "%Y-%m-%d").date()
62
- except ValueError:
63
- valuation_date = datetime.datetime.strptime(dates[0], "%Y%m%d").date()
64
- try:
65
- generation_date = datetime.datetime.strptime(dates[1], "%Y-%m-%d").date()
66
- except ValueError:
67
- generation_date = datetime.datetime.strptime(dates[1], "%Y%m%d").date()
68
-
69
- return {
70
- "product": {"isin": identifier[0]},
71
- "valuation_date": valuation_date,
72
- "generation_date": generation_date,
73
- }
57
+ dates = re.findall(r"_([0-9]{4}[-_]?[0-9]{2}[-_]?[0-9]{2})", file_name)
58
+ isin = re.findall(r"([A-Z]{2}(?![A-Z]{10}\b)[A-Z0-9]{10})_", file_name)
59
+ ticker = re.findall(r"(NX[A-Z]*)_", file_name)
60
+ if len(dates) == 0:
61
+ raise ValueError("Not dates found in the filename")
62
+ res = {"valuation_date": parse_date(dates[0].replace("_", "-"))}
63
+ if len(isin) >= 1:
64
+ res["product"] = {"isin": isin[0]}
65
+ elif len(ticker) == 1:
66
+ res["product"] = {"ticker": ticker[0]}
67
+ return res
@@ -11,9 +11,10 @@ from wbportfolio.models import ProductGroup
11
11
  def file_name_parse(file_name):
12
12
  dates = re.findall(r"([0-9]{4}-[0-9]{2}-[0-9]{2})", file_name)
13
13
  isin = re.findall(r"\.([a-zA-Z0-9]*)_", file_name)
14
-
15
- assert len(dates) == 2, "Not 2 dates found in the filename"
16
- assert len(isin) == 1, "Not exactly 1 isin found in the filename"
14
+ if len(dates) != 2:
15
+ raise ValueError("Not 2 dates found in the filename")
16
+ if len(isin) != 1:
17
+ raise ValueError("Not exactly 1 isin found in the filename")
17
18
 
18
19
  return {
19
20
  "isin": isin[0],
@@ -10,6 +10,7 @@ files generated by other spreadsheets.
10
10
  """
11
11
 
12
12
  import re
13
+ from ast import literal_eval
13
14
 
14
15
 
15
16
  class Table:
@@ -185,7 +186,7 @@ class SYLK:
185
186
  self.cury = int(val)
186
187
 
187
188
  elif ftd == "K":
188
- val = eval(self.escape(val))
189
+ val = literal_eval(self.escape(val))
189
190
  # if type(val) == int:
190
191
  # if self.currenttype == "date":
191
192
  # # value is offset in days from datebase
@@ -208,20 +209,20 @@ class SYLK:
208
209
  self.printformats.append((format, self.knownformats[format]))
209
210
  else:
210
211
  # hack to guess type...
211
- hasY = "y" in format
212
- hasD = "d" in format
213
- hasH = "h" in format
214
- hasZ = "0" in format
215
- hasP = "." in format
216
- if (hasD or hasY) and hasH:
212
+ has_y = "y" in format
213
+ has_d = "d" in format
214
+ has_h = "h" in format
215
+ has_z = "0" in format
216
+ has_p = "." in format
217
+ if (has_d or has_y) and has_h:
217
218
  dtype = "datetime"
218
- elif hasD or hasY:
219
+ elif has_d or has_y:
219
220
  dtype = "date"
220
- elif hasH:
221
+ elif has_h:
221
222
  dtype = "time"
222
- elif hasP and hasZ:
223
+ elif has_p and has_z:
223
224
  dtype = "float"
224
- elif hasZ:
225
+ elif has_z:
225
226
  dtype = "int"
226
227
  else:
227
228
  dtype = "string"
@@ -10,8 +10,10 @@ def file_name_parse(file_name):
10
10
  dates = re.findall(r"([0-9]{4}-[0-9]{2}-[0-9]{2})", file_name)
11
11
  isin = re.findall(r"\.([a-zA-Z0-9]*)_", file_name)
12
12
 
13
- assert len(dates) == 2, "Not 2 dates found in the filename"
14
- assert len(isin) == 1, "Not exactly 1 isin found in the filename"
13
+ if len(dates) != 2:
14
+ raise ValueError("Not 2 dates found in the filename")
15
+ if len(isin) != 1:
16
+ raise ValueError("Not exactly 1 isin found in the filename")
15
17
 
16
18
  return {
17
19
  "isin": isin[0],
@@ -14,8 +14,8 @@ logger = logging.getLogger("importers.parsers.jp_morgan.strategy")
14
14
  def file_name_parse(file_name):
15
15
  dates = re.findall("([0-9]{8})", file_name)
16
16
 
17
- assert len(dates) == 1, "Not exactly 1 date found in the filename"
18
-
17
+ if len(dates) != 1:
18
+ raise ValueError("Not exactly 1 date found in the filename")
19
19
  return {"valuation_date": datetime.datetime.strptime(dates[0], "%Y%m%d").date()}
20
20
 
21
21
 
@@ -23,7 +23,7 @@ def parse(import_source):
23
23
  data = list()
24
24
  prices = list()
25
25
  df_dict = pd.read_excel(BytesIO(import_source.file.read()), engine="openpyxl", sheet_name=None)
26
- for sheet_name, df in df_dict.items():
26
+ for df in df_dict.values():
27
27
  xx, yy = np.where(df == "Ticker")
28
28
  if len(xx) == 1 and len(yy) == 1:
29
29
  df_info = df.iloc[: xx[0] - 1, :].transpose()
@@ -20,7 +20,8 @@ product_mapping = {
20
20
 
21
21
  def file_name_parse(file_name):
22
22
  identifier = re.findall("([0-9]{4}).*", file_name)
23
- assert len(identifier) == 1, "Not exactly one identifier was found."
23
+ if len(identifier) != 1:
24
+ raise ValueError("Not exactly 1 identifier found in the filename")
24
25
  return identifier[0]
25
26
 
26
27