wbportfolio 1.56.3__tar.gz → 1.56.5__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 (573) hide show
  1. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/PKG-INFO +1 -1
  2. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/api_clients/ubs.py +6 -6
  3. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/models.py +69 -39
  4. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/serializers.py +2 -4
  5. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/tasks.py +12 -1
  6. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/handlers/asset_position.py +6 -2
  7. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/natixis/equity.py +9 -9
  8. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/asset.py +4 -1
  9. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/orders/order_proposals.py +73 -25
  10. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/orders/orders.py +71 -39
  11. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/pms/trading/handler.py +4 -1
  12. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/backends/exposure_portfolio.py +1 -1
  13. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/orders/orders.py +12 -1
  14. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/orders/test_order_proposals.py +8 -5
  15. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/configs/displays/orders.py +7 -1
  16. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/order_proposals.py +1 -3
  17. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/orders.py +4 -3
  18. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/.gitignore +0 -0
  19. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/LICENSE +0 -0
  20. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/pyproject.toml +0 -0
  21. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/__init__.py +0 -0
  22. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/__init__.py +0 -0
  23. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/asset.py +0 -0
  24. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/custodians.py +0 -0
  25. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/indexes.py +0 -0
  26. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/orders/__init__.py +0 -0
  27. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/orders/order_proposals.py +0 -0
  28. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/orders/orders.py +0 -0
  29. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/portfolio.py +0 -0
  30. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/portfolio_relationships.py +0 -0
  31. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/product_groups.py +0 -0
  32. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/products.py +0 -0
  33. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/rebalancing.py +0 -0
  34. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/reconciliations.py +0 -0
  35. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/registers.py +0 -0
  36. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/roles.py +0 -0
  37. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/transactions/__init__.py +0 -0
  38. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/transactions/claim.py +0 -0
  39. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/transactions/dividends.py +0 -0
  40. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/transactions/fees.py +0 -0
  41. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/admin/transactions/trades.py +0 -0
  42. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/analysis/__init__.py +0 -0
  43. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/analysis/claims.py +0 -0
  44. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/api_clients/__init__.py +0 -0
  45. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/apps.py +0 -0
  46. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/constants.py +0 -0
  47. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/__init__.py +0 -0
  48. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/__init__.py +0 -0
  49. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/admin.py +0 -0
  50. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/apps.py +0 -0
  51. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/configs/__init__.py +0 -0
  52. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/configs/display.py +0 -0
  53. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/configs/endpoints.py +0 -0
  54. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/configs/previews.py +0 -0
  55. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/constants.py +0 -0
  56. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/dynamic_preferences_registry.py +0 -0
  57. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/factories.py +0 -0
  58. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/filters.py +0 -0
  59. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/management.py +0 -0
  60. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/migrations/0001_initial.py +0 -0
  61. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/migrations/__init__.py +0 -0
  62. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/scripts.py +0 -0
  63. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/tests/__init__.py +0 -0
  64. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/tests/conftest.py +0 -0
  65. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/tests/test_models.py +0 -0
  66. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/urls.py +0 -0
  67. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/contrib/company_portfolio/viewsets.py +0 -0
  68. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/defaults/__init__.py +0 -0
  69. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/defaults/fees/__init__.py +0 -0
  70. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/defaults/fees/default.py +0 -0
  71. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/dynamic_preferences_registry.py +0 -0
  72. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/__init__.py +0 -0
  73. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/adjustments.py +0 -0
  74. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/assets.py +0 -0
  75. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/claim.py +0 -0
  76. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/custodians.py +0 -0
  77. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/dividends.py +0 -0
  78. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/fees.py +0 -0
  79. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/indexes.py +0 -0
  80. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/orders/__init__.py +0 -0
  81. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/orders/order_proposals.py +0 -0
  82. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/orders/orders.py +0 -0
  83. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/portfolio_cash_flow.py +0 -0
  84. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/portfolio_cash_targets.py +0 -0
  85. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/portfolio_swing_pricings.py +0 -0
  86. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/portfolios.py +0 -0
  87. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/product_groups.py +0 -0
  88. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/products.py +0 -0
  89. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/rebalancing.py +0 -0
  90. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/reconciliations.py +0 -0
  91. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/roles.py +0 -0
  92. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/factories/trades.py +0 -0
  93. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/__init__.py +0 -0
  94. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/assets.py +0 -0
  95. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/assets_and_net_new_money_progression.py +0 -0
  96. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/custodians.py +0 -0
  97. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/esg.py +0 -0
  98. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/orders/__init__.py +0 -0
  99. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/orders/order_proposals.py +0 -0
  100. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/orders/orders.py +0 -0
  101. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/performances.py +0 -0
  102. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/portfolios.py +0 -0
  103. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/positions.py +0 -0
  104. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/products.py +0 -0
  105. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/roles.py +0 -0
  106. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/signals.py +0 -0
  107. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/transactions/__init__.py +0 -0
  108. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/transactions/claim.py +0 -0
  109. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/transactions/fees.py +0 -0
  110. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/transactions/mixins.py +0 -0
  111. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/transactions/trades.py +0 -0
  112. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/filters/transactions/utils.py +0 -0
  113. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/fixtures/product_factsheets.yaml +0 -0
  114. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/fixtures/wbportfolio.yaml.gz +0 -0
  115. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/fixtures/wbrisk_management.yaml.gz +0 -0
  116. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/__init__.py +0 -0
  117. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/backends/__init__.py +0 -0
  118. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/backends/refinitiv/adjustment.py +0 -0
  119. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/backends/ubs/__init__.py +0 -0
  120. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/backends/ubs/asset_position.py +0 -0
  121. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/backends/ubs/fees.py +0 -0
  122. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/backends/ubs/instrument_price.py +0 -0
  123. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/backends/ubs/mixin.py +0 -0
  124. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/backends/utils.py +0 -0
  125. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/backends/wbfdm/__init__.py +0 -0
  126. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/backends/wbfdm/adjustment.py +0 -0
  127. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/backends/wbfdm/dividend.py +0 -0
  128. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/backends/wbfdm/mixin.py +0 -0
  129. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/handlers/__init__.py +0 -0
  130. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/handlers/adjustment.py +0 -0
  131. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/handlers/dividend.py +0 -0
  132. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/handlers/fees.py +0 -0
  133. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/handlers/orders.py +0 -0
  134. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/handlers/portfolio_cash_flow.py +0 -0
  135. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/handlers/register.py +0 -0
  136. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/handlers/trade.py +0 -0
  137. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/__init__.py +0 -0
  138. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/default_mapping.py +0 -0
  139. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/jpmorgan/__init__.py +0 -0
  140. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/jpmorgan/customer_trade.py +0 -0
  141. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/jpmorgan/fees.py +0 -0
  142. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/jpmorgan/strategy.py +0 -0
  143. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/jpmorgan/valuation.py +0 -0
  144. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/leonteq/__init__.py +0 -0
  145. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/leonteq/customer_trade.py +0 -0
  146. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/leonteq/equity.py +0 -0
  147. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/leonteq/fees.py +0 -0
  148. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/leonteq/trade.py +0 -0
  149. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/leonteq/valuation.py +0 -0
  150. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/natixis/__init__.py +0 -0
  151. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/natixis/customer_trade.py +0 -0
  152. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/natixis/d1_customer_trade.py +0 -0
  153. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/natixis/d1_equity.py +0 -0
  154. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/natixis/d1_fees.py +0 -0
  155. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/natixis/d1_trade.py +0 -0
  156. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/natixis/d1_valuation.py +0 -0
  157. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/natixis/dividend.py +0 -0
  158. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/natixis/fees.py +0 -0
  159. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/natixis/trade.py +0 -0
  160. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/natixis/utils.py +0 -0
  161. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/natixis/valuation.py +0 -0
  162. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/refinitiv/__init__.py +0 -0
  163. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/refinitiv/adjustment.py +0 -0
  164. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/__init__.py +0 -0
  165. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/custodian_positions.py +0 -0
  166. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/customer_trade.py +0 -0
  167. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/customer_trade_pending_slk.py +0 -0
  168. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/customer_trade_slk.py +0 -0
  169. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/customer_trade_without_pw.py +0 -0
  170. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/equity.py +0 -0
  171. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/fees.py +0 -0
  172. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/perf_fees.py +0 -0
  173. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/portfolio_cash_flow.py +0 -0
  174. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/portfolio_future_cash_flow.py +0 -0
  175. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/registers.py +0 -0
  176. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/sylk.py +0 -0
  177. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/utils.py +0 -0
  178. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/sg_lux/valuation.py +0 -0
  179. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/societe_generale/__init__.py +0 -0
  180. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/societe_generale/customer_trade.py +0 -0
  181. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/societe_generale/strategy.py +0 -0
  182. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/societe_generale/valuation.py +0 -0
  183. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/tellco/__init__.py +0 -0
  184. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/tellco/customer_trade.py +0 -0
  185. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/tellco/equity.py +0 -0
  186. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/tellco/valuation.py +0 -0
  187. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/ubs/__init__.py +0 -0
  188. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/ubs/api/__init__.py +0 -0
  189. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/ubs/api/asset_position.py +0 -0
  190. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/ubs/api/fees.py +0 -0
  191. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/ubs/api/instrument_price.py +0 -0
  192. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/ubs/api/utils.py +0 -0
  193. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/ubs/customer_trade.py +0 -0
  194. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/ubs/equity.py +0 -0
  195. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/ubs/historical_customer_trade.py +0 -0
  196. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/ubs/valuation.py +0 -0
  197. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/vontobel/__init__.py +0 -0
  198. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/vontobel/asset_position.py +0 -0
  199. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/vontobel/customer_trade.py +0 -0
  200. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/vontobel/historical_customer_trade.py +0 -0
  201. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/vontobel/instrument.py +0 -0
  202. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/vontobel/management_fees.py +0 -0
  203. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/vontobel/performance_fees.py +0 -0
  204. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/vontobel/trade.py +0 -0
  205. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/vontobel/utils.py +0 -0
  206. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/vontobel/valuation.py +0 -0
  207. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/parsers/vontobel/valuation_api.py +0 -0
  208. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/resources/__init__.py +0 -0
  209. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/resources/assets.py +0 -0
  210. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/resources/trades.py +0 -0
  211. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/import_export/utils.py +0 -0
  212. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/jinja2/wbportfolio/sql/aum_nnm.sql +0 -0
  213. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/kpi_handlers/nnm.py +0 -0
  214. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/locale/de/LC_MESSAGES/django.mo +0 -0
  215. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/locale/de/LC_MESSAGES/django.po +0 -0
  216. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/locale/en/LC_MESSAGES/django.mo +0 -0
  217. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/locale/en/LC_MESSAGES/django.po +0 -0
  218. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/locale/fr/LC_MESSAGES/django.mo +0 -0
  219. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/locale/fr/LC_MESSAGES/django.po +0 -0
  220. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/metric/__init__.py +0 -0
  221. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/metric/backends/__init__.py +0 -0
  222. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/metric/backends/base.py +0 -0
  223. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/metric/backends/constants.py +0 -0
  224. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/metric/backends/portfolio_base.py +0 -0
  225. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/metric/backends/portfolio_esg.py +0 -0
  226. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/metric/tests/__init__.py +0 -0
  227. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/metric/tests/conftest.py +0 -0
  228. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/metric/tests/test_portfolio_base.py +0 -0
  229. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/metric/tests/test_portfolio_esg.py +0 -0
  230. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0001_initial_squashed.py +0 -0
  231. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0002_product_default_sub_account_squashed_0039_alter_assetallocation_company_and_more.py +0 -0
  232. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0040_instrument_financial_instrument.py +0 -0
  233. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0041_remove_listresearch_research_ptr_and_more.py +0 -0
  234. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0042_instrumentlist_instrumentlistthroughmodel_and_more.py +0 -0
  235. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0043_alter_instrumentlistthroughmodel_options_and_more.py +0 -0
  236. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0044_alter_instrumentlist_identifier.py +0 -0
  237. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0045_alter_instrument_financial_instrument.py +0 -0
  238. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0046_add_product_default_account.py +0 -0
  239. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0047_remove_product_default_sub_account.py +0 -0
  240. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0048_alter_trade_status.py +0 -0
  241. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0049_trade_claimed_shares.py +0 -0
  242. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0050_fees_fee_date_fees_wbportfolio_transac_1f7a29_idx.py +0 -0
  243. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0051_delete_macroreview.py +0 -0
  244. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0052_remove_cash_instrument_ptr_and_more.py +0 -0
  245. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0053_remove_product_group.py +0 -0
  246. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0054_portfolioinstrumentpreferredclassificationthroughmodel_and_more.py +0 -0
  247. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0055_remove_product__custom_management_rebates_and_more.py +0 -0
  248. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0056_remove_companyportfoliodata_assets_under_management_currency_and_more.py +0 -0
  249. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0057_alter_portfolio_preferred_instrument_classifications_and_more.py +0 -0
  250. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0058_pmsinstrument.py +0 -0
  251. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0059_fees_unique_fees.py +0 -0
  252. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0060_alter_portfolioportfoliothroughmodel_type.py +0 -0
  253. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0061_portfolio_bank_accounts_product_bank_account_and_more.py +0 -0
  254. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0062_alter_dailyportfoliocashflow_options.py +0 -0
  255. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0063_accountreconciliation_accountreconciliationline_and_more.py +0 -0
  256. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0064_alter_portfolio_managers_portfolio_is_tracked_and_more.py +0 -0
  257. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0065_alter_portfolio_managers_claim_as_shares_and_more.py +0 -0
  258. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0066_assetposition_initial_shares_at_custodian_and_more.py +0 -0
  259. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0067_assetposition_unique_asset_position.py +0 -0
  260. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0068_trade_internal_trade_trade_marked_as_internal_and_more.py +0 -0
  261. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0069_remove_portfolio_is_invested_and_more.py +0 -0
  262. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0070_remove_assetposition_unique_asset_position_and_more.py +0 -0
  263. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0071_alter_trade_options_alter_trade_order.py +0 -0
  264. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0072_trade_diff_shares.py +0 -0
  265. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0073_remove_product_price_computation_and_more.py +0 -0
  266. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0074_alter_rebalancer_frequency_and_more.py +0 -0
  267. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0075_portfolio_initial_position_date_and_more.py +0 -0
  268. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0076_alter_dividendtransaction_price_and_more.py +0 -0
  269. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0077_remove_transaction_currency_and_more.py +0 -0
  270. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0078_trade_drift_factor.py +0 -0
  271. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0079_alter_trade_drift_factor.py +0 -0
  272. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0080_alter_trade_drift_factor_alter_trade_weighting.py +0 -0
  273. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0081_alter_trade_drift_factor.py +0 -0
  274. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0082_remove_tradeproposal_creator_and_more.py +0 -0
  275. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0083_order_alter_trade_options_and_more.py +0 -0
  276. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0084_orderproposal_min_order_value.py +0 -0
  277. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0085_order_desired_target_weight.py +0 -0
  278. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0086_orderproposal_total_cash_weight.py +0 -0
  279. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0087_product_order_routing_custodian_adapter.py +0 -0
  280. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0088_orderproposal_total_effective_portfolio_contribution.py +0 -0
  281. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0089_orderproposal_min_weighting.py +0 -0
  282. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/0090_dividendtransaction_price_fx_portfolio_and_more.py +0 -0
  283. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/migrations/__init__.py +0 -0
  284. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/__init__.py +0 -0
  285. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/adjustments.py +0 -0
  286. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/builder.py +0 -0
  287. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/custodians.py +0 -0
  288. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/exceptions.py +0 -0
  289. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/graphs/__init__.py +0 -0
  290. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/graphs/portfolio.py +0 -0
  291. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/graphs/utils.py +0 -0
  292. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/indexes.py +0 -0
  293. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/llm/wbcrm/analyze_relationship.py +0 -0
  294. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/mixins/__init__.py +0 -0
  295. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/mixins/instruments.py +0 -0
  296. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/mixins/liquidity_stress_test.py +0 -0
  297. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/orders/__init__.py +0 -0
  298. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/orders/routing.py +0 -0
  299. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/portfolio.py +0 -0
  300. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/portfolio_cash_flow.py +0 -0
  301. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/portfolio_cash_targets.py +0 -0
  302. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/portfolio_relationship.py +0 -0
  303. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/portfolio_swing_pricings.py +0 -0
  304. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/product_groups.py +0 -0
  305. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/products.py +0 -0
  306. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/rebalancing.py +0 -0
  307. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/reconciliations/__init__.py +0 -0
  308. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/reconciliations/account_reconciliation_lines.py +0 -0
  309. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/reconciliations/account_reconciliations.py +0 -0
  310. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/reconciliations/reconciliations.py +0 -0
  311. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/registers.py +0 -0
  312. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/roles.py +0 -0
  313. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/signals.py +0 -0
  314. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/transactions/__init__.py +0 -0
  315. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/transactions/claim.py +0 -0
  316. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/transactions/dividends.py +0 -0
  317. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/transactions/fees.py +0 -0
  318. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/transactions/trades.py +0 -0
  319. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/transactions/transactions.py +0 -0
  320. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/models/utils.py +0 -0
  321. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/order_routing/__init__.py +0 -0
  322. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/order_routing/adapters/__init__.py +0 -0
  323. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/order_routing/adapters/ubs.py +0 -0
  324. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/permissions.py +0 -0
  325. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/pms/__init__.py +0 -0
  326. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/pms/analytics/__init__.py +0 -0
  327. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/pms/analytics/portfolio.py +0 -0
  328. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/pms/analytics/utils.py +0 -0
  329. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/pms/statistics/__init__.py +0 -0
  330. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/pms/trading/__init__.py +0 -0
  331. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/pms/typing.py +0 -0
  332. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/preferences.py +0 -0
  333. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/rebalancing/__init__.py +0 -0
  334. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/rebalancing/base.py +0 -0
  335. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/rebalancing/decorators.py +0 -0
  336. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/rebalancing/models/__init__.py +0 -0
  337. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/rebalancing/models/composite.py +0 -0
  338. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/rebalancing/models/equally_weighted.py +0 -0
  339. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/rebalancing/models/market_capitalization_weighted.py +0 -0
  340. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/rebalancing/models/model_portfolio.py +0 -0
  341. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/reports/__init__.py +0 -0
  342. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/reports/monthly_position_report.py +0 -0
  343. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/__init__.py +0 -0
  344. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/backends/__init__.py +0 -0
  345. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/backends/accounts.py +0 -0
  346. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/backends/controversy_portfolio.py +0 -0
  347. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/backends/instrument_list_portfolio.py +0 -0
  348. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/backends/liquidity_risk.py +0 -0
  349. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/backends/liquidity_stress_instrument.py +0 -0
  350. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/backends/mixins.py +0 -0
  351. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/backends/product_integrity.py +0 -0
  352. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/backends/stop_loss_instrument.py +0 -0
  353. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/backends/stop_loss_portfolio.py +0 -0
  354. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/backends/ucits_portfolio.py +0 -0
  355. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/tests/__init__.py +0 -0
  356. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/tests/conftest.py +0 -0
  357. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/tests/test_accounts.py +0 -0
  358. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/tests/test_controversy_portfolio.py +0 -0
  359. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/tests/test_exposure_portfolio.py +0 -0
  360. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/tests/test_instrument_list_portfolio.py +0 -0
  361. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/tests/test_liquidity_risk.py +0 -0
  362. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/tests/test_product_integrity.py +0 -0
  363. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/tests/test_stop_loss_instrument.py +0 -0
  364. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/tests/test_stop_loss_portfolio.py +0 -0
  365. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/risk_management/tests/test_ucits_portfolio.py +0 -0
  366. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/__init__.py +0 -0
  367. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/adjustments.py +0 -0
  368. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/assets.py +0 -0
  369. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/custodians.py +0 -0
  370. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/orders/__init__.py +0 -0
  371. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/orders/order_proposals.py +0 -0
  372. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/portfolio_cash_flow.py +0 -0
  373. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/portfolio_cash_targets.py +0 -0
  374. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/portfolio_relationship.py +0 -0
  375. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/portfolio_swing_pricing.py +0 -0
  376. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/portfolios.py +0 -0
  377. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/positions.py +0 -0
  378. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/product_group.py +0 -0
  379. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/products.py +0 -0
  380. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/rebalancing.py +0 -0
  381. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/reconciliations.py +0 -0
  382. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/registers.py +0 -0
  383. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/roles.py +0 -0
  384. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/signals.py +0 -0
  385. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/transactions/__init__.py +0 -0
  386. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/transactions/claim.py +0 -0
  387. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/transactions/dividends.py +0 -0
  388. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/transactions/fees.py +0 -0
  389. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/serializers/transactions/trades.py +0 -0
  390. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/static/wbportfolio/css/macro_review.css +0 -0
  391. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/static/wbportfolio/markdown/documentation/account_holding_reconciliation.md +0 -0
  392. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/static/wbportfolio/markdown/documentation/aggregate_asset_position_liquidity.md +0 -0
  393. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/static/wbportfolio/markdown/documentation/company.md +0 -0
  394. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/static/wbportfolio/markdown/documentation/earnings_instrument.md +0 -0
  395. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/static/wbportfolio/markdown/documentation/financial_analysis_instrument_ratios.md +0 -0
  396. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/static/wbportfolio/markdown/documentation/financial_statistics.md +0 -0
  397. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/static/wbportfolio/markdown/documentation/person.md +0 -0
  398. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tasks.py +0 -0
  399. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/templates/portfolio/email/customer_report.html +0 -0
  400. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/templates/portfolio/email/customer_trade_notification.html +0 -0
  401. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/templates/portfolio/email/email_base_template.html +0 -0
  402. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/templates/portfolio/email/rebalancing_report.html +0 -0
  403. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/templates/portfolio/macro/macro_review.html +0 -0
  404. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/__init__.py +0 -0
  405. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/analysis/__init__.py +0 -0
  406. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/analysis/test_claims.py +0 -0
  407. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/conftest.py +0 -0
  408. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/__init__.py +0 -0
  409. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/orders/__init__.py +0 -0
  410. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_account_reconciliation.py +0 -0
  411. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_assets.py +0 -0
  412. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_custodians.py +0 -0
  413. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_customer_trades.py +0 -0
  414. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_dividends.py +0 -0
  415. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_imports.py +0 -0
  416. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_instrument_mixins.py +0 -0
  417. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_merge.py +0 -0
  418. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_portfolio_cash_flow.py +0 -0
  419. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_portfolio_cash_targets.py +0 -0
  420. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_portfolio_swing_pricings.py +0 -0
  421. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_portfolios.py +0 -0
  422. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_product_groups.py +0 -0
  423. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_products.py +0 -0
  424. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_roles.py +0 -0
  425. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/test_splits.py +0 -0
  426. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/transactions/__init__.py +0 -0
  427. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/transactions/test_claim.py +0 -0
  428. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/transactions/test_fees.py +0 -0
  429. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/transactions/test_rebalancing.py +0 -0
  430. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/transactions/test_trades.py +0 -0
  431. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/models/utils.py +0 -0
  432. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/pms/__init__.py +0 -0
  433. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/pms/test_analytics.py +0 -0
  434. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/rebalancing/__init__.py +0 -0
  435. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/rebalancing/test_models.py +0 -0
  436. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/serializers/__init__.py +0 -0
  437. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/serializers/test_claims.py +0 -0
  438. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/signals.py +0 -0
  439. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/tests.py +0 -0
  440. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/viewsets/__init__.py +0 -0
  441. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/viewsets/test_assets.py +0 -0
  442. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/viewsets/test_performances.py +0 -0
  443. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/viewsets/test_products.py +0 -0
  444. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/viewsets/transactions/__init__.py +0 -0
  445. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/tests/viewsets/transactions/test_claims.py +0 -0
  446. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/urls.py +0 -0
  447. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/utils.py +0 -0
  448. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/__init__.py +0 -0
  449. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/adjustments.py +0 -0
  450. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/assets.py +0 -0
  451. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/assets_and_net_new_money_progression.py +0 -0
  452. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/charts/__init__.py +0 -0
  453. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/charts/assets.py +0 -0
  454. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/__init__.py +0 -0
  455. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/buttons/__init__.py +0 -0
  456. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/buttons/adjustments.py +0 -0
  457. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/buttons/assets.py +0 -0
  458. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/buttons/claims.py +0 -0
  459. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/buttons/custodians.py +0 -0
  460. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/buttons/fees.py +0 -0
  461. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/buttons/mixins.py +0 -0
  462. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/buttons/portfolios.py +0 -0
  463. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/buttons/products.py +0 -0
  464. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/buttons/reconciliations.py +0 -0
  465. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/buttons/registers.py +0 -0
  466. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/buttons/signals.py +0 -0
  467. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/buttons/trades.py +0 -0
  468. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/__init__.py +0 -0
  469. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/adjustments.py +0 -0
  470. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/assets.py +0 -0
  471. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/claim.py +0 -0
  472. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/custodians.py +0 -0
  473. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/esg.py +0 -0
  474. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/fees.py +0 -0
  475. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/portfolio_cash_flow.py +0 -0
  476. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/portfolio_relationship.py +0 -0
  477. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/portfolios.py +0 -0
  478. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/positions.py +0 -0
  479. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/product_groups.py +0 -0
  480. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/product_performance.py +0 -0
  481. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/products.py +0 -0
  482. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/rebalancing.py +0 -0
  483. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/reconciliations.py +0 -0
  484. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/registers.py +0 -0
  485. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/roles.py +0 -0
  486. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/display/trades.py +0 -0
  487. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/__init__.py +0 -0
  488. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/adjustments.py +0 -0
  489. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/assets.py +0 -0
  490. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/claim.py +0 -0
  491. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/custodians.py +0 -0
  492. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/esg.py +0 -0
  493. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/fees.py +0 -0
  494. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/portfolio_relationship.py +0 -0
  495. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/portfolios.py +0 -0
  496. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/positions.py +0 -0
  497. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/product_groups.py +0 -0
  498. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/product_performance.py +0 -0
  499. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/products.py +0 -0
  500. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/rebalancing.py +0 -0
  501. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/reconciliations.py +0 -0
  502. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/roles.py +0 -0
  503. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/endpoints/trades.py +0 -0
  504. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/__init__.py +0 -0
  505. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/adjustments.py +0 -0
  506. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/assets.py +0 -0
  507. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/claim.py +0 -0
  508. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/custodians.py +0 -0
  509. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/fees.py +0 -0
  510. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/instrument_prices.py +0 -0
  511. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/orders.py +0 -0
  512. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/portfolio_cash_flow.py +0 -0
  513. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/portfolios.py +0 -0
  514. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/positions.py +0 -0
  515. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/product_groups.py +0 -0
  516. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/product_performance.py +0 -0
  517. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/products.py +0 -0
  518. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/reconciliations.py +0 -0
  519. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/registers.py +0 -0
  520. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/roles.py +0 -0
  521. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/menu/trades.py +0 -0
  522. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/previews/__init__.py +0 -0
  523. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/previews/portfolios.py +0 -0
  524. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/__init__.py +0 -0
  525. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/adjustments.py +0 -0
  526. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/assets.py +0 -0
  527. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/assets_and_net_new_money_progression.py +0 -0
  528. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/claim.py +0 -0
  529. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/custodians.py +0 -0
  530. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/esg.py +0 -0
  531. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/fees.py +0 -0
  532. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/instrument_prices.py +0 -0
  533. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/portfolios.py +0 -0
  534. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/positions.py +0 -0
  535. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/product_groups.py +0 -0
  536. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/product_performance.py +0 -0
  537. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/products.py +0 -0
  538. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/registers.py +0 -0
  539. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/roles.py +0 -0
  540. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/configs/titles/trades.py +0 -0
  541. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/custodians.py +0 -0
  542. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/esg.py +0 -0
  543. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/mixins.py +0 -0
  544. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/__init__.py +0 -0
  545. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/configs/__init__.py +0 -0
  546. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/configs/buttons/__init__.py +0 -0
  547. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/configs/buttons/order_proposals.py +0 -0
  548. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/configs/buttons/orders.py +0 -0
  549. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/configs/displays/__init__.py +0 -0
  550. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/configs/displays/order_proposals.py +0 -0
  551. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/configs/endpoints/__init__.py +0 -0
  552. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/configs/endpoints/order_proposals.py +0 -0
  553. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/configs/endpoints/orders.py +0 -0
  554. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/configs/titles/__init__.py +0 -0
  555. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/orders/configs/titles/orders.py +0 -0
  556. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/portfolio_cash_flow.py +0 -0
  557. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/portfolio_cash_targets.py +0 -0
  558. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/portfolio_relationship.py +0 -0
  559. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/portfolio_swing_pricing.py +0 -0
  560. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/portfolios.py +0 -0
  561. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/positions.py +0 -0
  562. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/product_groups.py +0 -0
  563. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/product_performance.py +0 -0
  564. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/products.py +0 -0
  565. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/rebalancing.py +0 -0
  566. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/reconciliations.py +0 -0
  567. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/registers.py +0 -0
  568. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/roles.py +0 -0
  569. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/transactions/__init__.py +0 -0
  570. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/transactions/claim.py +0 -0
  571. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/transactions/fees.py +0 -0
  572. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/transactions/mixins.py +0 -0
  573. {wbportfolio-1.56.3 → wbportfolio-1.56.5}/wbportfolio/viewsets/transactions/trades.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbportfolio
