wbportfolio 1.56.2__tar.gz → 1.56.4__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.2 → wbportfolio-1.56.4}/PKG-INFO +1 -1
  2. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/api_clients/ubs.py +6 -6
  3. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/handlers/asset_position.py +6 -2
  4. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/natixis/equity.py +9 -9
  5. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/asset.py +4 -1
  6. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/orders/order_proposals.py +40 -14
  7. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/orders/orders.py +41 -25
  8. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/backends/exposure_portfolio.py +1 -1
  9. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/orders/orders.py +12 -1
  10. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/configs/displays/orders.py +7 -1
  11. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/order_proposals.py +1 -3
  12. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/orders.py +1 -0
  13. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/.gitignore +0 -0
  14. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/LICENSE +0 -0
  15. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/pyproject.toml +0 -0
  16. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/__init__.py +0 -0
  17. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/__init__.py +0 -0
  18. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/asset.py +0 -0
  19. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/custodians.py +0 -0
  20. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/indexes.py +0 -0
  21. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/orders/__init__.py +0 -0
  22. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/orders/order_proposals.py +0 -0
  23. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/orders/orders.py +0 -0
  24. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/portfolio.py +0 -0
  25. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/portfolio_relationships.py +0 -0
  26. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/product_groups.py +0 -0
  27. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/products.py +0 -0
  28. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/rebalancing.py +0 -0
  29. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/reconciliations.py +0 -0
  30. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/registers.py +0 -0
  31. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/roles.py +0 -0
  32. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/transactions/__init__.py +0 -0
  33. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/transactions/claim.py +0 -0
  34. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/transactions/dividends.py +0 -0
  35. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/transactions/fees.py +0 -0
  36. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/admin/transactions/trades.py +0 -0
  37. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/analysis/__init__.py +0 -0
  38. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/analysis/claims.py +0 -0
  39. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/api_clients/__init__.py +0 -0
  40. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/apps.py +0 -0
  41. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/constants.py +0 -0
  42. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/__init__.py +0 -0
  43. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/__init__.py +0 -0
  44. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/admin.py +0 -0
  45. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/apps.py +0 -0
  46. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/configs/__init__.py +0 -0
  47. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/configs/display.py +0 -0
  48. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/configs/endpoints.py +0 -0
  49. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/configs/previews.py +0 -0
  50. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/constants.py +0 -0
  51. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/dynamic_preferences_registry.py +0 -0
  52. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/factories.py +0 -0
  53. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/filters.py +0 -0
  54. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/management.py +0 -0
  55. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/migrations/0001_initial.py +0 -0
  56. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/migrations/__init__.py +0 -0
  57. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/models.py +0 -0
  58. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/scripts.py +0 -0
  59. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/serializers.py +0 -0
  60. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/tasks.py +0 -0
  61. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/tests/__init__.py +0 -0
  62. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/tests/conftest.py +0 -0
  63. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/tests/test_models.py +0 -0
  64. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/urls.py +0 -0
  65. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/contrib/company_portfolio/viewsets.py +0 -0
  66. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/defaults/__init__.py +0 -0
  67. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/defaults/fees/__init__.py +0 -0
  68. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/defaults/fees/default.py +0 -0
  69. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/dynamic_preferences_registry.py +0 -0
  70. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/__init__.py +0 -0
  71. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/adjustments.py +0 -0
  72. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/assets.py +0 -0
  73. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/claim.py +0 -0
  74. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/custodians.py +0 -0
  75. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/dividends.py +0 -0
  76. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/fees.py +0 -0
  77. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/indexes.py +0 -0
  78. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/orders/__init__.py +0 -0
  79. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/orders/order_proposals.py +0 -0
  80. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/orders/orders.py +0 -0
  81. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/portfolio_cash_flow.py +0 -0
  82. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/portfolio_cash_targets.py +0 -0
  83. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/portfolio_swing_pricings.py +0 -0
  84. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/portfolios.py +0 -0
  85. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/product_groups.py +0 -0
  86. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/products.py +0 -0
  87. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/rebalancing.py +0 -0
  88. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/reconciliations.py +0 -0
  89. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/roles.py +0 -0
  90. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/factories/trades.py +0 -0
  91. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/__init__.py +0 -0
  92. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/assets.py +0 -0
  93. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/assets_and_net_new_money_progression.py +0 -0
  94. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/custodians.py +0 -0
  95. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/esg.py +0 -0
  96. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/orders/__init__.py +0 -0
  97. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/orders/order_proposals.py +0 -0
  98. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/orders/orders.py +0 -0
  99. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/performances.py +0 -0
  100. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/portfolios.py +0 -0
  101. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/positions.py +0 -0
  102. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/products.py +0 -0
  103. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/roles.py +0 -0
  104. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/signals.py +0 -0
  105. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/transactions/__init__.py +0 -0
  106. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/transactions/claim.py +0 -0
  107. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/transactions/fees.py +0 -0
  108. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/transactions/mixins.py +0 -0
  109. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/transactions/trades.py +0 -0
  110. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/filters/transactions/utils.py +0 -0
  111. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/fixtures/product_factsheets.yaml +0 -0
  112. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/fixtures/wbportfolio.yaml.gz +0 -0
  113. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/fixtures/wbrisk_management.yaml.gz +0 -0
  114. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/__init__.py +0 -0
  115. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/backends/__init__.py +0 -0
  116. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/backends/refinitiv/adjustment.py +0 -0
  117. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/backends/ubs/__init__.py +0 -0
  118. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/backends/ubs/asset_position.py +0 -0
  119. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/backends/ubs/fees.py +0 -0
  120. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/backends/ubs/instrument_price.py +0 -0
  121. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/backends/ubs/mixin.py +0 -0
  122. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/backends/utils.py +0 -0
  123. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/backends/wbfdm/__init__.py +0 -0
  124. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/backends/wbfdm/adjustment.py +0 -0
  125. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/backends/wbfdm/dividend.py +0 -0
  126. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/backends/wbfdm/mixin.py +0 -0
  127. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/handlers/__init__.py +0 -0
  128. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/handlers/adjustment.py +0 -0
  129. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/handlers/dividend.py +0 -0
  130. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/handlers/fees.py +0 -0
  131. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/handlers/orders.py +0 -0
  132. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/handlers/portfolio_cash_flow.py +0 -0
  133. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/handlers/register.py +0 -0
  134. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/handlers/trade.py +0 -0
  135. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/__init__.py +0 -0
  136. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/default_mapping.py +0 -0
  137. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/jpmorgan/__init__.py +0 -0
  138. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/jpmorgan/customer_trade.py +0 -0
  139. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/jpmorgan/fees.py +0 -0
  140. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/jpmorgan/strategy.py +0 -0
  141. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/jpmorgan/valuation.py +0 -0
  142. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/leonteq/__init__.py +0 -0
  143. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/leonteq/customer_trade.py +0 -0
  144. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/leonteq/equity.py +0 -0
  145. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/leonteq/fees.py +0 -0
  146. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/leonteq/trade.py +0 -0
  147. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/leonteq/valuation.py +0 -0
  148. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/natixis/__init__.py +0 -0
  149. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/natixis/customer_trade.py +0 -0
  150. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/natixis/d1_customer_trade.py +0 -0
  151. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/natixis/d1_equity.py +0 -0
  152. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/natixis/d1_fees.py +0 -0
  153. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/natixis/d1_trade.py +0 -0
  154. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/natixis/d1_valuation.py +0 -0
  155. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/natixis/dividend.py +0 -0
  156. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/natixis/fees.py +0 -0
  157. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/natixis/trade.py +0 -0
  158. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/natixis/utils.py +0 -0
  159. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/natixis/valuation.py +0 -0
  160. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/refinitiv/__init__.py +0 -0
  161. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/refinitiv/adjustment.py +0 -0
  162. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/__init__.py +0 -0
  163. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/custodian_positions.py +0 -0
  164. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/customer_trade.py +0 -0
  165. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/customer_trade_pending_slk.py +0 -0
  166. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/customer_trade_slk.py +0 -0
  167. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/customer_trade_without_pw.py +0 -0
  168. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/equity.py +0 -0
  169. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/fees.py +0 -0
  170. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/perf_fees.py +0 -0
  171. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/portfolio_cash_flow.py +0 -0
  172. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/portfolio_future_cash_flow.py +0 -0
  173. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/registers.py +0 -0
  174. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/sylk.py +0 -0
  175. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/utils.py +0 -0
  176. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/sg_lux/valuation.py +0 -0
  177. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/societe_generale/__init__.py +0 -0
  178. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/societe_generale/customer_trade.py +0 -0
  179. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/societe_generale/strategy.py +0 -0
  180. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/societe_generale/valuation.py +0 -0
  181. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/tellco/__init__.py +0 -0
  182. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/tellco/customer_trade.py +0 -0
  183. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/tellco/equity.py +0 -0
  184. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/tellco/valuation.py +0 -0
  185. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/ubs/__init__.py +0 -0
  186. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/ubs/api/__init__.py +0 -0
  187. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/ubs/api/asset_position.py +0 -0
  188. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/ubs/api/fees.py +0 -0
  189. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/ubs/api/instrument_price.py +0 -0
  190. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/ubs/api/utils.py +0 -0
  191. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/ubs/customer_trade.py +0 -0
  192. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/ubs/equity.py +0 -0
  193. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/ubs/historical_customer_trade.py +0 -0
  194. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/ubs/valuation.py +0 -0
  195. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/vontobel/__init__.py +0 -0
  196. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/vontobel/asset_position.py +0 -0
  197. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/vontobel/customer_trade.py +0 -0
  198. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/vontobel/historical_customer_trade.py +0 -0
  199. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/vontobel/instrument.py +0 -0
  200. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/vontobel/management_fees.py +0 -0
  201. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/vontobel/performance_fees.py +0 -0
  202. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/vontobel/trade.py +0 -0
  203. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/vontobel/utils.py +0 -0
  204. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/vontobel/valuation.py +0 -0
  205. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/parsers/vontobel/valuation_api.py +0 -0
  206. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/resources/__init__.py +0 -0
  207. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/resources/assets.py +0 -0
  208. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/resources/trades.py +0 -0
  209. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/import_export/utils.py +0 -0
  210. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/jinja2/wbportfolio/sql/aum_nnm.sql +0 -0
  211. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/kpi_handlers/nnm.py +0 -0
  212. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/locale/de/LC_MESSAGES/django.mo +0 -0
  213. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/locale/de/LC_MESSAGES/django.po +0 -0
  214. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/locale/en/LC_MESSAGES/django.mo +0 -0
  215. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/locale/en/LC_MESSAGES/django.po +0 -0
  216. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/locale/fr/LC_MESSAGES/django.mo +0 -0
  217. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/locale/fr/LC_MESSAGES/django.po +0 -0
  218. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/metric/__init__.py +0 -0
  219. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/metric/backends/__init__.py +0 -0
  220. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/metric/backends/base.py +0 -0
  221. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/metric/backends/constants.py +0 -0
  222. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/metric/backends/portfolio_base.py +0 -0
  223. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/metric/backends/portfolio_esg.py +0 -0
  224. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/metric/tests/__init__.py +0 -0
  225. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/metric/tests/conftest.py +0 -0
  226. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/metric/tests/test_portfolio_base.py +0 -0
  227. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/metric/tests/test_portfolio_esg.py +0 -0
  228. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0001_initial_squashed.py +0 -0
  229. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0002_product_default_sub_account_squashed_0039_alter_assetallocation_company_and_more.py +0 -0
  230. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0040_instrument_financial_instrument.py +0 -0
  231. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0041_remove_listresearch_research_ptr_and_more.py +0 -0
  232. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0042_instrumentlist_instrumentlistthroughmodel_and_more.py +0 -0
  233. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0043_alter_instrumentlistthroughmodel_options_and_more.py +0 -0
  234. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0044_alter_instrumentlist_identifier.py +0 -0
  235. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0045_alter_instrument_financial_instrument.py +0 -0
  236. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0046_add_product_default_account.py +0 -0
  237. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0047_remove_product_default_sub_account.py +0 -0
  238. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0048_alter_trade_status.py +0 -0
  239. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0049_trade_claimed_shares.py +0 -0
  240. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0050_fees_fee_date_fees_wbportfolio_transac_1f7a29_idx.py +0 -0
  241. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0051_delete_macroreview.py +0 -0
  242. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0052_remove_cash_instrument_ptr_and_more.py +0 -0
  243. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0053_remove_product_group.py +0 -0
  244. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0054_portfolioinstrumentpreferredclassificationthroughmodel_and_more.py +0 -0
  245. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0055_remove_product__custom_management_rebates_and_more.py +0 -0
  246. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0056_remove_companyportfoliodata_assets_under_management_currency_and_more.py +0 -0
  247. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0057_alter_portfolio_preferred_instrument_classifications_and_more.py +0 -0
  248. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0058_pmsinstrument.py +0 -0
  249. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0059_fees_unique_fees.py +0 -0
  250. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0060_alter_portfolioportfoliothroughmodel_type.py +0 -0
  251. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0061_portfolio_bank_accounts_product_bank_account_and_more.py +0 -0
  252. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0062_alter_dailyportfoliocashflow_options.py +0 -0
  253. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0063_accountreconciliation_accountreconciliationline_and_more.py +0 -0
  254. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0064_alter_portfolio_managers_portfolio_is_tracked_and_more.py +0 -0
  255. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0065_alter_portfolio_managers_claim_as_shares_and_more.py +0 -0
  256. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0066_assetposition_initial_shares_at_custodian_and_more.py +0 -0
  257. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0067_assetposition_unique_asset_position.py +0 -0
  258. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0068_trade_internal_trade_trade_marked_as_internal_and_more.py +0 -0
  259. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0069_remove_portfolio_is_invested_and_more.py +0 -0
  260. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0070_remove_assetposition_unique_asset_position_and_more.py +0 -0
  261. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0071_alter_trade_options_alter_trade_order.py +0 -0
  262. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0072_trade_diff_shares.py +0 -0
  263. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0073_remove_product_price_computation_and_more.py +0 -0
  264. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0074_alter_rebalancer_frequency_and_more.py +0 -0
  265. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0075_portfolio_initial_position_date_and_more.py +0 -0
  266. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0076_alter_dividendtransaction_price_and_more.py +0 -0
  267. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0077_remove_transaction_currency_and_more.py +0 -0
  268. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0078_trade_drift_factor.py +0 -0
  269. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0079_alter_trade_drift_factor.py +0 -0
  270. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0080_alter_trade_drift_factor_alter_trade_weighting.py +0 -0
  271. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0081_alter_trade_drift_factor.py +0 -0
  272. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0082_remove_tradeproposal_creator_and_more.py +0 -0
  273. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0083_order_alter_trade_options_and_more.py +0 -0
  274. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0084_orderproposal_min_order_value.py +0 -0
  275. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0085_order_desired_target_weight.py +0 -0
  276. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0086_orderproposal_total_cash_weight.py +0 -0
  277. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0087_product_order_routing_custodian_adapter.py +0 -0
  278. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0088_orderproposal_total_effective_portfolio_contribution.py +0 -0
  279. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0089_orderproposal_min_weighting.py +0 -0
  280. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/0090_dividendtransaction_price_fx_portfolio_and_more.py +0 -0
  281. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/migrations/__init__.py +0 -0
  282. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/__init__.py +0 -0
  283. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/adjustments.py +0 -0
  284. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/builder.py +0 -0
  285. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/custodians.py +0 -0
  286. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/exceptions.py +0 -0
  287. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/graphs/__init__.py +0 -0
  288. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/graphs/portfolio.py +0 -0
  289. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/graphs/utils.py +0 -0
  290. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/indexes.py +0 -0
  291. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/llm/wbcrm/analyze_relationship.py +0 -0
  292. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/mixins/__init__.py +0 -0
  293. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/mixins/instruments.py +0 -0
  294. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/mixins/liquidity_stress_test.py +0 -0
  295. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/orders/__init__.py +0 -0
  296. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/orders/routing.py +0 -0
  297. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/portfolio.py +0 -0
  298. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/portfolio_cash_flow.py +0 -0
  299. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/portfolio_cash_targets.py +0 -0
  300. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/portfolio_relationship.py +0 -0
  301. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/portfolio_swing_pricings.py +0 -0
  302. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/product_groups.py +0 -0
  303. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/products.py +0 -0
  304. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/rebalancing.py +0 -0
  305. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/reconciliations/__init__.py +0 -0
  306. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/reconciliations/account_reconciliation_lines.py +0 -0
  307. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/reconciliations/account_reconciliations.py +0 -0
  308. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/reconciliations/reconciliations.py +0 -0
  309. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/registers.py +0 -0
  310. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/roles.py +0 -0
  311. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/signals.py +0 -0
  312. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/transactions/__init__.py +0 -0
  313. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/transactions/claim.py +0 -0
  314. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/transactions/dividends.py +0 -0
  315. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/transactions/fees.py +0 -0
  316. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/transactions/trades.py +0 -0
  317. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/transactions/transactions.py +0 -0
  318. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/models/utils.py +0 -0
  319. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/order_routing/__init__.py +0 -0
  320. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/order_routing/adapters/__init__.py +0 -0
  321. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/order_routing/adapters/ubs.py +0 -0
  322. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/permissions.py +0 -0
  323. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/pms/__init__.py +0 -0
  324. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/pms/analytics/__init__.py +0 -0
  325. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/pms/analytics/portfolio.py +0 -0
  326. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/pms/analytics/utils.py +0 -0
  327. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/pms/statistics/__init__.py +0 -0
  328. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/pms/trading/__init__.py +0 -0
  329. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/pms/trading/handler.py +0 -0
  330. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/pms/typing.py +0 -0
  331. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/preferences.py +0 -0
  332. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/rebalancing/__init__.py +0 -0
  333. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/rebalancing/base.py +0 -0
  334. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/rebalancing/decorators.py +0 -0
  335. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/rebalancing/models/__init__.py +0 -0
  336. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/rebalancing/models/composite.py +0 -0
  337. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/rebalancing/models/equally_weighted.py +0 -0
  338. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/rebalancing/models/market_capitalization_weighted.py +0 -0
  339. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/rebalancing/models/model_portfolio.py +0 -0
  340. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/reports/__init__.py +0 -0
  341. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/reports/monthly_position_report.py +0 -0
  342. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/__init__.py +0 -0
  343. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/backends/__init__.py +0 -0
  344. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/backends/accounts.py +0 -0
  345. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/backends/controversy_portfolio.py +0 -0
  346. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/backends/instrument_list_portfolio.py +0 -0
  347. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/backends/liquidity_risk.py +0 -0
  348. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/backends/liquidity_stress_instrument.py +0 -0
  349. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/backends/mixins.py +0 -0
  350. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/backends/product_integrity.py +0 -0
  351. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/backends/stop_loss_instrument.py +0 -0
  352. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/backends/stop_loss_portfolio.py +0 -0
  353. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/backends/ucits_portfolio.py +0 -0
  354. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/tests/__init__.py +0 -0
  355. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/tests/conftest.py +0 -0
  356. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/tests/test_accounts.py +0 -0
  357. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/tests/test_controversy_portfolio.py +0 -0
  358. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/tests/test_exposure_portfolio.py +0 -0
  359. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/tests/test_instrument_list_portfolio.py +0 -0
  360. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/tests/test_liquidity_risk.py +0 -0
  361. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/tests/test_product_integrity.py +0 -0
  362. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/tests/test_stop_loss_instrument.py +0 -0
  363. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/tests/test_stop_loss_portfolio.py +0 -0
  364. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/risk_management/tests/test_ucits_portfolio.py +0 -0
  365. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/__init__.py +0 -0
  366. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/adjustments.py +0 -0
  367. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/assets.py +0 -0
  368. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/custodians.py +0 -0
  369. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/orders/__init__.py +0 -0
  370. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/orders/order_proposals.py +0 -0
  371. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/portfolio_cash_flow.py +0 -0
  372. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/portfolio_cash_targets.py +0 -0
  373. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/portfolio_relationship.py +0 -0
  374. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/portfolio_swing_pricing.py +0 -0
  375. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/portfolios.py +0 -0
  376. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/positions.py +0 -0
  377. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/product_group.py +0 -0
  378. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/products.py +0 -0
  379. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/rebalancing.py +0 -0
  380. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/reconciliations.py +0 -0
  381. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/registers.py +0 -0
  382. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/roles.py +0 -0
  383. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/signals.py +0 -0
  384. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/transactions/__init__.py +0 -0
  385. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/transactions/claim.py +0 -0
  386. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/transactions/dividends.py +0 -0
  387. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/transactions/fees.py +0 -0
  388. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/serializers/transactions/trades.py +0 -0
  389. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/static/wbportfolio/css/macro_review.css +0 -0
  390. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/static/wbportfolio/markdown/documentation/account_holding_reconciliation.md +0 -0
  391. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/static/wbportfolio/markdown/documentation/aggregate_asset_position_liquidity.md +0 -0
  392. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/static/wbportfolio/markdown/documentation/company.md +0 -0
  393. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/static/wbportfolio/markdown/documentation/earnings_instrument.md +0 -0
  394. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/static/wbportfolio/markdown/documentation/financial_analysis_instrument_ratios.md +0 -0
  395. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/static/wbportfolio/markdown/documentation/financial_statistics.md +0 -0
  396. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/static/wbportfolio/markdown/documentation/person.md +0 -0
  397. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tasks.py +0 -0
  398. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/templates/portfolio/email/customer_report.html +0 -0
  399. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/templates/portfolio/email/customer_trade_notification.html +0 -0
  400. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/templates/portfolio/email/email_base_template.html +0 -0
  401. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/templates/portfolio/email/rebalancing_report.html +0 -0
  402. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/templates/portfolio/macro/macro_review.html +0 -0
  403. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/__init__.py +0 -0
  404. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/analysis/__init__.py +0 -0
  405. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/analysis/test_claims.py +0 -0
  406. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/conftest.py +0 -0
  407. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/__init__.py +0 -0
  408. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/orders/__init__.py +0 -0
  409. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/orders/test_order_proposals.py +0 -0
  410. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_account_reconciliation.py +0 -0
  411. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_assets.py +0 -0
  412. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_custodians.py +0 -0
  413. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_customer_trades.py +0 -0
  414. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_dividends.py +0 -0
  415. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_imports.py +0 -0
  416. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_instrument_mixins.py +0 -0
  417. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_merge.py +0 -0
  418. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_portfolio_cash_flow.py +0 -0
  419. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_portfolio_cash_targets.py +0 -0
  420. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_portfolio_swing_pricings.py +0 -0
  421. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_portfolios.py +0 -0
  422. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_product_groups.py +0 -0
  423. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_products.py +0 -0
  424. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_roles.py +0 -0
  425. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/test_splits.py +0 -0
  426. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/transactions/__init__.py +0 -0
  427. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/transactions/test_claim.py +0 -0
  428. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/transactions/test_fees.py +0 -0
  429. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/transactions/test_rebalancing.py +0 -0
  430. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/transactions/test_trades.py +0 -0
  431. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/models/utils.py +0 -0
  432. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/pms/__init__.py +0 -0
  433. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/pms/test_analytics.py +0 -0
  434. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/rebalancing/__init__.py +0 -0
  435. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/rebalancing/test_models.py +0 -0
  436. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/serializers/__init__.py +0 -0
  437. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/serializers/test_claims.py +0 -0
  438. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/signals.py +0 -0
  439. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/tests.py +0 -0
  440. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/viewsets/__init__.py +0 -0
  441. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/viewsets/test_assets.py +0 -0
  442. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/viewsets/test_performances.py +0 -0
  443. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/viewsets/test_products.py +0 -0
  444. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/viewsets/transactions/__init__.py +0 -0
  445. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/tests/viewsets/transactions/test_claims.py +0 -0
  446. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/urls.py +0 -0
  447. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/utils.py +0 -0
  448. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/__init__.py +0 -0
  449. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/adjustments.py +0 -0
  450. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/assets.py +0 -0
  451. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/assets_and_net_new_money_progression.py +0 -0
  452. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/charts/__init__.py +0 -0
  453. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/charts/assets.py +0 -0
  454. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/__init__.py +0 -0
  455. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/buttons/__init__.py +0 -0
  456. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/buttons/adjustments.py +0 -0
  457. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/buttons/assets.py +0 -0
  458. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/buttons/claims.py +0 -0
  459. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/buttons/custodians.py +0 -0
  460. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/buttons/fees.py +0 -0
  461. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/buttons/mixins.py +0 -0
  462. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/buttons/portfolios.py +0 -0
  463. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/buttons/products.py +0 -0
  464. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/buttons/reconciliations.py +0 -0
  465. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/buttons/registers.py +0 -0
  466. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/buttons/signals.py +0 -0
  467. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/buttons/trades.py +0 -0
  468. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/__init__.py +0 -0
  469. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/adjustments.py +0 -0
  470. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/assets.py +0 -0
  471. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/claim.py +0 -0
  472. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/custodians.py +0 -0
  473. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/esg.py +0 -0
  474. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/fees.py +0 -0
  475. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/portfolio_cash_flow.py +0 -0
  476. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/portfolio_relationship.py +0 -0
  477. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/portfolios.py +0 -0
  478. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/positions.py +0 -0
  479. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/product_groups.py +0 -0
  480. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/product_performance.py +0 -0
  481. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/products.py +0 -0
  482. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/rebalancing.py +0 -0
  483. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/reconciliations.py +0 -0
  484. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/registers.py +0 -0
  485. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/roles.py +0 -0
  486. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/display/trades.py +0 -0
  487. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/__init__.py +0 -0
  488. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/adjustments.py +0 -0
  489. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/assets.py +0 -0
  490. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/claim.py +0 -0
  491. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/custodians.py +0 -0
  492. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/esg.py +0 -0
  493. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/fees.py +0 -0
  494. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/portfolio_relationship.py +0 -0
  495. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/portfolios.py +0 -0
  496. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/positions.py +0 -0
  497. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/product_groups.py +0 -0
  498. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/product_performance.py +0 -0
  499. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/products.py +0 -0
  500. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/rebalancing.py +0 -0
  501. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/reconciliations.py +0 -0
  502. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/roles.py +0 -0
  503. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/endpoints/trades.py +0 -0
  504. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/__init__.py +0 -0
  505. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/adjustments.py +0 -0
  506. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/assets.py +0 -0
  507. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/claim.py +0 -0
  508. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/custodians.py +0 -0
  509. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/fees.py +0 -0
  510. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/instrument_prices.py +0 -0
  511. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/orders.py +0 -0
  512. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/portfolio_cash_flow.py +0 -0
  513. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/portfolios.py +0 -0
  514. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/positions.py +0 -0
  515. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/product_groups.py +0 -0
  516. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/product_performance.py +0 -0
  517. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/products.py +0 -0
  518. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/reconciliations.py +0 -0
  519. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/registers.py +0 -0
  520. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/roles.py +0 -0
  521. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/menu/trades.py +0 -0
  522. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/previews/__init__.py +0 -0
  523. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/previews/portfolios.py +0 -0
  524. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/__init__.py +0 -0
  525. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/adjustments.py +0 -0
  526. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/assets.py +0 -0
  527. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/assets_and_net_new_money_progression.py +0 -0
  528. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/claim.py +0 -0
  529. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/custodians.py +0 -0
  530. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/esg.py +0 -0
  531. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/fees.py +0 -0
  532. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/instrument_prices.py +0 -0
  533. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/portfolios.py +0 -0
  534. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/positions.py +0 -0
  535. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/product_groups.py +0 -0
  536. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/product_performance.py +0 -0
  537. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/products.py +0 -0
  538. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/registers.py +0 -0
  539. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/roles.py +0 -0
  540. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/configs/titles/trades.py +0 -0
  541. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/custodians.py +0 -0
  542. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/esg.py +0 -0
  543. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/mixins.py +0 -0
  544. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/__init__.py +0 -0
  545. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/configs/__init__.py +0 -0
  546. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/configs/buttons/__init__.py +0 -0
  547. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/configs/buttons/order_proposals.py +0 -0
  548. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/configs/buttons/orders.py +0 -0
  549. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/configs/displays/__init__.py +0 -0
  550. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/configs/displays/order_proposals.py +0 -0
  551. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/configs/endpoints/__init__.py +0 -0
  552. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/configs/endpoints/order_proposals.py +0 -0
  553. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/configs/endpoints/orders.py +0 -0
  554. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/configs/titles/__init__.py +0 -0
  555. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/orders/configs/titles/orders.py +0 -0
  556. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/portfolio_cash_flow.py +0 -0
  557. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/portfolio_cash_targets.py +0 -0
  558. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/portfolio_relationship.py +0 -0
  559. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/portfolio_swing_pricing.py +0 -0
  560. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/portfolios.py +0 -0
  561. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/positions.py +0 -0
  562. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/product_groups.py +0 -0
  563. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/product_performance.py +0 -0
  564. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/products.py +0 -0
  565. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/rebalancing.py +0 -0
  566. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/reconciliations.py +0 -0
  567. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/registers.py +0 -0
  568. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/roles.py +0 -0
  569. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/transactions/__init__.py +0 -0
  570. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/transactions/claim.py +0 -0
  571. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/transactions/fees.py +0 -0
  572. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/wbportfolio/viewsets/transactions/mixins.py +0 -0
  573. {wbportfolio-1.56.2 → wbportfolio-1.56.4}/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.2
