wbportfolio 1.49.5__tar.gz → 1.49.7__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 (527) hide show
  1. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/PKG-INFO +1 -1
  2. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/__init__.py +1 -0
  3. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/assets.py +4 -0
  4. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/positions.py +19 -12
  5. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/asset.py +23 -3
  6. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/portfolio.py +44 -68
  7. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/rebalancing.py +9 -5
  8. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/trade_proposals.py +112 -52
  9. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/trades.py +38 -15
  10. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/models/composite.py +6 -2
  11. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/models/equally_weighted.py +12 -1
  12. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/models/model_portfolio.py +11 -5
  13. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/transactions/test_rebalancing.py +6 -2
  14. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/transactions/test_trade_proposals.py +25 -8
  15. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/rebalancing/test_models.py +18 -12
  16. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/assets.py +40 -7
  17. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/portfolios.py +1 -3
  18. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/positions.py +7 -8
  19. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/trades.py +9 -7
  20. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/.gitignore +0 -0
  21. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/LICENSE +0 -0
  22. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/pyproject.toml +0 -0
  23. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/__init__.py +0 -0
  24. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/__init__.py +0 -0
  25. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/asset.py +0 -0
  26. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/custodians.py +0 -0
  27. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/indexes.py +0 -0
  28. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/portfolio.py +0 -0
  29. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/portfolio_relationships.py +0 -0
  30. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/product_groups.py +0 -0
  31. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/products.py +0 -0
  32. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/reconciliations.py +0 -0
  33. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/registers.py +0 -0
  34. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/roles.py +0 -0
  35. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/__init__.py +0 -0
  36. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/claim.py +0 -0
  37. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/dividends.py +0 -0
  38. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/fees.py +0 -0
  39. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/rebalancing.py +0 -0
  40. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/trades.py +0 -0
  41. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/admin/transactions/transactions.py +0 -0
  42. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/analysis/__init__.py +0 -0
  43. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/analysis/claims.py +0 -0
  44. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/apps.py +0 -0
  45. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/__init__.py +0 -0
  46. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/__init__.py +0 -0
  47. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/admin.py +0 -0
  48. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/apps.py +0 -0
  49. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/configs/__init__.py +0 -0
  50. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/configs/display.py +0 -0
  51. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/configs/endpoints.py +0 -0
  52. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/configs/previews.py +0 -0
  53. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/constants.py +0 -0
  54. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/dynamic_preferences_registry.py +0 -0
  55. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/factories.py +0 -0
  56. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/filters.py +0 -0
  57. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/management.py +0 -0
  58. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/migrations/0001_initial.py +0 -0
  59. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/migrations/__init__.py +0 -0
  60. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/models.py +0 -0
  61. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/scripts.py +0 -0
  62. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/serializers.py +0 -0
  63. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/tasks.py +0 -0
  64. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/tests/__init__.py +0 -0
  65. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/tests/conftest.py +0 -0
  66. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/tests/test_models.py +0 -0
  67. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/urls.py +0 -0
  68. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/contrib/company_portfolio/viewsets.py +0 -0
  69. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/defaults/__init__.py +0 -0
  70. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/defaults/fees/__init__.py +0 -0
  71. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/defaults/fees/default.py +0 -0
  72. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/dynamic_preferences_registry.py +0 -0
  73. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/__init__.py +0 -0
  74. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/adjustments.py +0 -0
  75. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/assets.py +0 -0
  76. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/claim.py +0 -0
  77. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/custodians.py +0 -0
  78. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/dividends.py +0 -0
  79. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/fees.py +0 -0
  80. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/indexes.py +0 -0
  81. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/portfolio_cash_flow.py +0 -0
  82. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/portfolio_cash_targets.py +0 -0
  83. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/portfolio_swing_pricings.py +0 -0
  84. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/portfolios.py +0 -0
  85. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/product_groups.py +0 -0
  86. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/products.py +0 -0
  87. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/rebalancing.py +0 -0
  88. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/reconciliations.py +0 -0
  89. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/roles.py +0 -0
  90. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/trades.py +0 -0
  91. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/factories/transactions.py +0 -0
  92. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/fdm/__init__.py +0 -0
  93. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/fdm/tasks.py +0 -0
  94. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/assets_and_net_new_money_progression.py +0 -0
  95. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/custodians.py +0 -0
  96. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/esg.py +0 -0
  97. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/performances.py +0 -0
  98. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/portfolios.py +0 -0
  99. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/products.py +0 -0
  100. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/roles.py +0 -0
  101. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/signals.py +0 -0
  102. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/transactions/__init__.py +0 -0
  103. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/transactions/claim.py +0 -0
  104. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/transactions/fees.py +0 -0
  105. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/transactions/mixins.py +0 -0
  106. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/transactions/trades.py +0 -0
  107. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/filters/transactions/transactions.py +0 -0
  108. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/fixtures/product_factsheets.yaml +0 -0
  109. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/fixtures/wbportfolio.yaml.gz +0 -0
  110. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/fixtures/wbrisk_management.yaml.gz +0 -0
  111. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/__init__.py +0 -0
  112. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/__init__.py +0 -0
  113. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/refinitiv/adjustment.py +0 -0
  114. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/ubs/__init__.py +0 -0
  115. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/ubs/asset_position.py +0 -0
  116. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/ubs/fees.py +0 -0
  117. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/ubs/instrument_price.py +0 -0
  118. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/ubs/mixin.py +0 -0
  119. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/utils.py +0 -0
  120. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/wbfdm/__init__.py +0 -0
  121. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/wbfdm/adjustment.py +0 -0
  122. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/wbfdm/dividend.py +0 -0
  123. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/backends/wbfdm/mixin.py +0 -0
  124. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/__init__.py +0 -0
  125. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/adjustment.py +0 -0
  126. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/asset_position.py +0 -0
  127. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/dividend.py +0 -0
  128. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/fees.py +0 -0
  129. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/portfolio_cash_flow.py +0 -0
  130. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/register.py +0 -0
  131. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/handlers/trade.py +0 -0
  132. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/__init__.py +0 -0
  133. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/default_mapping.py +0 -0
  134. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/jpmorgan/__init__.py +0 -0
  135. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/jpmorgan/customer_trade.py +0 -0
  136. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/jpmorgan/fees.py +0 -0
  137. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/jpmorgan/strategy.py +0 -0
  138. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/jpmorgan/valuation.py +0 -0
  139. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/leonteq/__init__.py +0 -0
  140. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/leonteq/customer_trade.py +0 -0
  141. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/leonteq/equity.py +0 -0
  142. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/leonteq/fees.py +0 -0
  143. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/leonteq/trade.py +0 -0
  144. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/leonteq/valuation.py +0 -0
  145. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/__init__.py +0 -0
  146. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/customer_trade.py +0 -0
  147. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/d1_customer_trade.py +0 -0
  148. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/d1_equity.py +0 -0
  149. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/d1_fees.py +0 -0
  150. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/d1_trade.py +0 -0
  151. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/d1_valuation.py +0 -0
  152. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/dividend.py +0 -0
  153. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/equity.py +0 -0
  154. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/fees.py +0 -0
  155. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/trade.py +0 -0
  156. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/utils.py +0 -0
  157. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/natixis/valuation.py +0 -0
  158. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/refinitiv/__init__.py +0 -0
  159. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/refinitiv/adjustment.py +0 -0
  160. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/__init__.py +0 -0
  161. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/custodian_positions.py +0 -0
  162. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/customer_trade.py +0 -0
  163. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/customer_trade_pending_slk.py +0 -0
  164. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/customer_trade_slk.py +0 -0
  165. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/customer_trade_without_pw.py +0 -0
  166. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/equity.py +0 -0
  167. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/fees.py +0 -0
  168. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/perf_fees.py +0 -0
  169. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/portfolio_cash_flow.py +0 -0
  170. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/portfolio_future_cash_flow.py +0 -0
  171. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/registers.py +0 -0
  172. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/sylk.py +0 -0
  173. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/utils.py +0 -0
  174. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/sg_lux/valuation.py +0 -0
  175. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/societe_generale/__init__.py +0 -0
  176. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/societe_generale/customer_trade.py +0 -0
  177. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/societe_generale/strategy.py +0 -0
  178. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/societe_generale/valuation.py +0 -0
  179. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/tellco/__init__.py +0 -0
  180. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/tellco/customer_trade.py +0 -0
  181. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/tellco/equity.py +0 -0
  182. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/tellco/valuation.py +0 -0
  183. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/__init__.py +0 -0
  184. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/api/__init__.py +0 -0
  185. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/api/asset_position.py +0 -0
  186. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/api/fees.py +0 -0
  187. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/api/instrument_price.py +0 -0
  188. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/api/utils.py +0 -0
  189. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/customer_trade.py +0 -0
  190. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/equity.py +0 -0
  191. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/historical_customer_trade.py +0 -0
  192. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/ubs/valuation.py +0 -0
  193. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/__init__.py +0 -0
  194. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/asset_position.py +0 -0
  195. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/customer_trade.py +0 -0
  196. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/historical_customer_trade.py +0 -0
  197. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/instrument.py +0 -0
  198. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/management_fees.py +0 -0
  199. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/performance_fees.py +0 -0
  200. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/trade.py +0 -0
  201. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/utils.py +0 -0
  202. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/valuation.py +0 -0
  203. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/parsers/vontobel/valuation_api.py +0 -0
  204. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/resources/__init__.py +0 -0
  205. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/resources/assets.py +0 -0
  206. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/resources/trades.py +0 -0
  207. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/import_export/utils.py +0 -0
  208. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/jinja2/wbportfolio/sql/aum_nnm.sql +0 -0
  209. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/kpi_handlers/nnm.py +0 -0
  210. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/__init__.py +0 -0
  211. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/backends/__init__.py +0 -0
  212. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/backends/base.py +0 -0
  213. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/backends/constants.py +0 -0
  214. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/backends/portfolio_base.py +0 -0
  215. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/backends/portfolio_esg.py +0 -0
  216. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/tests/__init__.py +0 -0
  217. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/tests/conftest.py +0 -0
  218. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/tests/test_portfolio_base.py +0 -0
  219. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/metric/tests/test_portfolio_esg.py +0 -0
  220. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0001_initial_squashed.py +0 -0
  221. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0002_product_default_sub_account_squashed_0039_alter_assetallocation_company_and_more.py +0 -0
  222. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0040_instrument_financial_instrument.py +0 -0
  223. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0041_remove_listresearch_research_ptr_and_more.py +0 -0
  224. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0042_instrumentlist_instrumentlistthroughmodel_and_more.py +0 -0
  225. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0043_alter_instrumentlistthroughmodel_options_and_more.py +0 -0
  226. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0044_alter_instrumentlist_identifier.py +0 -0
  227. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0045_alter_instrument_financial_instrument.py +0 -0
  228. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0046_add_product_default_account.py +0 -0
  229. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0047_remove_product_default_sub_account.py +0 -0
  230. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0048_alter_trade_status.py +0 -0
  231. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0049_trade_claimed_shares.py +0 -0
  232. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0050_fees_fee_date_fees_wbportfolio_transac_1f7a29_idx.py +0 -0
  233. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0051_delete_macroreview.py +0 -0
  234. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0052_remove_cash_instrument_ptr_and_more.py +0 -0
  235. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0053_remove_product_group.py +0 -0
  236. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0054_portfolioinstrumentpreferredclassificationthroughmodel_and_more.py +0 -0
  237. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0055_remove_product__custom_management_rebates_and_more.py +0 -0
  238. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0056_remove_companyportfoliodata_assets_under_management_currency_and_more.py +0 -0
  239. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0057_alter_portfolio_preferred_instrument_classifications_and_more.py +0 -0
  240. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0058_pmsinstrument.py +0 -0
  241. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0059_fees_unique_fees.py +0 -0
  242. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0060_alter_portfolioportfoliothroughmodel_type.py +0 -0
  243. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0061_portfolio_bank_accounts_product_bank_account_and_more.py +0 -0
  244. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0062_alter_dailyportfoliocashflow_options.py +0 -0
  245. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0063_accountreconciliation_accountreconciliationline_and_more.py +0 -0
  246. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0064_alter_portfolio_managers_portfolio_is_tracked_and_more.py +0 -0
  247. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0065_alter_portfolio_managers_claim_as_shares_and_more.py +0 -0
  248. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0066_assetposition_initial_shares_at_custodian_and_more.py +0 -0
  249. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0067_assetposition_unique_asset_position.py +0 -0
  250. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0068_trade_internal_trade_trade_marked_as_internal_and_more.py +0 -0
  251. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0069_remove_portfolio_is_invested_and_more.py +0 -0
  252. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0070_remove_assetposition_unique_asset_position_and_more.py +0 -0
  253. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0071_alter_trade_options_alter_trade_order.py +0 -0
  254. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0072_trade_diff_shares.py +0 -0
  255. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0073_remove_product_price_computation_and_more.py +0 -0
  256. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0074_alter_rebalancer_frequency_and_more.py +0 -0
  257. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0075_portfolio_initial_position_date_and_more.py +0 -0
  258. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/0076_alter_dividendtransaction_price_and_more.py +0 -0
  259. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/migrations/__init__.py +0 -0
  260. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/__init__.py +0 -0
  261. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/adjustments.py +0 -0
  262. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/custodians.py +0 -0
  263. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/exceptions.py +0 -0
  264. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/graphs/__init__.py +0 -0
  265. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/graphs/portfolio.py +0 -0
  266. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/graphs/utils.py +0 -0
  267. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/indexes.py +0 -0
  268. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/llm/wbcrm/analyze_relationship.py +0 -0
  269. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/mixins/__init__.py +0 -0
  270. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/mixins/instruments.py +0 -0
  271. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/mixins/liquidity_stress_test.py +0 -0
  272. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/portfolio_cash_flow.py +0 -0
  273. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/portfolio_cash_targets.py +0 -0
  274. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/portfolio_relationship.py +0 -0
  275. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/portfolio_swing_pricings.py +0 -0
  276. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/product_groups.py +0 -0
  277. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/products.py +0 -0
  278. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/reconciliations/__init__.py +0 -0
  279. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/reconciliations/account_reconciliation_lines.py +0 -0
  280. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/reconciliations/account_reconciliations.py +0 -0
  281. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/reconciliations/reconciliations.py +0 -0
  282. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/registers.py +0 -0
  283. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/roles.py +0 -0
  284. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/__init__.py +0 -0
  285. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/claim.py +0 -0
  286. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/dividends.py +0 -0
  287. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/expiry.py +0 -0
  288. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/fees.py +0 -0
  289. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/transactions/transactions.py +0 -0
  290. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/models/utils.py +0 -0
  291. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/permissions.py +0 -0
  292. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/__init__.py +0 -0
  293. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/analytics/__init__.py +0 -0
  294. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/analytics/portfolio.py +0 -0
  295. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/statistics/__init__.py +0 -0
  296. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/trading/__init__.py +0 -0
  297. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/trading/handler.py +0 -0
  298. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/pms/typing.py +0 -0
  299. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/preferences.py +0 -0
  300. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/__init__.py +0 -0
  301. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/base.py +0 -0
  302. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/decorators.py +0 -0
  303. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/models/__init__.py +0 -0
  304. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/rebalancing/models/market_capitalization_weighted.py +0 -0
  305. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/reports/__init__.py +0 -0
  306. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/reports/monthly_position_report.py +0 -0
  307. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/__init__.py +0 -0
  308. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/__init__.py +0 -0
  309. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/accounts.py +0 -0
  310. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/controversy_portfolio.py +0 -0
  311. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/exposure_portfolio.py +0 -0
  312. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/instrument_list_portfolio.py +0 -0
  313. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/liquidity_risk.py +0 -0
  314. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/liquidity_stress_instrument.py +0 -0
  315. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/mixins.py +0 -0
  316. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/product_integrity.py +0 -0
  317. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/stop_loss_instrument.py +0 -0
  318. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/stop_loss_portfolio.py +0 -0
  319. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/backends/ucits_portfolio.py +0 -0
  320. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/__init__.py +0 -0
  321. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/conftest.py +0 -0
  322. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_accounts.py +0 -0
  323. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_controversy_portfolio.py +0 -0
  324. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_exposure_portfolio.py +0 -0
  325. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_instrument_list_portfolio.py +0 -0
  326. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_liquidity_risk.py +0 -0
  327. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_product_integrity.py +0 -0
  328. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_stop_loss_instrument.py +0 -0
  329. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_stop_loss_portfolio.py +0 -0
  330. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/risk_management/tests/test_ucits_portfolio.py +0 -0
  331. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/__init__.py +0 -0
  332. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/adjustments.py +0 -0
  333. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/assets.py +0 -0
  334. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/custodians.py +0 -0
  335. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/portfolio_cash_flow.py +0 -0
  336. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/portfolio_cash_targets.py +0 -0
  337. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/portfolio_relationship.py +0 -0
  338. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/portfolio_swing_pricing.py +0 -0
  339. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/portfolios.py +0 -0
  340. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/positions.py +0 -0
  341. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/product_group.py +0 -0
  342. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/products.py +0 -0
  343. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/rebalancing.py +0 -0
  344. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/reconciliations.py +0 -0
  345. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/registers.py +0 -0
  346. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/roles.py +0 -0
  347. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/signals.py +0 -0
  348. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/__init__.py +0 -0
  349. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/claim.py +0 -0
  350. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/dividends.py +0 -0
  351. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/expiry.py +0 -0
  352. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/fees.py +0 -0
  353. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/trade_proposals.py +0 -0
  354. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/trades.py +0 -0
  355. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/serializers/transactions/transactions.py +0 -0
  356. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/css/macro_review.css +0 -0
  357. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/account_holding_reconciliation.md +0 -0
  358. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/aggregate_asset_position_liquidity.md +0 -0
  359. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/company.md +0 -0
  360. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/earnings_instrument.md +0 -0
  361. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/financial_analysis_instrument_ratios.md +0 -0
  362. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/financial_statistics.md +0 -0
  363. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/static/wbportfolio/markdown/documentation/person.md +0 -0
  364. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tasks.py +0 -0
  365. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/templates/portfolio/email/customer_report.html +0 -0
  366. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/templates/portfolio/email/customer_trade_notification.html +0 -0
  367. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/templates/portfolio/email/email_base_template.html +0 -0
  368. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/templates/portfolio/email/rebalancing_report.html +0 -0
  369. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/templates/portfolio/macro/macro_review.html +0 -0
  370. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/__init__.py +0 -0
  371. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/conftest.py +0 -0
  372. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/__init__.py +0 -0
  373. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_account_reconciliation.py +0 -0
  374. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_assets.py +0 -0
  375. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_custodians.py +0 -0
  376. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_customer_trades.py +0 -0
  377. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_dividends.py +0 -0
  378. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_imports.py +0 -0
  379. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_instrument_mixins.py +0 -0
  380. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_merge.py +0 -0
  381. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_portfolio_cash_flow.py +0 -0
  382. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_portfolio_cash_targets.py +0 -0
  383. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_portfolio_swing_pricings.py +0 -0
  384. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_portfolios.py +0 -0
  385. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_product_groups.py +0 -0
  386. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_products.py +0 -0
  387. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_roles.py +0 -0
  388. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/test_splits.py +0 -0
  389. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/transactions/__init__.py +0 -0
  390. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/transactions/test_claim.py +0 -0
  391. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/transactions/test_fees.py +0 -0
  392. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/transactions/test_trades.py +0 -0
  393. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/models/utils.py +0 -0
  394. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/pms/__init__.py +0 -0
  395. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/pms/test_analytics.py +0 -0
  396. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/rebalancing/__init__.py +0 -0
  397. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/serializers/__init__.py +0 -0
  398. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/serializers/test_claims.py +0 -0
  399. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/signals.py +0 -0
  400. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/tests.py +0 -0
  401. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/viewsets/__init__.py +0 -0
  402. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/viewsets/test_assets.py +0 -0
  403. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/viewsets/test_performances.py +0 -0
  404. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/viewsets/test_products.py +0 -0
  405. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/viewsets/transactions/__init__.py +0 -0
  406. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/tests/viewsets/transactions/test_claims.py +0 -0
  407. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/urls.py +0 -0
  408. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/utils.py +0 -0
  409. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/__init__.py +0 -0
  410. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/adjustments.py +0 -0
  411. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/assets_and_net_new_money_progression.py +0 -0
  412. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/charts/__init__.py +0 -0
  413. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/charts/assets.py +0 -0
  414. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/__init__.py +0 -0
  415. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/__init__.py +0 -0
  416. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/adjustments.py +0 -0
  417. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/assets.py +0 -0
  418. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/claims.py +0 -0
  419. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/custodians.py +0 -0
  420. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/fees.py +0 -0
  421. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/mixins.py +0 -0
  422. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/portfolios.py +0 -0
  423. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/products.py +0 -0
  424. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/reconciliations.py +0 -0
  425. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/registers.py +0 -0
  426. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/signals.py +0 -0
  427. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/trade_proposals.py +0 -0
  428. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/buttons/trades.py +0 -0
  429. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/__init__.py +0 -0
  430. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/adjustments.py +0 -0
  431. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/assets.py +0 -0
  432. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/claim.py +0 -0
  433. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/custodians.py +0 -0
  434. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/esg.py +0 -0
  435. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/fees.py +0 -0
  436. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/portfolio_cash_flow.py +0 -0
  437. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/portfolio_relationship.py +0 -0
  438. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/positions.py +0 -0
  439. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/product_groups.py +0 -0
  440. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/product_performance.py +0 -0
  441. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/products.py +0 -0
  442. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/rebalancing.py +0 -0
  443. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/reconciliations.py +0 -0
  444. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/registers.py +0 -0
  445. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/roles.py +0 -0
  446. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/trade_proposals.py +0 -0
  447. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/trades.py +0 -0
  448. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/display/transactions.py +0 -0
  449. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/__init__.py +0 -0
  450. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/adjustments.py +0 -0
  451. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/assets.py +0 -0
  452. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/claim.py +0 -0
  453. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/custodians.py +0 -0
  454. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/esg.py +0 -0
  455. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/fees.py +0 -0
  456. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/portfolio_relationship.py +0 -0
  457. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/portfolios.py +0 -0
  458. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/positions.py +0 -0
  459. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/product_groups.py +0 -0
  460. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/product_performance.py +0 -0
  461. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/products.py +0 -0
  462. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/rebalancing.py +0 -0
  463. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/reconciliations.py +0 -0
  464. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/roles.py +0 -0
  465. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/trade_proposals.py +0 -0
  466. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/trades.py +0 -0
  467. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/endpoints/transactions.py +0 -0
  468. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/__init__.py +0 -0
  469. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/adjustments.py +0 -0
  470. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/assets.py +0 -0
  471. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/claim.py +0 -0
  472. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/custodians.py +0 -0
  473. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/fees.py +0 -0
  474. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/instrument_prices.py +0 -0
  475. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/portfolio_cash_flow.py +0 -0
  476. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/portfolios.py +0 -0
  477. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/positions.py +0 -0
  478. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/product_groups.py +0 -0
  479. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/product_performance.py +0 -0
  480. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/products.py +0 -0
  481. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/reconciliations.py +0 -0
  482. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/registers.py +0 -0
  483. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/roles.py +0 -0
  484. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/trades.py +0 -0
  485. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/menu/transactions.py +0 -0
  486. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/previews/__init__.py +0 -0
  487. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/previews/portfolios.py +0 -0
  488. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/__init__.py +0 -0
  489. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/adjustments.py +0 -0
  490. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/assets.py +0 -0
  491. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/assets_and_net_new_money_progression.py +0 -0
  492. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/claim.py +0 -0
  493. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/custodians.py +0 -0
  494. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/esg.py +0 -0
  495. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/fees.py +0 -0
  496. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/instrument_prices.py +0 -0
  497. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/portfolios.py +0 -0
  498. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/positions.py +0 -0
  499. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/product_groups.py +0 -0
  500. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/product_performance.py +0 -0
  501. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/products.py +0 -0
  502. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/registers.py +0 -0
  503. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/roles.py +0 -0
  504. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/trades.py +0 -0
  505. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/configs/titles/transactions.py +0 -0
  506. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/custodians.py +0 -0
  507. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/esg.py +0 -0
  508. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/mixins.py +0 -0
  509. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/portfolio_cash_flow.py +0 -0
  510. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/portfolio_cash_targets.py +0 -0
  511. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/portfolio_relationship.py +0 -0
  512. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/portfolio_swing_pricing.py +0 -0
  513. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/portfolios.py +0 -0
  514. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/product_groups.py +0 -0
  515. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/product_performance.py +0 -0
  516. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/products.py +0 -0
  517. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/reconciliations.py +0 -0
  518. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/registers.py +0 -0
  519. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/roles.py +0 -0
  520. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/signals.py +0 -0
  521. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/__init__.py +0 -0
  522. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/claim.py +0 -0
  523. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/fees.py +0 -0
  524. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/mixins.py +0 -0
  525. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/rebalancing.py +0 -0
  526. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/trade_proposals.py +0 -0
  527. {wbportfolio-1.49.5 → wbportfolio-1.49.7}/wbportfolio/viewsets/transactions/transactions.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbportfolio
3
- Version: 1.49.5
3
+ Version: 1.49.7
4
4
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
5
5
  License-File: LICENSE
6
6
  Requires-Dist: cryptography==3.4.*
@@ -9,6 +9,7 @@ from .assets import ( # ProductAllocationEquityFilter, AssetPositionAPIFilter,
9
9
  CashPositionPortfolioFilterSet,
10
10
  CompositionModelPortfolioPandasFilter,
11
11
  ContributionChartFilter,
12
+ CompositionContributionChartFilter,
12
13
  DistributionFilter,
13
14
  )
14
15
  from .custodians import CustodianFilterSet
@@ -462,6 +462,10 @@ class ContributionChartFilter(wb_filters.FilterSet):
462
462
  fields = {}
463
463
 
464
464
 
465
+ class CompositionContributionChartFilter(ContributionChartFilter):
466
+ show_lookthrough = wb_filters.BooleanFilter(label="Show Lookthrough", default=False, method="fake_filter")
467
+
468
+
465
469
  class AssetPositionUnderlyingInstrumentChartFilter(DateFilterMixin, wb_filters.FilterSet):
466
470
  portfolio = wb_filters.ModelMultipleChoiceFilter(
467
471
  label="Portfolios",
@@ -3,15 +3,17 @@ import datetime as dt
3
3
  from django.db.models import TextChoices
4
4
  from pandas.tseries.offsets import BDay
5
5
  from wbcore import filters as wb_filters
6
- from wbcore.contrib.currency.models import CurrencyFXRates
6
+ from wbcore.contrib.currency.models import Currency, CurrencyFXRates
7
+ from wbcore.contrib.geography.models import Geography
7
8
  from wbcore.pandas.filterset import PandasFilterSetMixin
8
9
  from wbcore.utils.date import current_financial_month
10
+ from wbfdm.models import Classification, Instrument
9
11
 
10
12
  from wbportfolio.filters.assets import (
11
13
  DateFilterMixin,
12
14
  get_latest_end_quarter_date_asset_position,
13
15
  )
14
- from wbportfolio.models import AssetPosition
16
+ from wbportfolio.models import AssetPosition, Portfolio
15
17
 
16
18
 
17
19
  class GroupbyChoice(TextChoices):
@@ -33,16 +35,21 @@ class GroupbyChoice(TextChoices):
33
35
  "PREFERRED_CLASSIFICATION": "classification_id",
34
36
  }[name]