3
- Version: 1.56.3
3
+ Version: 1.56.5
4
4
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
5
5
  License-File: LICENSE
6
6
  Requires-Dist: cryptography==3.4.*
@@ -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(), timeout=10)
93
+ response = requests.post(url, json=payload, headers=self._get_headers(), timeout=60)
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(), timeout=10)
102
+ response = requests.post(url, json=payload, headers=self._get_headers(), timeout=60)
103
103
  self._raise_for_status(response)
104
104
  return self._get_json(response)
105
105
 
@@ -107,14 +107,14 @@ 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(), timeout=10)
110
+ response = requests.delete(url, headers=self._get_headers(), timeout=60)
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(), timeout=10)
117
+ response = requests.get(url, headers=self._get_headers(), timeout=60)
118
118
  self._raise_for_status(response)
119
119
  return self._get_json(response)
120
120
 
@@ -130,7 +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
+ timeout=30,
134
134
  )
135
135
  self._raise_for_status(response)
136
136
  return self._get_json(response)
@@ -141,7 +141,7 @@ class UBSNeoAPIClient:
141
141
  url,
142
142
  headers=self._get_headers(),
143
143
  params={"fromDate": from_date.strftime("%Y-%m-%d"), "toDate": to_date.strftime("%Y-%m-%d")},