3
+ Version: 1.56.4
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)
@@ -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
@@ -458,6 +458,27 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
458
458
  weighting = drifted_weight + row["delta_weight"]
459
459
 
460
460
  # Assemble the position object
461
+ trade_date = self.last_effective_date if use_effective else self.trade_date
462
+ price_data = {}
463
+ with suppress(InstrumentPrice.DoesNotExist):
464
+ instrument_price = instrument.valuations.get(date=trade_date)
465
+ if fx_rate := instrument_price.currency_fx_rate_to_usd:
466
+ price_data = {
467
+ "volume_usd": instrument_price.volume
468
+ * float(instrument_price.net_value)
469
+ / float(fx_rate.value)
470
+ }
471
+ if instrument_price.market_capitalization:
472
+ price_data["market_capitalization_usd"] = instrument_price.market_capitalization / float(
473
+ fx_rate.value
474
+ )
475
+ if row["shares"] is not None:
476
+ if instrument_price.market_capitalization:
477
+ price_data["market_share"] = (
478
+ float(row["shares"]) * float(row["price"]) / instrument_price.market_capitalization
479
+ )
480
+ if instrument_price.volume_50d:
481
+ price_data["daily_liquidity"] = float(row["shares"]) / instrument_price.volume_50d / 0.33
461
482
  positions.append(
462
483
  PositionDTO(
463
484
  underlying_instrument=instrument.id,
@@ -466,10 +487,14 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
466
487
  daily_return=daily_return if use_effective else Decimal("0"),
467
488
  shares=row["shares"],
468
489
  currency=instrument.currency.id,
469
- date=self.last_effective_date if use_effective else self.trade_date,
490
+ date=trade_date,
491
+ asset_valuation_date=trade_date,
470
492
  is_cash=instrument.is_cash or instrument.is_cash_equivalent,
471
493
  price=row["price"],
472
494
  currency_fx_rate=row["currency_fx_rate"],
495
+ exchange=instrument.exchange.id if instrument.exchange else None,
496
+ country=instrument.country.id if instrument.country else None,
497
+ **price_data,
473
498
  )
474
499
  )