35
37
 
36
- @classmethod
37
- def get_repr(cls, name: str) -> str:
38
- return {
39
- "UNDERLYING_INSTRUMENT": "underlying_instrument__name_repr",
40
- "CURRENCY": "underlying_instrument__currency__key",
41
- "COUNTRY": "underlying_instrument__country__name",
42
- "PORTFOLIO": "portfolio__name",
43
- "PRIMARY_CLASSIFICATION": "classification_title",
44
- "PREFERRED_CLASSIFICATION": "classification_title",
45
- }[name]
38
+ def get_repr(self, ids: list[int]) -> dict[int, str]:
39
+ match self:
40
+ case GroupbyChoice.UNDERLYING_INSTRUMENT:
41
+ return dict(Instrument.objects.filter(id__in=ids).values_list("id", "name_repr"))
42
+ case GroupbyChoice.CURRENCY:
43
+ return dict(Currency.objects.filter(id__in=ids).values_list("id", "key"))
44
+ case GroupbyChoice.COUNTRY:
45
+ return dict(Geography.countries.filter(id__in=ids).values_list("id", "name"))
46
+ case GroupbyChoice.PORTFOLIO:
47
+ return dict(Portfolio.objects.filter(id__in=ids).values_list("id", "name"))
48
+ case GroupbyChoice.PRIMARY_CLASSIFICATION:
49
+ return dict(Classification.objects.filter(id__in=ids).values_list("id", "name"))
50
+ case GroupbyChoice.PREFERRED_CLASSIFICATION:
51
+ return dict(Classification.objects.filter(id__in=ids).values_list("id", "name"))
52
+ raise ValueError("invalid self value")
46
53
 