144
- timeout=10,
144
+ timeout=30,
145
145
  )
146
146
  self._raise_for_status(response)
147
147
  return self._get_json(response)
@@ -3,6 +3,7 @@ from datetime import date
3
3
  from decimal import Decimal
4
4
 
5
5
  from django.conf import settings
6
+ from django.core.cache import cache
6
7
  from django.db import models
7
8
  from django.db.models.signals import post_save
8
9
  from django.dispatch import receiver
@@ -16,7 +17,12 @@ from wbportfolio.models import Claim, Product
16
17
 
17
18
 
18
19
  def get_total_assets_under_management(val_date: date) -> Decimal:
19
- return sum([product.get_total_aum_usd(val_date) for product in Product.active_objects.all()])
20
+ cache_key = f"total_assets_under_management:{val_date.isoformat()}"
21
+ return cache.get_or_set(
22
+ cache_key,
23
+ lambda: sum([product.get_total_aum_usd(val_date) for product in Product.active_objects.all()]),
24
+ 60 * 60 * 24,
25
+ )
20
26
 
21
27
 
22
28
  def get_lost_client_customer_status():
@@ -44,9 +50,8 @@ class Updater:
44
50
  self.val_date = val_date
45
51
  self.total_assets_under_management = get_total_assets_under_management(val_date)