475
500
  total_weighting += weighting
@@ -601,15 +626,11 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
601
626
  portfolio_value = self.portfolio_total_asset_value
602
627
  for order_dto in orders:
603
628
  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
629
  # we cannot do a bulk-create because Order is a multi table inheritance
608
630
  weighting = round(order_dto.delta_weight, Order.ORDER_WEIGHTING_PRECISION)
609
631
  daily_return = order_dto.daily_return
610
632
  try:
611
633
  order = self.orders.get(underlying_instrument=instrument)
612
- order.currency_fx_rate = currency_fx_rate
613
634
  order.daily_return = daily_return
614
635
  except Order.DoesNotExist:
615
636
  order = Order(
@@ -618,7 +639,6 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
618
639
  value_date=self.trade_date,
619
640
  weighting=weighting,
620
641
  daily_return=daily_return,
621
- currency_fx_rate=currency_fx_rate,
622
642
  )
623
643
  order.pre_save()
624
644
  order.set_weighting(weighting, portfolio_value)
@@ -916,7 +936,7 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
916
936
  # "There is no change detected in this order proposal. Please submit at last one valid order"
917
937
  # )
918
938
  if len(service.validated_trades) == 0:
919
- errors_list.append(_("There is no valid order on this proposal"))
939
+ errors_list.append(gettext_lazy("There is no valid order on this proposal"))
920
940
  if service.errors:
921
941
  errors_list.extend(service.errors)
922
942
  if errors_list:
@@ -1043,22 +1063,26 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
1043
1063
  errors = dict()
1044
1064
  orders = self.get_orders()
1045
1065
  if not self.portfolio.can_be_rebalanced:
1046
- errors["non_field_errors"] = [_("The portfolio does not allow manual rebalanced")]
1066
+ errors["non_field_errors"] = [gettext_lazy("The portfolio does not allow manual rebalanced")]
1047
1067
  if not orders.exists():
1048
1068
  errors["non_field_errors"] = [
1049
- _("At least one order needs to be submitted to be able to apply this proposal")
1069
+ gettext_lazy("At least one order needs to be submitted to be able to apply this proposal")
1050
1070
  ]
1051
1071
  if not self.portfolio.can_be_rebalanced:
1052
1072
  errors["portfolio"] = [
1053
- [_("The portfolio needs to be a model portfolio in order to apply this order proposal manually")]
1073
+ [
1074
+ gettext_lazy(
1075
+ "The portfolio needs to be a model portfolio in order to apply this order proposal manually"
1076
+ )
1077
+ ]
1054
1078
  ]
1055
1079
  if self.has_non_successful_checks:
1056
- errors["non_field_errors"] = [_("The pre orders rules did not passed successfully")]
1080
+ errors["non_field_errors"] = [gettext_lazy("The pre orders rules did not passed successfully")]
1057
1081
  if orders.filter(has_warnings=True).filter(
1058
1082
  underlying_instrument__is_cash=False, underlying_instrument__is_cash_equivalent=False
1059
1083
  ):