47
54
 
48
55
  def get_latest_date_based_on_multiple_models(field, request, view):
@@ -24,7 +24,7 @@ from django.db.models.functions import Coalesce
24
24
  from django.db.models.signals import post_save
25
25
  from django.dispatch import receiver
26
26
  from django.utils.functional import cached_property
27
- from wbcore.contrib.currency.models import CurrencyFXRates
27
+ from wbcore.contrib.currency.models import Currency, CurrencyFXRates
28
28
  from wbcore.contrib.io.mixins import ImportMixin
29
29
  from wbcore.signals import pre_merge
30
30
  from wbcore.utils.enum import ChoiceEnum
@@ -77,6 +77,24 @@ class AssetPositionDefaultQueryset(QuerySet):
77
77
  classification_title=Subquery(base_qs.values(ref_title)[:1]),
78
78
  )
79
79
 
80
+ def annotate_hedged_currency_fx_rate(self, hedged_currency: Currency | None) -> QuerySet:
81
+ return self.annotate(
82
+ _is_hedged=Case(
83
+ When(
84
+ underlying_instrument__currency__isnull=False,
85
+ underlying_instrument__currency=hedged_currency,
86
+ then=Value(True),
87
+ ),
88
+ default=Value(False),
89
+ output_field=models.BooleanField(),
90
+ ),
91
+ hedged_currency_fx_rate=Case(
92
+ When(_is_hedged=True, then=Value(Decimal(1.0))),
93
+ default=F("currency_fx_rate"),
94
+ output_field=models.BooleanField(),
95
+ ),
96
+ )
97
+
80
98
 