46
52
 
47
- def update_company_data(self, company):
53
+ def update_company_data(self, company_portfolio_data) -> tuple[str, str]:
48
54
  # save company portfolio data
49
- company_portfolio_data = CompanyPortfolioData.objects.get_or_create(company=company)[0]
50
55
  if (
51
56
  invested_assets_under_management_usd := company_portfolio_data.get_assets_under_management_usd(
52
57
  self.val_date
@@ -55,19 +60,11 @@ class Updater:
55
60
  company_portfolio_data.invested_assets_under_management_usd = invested_assets_under_management_usd
56
61
  if (potential := company_portfolio_data.get_potential(self.val_date)) is not None:
57
62
  company_portfolio_data.potential = potential
58
- company_portfolio_data.save()
59
63
 
60
64
  # update the company object itself
61
- if (tier := company_portfolio_data.get_tiering(self.total_assets_under_management)) is not None:
62
- company.tier = tier
63
- company.customer_status = company_portfolio_data.get_customer_status()
64
- company.save()
65
-
66
- # def update_all_companies(self, val_date: date):
67
- # for company in tqdm(qs, total=qs.count()):
68
- # with suppress(CompanyPortfolioData.DoesNotExist):
69
- # company_portfolio = CompanyPortfolioData.objects.get(company=company)
70
- # company_portfolio.update_data(date.today())
65
+ tier = company_portfolio_data.get_tiering(self.total_assets_under_management)
66
+ customer_status = company_portfolio_data.get_customer_status()
67
+ return customer_status, tier
71
68
 
72
69
 
73
70
  class CompanyPortfolioData(models.Model):
@@ -104,14 +101,6 @@ class CompanyPortfolioData(models.Model):
104
101
  verbose_name="AUM",
105
102
  help_text="The Assets under Management (AUM) that is managed by this company or this person's primary employer.",
106
103
  )
107
- invested_assets_under_management_usd = models.DecimalField(
108
- max_digits=17,
109
- decimal_places=2,
110
- null=True,
111
- blank=True,
112
- help_text="The invested Assets under Management (AUM).",
113
- verbose_name="Invested AUM ($)",
114
- )
115
104
 
116
105
  investment_discretion = models.CharField(
117
106
  max_length=21,
@@ -120,10 +109,6 @@ class CompanyPortfolioData(models.Model):
120
109
  help_text="What discretion this company or this person's primary employer has to invest its assets.",
121
110
  verbose_name="Investment Discretion",
122
111
  )
123
-
124
- potential = models.DecimalField(
125
- decimal_places=2, max_digits=19, null=True, blank=True, help_text=potential_help_text
126
- )
127
112
  potential_currency = models.ForeignKey(
128
113
  to="currency.Currency",
129
114
  related_name="wbportfolio_potential_currencies",
@@ -132,6 +117,25 @@ class CompanyPortfolioData(models.Model):
132
117
  on_delete=models.PROTECT,
133
118
  )
134
119
 
120
+ # Dynamic fields
121
+ invested_assets_under_management_usd = models.DecimalField(
122
+ max_digits=17,
123
+ decimal_places=2,
124
+ null=True,
125
+ blank=True,
126
+ help_text="The invested Assets under Management (AUM).",
127
+ verbose_name="Invested AUM ($)",
128
+ )
129
+
130
+ potential = models.DecimalField(
131
+ decimal_places=2, max_digits=19, null=True, blank=True, help_text=potential_help_text
132
+ )
133
+
134
+ def update(self):
135
+ with suppress(CurrencyFXRates.DoesNotExist):
136
+ val_date = CurrencyFXRates.objects.latest("date").date
137
+ self.company.customer_status, self.company.tier = Updater(val_date).update_company_data(self)
138
+
135
139
  def get_assets_under_management_usd(self, val_date: date) -> Decimal:
136
140
  return Claim.objects.filter(status=Claim.Status.APPROVED).filter_for_customer(
137
141
  self.company
@@ -140,16 +144,17 @@ class CompanyPortfolioData(models.Model):
140
144
  )["invested_aum_usd"] or Decimal(0)
141
145
 
142
146
  def _get_default_potential(self, val_date: date) -> Decimal:
143
- with suppress(CurrencyFXRates.DoesNotExist):
144
- fx = CurrencyFXRates.objects.get(currency=self.assets_under_management_currency, date=val_date).value
147
+ if self.assets_under_management:
148
+ with suppress(CurrencyFXRates.DoesNotExist):
149
+ fx = CurrencyFXRates.objects.get(currency=self.assets_under_management_currency, date=val_date).value
145
150
 
146
- aum_usd = self.assets_under_management / fx
147
- aum_potential = Decimal(0)
148
- for asset_allocation in self.company.asset_allocations.all():
149
- aum_potential += aum_usd * asset_allocation.percent * asset_allocation.max_investment
150
- invested_aum = self.invested_assets_under_management_usd or Decimal(0.0)
151
+ aum_usd = self.assets_under_management / fx
152
+ aum_potential = Decimal(0)
153
+ for asset_allocation in self.company.asset_allocations.all():
154
+ aum_potential += aum_usd * asset_allocation.percent * asset_allocation.max_investment
155
+ invested_aum = self.invested_assets_under_management_usd or Decimal(0.0)
151
156
 
152
- return aum_potential - invested_aum
157
+ return aum_potential - invested_aum
153
158
 
154
159
  def get_potential(self, val_date: date) -> Decimal:
155
160
  if module_path := getattr(settings, "PORTFOLIO_COMPANY_DATA_POTENTIAL_METHOD", None):
@@ -225,11 +230,6 @@ class CompanyPortfolioData(models.Model):
225
230
  verbose_name_plural = "Company Portfolio Data"
226
231
 
227
232
 
228
- @receiver(post_save, sender="directory.Company")
229
- def create_company_portfolio_data(sender, instance, created, **kwargs):
230
- CompanyPortfolioData.objects.get_or_create(company=instance)
231
-
232
-
233
233
  class AssetAllocationType(WBModel):
234
234
  name = models.CharField(max_length=255)
235
235
  default_max_investment = models.DecimalField(
@@ -329,3 +329,33 @@ class GeographicFocus(models.Model):
329
329
  @classmethod
330
330
  def get_representation_label_key(cls):
331
331
  return "{{company}}: {{percent}} {{country}}"
332
+
333
+
334
+ @receiver(post_save, sender=AssetAllocation)
335
+ @receiver(post_save, sender=GeographicFocus)
336
+ def post_save_company_data(sender, instance, created, **kwargs):
337
+ company = instance.company
338
+ portfolio_data, created = CompanyPortfolioData.objects.get_or_create(company=company)
339
+ if not created:
340
+ portfolio_data.update()
341
+ portfolio_data.save()
342
+ portfolio_data.company.save()
343
+
344
+
345
+ @receiver(post_save, sender="directory.Company")
346
+ def handle_company_portfolio_data(sender, instance, created, **kwargs):
347
+ # create default asset allocation type (equity 50/50)
348
+ if not instance.asset_allocations.exists():
349
+ equity_asset_type = AssetAllocationType.objects.get_or_create(name="Equity")[0]
350
+ AssetAllocation.objects.create(
351
+ company=instance,
352
+ asset_type=equity_asset_type,
353
+ percent=0.5,
354
+ max_investment=0.5,
355
+ )
356
+ if created:
357
+ portfolio_data, created = CompanyPortfolioData.objects.get_or_create(company=instance)
358
+ if not created:
359
+ portfolio_data.update()
360
+ portfolio_data.save()
361
+ portfolio_data.company.save()
@@ -91,7 +91,7 @@ def update_portfolio_data(company_portfolio_data, portfolio_data):
91
91
 
92
92
  if investment_discretion := portfolio_data["investment_discretion"]:
93
93
  company_portfolio_data.investment_discretion = investment_discretion
94
-
94
+ company_portfolio_data.update()
95
95
  company_portfolio_data.save()
96
96
 
97
97
 
@@ -243,11 +243,9 @@ class PersonModelListSerializer(CompanyPortfolioDataMixin, BasePersonModelListSe
243
243
 
244
244
 
245
245
  class AssetAllocationTypeRepresentationSerializer(serializers.RepresentationSerializer):
246
- _detail = serializers.HyperlinkField(reverse_name="company_portfolio:assetallocationtyperepresentation-detail")
247
-
248
246
  class Meta:
249
247
  model = AssetAllocationType
250
- fields = ("id", "name", "_detail")
248
+ fields = ("id", "name")
251
249
 
252
250
 
253
251
  class AssetAllocationTypeModelSerializer(serializers.ModelSerializer):
@@ -19,5 +19,16 @@ def update_all_portfolio_data(val_date: date | None = None):
19
19
  has_account=Exists(Account.objects.filter(owner=OuterRef("pk"))),
20
20
  has_portfolio_data=Exists(CompanyPortfolioData.objects.filter(company=OuterRef("pk"))),
21
21
  )
22
+ company_objs = []
23
+ portfolio_data_objs = []
22
24
  for company in tqdm(qs, total=qs.count()):
23
- updater.update_company_data(company)
25
+ portfolio_data = CompanyPortfolioData.objects.get_or_create(company=company)[0]
26
+ company.customer_status, company.tier = updater.update_company_data(portfolio_data)
27
+ portfolio_data_objs.append(portfolio_data)
28
+ company_objs.append(company)
29
+ if company_objs:
30
+ Company.objects.bulk_update(company_objs, ["customer_status", "tier"])
31
+ if portfolio_data_objs:
32
+ CompanyPortfolioData.objects.bulk_update(
33
+ portfolio_data_objs, ["invested_assets_under_management_usd", "potential"]
34
+ )
@@ -1,6 +1,6 @@
1
1
  from collections import defaultdict
2
2
  from contextlib import suppress
3
- from datetime import datetime
3
+ from datetime import datetime, timedelta
4
4
  from decimal import Decimal
5
5
  from itertools import chain
6
6
  from typing import Any, Dict, List, Optional
@@ -31,7 +31,7 @@ class AssetPositionImportHandler(ImportExportHandler):
31
31
  self.instrument_price_handler = InstrumentPriceImportHandler(self.import_source)
32
32
  self.currency_handler = CurrencyImportHandler(self.import_source)
33
33
 
34
- def _deserialize(self, data: Dict[str, Any]):
34
+ def _deserialize(self, data: Dict[str, Any]): # noqa: C901
35
35
  from wbportfolio.models import Portfolio
36
36
 
37
37
  portfolio_data = data.pop("portfolio", None)
@@ -45,6 +45,10 @@ class AssetPositionImportHandler(ImportExportHandler):
45
45
  data["initial_price"] /= 1000
46
46
  data["currency"] = currency
47
47
  data["date"] = datetime.strptime(data["date"], "%Y-%m-%d").date()
48
+
49
+ # ensure that the position falls into a weekday
50
+ if data["date"].weekday() == 5:
51
+ data["date"] -= timedelta(days=1)
48
52
  if data.get("asset_valuation_date", None):
49
53
  data["asset_valuation_date"] = datetime.strptime(data["asset_valuation_date"], "%Y-%m-%d").date()
50
54
  else:
@@ -43,16 +43,16 @@ def parse(import_source):
43
43
  df = pd.read_excel(import_source.file, engine="openpyxl", sheet_name="Basket Valuation")
44
44
  except BadZipFile:
45
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
-
46
+ xx, yy = np.where(df.isin(["Ticker", "Code"]))
47
+ if xx.size > 0 and yy.size > 0:
48
+ df = df.iloc[xx[0] :, yy[0] :]
49
+ df = df.rename(columns=df.iloc[0]).drop(df.index[0]).dropna(how="all")
50
+ df["Quotity/Adj. factor"] = 1.0
51
+ df = df.rename(columns={"Code": "Ticker"})
52
+ else:
53
+ return {}
54
54
  df = df.rename(columns=FIELD_MAP)
55
- df = df.dropna(subset=["initial_price"])
55
+ df = df.dropna(subset=["initial_price", "Name"], how="any")
56
56
  df["initial_price"] = df["initial_price"].astype("str").str.replace(" ", "").astype("float")
57
57
  df["underlying_quote"] = df[["Ticker", "Name", "currency__key"]].apply(
58
58
  lambda x: _get_underlying_instrument(*x), axis=1
@@ -448,7 +448,10 @@ class AssetPosition(ImportMixin, models.Model):
448
448
  net_value = self.initial_price
449
449
  # in case the position currency and the linked underlying_quote currency don't correspond, we convert the rate accordingly
450
450
  if self.currency != self.underlying_quote.currency:
451
- net_value *= self.currency.convert(self.asset_valuation_date, self.underlying_quote.currency)
451
+ with suppress(CurrencyFXRates.DoesNotExist):
452
+ net_value *= self.currency.convert(
453
+ self.asset_valuation_date, self.underlying_quote.currency
454
+ )
452
455
  self.underlying_quote_price = InstrumentPrice.objects.create(
453
456
  calculated=False,
454
457
  instrument=self.underlying_quote,
@@ -20,7 +20,7 @@ from django.db.models.functions import Coalesce, Round
20
20
  from django.db.models.signals import post_save
21
21
  from django.dispatch import receiver
22
22
  from django.utils.functional import cached_property
23
- from django.utils.translation import gettext_lazy as _
23
+ from django.utils.translation import gettext_lazy
24
24
  from django_fsm import FSMField, transition
25
25
  from pandas._libs.tslibs.offsets import BDay
26
26
  from wbcompliance.models.risk_management.mixins import RiskCheckMixin
@@ -172,7 +172,7 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
172
172
 
173
173
  @cached_property
174
174
  def portfolio_total_asset_value(self) -> Decimal:
175
- return self.portfolio.get_total_asset_value(self.last_effective_date)
175
+ return self.get_portfolio_total_asset_value()
176
176
 
177
177
  @cached_property
178
178
  def validated_trading_service(self) -> TradingService:
@@ -248,6 +248,25 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
248
248
  # TODO make this dynamically configurable
249
249
  return "MARKET_ON_CLOSE"
250
250
 
251
+ def get_portfolio_total_asset_value(self):
252
+ return self.portfolio.get_total_asset_value(self.last_effective_date)
253
+ # return self.orders.annotate(
254
+ # effective_shares=Coalesce(
255
+ # Subquery(
256
+ # AssetPosition.objects.filter(
257
+ # underlying_quote=OuterRef("underlying_instrument"),
258
+ # date=self.last_effective_date,
259
+ # portfolio=self.portfolio,
260
+ # )
261
+ # .values("portfolio")
262
+ # .annotate(s=Sum("shares"))
263
+ # .values("s")[:1]
264
+ # ),
265
+ # Decimal(0),
266
+ # ),
267
+ # effective_total_value_fx_portfolio=F("effective_shares") * F("currency_fx_rate") * F("price"),
268
+ # ).aggregate(s=Sum("effective_total_value_fx_portfolio"))["s"] or Decimal(0.0)
269
+
251
270
  def get_orders(self):
252
271
  # TODO Issue here: the cash is subqueried on the portfolio, on portfolio such as the fund, there is multiple cash component, that we exclude in the orders (and use a unique cash position instead)
253
272
  # so the subquery returns the previous position (probably USD), but is missing the other cash aggregation. We need to find a way to handle that properly
@@ -428,7 +447,6 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
428
447
 
429
448
  # 3. Prepare a mapping from instrument IDs to weights for analytic calculations.
430
449
  previous_weights = {instrument.id: float(info["weighting"]) for instrument, info in portfolio.items()}
431
-
432
450
  # 4. Attempt to fetch analytic returns and portfolio contribution. Default on error.
433
451
  try:
434
452
  last_returns, contribution = self.portfolio.get_analytic_portfolio(
@@ -437,7 +455,6 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
437
455
  last_returns = last_returns.to_dict()
438
456
  except ValueError:
439
457
  last_returns, contribution = {}, 1
440
-
441
458
  positions = []
442
459
  total_weighting = Decimal("0")
443
460
 
@@ -458,6 +475,27 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
458
475
  weighting = drifted_weight + row["delta_weight"]
459
476
 
460
477
  # Assemble the position object
478
+ trade_date = self.last_effective_date if use_effective else self.trade_date
479
+ price_data = {}
480
+ with suppress(InstrumentPrice.DoesNotExist):
481
+ instrument_price = instrument.valuations.get(date=trade_date)
482
+ if fx_rate := instrument_price.currency_fx_rate_to_usd:
483
+ price_data = {
484
+ "volume_usd": instrument_price.volume
485
+ * float(instrument_price.net_value)
486
+ / float(fx_rate.value)
487
+ }
488
+ if instrument_price.market_capitalization:
489
+ price_data["market_capitalization_usd"] = instrument_price.market_capitalization / float(
490
+ fx_rate.value
491
+ )
492
+ if row["shares"] is not None:
493
+ if instrument_price.market_capitalization:
494
+ price_data["market_share"] = (
495
+ float(row["shares"]) * float(row["price"]) / instrument_price.market_capitalization
496
+ )
497
+ if instrument_price.volume_50d:
498
+ price_data["daily_liquidity"] = float(row["shares"]) / instrument_price.volume_50d / 0.33
461
499
  positions.append(
462
500
  PositionDTO(
463
501
  underlying_instrument=instrument.id,
@@ -466,10 +504,14 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
466
504
  daily_return=daily_return if use_effective else Decimal("0"),
467
505
  shares=row["shares"],
468
506
  currency=instrument.currency.id,
469
- date=self.last_effective_date if use_effective else self.trade_date,
507
+ date=trade_date,
508
+ asset_valuation_date=trade_date,
470
509
  is_cash=instrument.is_cash or instrument.is_cash_equivalent,
471
510
  price=row["price"],
472
511
  currency_fx_rate=row["currency_fx_rate"],
512
+ exchange=instrument.exchange.id if instrument.exchange else None,
513
+ country=instrument.country.id if instrument.country else None,
514
+ **price_data,
473
515
  )
474
516
  )
475
517
  total_weighting += weighting
@@ -584,12 +626,16 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
584
626
  target_portfolio = self._get_default_target_portfolio(use_desired_target_weight=use_desired_target_weight)
585
627
  if not effective_portfolio:
586
628
  effective_portfolio = self._get_default_effective_portfolio()
629
+ if use_desired_target_weight:
630
+ total_target_weight = target_portfolio.total_weight
631
+ else:
632
+ total_target_weight = self.total_expected_target_weight
587
633
  if target_portfolio:
588
634
  service = TradingService(
589
635
  self.trade_date,
590
636
  effective_portfolio=effective_portfolio,
591
637
  target_portfolio=target_portfolio,
592
- total_target_weight=self.total_expected_target_weight,
638
+ total_target_weight=total_target_weight,
593
639
  )
594
640
  if validate_order:
595
641
  service.is_valid()
@@ -601,15 +647,11 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
601
647
  portfolio_value = self.portfolio_total_asset_value
602
648
  for order_dto in orders:
603
649
  instrument = Instrument.objects.get(id=order_dto.underlying_instrument)
604
- currency_fx_rate = instrument.currency.convert(
605
- self.value_date, self.portfolio.currency, exact_lookup=True
606
- )
607
650
  # we cannot do a bulk-create because Order is a multi table inheritance
608
651
  weighting = round(order_dto.delta_weight, Order.ORDER_WEIGHTING_PRECISION)
609
652
  daily_return = order_dto.daily_return
610
653
  try:
611
654
  order = self.orders.get(underlying_instrument=instrument)
612
- order.currency_fx_rate = currency_fx_rate
613
655
  order.daily_return = daily_return
614
656
  except Order.DoesNotExist:
615
657
  order = Order(
@@ -618,18 +660,18 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
618
660
  value_date=self.trade_date,
619
661
  weighting=weighting,
620
662
  daily_return=daily_return,
621
- currency_fx_rate=currency_fx_rate,
622
663
  )
623
- order.pre_save()
624
- order.set_weighting(weighting, portfolio_value)
625
- order.desired_target_weight = order_dto.target_weight
626
664
  order.order_type = Order.get_type(
627
665
  weighting, round(order_dto.previous_weight, 8), round(order_dto.target_weight, 8)
628
666
  )
629
- # # if we cannot automatically find a price, we consider the stock is invalid and we sell it
630
- # if not order.price and order.weighting > 0:
631
- # order.price = Decimal("0.0")
632
- # order.weighting = -order_dto.effective_weight
667
+ order.pre_save()
668
+ order.set_weighting(weighting, portfolio_value)
669
+ order.desired_target_weight = order_dto.target_weight
670
+
671
+ # if we cannot automatically find a price, we consider the stock is invalid and we sell it
672
+ if not order.price and order.weighting > 0:
673
+ order.price = Decimal("0.0")
674
+ order.weighting = -order_dto.effective_weight
633
675
  objs.append(order)
634
676
  Order.objects.bulk_create(
635
677
  objs,
@@ -916,7 +958,7 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
916
958
  # "There is no change detected in this order proposal. Please submit at last one valid order"
917
959
  # )
918
960
  if len(service.validated_trades) == 0:
919
- errors_list.append(_("There is no valid order on this proposal"))
961
+ errors_list.append(gettext_lazy("There is no valid order on this proposal"))
920
962
  if service.errors:
921
963
  errors_list.extend(service.errors)
922
964
  if errors_list:
@@ -1043,22 +1085,26 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
1043
1085
  errors = dict()
1044
1086
  orders = self.get_orders()
1045
1087
  if not self.portfolio.can_be_rebalanced:
1046
- errors["non_field_errors"] = [_("The portfolio does not allow manual rebalanced")]
1088
+ errors["non_field_errors"] = [gettext_lazy("The portfolio does not allow manual rebalanced")]
1047
1089
  if not orders.exists():
1048
1090
  errors["non_field_errors"] = [
1049
- _("At least one order needs to be submitted to be able to apply this proposal")
1091
+ gettext_lazy("At least one order needs to be submitted to be able to apply this proposal")
1050
1092
  ]
1051
1093
  if not self.portfolio.can_be_rebalanced:
1052
1094
  errors["portfolio"] = [
1053
- [_("The portfolio needs to be a model portfolio in order to apply this order proposal manually")]
1095
+ [
1096
+ gettext_lazy(
1097
+ "The portfolio needs to be a model portfolio in order to apply this order proposal manually"
1098
+ )
1099
+ ]
1054
1100
  ]
1055
1101
  if self.has_non_successful_checks:
1056
- errors["non_field_errors"] = [_("The pre orders rules did not passed successfully")]
1102
+ errors["non_field_errors"] = [gettext_lazy("The pre orders rules did not passed successfully")]
1057
1103
  if orders.filter(has_warnings=True).filter(
1058
1104
  underlying_instrument__is_cash=False, underlying_instrument__is_cash_equivalent=False
1059
1105
  ):
1060
1106
  errors["non_field_errors"] = [
1061
- _("There is warning that needs to be addresses on the orders before approval.")
1107
+ gettext_lazy("There is warning that needs to be addresses on the orders before approval.")
1062
1108
  ]
1063
1109
  return errors
1064
1110
 
@@ -1122,7 +1168,9 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
1122
1168
  errors = dict()
1123
1169
  if not self.portfolio.can_be_rebalanced:
1124
1170
  errors["portfolio"] = [
1125
- _("The portfolio needs to be a model portfolio in order to revert this order proposal manually")
1171
+ gettext_lazy(
1172
+ "The portfolio needs to be a model portfolio in order to revert this order proposal manually"
1173
+ )
1126
1174
  ]
1127
1175
  return errors
1128
1176