1060
1084
  errors["non_field_errors"] = [
1061
- _("There is warning that needs to be addresses on the orders before approval.")
1085
+ gettext_lazy("There is warning that needs to be addresses on the orders before approval.")
1062
1086
  ]
1063
1087
  return errors
1064
1088
 
@@ -1122,7 +1146,9 @@ class OrderProposal(CloneMixin, RiskCheckMixin, WBModel):
1122
1146
  errors = dict()
1123
1147
  if not self.portfolio.can_be_rebalanced:
1124
1148
  errors["portfolio"] = [
1125
- _("The portfolio needs to be a model portfolio in order to revert this order proposal manually")
1149
+ gettext_lazy(
1150
+ "The portfolio needs to be a model portfolio in order to revert this order proposal manually"
1151
+ )
1126
1152
  ]
1127
1153
  return errors
1128
1154
 
@@ -1,3 +1,4 @@
1
+ from contextlib import suppress
1
2
  from datetime import date
2
3
  from decimal import Decimal
3
4
 
@@ -7,6 +8,7 @@ from django.db.models import (
7
8
  Sum,
8
9
  )
9
10
  from ordered_model.models import OrderedModel
11
+ from wbcore.contrib.currency.models import CurrencyFXRates
10
12
  from wbcore.contrib.io.mixins import ImportMixin