81
99
  class DefaultAssetPositionManager(models.Manager):
82
100
  def annotate_classification_for_group(
@@ -93,7 +111,10 @@ class DefaultAssetPositionManager(models.Manager):
93
111
  classification_group, classification_height=classification_height
94
112
  )
95
113
 
96
- def get_queryset(self) -> QuerySet["AssetPosition"]:
114
+ def annotate_hedged_currency_fx_rate(self, hedged_currency: Currency | None) -> QuerySet:
115
+ return self.get_queryset().annotate_hedged_currency_fx_rate(hedged_currency)
116
+
117
+ def get_queryset(self) -> AssetPositionDefaultQueryset:
97
118
  return AssetPositionDefaultQueryset(self.model).annotate(
98
119
  adjusting_factor=Coalesce(
99
120
  F("applied_adjustment__cumulative_factor") * F("applied_adjustment__factor"), Decimal(1.0)
@@ -511,7 +532,6 @@ class AssetPosition(ImportMixin, models.Model):
511
532
  self.initial_shares = new_weighting * self.get_portfolio_total_asset_value()
512
533
  else:
513
534
  self.initial_shares = (new_weighting / self.weighting) * self.initial_shares
514
- self.save()
515
535
 
516
536
  def get_portfolio_total_asset_value(self) -> Decimal:
517
537
  return self.portfolio.get_total_asset_value(self.date)
@@ -13,16 +13,12 @@ from django.contrib.contenttypes.models import ContentType
13
13
  from django.contrib.postgres.fields import DateRangeField
14
14
  from django.db import models
15
15
  from django.db.models import (
16
- BooleanField,
17
- Case,
18
16
  Exists,
19
17
  F,
20
18
  OuterRef,
21
19
  Q,
22
20
  QuerySet,
23
21
  Sum,
24
- Value,
25
- When,
26
22
  )
27
23
  from django.db.models.signals import post_save
28
24
  from django.dispatch import receiver
@@ -629,11 +625,28 @@ class Portfolio(DeleteToDisableMixin, WBModel):
629
625
  )
630
626
  return df
631
627
 
632
- def get_portfolio_contribution_df(self, start, end, with_cash=True, hedged_currency=None, only_equity=False):
628
+ def get_portfolio_contribution_df(
629
+ self,
630
+ start: date,
631
+ end: date,
632
+ with_cash: bool = True,
633
+ hedged_currency: Currency | None = None,
634
+ only_equity: bool = False,
635
+ ) -> pd.DataFrame:
633
636
  qs = self._get_assets(with_cash=with_cash).filter(date__gte=start, date__lte=end)
634
637
  if only_equity:
635
638
  qs = qs.filter(underlying_instrument__instrument_type=InstrumentType.EQUITY)
636
- return Portfolio.get_contribution_df(qs, hedged_currency=hedged_currency)
639
+ qs = qs.annotate_hedged_currency_fx_rate(hedged_currency)
640
+ df = Portfolio.get_contribution_df(
641
+ qs.select_related("underlying_instrument").values_list(
642
+ "date", "price", "hedged_currency_fx_rate", "underlying_instrument", "weighting"
643
+ )
644
+ )
645
+ df = df.rename(columns={"group_key": "underlying_instrument"})
646
+ df["underlying_instrument__name_repr"] = df["underlying_instrument"].map(
647
+ dict(Instrument.objects.filter(id__in=df["underlying_instrument"]).values_list("id", "name_repr"))
648
+ )
649
+ return df
637
650
 
638
651
  def check_related_portfolio_at_date(self, val_date: date, related_portfolio: "Portfolio"):
639
652
  assets = AssetPosition.objects.filter(
@@ -730,6 +743,7 @@ class Portfolio(DeleteToDisableMixin, WBModel):
730
743
  ):
731
744
  rel.portfolio.evaluate_rebalancing(val_date)
732
745
  for dependent_portfolio in self.get_child_portfolios(val_date):
746
+ dependent_portfolio.change_at_date(val_date)
733
747
  dependent_portfolio.handle_controlling_portfolio_change_at_date(val_date)
734
748
 
735
749
  def evaluate_rebalancing(self, val_date: date):
@@ -1088,104 +1102,68 @@ class Portfolio(DeleteToDisableMixin, WBModel):
1088
1102
  return returns.replace([np.inf, -np.inf, np.nan], 0), prices_df.replace([np.inf, -np.inf, np.nan], None)
1089
1103
 
1090
1104
  @classmethod
1091
- def get_contribution_df(
1092
- cls,
1093
- qs,
1094
- need_normalize=False,
1095
- groupby_label_id="underlying_instrument",
1096
- groubpy_label_title="underlying_instrument__name_repr",
1097
- currency_fx_rate_label="currency_fx_rate",
1098
- hedged_currency=None,
1099
- ):
1100
- # qs = AssetPosition.annotate_underlying_instrument(qs)
1101
- weight_label = "weighting" if not need_normalize else "total_value_fx_portfolio"
1102
- qs = qs.annotate(
1103
- is_hedged=Case(
1104
- When(
1105
- underlying_instrument__currency__isnull=False,
1106
- underlying_instrument__currency=hedged_currency,
1107
- then=Value(True),
1108
- ),
1109
- default=Value(False),
1110
- output_field=BooleanField(),
1111
- ),
1112
- coalesce_currency_fx_rate=Case(
1113
- When(is_hedged=True, then=Value(Decimal(1.0))),
1114
- default=F(currency_fx_rate_label),
1115
- output_field=models.BooleanField(),
1116
- ),
1117
- ).select_related("underlying_instrument")
1105
+ def get_contribution_df(cls, data, need_normalize: bool = False):
1118
1106
  df = pd.DataFrame(
1119
- qs.values_list(
1120
- "date",
1121
- "price",
1122
- "coalesce_currency_fx_rate",
1123
- groupby_label_id,
1124
- groubpy_label_title,
1125
- weight_label,
1126
- ),
1107
+ data,
1127
1108
  columns=[
1128
1109
  "date",
1129
1110
  "price",
1130
- "coalesce_currency_fx_rate",
1131
- groupby_label_id,
1132
- groubpy_label_title,
1133
- weight_label,
1111
+ "currency_fx_rate",
1112
+ "group_key",
1113
+ "value",
1134
1114
  ],
1135
1115
  )
1136
1116
  if not df.empty:
1137
- df = df[df[weight_label] != 0]
1117
+ df = df[df["value"] != 0]
1138
1118
  df.date = pd.to_datetime(df.date)
1139
- df["price_fx_portfolio"] = df.price * df.coalesce_currency_fx_rate
1119
+ df["price_fx_portfolio"] = df.price * df.currency_fx_rate
1140
1120
 
1141
- df[["price", "price_fx_portfolio", weight_label, "coalesce_currency_fx_rate"]] = df[
1142
- ["price", "price_fx_portfolio", weight_label, "coalesce_currency_fx_rate"]
1121
+ df[["price", "price_fx_portfolio", "value", "currency_fx_rate"]] = df[
1122
+ ["price", "price_fx_portfolio", "value", "currency_fx_rate"]
1143
1123
  ].astype("float")
1144
1124
 
1145
- df[groupby_label_id] = df[groupby_label_id].fillna(0)
1146
- df[groubpy_label_title] = df[groubpy_label_title].fillna("N/A")
1147
- df_static = df[[groupby_label_id, groubpy_label_title]].groupby(groupby_label_id, dropna=False).first()
1125
+ df["group_key"] = df["group_key"].fillna(0)
1148
1126
 
1149
1127
  df = (
1150
1128
  df[
1151
1129
  [
1152
- groupby_label_id,
1130
+ "group_key",
1153
1131
  "date",
1154
1132
  "price",
1155
1133
  "price_fx_portfolio",
1156
- weight_label,
1157
- "coalesce_currency_fx_rate",
1134
+ "value",
1135
+ "currency_fx_rate",
1158
1136
  ]
1159
1137
  ]
1160
- .groupby(["date", groupby_label_id], dropna=False)
1138
+ .groupby(["date", "group_key"], dropna=False)
1161
1139
  .agg(
1162
1140
  {
1163
1141
  "price": "mean",
1164
1142
  "price_fx_portfolio": "mean",
1165
- weight_label: "sum",
1166
- "coalesce_currency_fx_rate": "mean",
1143
+ "value": "sum",
1144
+ "currency_fx_rate": "mean",
1167
1145
  }
1168
1146
  )
1169
1147
  .reset_index()
1170
1148
  .set_index("date")
1171
1149
  .sort_index()
1172
1150
  )
1173
- df[weight_label] = df[weight_label].fillna(0)
1151
+ df["value"] = df["value"].fillna(0)
1174
1152
  value = df.pivot_table(
1175
1153
  index="date",
1176
- columns=[groupby_label_id],
1177
- values=weight_label,
1154
+ columns=["group_key"],
1155
+ values="value",
1178
1156
  fill_value=0,
1179
1157
  aggfunc="sum",
1180
1158
  )
1181
1159
  weights_ = value
1182
1160
  if need_normalize:
1183
- total_value_price = df[weight_label].groupby("date", dropna=False).sum()
1161
+ total_value_price = df["value"].groupby("date", dropna=False).sum()
1184
1162
  weights_ = value.divide(total_value_price, axis=0)
1185
1163
  prices_usd = (
1186
1164
  df.pivot_table(
1187
1165
  index="date",
1188
- columns=[groupby_label_id],
1166
+ columns=["group_key"],
1189
1167
  values="price_fx_portfolio",
1190
1168
  aggfunc="mean",
1191
1169
  )
@@ -1196,8 +1174,8 @@ class Portfolio(DeleteToDisableMixin, WBModel):
1196
1174
  rates_fx = (
1197
1175
  df.pivot_table(
1198
1176
  index="date",
1199
- columns=[groupby_label_id],
1200
- values="coalesce_currency_fx_rate",
1177
+ columns=["group_key"],
1178
+ values="currency_fx_rate",
1201
1179
  aggfunc="mean",
1202
1180
  )
1203
1181
  .replace(0, np.nan)
@@ -1220,7 +1198,6 @@ class Portfolio(DeleteToDisableMixin, WBModel):
1220
1198
 
1221
1199
  res = pd.concat(
1222
1200
  [
1223
- df_static,
1224
1201
  monthly_perf_prices,
1225
1202
  monthly_perf_rates_fx,
1226
1203
  contributions_prices,
@@ -1233,8 +1210,7 @@ class Portfolio(DeleteToDisableMixin, WBModel):
1233
1210
  axis=1,
1234
1211
  ).reset_index()
1235
1212
  res.columns = [
1236
- groupby_label_id,
1237
- groubpy_label_title,
1213
+ "group_key",
1238
1214
  "performance_total",
1239
1215
  "performance_forex",
1240
1216
  "contribution_total",
@@ -95,12 +95,15 @@ class Rebalancer(ComplexToStringMixin, models.Model):
95
95
  while TradeProposal.objects.filter(
96
96
  portfolio=self.portfolio, status=TradeProposal.Status.FAILED, trade_date=pivot_date
97
97
  ).exists():
98
- pivot_date += BDay(1)
98
+ pivot_date = (pivot_date + BDay(1)).date()
99
99
  return pivot_date
100
100
 
101
101
  def is_valid(self, trade_date: date) -> bool:
102
102
  if TradeProposal.objects.filter(
103
- portfolio=self.portfolio, status=TradeProposal.Status.APPROVED, trade_date=trade_date
103
+ portfolio=self.portfolio,
104
+ status=TradeProposal.Status.APPROVED,
105
+ trade_date=trade_date,
106
+ rebalancing_model__isnull=True,
104
107
  ).exists(): # if a already approved trade proposal exists, we do not allow a re-evaluatioon of the rebalancing (only possible if "replayed")
105
108
  return False
106
109
  for initial_valid_datetime in self.get_rrule(trade_date):
@@ -121,12 +124,13 @@ class Rebalancer(ComplexToStringMixin, models.Model):
121
124
  "rebalancing_model": self.rebalancing_model,
122
125
  },
123
126
  )
124
- logger.info(
125
- f"Getting target portfolio ({self.portfolio}) for rebalancing model {self.rebalancing_model} for trade date {trade_date:%Y-%m-%d}"
126
- )
127
+
127
128
  if trade_proposal.rebalancing_model == self.rebalancing_model:
128
129
  trade_proposal.status = TradeProposal.Status.DRAFT
129
130
  try:
131
+ logger.info(
132
+ f"Getting target portfolio ({self.portfolio}) for rebalancing model {self.rebalancing_model} for trade date {trade_date:%Y-%m-%d}"
133
+ )
130
134
  target_portfolio = self.rebalancing_model.get_target_portfolio(
131
135
  self.portfolio, trade_date, trade_proposal.last_effective_date, **self.parameters
132
136
  )
@@ -18,6 +18,7 @@ from wbcore.enums import RequestType
18
18
  from wbcore.metadata.configs.buttons import ActionButton
19
19
  from wbcore.models import WBModel
20
20
  from wbcore.utils.models import CloneMixin
21
+ from wbfdm.models import InstrumentPrice
21
22
  from wbfdm.models.instruments.instruments import Cash, Instrument
22
23
 
23
24
  from wbportfolio.models.roles import PortfolioRole
@@ -80,8 +81,6 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
80
81
  if not self.trade_date and self.portfolio.assets.exists():
81
82
  self.trade_date = (self.portfolio.assets.latest("date").date + BDay(1)).date()
82
83
  super().save(*args, **kwargs)
83
- if self.status == TradeProposal.Status.APPROVED:
84
- self.portfolio.change_at_date(self.trade_date)
85
84
 
86
85
  @property
87
86
  def checked_object(self):
@@ -256,6 +255,9 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
256
255
  # we cannot do a bulk-create because Trade is a multi table inheritance
257
256
  try:
258
257
  trade = self.trades.get(underlying_instrument=instrument)
258
+ trade.weighting = trade_dto.delta_weight
259
+ trade.currency_fx_rate = currency_fx_rate
260
+ trade.status = Trade.Status.DRAFT
259
261
  except Trade.DoesNotExist:
260
262
  trade = Trade(
261
263
  underlying_instrument=instrument,
@@ -272,35 +274,43 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
272
274
 
273
275
  def replay(self):
274
276
  last_trade_proposal = self
277
+ last_trade_proposal_created = False
275
278
  while last_trade_proposal and last_trade_proposal.status == TradeProposal.Status.APPROVED:
276
- logger.info(f"Replaying trade proposal {last_trade_proposal}")
277
- last_trade_proposal.portfolio.assets.filter(
278
- date=last_trade_proposal.trade_date
279
- ).delete() # we delete the existing position and we reapply the trade proposal
280
- if last_trade_proposal.status == TradeProposal.Status.APPROVED:
281
- logger.info("Reverting trade proposal ...")
282
- last_trade_proposal.revert()
283
- if last_trade_proposal.status == TradeProposal.Status.DRAFT:
284
- if self.rebalancing_model: # if there is no position (for any reason) or we the trade proposal has a rebalancer model attached (trades are computed based on an aglo), we reapply this trade proposal
285
- logger.info(f"Resetting trades from rebalancer model {self.rebalancing_model} ...")
286
- with suppress(
287
- ValidationError
288
- ): # we silent any validation error while setting proposal, because if this happens, we assume the current trade proposal state if valid and we continue to batch compute
289
- self.reset_trades()
290
- logger.info("Submitting trade proposal ...")
291
- last_trade_proposal.submit()
292
- if last_trade_proposal.status == TradeProposal.Status.SUBMIT:
293
- logger.info("Approving trade proposal ...")
294
- last_trade_proposal.approve(replay=False)
295
- last_trade_proposal.save()
279
+ if not last_trade_proposal_created:
280
+ logger.info(f"Replaying trade proposal {last_trade_proposal}")
281
+ last_trade_proposal.portfolio.assets.filter(
282
+ date=last_trade_proposal.trade_date
283
+ ).delete() # we delete the existing position and we reapply the trade proposal
284
+ if last_trade_proposal.status == TradeProposal.Status.APPROVED:
285
+ logger.info("Reverting trade proposal ...")
286
+ last_trade_proposal.revert()
287
+ if last_trade_proposal.status == TradeProposal.Status.DRAFT:
288
+ if self.rebalancing_model: # if there is no position (for any reason) or we the trade proposal has a rebalancer model attached (trades are computed based on an aglo), we reapply this trade proposal
289
+ logger.info(f"Resetting trades from rebalancer model {self.rebalancing_model} ...")
290
+ with suppress(
291
+ ValidationError
292
+ ): # we silent any validation error while setting proposal, because if this happens, we assume the current trade proposal state if valid and we continue to batch compute
293
+ self.reset_trades()
294
+ logger.info("Submitting trade proposal ...")
295
+ last_trade_proposal.submit()
296
+ if last_trade_proposal.status == TradeProposal.Status.SUBMIT:
297
+ logger.info("Approving trade proposal ...")
298
+ last_trade_proposal.approve(replay=False)
299
+ last_trade_proposal.save()
296
300
  next_trade_proposal = last_trade_proposal.next_trade_proposal
301
+
297
302
  next_trade_date = (
298
303
  next_trade_proposal.trade_date - timedelta(days=1) if next_trade_proposal else date.today()
299
304
  )
300
305
  overriding_trade_proposal = last_trade_proposal.portfolio.batch_portfolio(
301
306
  last_trade_proposal.trade_date, next_trade_date
302
307
  )
303
- last_trade_proposal = overriding_trade_proposal or next_trade_proposal
308
+ if overriding_trade_proposal:
309
+ last_trade_proposal_created = True
310
+ last_trade_proposal = overriding_trade_proposal
311
+ else:
312
+ last_trade_proposal_created = False
313
+ last_trade_proposal = next_trade_proposal
304
314
 
305
315
  def get_estimated_shares(self, weight: Decimal, underlying_quote: Instrument) -> Decimal:
306
316
  """
@@ -333,7 +343,7 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
333
343
  except Exception:
334
344
  raise ValueError("We couldn't estimate the number of shares")
335
345
 
336
- def get_estimated_target_cash(self, currency: Currency) -> tuple[Decimal, Decimal]:
346
+ def get_estimated_target_cash(self, currency: Currency) -> AssetPosition:
337
347
  """
338
348
  Estimates the target cash weight and shares for a trade proposal.
339
349
 
@@ -374,7 +384,29 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
374
384
  with suppress(ValueError):
375
385
  total_target_shares = self.get_estimated_shares(target_cash_weight, cash_component)
376
386
 
377
- return target_cash_weight, total_target_shares
387
+ cash_component = Cash.objects.get_or_create(
388
+ currency=self.portfolio.currency, defaults={"name": self.portfolio.currency.title}
389
+ )[0]
390
+ # otherwise, we create a new position
391
+ underlying_quote_price = InstrumentPrice.objects.get_or_create(
392
+ instrument=cash_component,
393
+ date=self.trade_date,
394
+ calculated=False,
395
+ defaults={"net_value": Decimal(1)},
396
+ )[0]
397
+ return AssetPosition(
398
+ underlying_quote=cash_component,
399
+ portfolio_created=None,
400
+ portfolio=self.portfolio,
401
+ date=self.trade_date,
402
+ weighting=target_cash_weight,
403
+ initial_price=underlying_quote_price.net_value,
404
+ initial_shares=total_target_shares,
405
+ asset_valuation_date=self.trade_date,
406
+ underlying_quote_price=underlying_quote_price,
407
+ currency=cash_component.currency,
408
+ is_estimated=False,
409
+ )
378
410
 
379
411
  # Start FSM logics
380
412
 
@@ -398,30 +430,30 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
398
430
  },
399
431
  )
400
432
  def submit(self, by=None, description=None, **kwargs):
401
- self.trades.update(comment="", status=Trade.Status.DRAFT)
402
433
  self.reset_trades(target_portfolio=self._build_dto().convert_to_portfolio())
434
+ trades = []
403
435
  for trade in self.trades.all():
404
- trade.submit()
405
- trade.save()
436
+ trade.status = Trade.Status.SUBMIT
437
+ trade.comment = ""
438
+ trades.append(trade)
439
+
440
+ Trade.objects.bulk_update(trades, ["status", "comment"])
406
441
 
407
442
  # If we estimate cash on this trade proposal, we make sure to create the corresponding cash component
408
- cash_target_cash_weight, cash_target_cash_shares = self.get_estimated_target_cash(self.portfolio.currency)
409
- if cash_target_cash_weight:
410
- cash_component = Cash.objects.get_or_create(
411
- currency=self.portfolio.currency, defaults={"name": self.portfolio.currency.title}
412
- )[0]
413
- self.trades.update_or_create(
414
- underlying_instrument=cash_component,
415
- defaults={
416
- "status": Trade.Status.SUBMIT,
417
- "weighting": cash_target_cash_weight,
418
- "shares": cash_target_cash_shares,
419
- },
420
- )
443
+ estimated_cash_position = self.get_estimated_target_cash(self.portfolio.currency)
444
+ target_portfolio = self.validated_trading_service.target_portfolio
445
+ if estimated_cash_position.weighting:
446
+ if existing_cash_position := target_portfolio.positions_map.get(
447
+ estimated_cash_position.underlying_quote.id
448
+ ):
449
+ existing_cash_position += estimated_cash_position
450
+ else:
451
+ target_portfolio.positions_map[estimated_cash_position.underlying_quote.id] = (
452
+ estimated_cash_position._build_dto()
453
+ )
454
+ target_portfolio = PortfolioDTO(positions=tuple(target_portfolio.positions_map.values()))
421
455
 
422
- self.evaluate_active_rules(
423
- self.trade_date, self.validated_trading_service.target_portfolio, asynchronously=True
424
- )
456
+ self.evaluate_active_rules(self.trade_date, target_portfolio, asynchronously=True)
425
457
 
426
458
  def can_submit(self):
427
459
  errors = dict()
@@ -475,11 +507,27 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
475
507
  # We validate trade which will create or update the initial asset positions
476
508
  if not self.portfolio.can_be_rebalanced:
477
509
  raise ValueError("Non-Rebalanceable portfolio cannot be traded manually.")
478
- self.trades.update(status=Trade.Status.SUBMIT)
479
- self.portfolio.assets.filter(date=self.trade_date).delete() # we delete position to avoid having leftovers
510
+ trades = []
511
+ assets = []
512
+ # We do not want to create the estimated cash position if there is not trades in the trade proposal (shouldn't be possible anyway)
513
+ estimated_cash_position = self.get_estimated_target_cash(self.portfolio.currency)
514
+
480
515
  for trade in self.trades.all():
481
- trade.execute()
482
- trade.save()
516
+ with suppress(ValueError):
517
+ asset = trade.to_asset()
518
+ # we add the corresponding asset only if it is not the cache position (already included in estimated_cash_position)
519
+ if asset.underlying_quote != estimated_cash_position.underlying_quote:
520
+ assets.append(asset)
521
+ trade.status = Trade.Status.EXECUTED
522
+ trades.append(trade)
523
+
524
+ # if there is cash leftover, we create an extra asset position to hold the cash component
525
+ if estimated_cash_position.weighting and len(trades) > 0:
526
+ estimated_cash_position.pre_save()
527
+ assets.append(estimated_cash_position)
528
+
529
+ Trade.objects.bulk_update(trades, ["status"])
530
+ self.portfolio.bulk_create_positions(assets, evaluate_rebalancer=False)
483
531
  if replay and self.portfolio.is_manageable:
484
532
  replay_as_task.delay(self.id)
485
533
 
@@ -584,10 +632,22 @@ class TradeProposal(CloneMixin, RiskCheckMixin, WBModel):
584
632
  def revert(self, **kwargs):
585
633
  with suppress(KeyError):
586
634
  del self.__dict__["validated_trading_service"]
587
- for trade in self.trades.filter(status=Trade.Status.EXECUTED):
588
- trade.revert()
589
- trade.save()
590
- # replay_as_task.delay(self.id)
635
+ trades = []
636
+ assets = []
637
+ for trade in self.trades.all():
638
+ trade.status = Trade.Status.DRAFT
639
+ trades.append(trade)
640
+ with suppress(AssetPosition.DoesNotExist):
641
+ asset = AssetPosition.unannotated_objects.get(
642
+ underlying_quote=trade.underlying_instrument,
643
+ portfolio=trade.portfolio,
644
+ date=trade.transaction_date,
645
+ is_estimated=False,
646
+ )
647
+ asset.set_weighting(asset.weighting - trade.weighting)
648
+ assets.append(asset)
649
+ Trade.objects.bulk_update(trades, ["status"])
650
+ self.portfolio.bulk_create_positions(assets, evaluate_rebalancer=False)
591
651
 
592
652
  def can_revert(self):
593
653
  errors = dict()