11
13
 
12
14
  from wbportfolio.import_export.handlers.orders import OrderImportHandler
@@ -137,12 +139,7 @@ class Order(TransactionMixin, ImportMixin, OrderedModel, models.Model):
137
139
  return getattr(
138
140
  self,
139
141
  "effective_shares",
140
- AssetPosition.objects.filter(
141
- underlying_quote=self.underlying_instrument,
142
- date=self.value_date,
143
- portfolio=self.portfolio,
144
- ).aggregate(s=Sum("shares"))["s"]
145
- or Decimal(0),
142
+ self.get_effective_shares(),
146
143
  )
147
144
 
148
145
  @property
@@ -164,6 +161,7 @@ class Order(TransactionMixin, ImportMixin, OrderedModel, models.Model):
164
161
  def pre_save(self):
165
162
  self.portfolio = self.order_proposal.portfolio
166
163
  self.value_date = self.order_proposal.trade_date
164
+ self.set_currency_fx_rate()
167
165
 
168
166
  if not self.price:
169
167
  # we try to get the price if not provided directly from the underlying instrument
@@ -171,7 +169,7 @@ class Order(TransactionMixin, ImportMixin, OrderedModel, models.Model):
171
169
  self.price = Decimal("1")
172
170
  else:
173
171
  self.price = self.get_price()
174
- if not self.portfolio.only_weighting:
172
+ if not self.portfolio.only_weighting and not self.shares:
175
173
  estimated_shares = self.order_proposal.get_estimated_shares(
176
174
  self.weighting, self.underlying_instrument, self.price
177
175
  )
@@ -211,9 +209,24 @@ class Order(TransactionMixin, ImportMixin, OrderedModel, models.Model):
211
209
  except ValueError:
212
210
  return Decimal("0")
213
211
 
212
+ def get_effective_shares(self) -> Decimal:
213
+ return AssetPosition.objects.filter(
214
+ underlying_quote=self.underlying_instrument,
215
+ date=self.value_date,
216
+ portfolio=self.portfolio,
217
+ ).aggregate(s=Sum("shares"))["s"] or Decimal("0")
218
+
214
219
  def set_type(self):
215
220
  self.order_type = self.get_type(self.weighting, self._previous_weight, self._target_weight)
216
221
 
222
+ def set_currency_fx_rate(self):
223
+ self.currency_fx_rate = Decimal("1")
224
+ if self.order_proposal.portfolio.currency != self.underlying_instrument.currency:
225
+ with suppress(CurrencyFXRates.DoesNotExist):
226
+ self.currency_fx_rate = self.underlying_instrument.currency.convert(
227
+ self.value_date, self.portfolio.currency, exact_lookup=True
228
+ )
229
+
217
230
  def set_weighting(self, weighting: Decimal, portfolio_value: Decimal):
218
231
  self.weighting = weighting
219
232
  price_fx_portfolio = self.price * self.currency_fx_rate
@@ -222,6 +235,8 @@ class Order(TransactionMixin, ImportMixin, OrderedModel, models.Model):
222
235
  self.shares = total_value / price_fx_portfolio
223
236
  else:
224
237
  self.shares = Decimal("0")
238
+ if effective_shares := self.get_effective_shares():
239
+ self.shares = max(self.shares, -effective_shares)
225
240
 
226
241
  def set_shares(self, shares: Decimal, portfolio_value: Decimal):
227
242
  if portfolio_value:
@@ -244,26 +259,27 @@ class Order(TransactionMixin, ImportMixin, OrderedModel, models.Model):
244
259
  warnings = []
245
260
 
246
261
  # if shares is defined and the underlying instrument defines a round lot size different than 1 and exchange allows its application, we round the share accordingly
247
- if self.order_proposal and not self.portfolio.only_weighting:
248
- shares = self.order_proposal.get_round_lot_size(self.shares, self.underlying_instrument)
249
- if shares != self.shares:
262
+ if self._target_weight:
263
+ if self.order_proposal and not self.portfolio.only_weighting:
264
+ shares = self.order_proposal.get_round_lot_size(self.shares, self.underlying_instrument)
265
+ if shares != self.shares:
266
+ warnings.append(
267
+ f"{self.underlying_instrument.computed_str} has a round lot size of {self.underlying_instrument.round_lot_size}: shares were rounded from {self.shares} to {shares}"
268
+ )
269
+ shares = round(shares) # ensure fractional shares are converted into integer
270
+ # we need to recompute the delta weight has we changed the number of shares
271
+ if shares != self.shares:
272
+ self.set_shares(shares, portfolio_total_asset_value)
273
+ if abs(self.weighting) < self.order_proposal.min_weighting:
250
274
  warnings.append(
251
- f"{self.underlying_instrument.computed_str} has a round lot size of {self.underlying_instrument.round_lot_size}: shares were rounded from {self.shares} to {shares}"
275
+ f"Weighting for order {self.underlying_instrument.computed_str} ({self.weighting}) is bellow the allowed Minimum Weighting ({self.order_proposal.min_weighting})"
252
276
  )
253
- shares = round(shares) # ensure fractional shares are converted into integer
254
- # we need to recompute the delta weight has we changed the number of shares
255
- if shares != self.shares:
256
- self.set_shares(shares, portfolio_total_asset_value)
257
- if abs(self.weighting) < self.order_proposal.min_weighting:
258
- warnings.append(
259
- f"Weighting for order {self.underlying_instrument.computed_str} ({self.weighting}) is bellow the allowed Minimum Weighting ({self.order_proposal.min_weighting})"
260
- )
261
- self.set_weighting(Decimal("0"), portfolio_total_asset_value)
262
- if self.shares and abs(self.total_value_fx_portfolio) < self.order_proposal.min_order_value:
263
- warnings.append(
264
- f"Total Value for order {self.underlying_instrument.computed_str} ({self.total_value_fx_portfolio}) is bellow the allowed Minimum Order Value ({self.order_proposal.min_order_value})"
265
- )
266
- self.set_weighting(Decimal("0"), portfolio_total_asset_value)
277
+ self.set_weighting(Decimal("0"), portfolio_total_asset_value)
278
+ if self.shares and abs(self.total_value_fx_portfolio) < self.order_proposal.min_order_value:
279
+ warnings.append(
280
+ f"Total Value for order {self.underlying_instrument.computed_str} ({self.total_value_fx_portfolio}) is bellow the allowed Minimum Order Value ({self.order_proposal.min_order_value})"
281
+ )
282
+ self.set_weighting(Decimal("0"), portfolio_total_asset_value)
267
283
  if not self.price:
268
284
  warnings.append(f"No price for {self.underlying_instrument.computed_str}")
269
285
  if (
@@ -160,7 +160,7 @@ class RuleBackend(
160
160
 
161
161
  def _process_dto(self, portfolio: PortfolioDTO, **kwargs) -> Generator[backend.IncidentResult, None, None]:
162
162
  if not (df := self._filter_df(portfolio.to_df())).empty:
163
- df = df[[self.group_by.value, self.field.value]].groupby(self.group_by.value).sum().astype(float)
163
+ df = df[[self.group_by.value, self.field.value]].dropna().groupby(self.group_by.value).sum().astype(float)
164
164
  for threshold in self.thresholds:
165
165
  numerical_range = threshold.numerical_range
166
166
  incident_df = df[
@@ -66,6 +66,7 @@ class OrderOrderProposalListModelSerializer(wb_serializers.ModelSerializer):
66
66
  total_value_fx_portfolio = wb_serializers.DecimalField(required=False, max_digits=16, decimal_places=2)
67
67
 
68
68
  portfolio_currency = wb_serializers.CharField(read_only=True)
69
+ underlying_instrument_currency = wb_serializers.CharField(read_only=True)
69
70
  has_warnings = wb_serializers.BooleanField(read_only=True)
70
71
 
71
72
  def validate(self, data):
@@ -131,7 +132,7 @@ class OrderOrderProposalListModelSerializer(wb_serializers.ModelSerializer):
131
132
 
132
133
  class Meta:
133
134
  model = Order
134
- percent_fields = ["effective_weight", "target_weight", "weighting"]
135
+ percent_fields = ["effective_weight", "target_weight", "weighting", "daily_return", "desired_target_weight"]
135
136
  decorators = {
136
137
  "total_value_fx_portfolio": wb_serializers.decorator(
137
138
  decorator_type="text", position="left", value="{{portfolio_currency}}"
@@ -142,12 +143,17 @@ class OrderOrderProposalListModelSerializer(wb_serializers.ModelSerializer):
142
143
  "target_total_value_fx_portfolio": wb_serializers.decorator(
143
144
  decorator_type="text", position="left", value="{{portfolio_currency}}"
144
145
  ),
146
+ "price": wb_serializers.decorator(position="left", value="{{underlying_instrument_currency}}"),
145
147
  }
146
148
  read_only_fields = (
147
149
  "order_type",
148
150
  "effective_shares",
149
151
  "effective_total_value_fx_portfolio",
150
152
  "has_warnings",
153
+ "desired_target_weight",
154
+ "daily_return",
155
+ "currency_fx_rate",
156
+ "price",
151
157
  )
152
158
  fields = (
153
159
  "id",
@@ -171,9 +177,14 @@ class OrderOrderProposalListModelSerializer(wb_serializers.ModelSerializer):
171
177
  "effective_total_value_fx_portfolio",
172
178
  "target_total_value_fx_portfolio",
173
179
  "portfolio_currency",
180
+ "underlying_instrument_currency",
174
181
  "has_warnings",
175
182
  "execution_confirmed",
176
183
  "execution_comment",
184
+ "desired_target_weight",
185
+ "daily_return",
186
+ "currency_fx_rate",
187
+ "price",
177
188
  )
178
189
 
179
190
 
@@ -157,7 +157,13 @@ class OrderOrderProposalDisplayConfig(DisplayViewConfig):
157
157
  formatting_rules=ORDER_TYPE_FORMATTING_RULES,
158
158
  width=Unit.PIXEL(125),
159
159
  ),
160
- dp.Field(key="comment", label="Comment", width=Unit.PIXEL(250)),
160
+ dp.Field(key="comment", label="Comment", show="open", width=Unit.PIXEL(250)),
161
+ dp.Field(
162
+ key="desired_target_weight", label="Desired Target Weight", show="open", width=Unit.PIXEL(100)
163
+ ),
164
+ dp.Field(key="daily_return", label="Daily Return", show="open", width=Unit.PIXEL(100)),
165
+ dp.Field(key="currency_fx_rate", label="FX Rate", show="open", width=Unit.PIXEL(100)),
166
+ dp.Field(key="price", label="Price", show="open", width=Unit.PIXEL(100)),
161
167
  dp.Field(key="order", label="Order", show="open", width=Unit.PIXEL(100)),
162
168
  ],
163
169
  )
@@ -2,7 +2,7 @@ from contextlib import suppress
2
2
  from datetime import date
3
3
  from decimal import Decimal
4
4
 
5
- from django.contrib.messages import info, warning
5
+ from django.contrib.messages import warning
6
6
  from django.shortcuts import get_object_or_404
7
7
  from django.utils.functional import cached_property
8
8
  from pandas._libs.tslibs.offsets import BDay
@@ -87,8 +87,6 @@ class OrderProposalModelViewSet(CloneMixin, RiskCheckViewSetMixin, InternalUserP
87
87
 
88
88
  def add_messages(self, request, instance: OrderProposal | None = None, **kwargs):
89
89
  if instance:
90
- if instance.status == OrderProposal.Status.APPROVED and not instance.portfolio.is_manageable:
91
- info(request, "This order proposal cannot be approved the portfolio is considered unmanaged.")
92
90
  if instance.status == OrderProposal.Status.PENDING and instance.has_non_successful_checks:
93
91
  warning(
94
92
  request,
@@ -235,6 +235,7 @@ class OrderOrderProposalModelViewSet(
235
235
  effective_total_value_fx_portfolio=F("effective_weight") * Value(self.portfolio_total_asset_value),
236
236
  target_total_value_fx_portfolio=F("target_weight") * Value(self.portfolio_total_asset_value),
237
237
  portfolio_currency=F("portfolio__currency__symbol"),
238
+ underlying_instrument_currency=F("underlying_instrument__currency__symbol"),
238
239
  security=F("underlying_instrument__parent"),
239
240
  company=F("underlying_instrument__parent__parent"),
240
241
  ).select_related(
File without changes
File without changes