wbportfolio 1.52.6__tar.gz → 1.59.11__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (607) hide show
  1. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/PKG-INFO +5 -6
  2. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/pyproject.toml +5 -5
  3. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/__init__.py +2 -0
  4. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/indexes.py +1 -1
  5. wbportfolio-1.59.11/wbportfolio/admin/orders/__init__.py +2 -0
  6. wbportfolio-1.59.11/wbportfolio/admin/orders/order_proposals.py +16 -0
  7. wbportfolio-1.59.11/wbportfolio/admin/orders/orders.py +32 -0
  8. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/portfolio.py +13 -6
  9. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/product_groups.py +1 -1
  10. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/products.py +2 -1
  11. {wbportfolio-1.52.6/wbportfolio/admin/transactions → wbportfolio-1.59.11/wbportfolio/admin}/rebalancing.py +1 -1
  12. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/transactions/__init__.py +0 -1
  13. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/transactions/trades.py +2 -17
  14. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/analysis/claims.py +5 -6
  15. wbportfolio-1.59.11/wbportfolio/api_clients/ubs.py +162 -0
  16. wbportfolio-1.59.11/wbportfolio/constants.py +1 -0
  17. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/configs/display.py +22 -10
  18. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/configs/previews.py +3 -3
  19. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/filters.py +10 -10
  20. {wbportfolio-1.52.6/wbportfolio/contrib/company_portfolio/tests → wbportfolio-1.59.11/wbportfolio/contrib/company_portfolio/migrations}/__init__.py +0 -0
  21. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/models.py +72 -42
  22. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/scripts.py +7 -2
  23. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/serializers.py +32 -22
  24. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/tasks.py +14 -2
  25. {wbportfolio-1.52.6/wbportfolio/defaults → wbportfolio-1.59.11/wbportfolio/contrib/company_portfolio/tests}/__init__.py +0 -0
  26. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/tests/conftest.py +2 -2
  27. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/__init__.py +2 -1
  28. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/assets.py +1 -1
  29. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/claim.py +1 -0
  30. wbportfolio-1.59.11/wbportfolio/factories/orders/__init__.py +2 -0
  31. wbportfolio-1.59.11/wbportfolio/factories/orders/order_proposals.py +21 -0
  32. wbportfolio-1.59.11/wbportfolio/factories/orders/orders.py +35 -0
  33. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/portfolios.py +3 -1
  34. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/product_groups.py +3 -3
  35. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/products.py +3 -3
  36. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/rebalancing.py +1 -1
  37. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/trades.py +2 -13
  38. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/assets.py +19 -5
  39. wbportfolio-1.59.11/wbportfolio/filters/orders/__init__.py +2 -0
  40. wbportfolio-1.59.11/wbportfolio/filters/orders/order_proposals.py +55 -0
  41. wbportfolio-1.59.11/wbportfolio/filters/orders/orders.py +11 -0
  42. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/performances.py +1 -1
  43. wbportfolio-1.59.11/wbportfolio/filters/portfolios.py +81 -0
  44. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/positions.py +1 -2
  45. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/transactions/claim.py +1 -1
  46. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/transactions/fees.py +1 -3
  47. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/transactions/trades.py +0 -1
  48. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/backends/ubs/__init__.py +1 -0
  49. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/backends/ubs/asset_position.py +6 -7
  50. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/backends/ubs/fees.py +10 -20
  51. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/backends/ubs/instrument_price.py +6 -6
  52. wbportfolio-1.59.11/wbportfolio/import_export/backends/ubs/trade.py +48 -0
  53. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/backends/utils.py +0 -17
  54. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/handlers/asset_position.py +22 -10
  55. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/handlers/dividend.py +1 -1
  56. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/handlers/fees.py +2 -2
  57. wbportfolio-1.59.11/wbportfolio/import_export/handlers/orders.py +71 -0
  58. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/handlers/trade.py +50 -72
  59. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/default_mapping.py +1 -1
  60. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/jpmorgan/customer_trade.py +2 -2
  61. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/jpmorgan/fees.py +2 -2
  62. wbportfolio-1.59.11/wbportfolio/import_export/parsers/jpmorgan/strategy.py +91 -0
  63. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/jpmorgan/valuation.py +2 -2
  64. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/leonteq/trade.py +2 -1
  65. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/natixis/equity.py +22 -4
  66. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/natixis/utils.py +13 -19
  67. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/equity.py +10 -10
  68. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/sylk.py +12 -11
  69. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/valuation.py +4 -2
  70. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/societe_generale/strategy.py +5 -5
  71. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/tellco/customer_trade.py +2 -1
  72. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/tellco/valuation.py +4 -3
  73. wbportfolio-1.59.11/wbportfolio/import_export/parsers/ubs/api/trade.py +39 -0
  74. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/ubs/customer_trade.py +7 -5
  75. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/ubs/equity.py +3 -2
  76. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/ubs/valuation.py +2 -1
  77. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/vontobel/valuation_api.py +4 -1
  78. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/resources/trades.py +3 -3
  79. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/utils.py +3 -1
  80. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/metric/backends/base.py +2 -2
  81. wbportfolio-1.59.11/wbportfolio/migrations/0078_trade_drift_factor.py +26 -0
  82. wbportfolio-1.59.11/wbportfolio/migrations/0079_alter_trade_drift_factor.py +19 -0
  83. wbportfolio-1.59.11/wbportfolio/migrations/0080_alter_trade_drift_factor_alter_trade_weighting.py +19 -0
  84. wbportfolio-1.59.11/wbportfolio/migrations/0081_alter_trade_drift_factor.py +19 -0
  85. wbportfolio-1.59.11/wbportfolio/migrations/0082_remove_tradeproposal_creator_and_more.py +93 -0
  86. wbportfolio-1.59.11/wbportfolio/migrations/0083_order_alter_trade_options_and_more.py +181 -0
  87. wbportfolio-1.59.11/wbportfolio/migrations/0084_orderproposal_min_order_value.py +25 -0
  88. wbportfolio-1.59.11/wbportfolio/migrations/0085_order_desired_target_weight.py +26 -0
  89. wbportfolio-1.59.11/wbportfolio/migrations/0086_orderproposal_total_cash_weight.py +19 -0
  90. wbportfolio-1.59.11/wbportfolio/migrations/0087_product_order_routing_custodian_adapter.py +94 -0
  91. wbportfolio-1.59.11/wbportfolio/migrations/0088_orderproposal_total_effective_portfolio_contribution.py +19 -0
  92. wbportfolio-1.59.11/wbportfolio/migrations/0089_orderproposal_min_weighting.py +71 -0
  93. wbportfolio-1.59.11/wbportfolio/migrations/0090_dividendtransaction_price_fx_portfolio_and_more.py +44 -0
  94. wbportfolio-1.59.11/wbportfolio/migrations/0091_remove_order_execution_confirmed_and_more.py +32 -0
  95. wbportfolio-1.59.11/wbportfolio/migrations/0092_order_quantization_error_alter_orderproposal_status.py +49 -0
  96. wbportfolio-1.59.11/wbportfolio/migrations/0093_remove_portfolioportfoliothroughmodel_unique_primary_and_more.py +35 -0
  97. wbportfolio-1.59.11/wbportfolio/migrations/0094_alter_portfolio_depends_on_and_more.py +24 -0
  98. wbportfolio-1.59.11/wbportfolio/migrations/0095_portfolio_keep_only_essential_positions.py +18 -0
  99. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/__init__.py +2 -0
  100. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/adjustments.py +5 -4
  101. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/asset.py +26 -170
  102. wbportfolio-1.59.11/wbportfolio/models/builder.py +342 -0
  103. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/custodians.py +3 -3
  104. wbportfolio-1.59.11/wbportfolio/models/exceptions.py +2 -0
  105. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/graphs/portfolio.py +1 -1
  106. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/graphs/utils.py +11 -11
  107. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/mixins/instruments.py +7 -0
  108. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/mixins/liquidity_stress_test.py +1 -1
  109. wbportfolio-1.59.11/wbportfolio/models/orders/__init__.py +2 -0
  110. wbportfolio-1.59.11/wbportfolio/models/orders/order_proposals.py +1419 -0
  111. wbportfolio-1.59.11/wbportfolio/models/orders/orders.py +410 -0
  112. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/portfolio.py +324 -297
  113. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/portfolio_relationship.py +6 -0
  114. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/portfolio_swing_pricings.py +1 -1
  115. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/products.py +14 -1
  116. {wbportfolio-1.52.6/wbportfolio/models/transactions → wbportfolio-1.59.11/wbportfolio/models}/rebalancing.py +42 -30
  117. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/roles.py +4 -10
  118. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/transactions/__init__.py +0 -2
  119. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/transactions/claim.py +6 -5
  120. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/transactions/dividends.py +1 -0
  121. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/transactions/fees.py +2 -1
  122. wbportfolio-1.59.11/wbportfolio/models/transactions/trades.py +438 -0
  123. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/transactions/transactions.py +23 -7
  124. wbportfolio-1.59.11/wbportfolio/models/utils.py +113 -0
  125. wbportfolio-1.59.11/wbportfolio/order_routing/__init__.py +35 -0
  126. wbportfolio-1.59.11/wbportfolio/order_routing/adapters/__init__.py +65 -0
  127. wbportfolio-1.59.11/wbportfolio/order_routing/adapters/ubs.py +195 -0
  128. wbportfolio-1.59.11/wbportfolio/order_routing/router.py +33 -0
  129. wbportfolio-1.59.11/wbportfolio/order_routing/tests/test_router.py +110 -0
  130. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/permissions.py +7 -0
  131. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/pms/analytics/portfolio.py +17 -9
  132. wbportfolio-1.59.11/wbportfolio/pms/analytics/utils.py +9 -0
  133. wbportfolio-1.59.11/wbportfolio/pms/trading/optimizer.py +61 -0
  134. wbportfolio-1.59.11/wbportfolio/pms/typing.py +315 -0
  135. {wbportfolio-1.52.6/wbportfolio/risk_management → wbportfolio-1.59.11/wbportfolio/rebalancing}/__init__.py +0 -0
  136. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/rebalancing/base.py +12 -1
  137. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/rebalancing/decorators.py +1 -1
  138. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/rebalancing/models/composite.py +4 -8
  139. wbportfolio-1.59.11/wbportfolio/rebalancing/models/equally_weighted.py +54 -0
  140. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/rebalancing/models/market_capitalization_weighted.py +21 -14
  141. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/rebalancing/models/model_portfolio.py +9 -10
  142. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/backends/__init__.py +1 -0
  143. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/backends/controversy_portfolio.py +2 -2
  144. wbportfolio-1.59.11/wbportfolio/risk_management/backends/esg_aggregation_portfolio.py +64 -0
  145. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/backends/exposure_portfolio.py +4 -4
  146. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/backends/instrument_list_portfolio.py +3 -3
  147. {wbportfolio-1.52.6/wbportfolio/tests/models → wbportfolio-1.59.11/wbportfolio/risk_management/tests}/__init__.py +0 -0
  148. wbportfolio-1.59.11/wbportfolio/risk_management/tests/test_esg_aggregation_portfolio.py +49 -0
  149. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/tests/test_exposure_portfolio.py +1 -1
  150. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/tests/test_stop_loss_instrument.py +2 -2
  151. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/tests/test_stop_loss_portfolio.py +1 -1
  152. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/__init__.py +1 -0
  153. wbportfolio-1.59.11/wbportfolio/serializers/orders/__init__.py +2 -0
  154. wbportfolio-1.59.11/wbportfolio/serializers/orders/order_proposals.py +111 -0
  155. wbportfolio-1.59.11/wbportfolio/serializers/orders/orders.py +283 -0
  156. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/portfolios.py +9 -8
  157. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/positions.py +2 -2
  158. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/product_group.py +2 -1
  159. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/rebalancing.py +1 -1
  160. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/transactions/__init__.py +1 -5
  161. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/transactions/claim.py +2 -2
  162. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/transactions/trades.py +1 -170
  163. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tasks.py +46 -7
  164. {wbportfolio-1.52.6/wbportfolio/tests/models/transactions → wbportfolio-1.59.11/wbportfolio/tests}/__init__.py +0 -0
  165. wbportfolio-1.59.11/wbportfolio/tests/analysis/test_claims.py +85 -0
  166. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/conftest.py +10 -4
  167. {wbportfolio-1.52.6/wbportfolio/tests/rebalancing → wbportfolio-1.59.11/wbportfolio/tests/models}/__init__.py +0 -0
  168. wbportfolio-1.59.11/wbportfolio/tests/models/orders/test_order_proposals.py +1046 -0
  169. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_imports.py +7 -6
  170. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_portfolios.py +102 -95
  171. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_products.py +11 -0
  172. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_splits.py +1 -6
  173. wbportfolio-1.59.11/wbportfolio/tests/models/test_utils.py +140 -0
  174. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/transactions/test_rebalancing.py +5 -5
  175. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/transactions/test_trades.py +0 -20
  176. wbportfolio-1.59.11/wbportfolio/tests/pms/test_analytics.py +54 -0
  177. wbportfolio-1.59.11/wbportfolio/tests/rebalancing/__init__.py +0 -0
  178. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/rebalancing/test_models.py +41 -41
  179. wbportfolio-1.59.11/wbportfolio/tests/serializers/__init__.py +0 -0
  180. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/signals.py +10 -20
  181. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/tests.py +3 -1
  182. wbportfolio-1.59.11/wbportfolio/tests/viewsets/__init__.py +0 -0
  183. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/viewsets/test_products.py +1 -0
  184. wbportfolio-1.59.11/wbportfolio/tests/viewsets/transactions/__init__.py +0 -0
  185. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/urls.py +7 -7
  186. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/__init__.py +9 -4
  187. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/assets.py +4 -203
  188. wbportfolio-1.59.11/wbportfolio/viewsets/charts/__init__.py +6 -0
  189. wbportfolio-1.59.11/wbportfolio/viewsets/charts/assets.py +437 -0
  190. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/buttons/__init__.py +2 -3
  191. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/buttons/assets.py +1 -1
  192. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/buttons/mixins.py +2 -2
  193. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/buttons/portfolios.py +45 -1
  194. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/buttons/products.py +32 -2
  195. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/buttons/trades.py +0 -8
  196. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/__init__.py +0 -2
  197. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/assets.py +6 -19
  198. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/portfolios.py +12 -6
  199. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/products.py +1 -1
  200. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/rebalancing.py +2 -2
  201. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/reconciliations.py +4 -4
  202. wbportfolio-1.59.11/wbportfolio/viewsets/configs/display/trades.py +226 -0
  203. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/__init__.py +0 -3
  204. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/trades.py +0 -41
  205. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/__init__.py +1 -0
  206. wbportfolio-1.59.11/wbportfolio/viewsets/configs/menu/orders.py +11 -0
  207. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/esg.py +4 -6
  208. wbportfolio-1.59.11/wbportfolio/viewsets/orders/__init__.py +6 -0
  209. wbportfolio-1.59.11/wbportfolio/viewsets/orders/configs/__init__.py +4 -0
  210. wbportfolio-1.59.11/wbportfolio/viewsets/orders/configs/buttons/__init__.py +2 -0
  211. wbportfolio-1.59.11/wbportfolio/viewsets/orders/configs/buttons/order_proposals.py +188 -0
  212. wbportfolio-1.59.11/wbportfolio/viewsets/orders/configs/buttons/orders.py +113 -0
  213. wbportfolio-1.59.11/wbportfolio/viewsets/orders/configs/displays/__init__.py +2 -0
  214. wbportfolio-1.59.11/wbportfolio/viewsets/orders/configs/displays/order_proposals.py +157 -0
  215. wbportfolio-1.59.11/wbportfolio/viewsets/orders/configs/displays/orders.py +232 -0
  216. wbportfolio-1.59.11/wbportfolio/viewsets/orders/configs/endpoints/__init__.py +2 -0
  217. wbportfolio-1.59.11/wbportfolio/viewsets/orders/configs/endpoints/order_proposals.py +21 -0
  218. wbportfolio-1.59.11/wbportfolio/viewsets/orders/configs/endpoints/orders.py +28 -0
  219. wbportfolio-1.59.11/wbportfolio/viewsets/orders/configs/titles/__init__.py +0 -0
  220. wbportfolio-1.59.11/wbportfolio/viewsets/orders/configs/titles/orders.py +0 -0
  221. wbportfolio-1.59.11/wbportfolio/viewsets/orders/order_proposals.py +252 -0
  222. wbportfolio-1.59.11/wbportfolio/viewsets/orders/orders.py +277 -0
  223. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/portfolios.py +37 -13
  224. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/positions.py +4 -3
  225. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/product_performance.py +1 -1
  226. {wbportfolio-1.52.6/wbportfolio/viewsets/transactions → wbportfolio-1.59.11/wbportfolio/viewsets}/rebalancing.py +2 -2
  227. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/transactions/__init__.py +1 -7
  228. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/transactions/claim.py +3 -3
  229. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/transactions/fees.py +1 -1
  230. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/transactions/trades.py +1 -188
  231. wbportfolio-1.52.6/wbportfolio/fdm/tasks.py +0 -13
  232. wbportfolio-1.52.6/wbportfolio/filters/portfolios.py +0 -44
  233. wbportfolio-1.52.6/wbportfolio/import_export/parsers/jpmorgan/strategy.py +0 -117
  234. wbportfolio-1.52.6/wbportfolio/models/exceptions.py +0 -2
  235. wbportfolio-1.52.6/wbportfolio/models/transactions/trade_proposals.py +0 -715
  236. wbportfolio-1.52.6/wbportfolio/models/transactions/trades.py +0 -828
  237. wbportfolio-1.52.6/wbportfolio/models/utils.py +0 -13
  238. wbportfolio-1.52.6/wbportfolio/pms/trading/__init__.py +0 -1
  239. wbportfolio-1.52.6/wbportfolio/pms/trading/handler.py +0 -142
  240. wbportfolio-1.52.6/wbportfolio/pms/typing.py +0 -198
  241. wbportfolio-1.52.6/wbportfolio/rebalancing/models/equally_weighted.py +0 -32
  242. wbportfolio-1.52.6/wbportfolio/serializers/transactions/trade_proposals.py +0 -93
  243. wbportfolio-1.52.6/wbportfolio/tests/models/transactions/test_trade_proposals.py +0 -414
  244. wbportfolio-1.52.6/wbportfolio/tests/pms/test_analytics.py +0 -35
  245. wbportfolio-1.52.6/wbportfolio/viewsets/charts/__init__.py +0 -1
  246. wbportfolio-1.52.6/wbportfolio/viewsets/charts/assets.py +0 -249
  247. wbportfolio-1.52.6/wbportfolio/viewsets/configs/buttons/trade_proposals.py +0 -74
  248. wbportfolio-1.52.6/wbportfolio/viewsets/configs/display/trade_proposals.py +0 -101
  249. wbportfolio-1.52.6/wbportfolio/viewsets/configs/display/trades.py +0 -450
  250. wbportfolio-1.52.6/wbportfolio/viewsets/configs/endpoints/trade_proposals.py +0 -18
  251. wbportfolio-1.52.6/wbportfolio/viewsets/signals.py +0 -43
  252. wbportfolio-1.52.6/wbportfolio/viewsets/transactions/trade_proposals.py +0 -142
  253. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/.gitignore +0 -0
  254. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/LICENSE +0 -0
  255. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/__init__.py +0 -0
  256. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/asset.py +0 -0
  257. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/custodians.py +0 -0
  258. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/portfolio_relationships.py +0 -0
  259. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/reconciliations.py +0 -0
  260. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/registers.py +0 -0
  261. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/roles.py +0 -0
  262. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/transactions/claim.py +0 -0
  263. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/transactions/dividends.py +0 -0
  264. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/admin/transactions/fees.py +0 -0
  265. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/analysis/__init__.py +0 -0
  266. {wbportfolio-1.52.6/wbportfolio/contrib → wbportfolio-1.59.11/wbportfolio/api_clients}/__init__.py +0 -0
  267. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/apps.py +0 -0
  268. {wbportfolio-1.52.6/wbportfolio/contrib/company_portfolio → wbportfolio-1.59.11/wbportfolio/contrib}/__init__.py +0 -0
  269. {wbportfolio-1.52.6/wbportfolio/contrib/company_portfolio/migrations → wbportfolio-1.59.11/wbportfolio/contrib/company_portfolio}/__init__.py +0 -0
  270. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/admin.py +0 -0
  271. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/apps.py +0 -0
  272. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/configs/__init__.py +0 -0
  273. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/configs/endpoints.py +0 -0
  274. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/constants.py +0 -0
  275. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/dynamic_preferences_registry.py +0 -0
  276. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/factories.py +0 -0
  277. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/management.py +0 -0
  278. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/migrations/0001_initial.py +0 -0
  279. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/tests/test_models.py +0 -0
  280. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/urls.py +0 -0
  281. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/contrib/company_portfolio/viewsets.py +0 -0
  282. {wbportfolio-1.52.6/wbportfolio/defaults/fees → wbportfolio-1.59.11/wbportfolio/defaults}/__init__.py +0 -0
  283. {wbportfolio-1.52.6/wbportfolio/fdm → wbportfolio-1.59.11/wbportfolio/defaults/fees}/__init__.py +0 -0
  284. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/defaults/fees/default.py +0 -0
  285. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/dynamic_preferences_registry.py +0 -0
  286. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/adjustments.py +0 -0
  287. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/custodians.py +0 -0
  288. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/dividends.py +0 -0
  289. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/fees.py +0 -0
  290. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/indexes.py +0 -0
  291. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/portfolio_cash_flow.py +0 -0
  292. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/portfolio_cash_targets.py +0 -0
  293. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/portfolio_swing_pricings.py +0 -0
  294. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/reconciliations.py +0 -0
  295. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/factories/roles.py +0 -0
  296. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/__init__.py +0 -0
  297. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/assets_and_net_new_money_progression.py +0 -0
  298. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/custodians.py +0 -0
  299. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/esg.py +0 -0
  300. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/products.py +0 -0
  301. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/roles.py +0 -0
  302. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/signals.py +0 -0
  303. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/transactions/__init__.py +0 -0
  304. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/transactions/mixins.py +0 -0
  305. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/filters/transactions/utils.py +0 -0
  306. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/fixtures/product_factsheets.yaml +0 -0
  307. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/fixtures/wbportfolio.yaml.gz +0 -0
  308. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/fixtures/wbrisk_management.yaml.gz +0 -0
  309. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/__init__.py +0 -0
  310. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/backends/__init__.py +0 -0
  311. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/backends/refinitiv/adjustment.py +0 -0
  312. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/backends/ubs/mixin.py +0 -0
  313. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/backends/wbfdm/__init__.py +0 -0
  314. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/backends/wbfdm/adjustment.py +0 -0
  315. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/backends/wbfdm/dividend.py +0 -0
  316. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/backends/wbfdm/mixin.py +0 -0
  317. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/handlers/__init__.py +0 -0
  318. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/handlers/adjustment.py +0 -0
  319. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/handlers/portfolio_cash_flow.py +0 -0
  320. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/handlers/register.py +0 -0
  321. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/__init__.py +0 -0
  322. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/jpmorgan/__init__.py +0 -0
  323. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/leonteq/__init__.py +0 -0
  324. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/leonteq/customer_trade.py +0 -0
  325. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/leonteq/equity.py +0 -0
  326. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/leonteq/fees.py +0 -0
  327. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/leonteq/valuation.py +0 -0
  328. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/natixis/__init__.py +0 -0
  329. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/natixis/customer_trade.py +0 -0
  330. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/natixis/d1_customer_trade.py +0 -0
  331. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/natixis/d1_equity.py +0 -0
  332. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/natixis/d1_fees.py +0 -0
  333. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/natixis/d1_trade.py +0 -0
  334. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/natixis/d1_valuation.py +0 -0
  335. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/natixis/dividend.py +0 -0
  336. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/natixis/fees.py +0 -0
  337. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/natixis/trade.py +0 -0
  338. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/natixis/valuation.py +0 -0
  339. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/refinitiv/__init__.py +0 -0
  340. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/refinitiv/adjustment.py +0 -0
  341. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/__init__.py +0 -0
  342. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/custodian_positions.py +0 -0
  343. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/customer_trade.py +0 -0
  344. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/customer_trade_pending_slk.py +0 -0
  345. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/customer_trade_slk.py +0 -0
  346. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/customer_trade_without_pw.py +0 -0
  347. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/fees.py +0 -0
  348. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/perf_fees.py +0 -0
  349. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/portfolio_cash_flow.py +0 -0
  350. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/portfolio_future_cash_flow.py +0 -0
  351. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/registers.py +0 -0
  352. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/sg_lux/utils.py +0 -0
  353. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/societe_generale/__init__.py +0 -0
  354. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/societe_generale/customer_trade.py +0 -0
  355. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/societe_generale/valuation.py +0 -0
  356. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/tellco/__init__.py +0 -0
  357. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/tellco/equity.py +0 -0
  358. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/ubs/__init__.py +0 -0
  359. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/ubs/api/__init__.py +0 -0
  360. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/ubs/api/asset_position.py +0 -0
  361. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/ubs/api/fees.py +0 -0
  362. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/ubs/api/instrument_price.py +0 -0
  363. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/ubs/api/utils.py +0 -0
  364. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/ubs/historical_customer_trade.py +0 -0
  365. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/vontobel/__init__.py +0 -0
  366. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/vontobel/asset_position.py +0 -0
  367. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/vontobel/customer_trade.py +0 -0
  368. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/vontobel/historical_customer_trade.py +0 -0
  369. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/vontobel/instrument.py +0 -0
  370. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/vontobel/management_fees.py +0 -0
  371. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/vontobel/performance_fees.py +0 -0
  372. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/vontobel/trade.py +0 -0
  373. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/vontobel/utils.py +0 -0
  374. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/parsers/vontobel/valuation.py +0 -0
  375. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/resources/__init__.py +0 -0
  376. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/import_export/resources/assets.py +0 -0
  377. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/jinja2/wbportfolio/sql/aum_nnm.sql +0 -0
  378. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/kpi_handlers/nnm.py +0 -0
  379. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/locale/de/LC_MESSAGES/django.mo +0 -0
  380. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/locale/de/LC_MESSAGES/django.po +0 -0
  381. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/locale/en/LC_MESSAGES/django.mo +0 -0
  382. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/locale/en/LC_MESSAGES/django.po +0 -0
  383. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/locale/fr/LC_MESSAGES/django.mo +0 -0
  384. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/locale/fr/LC_MESSAGES/django.po +0 -0
  385. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/metric/__init__.py +0 -0
  386. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/metric/backends/__init__.py +0 -0
  387. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/metric/backends/constants.py +0 -0
  388. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/metric/backends/portfolio_base.py +0 -0
  389. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/metric/backends/portfolio_esg.py +0 -0
  390. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/metric/tests/__init__.py +0 -0
  391. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/metric/tests/conftest.py +0 -0
  392. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/metric/tests/test_portfolio_base.py +0 -0
  393. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/metric/tests/test_portfolio_esg.py +0 -0
  394. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0001_initial_squashed.py +0 -0
  395. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0002_product_default_sub_account_squashed_0039_alter_assetallocation_company_and_more.py +0 -0
  396. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0040_instrument_financial_instrument.py +0 -0
  397. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0041_remove_listresearch_research_ptr_and_more.py +0 -0
  398. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0042_instrumentlist_instrumentlistthroughmodel_and_more.py +0 -0
  399. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0043_alter_instrumentlistthroughmodel_options_and_more.py +0 -0
  400. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0044_alter_instrumentlist_identifier.py +0 -0
  401. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0045_alter_instrument_financial_instrument.py +0 -0
  402. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0046_add_product_default_account.py +0 -0
  403. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0047_remove_product_default_sub_account.py +0 -0
  404. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0048_alter_trade_status.py +0 -0
  405. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0049_trade_claimed_shares.py +0 -0
  406. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0050_fees_fee_date_fees_wbportfolio_transac_1f7a29_idx.py +0 -0
  407. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0051_delete_macroreview.py +0 -0
  408. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0052_remove_cash_instrument_ptr_and_more.py +0 -0
  409. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0053_remove_product_group.py +0 -0
  410. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0054_portfolioinstrumentpreferredclassificationthroughmodel_and_more.py +0 -0
  411. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0055_remove_product__custom_management_rebates_and_more.py +0 -0
  412. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0056_remove_companyportfoliodata_assets_under_management_currency_and_more.py +0 -0
  413. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0057_alter_portfolio_preferred_instrument_classifications_and_more.py +0 -0
  414. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0058_pmsinstrument.py +0 -0
  415. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0059_fees_unique_fees.py +0 -0
  416. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0060_alter_portfolioportfoliothroughmodel_type.py +0 -0
  417. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0061_portfolio_bank_accounts_product_bank_account_and_more.py +0 -0
  418. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0062_alter_dailyportfoliocashflow_options.py +0 -0
  419. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0063_accountreconciliation_accountreconciliationline_and_more.py +0 -0
  420. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0064_alter_portfolio_managers_portfolio_is_tracked_and_more.py +0 -0
  421. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0065_alter_portfolio_managers_claim_as_shares_and_more.py +0 -0
  422. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0066_assetposition_initial_shares_at_custodian_and_more.py +0 -0
  423. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0067_assetposition_unique_asset_position.py +0 -0
  424. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0068_trade_internal_trade_trade_marked_as_internal_and_more.py +0 -0
  425. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0069_remove_portfolio_is_invested_and_more.py +0 -0
  426. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0070_remove_assetposition_unique_asset_position_and_more.py +0 -0
  427. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0071_alter_trade_options_alter_trade_order.py +0 -0
  428. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0072_trade_diff_shares.py +0 -0
  429. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0073_remove_product_price_computation_and_more.py +0 -0
  430. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0074_alter_rebalancer_frequency_and_more.py +0 -0
  431. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0075_portfolio_initial_position_date_and_more.py +0 -0
  432. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0076_alter_dividendtransaction_price_and_more.py +0 -0
  433. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/0077_remove_transaction_currency_and_more.py +0 -0
  434. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/migrations/__init__.py +0 -0
  435. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/graphs/__init__.py +0 -0
  436. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/indexes.py +0 -0
  437. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/llm/wbcrm/analyze_relationship.py +0 -0
  438. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/mixins/__init__.py +0 -0
  439. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/portfolio_cash_flow.py +0 -0
  440. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/portfolio_cash_targets.py +0 -0
  441. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/product_groups.py +0 -0
  442. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/reconciliations/__init__.py +0 -0
  443. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/reconciliations/account_reconciliation_lines.py +0 -0
  444. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/reconciliations/account_reconciliations.py +0 -0
  445. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/reconciliations/reconciliations.py +0 -0
  446. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/registers.py +0 -0
  447. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/models/signals.py +0 -0
  448. {wbportfolio-1.52.6/wbportfolio/pms → wbportfolio-1.59.11/wbportfolio/order_routing/tests}/__init__.py +0 -0
  449. {wbportfolio-1.52.6/wbportfolio/pms/analytics → wbportfolio-1.59.11/wbportfolio/pms}/__init__.py +0 -0
  450. {wbportfolio-1.52.6/wbportfolio/pms/statistics → wbportfolio-1.59.11/wbportfolio/pms/analytics}/__init__.py +0 -0
  451. {wbportfolio-1.52.6/wbportfolio/rebalancing → wbportfolio-1.59.11/wbportfolio/pms/statistics}/__init__.py +0 -0
  452. {wbportfolio-1.52.6/wbportfolio/reports → wbportfolio-1.59.11/wbportfolio/pms/trading}/__init__.py +0 -0
  453. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/preferences.py +0 -0
  454. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/rebalancing/models/__init__.py +0 -0
  455. {wbportfolio-1.52.6/wbportfolio/risk_management/tests → wbportfolio-1.59.11/wbportfolio/reports}/__init__.py +0 -0
  456. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/reports/monthly_position_report.py +0 -0
  457. {wbportfolio-1.52.6/wbportfolio/tests → wbportfolio-1.59.11/wbportfolio/risk_management}/__init__.py +0 -0
  458. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/backends/accounts.py +0 -0
  459. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/backends/liquidity_risk.py +0 -0
  460. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/backends/liquidity_stress_instrument.py +0 -0
  461. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/backends/mixins.py +0 -0
  462. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/backends/product_integrity.py +0 -0
  463. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/backends/stop_loss_instrument.py +0 -0
  464. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/backends/stop_loss_portfolio.py +0 -0
  465. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/backends/ucits_portfolio.py +0 -0
  466. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/tests/conftest.py +0 -0
  467. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/tests/test_accounts.py +0 -0
  468. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/tests/test_controversy_portfolio.py +0 -0
  469. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/tests/test_instrument_list_portfolio.py +0 -0
  470. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/tests/test_liquidity_risk.py +0 -0
  471. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/tests/test_product_integrity.py +0 -0
  472. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/risk_management/tests/test_ucits_portfolio.py +0 -0
  473. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/adjustments.py +0 -0
  474. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/assets.py +0 -0
  475. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/custodians.py +0 -0
  476. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/portfolio_cash_flow.py +0 -0
  477. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/portfolio_cash_targets.py +0 -0
  478. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/portfolio_relationship.py +0 -0
  479. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/portfolio_swing_pricing.py +0 -0
  480. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/products.py +0 -0
  481. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/reconciliations.py +0 -0
  482. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/registers.py +0 -0
  483. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/roles.py +0 -0
  484. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/signals.py +0 -0
  485. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/transactions/dividends.py +0 -0
  486. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/serializers/transactions/fees.py +0 -0
  487. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/static/wbportfolio/css/macro_review.css +0 -0
  488. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/static/wbportfolio/markdown/documentation/account_holding_reconciliation.md +0 -0
  489. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/static/wbportfolio/markdown/documentation/aggregate_asset_position_liquidity.md +0 -0
  490. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/static/wbportfolio/markdown/documentation/company.md +0 -0
  491. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/static/wbportfolio/markdown/documentation/earnings_instrument.md +0 -0
  492. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/static/wbportfolio/markdown/documentation/financial_analysis_instrument_ratios.md +0 -0
  493. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/static/wbportfolio/markdown/documentation/financial_statistics.md +0 -0
  494. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/static/wbportfolio/markdown/documentation/person.md +0 -0
  495. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/templates/portfolio/email/customer_report.html +0 -0
  496. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/templates/portfolio/email/customer_trade_notification.html +0 -0
  497. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/templates/portfolio/email/email_base_template.html +0 -0
  498. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/templates/portfolio/email/rebalancing_report.html +0 -0
  499. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/templates/portfolio/macro/macro_review.html +0 -0
  500. {wbportfolio-1.52.6/wbportfolio/tests/pms → wbportfolio-1.59.11/wbportfolio/tests/analysis}/__init__.py +0 -0
  501. {wbportfolio-1.52.6/wbportfolio/tests/serializers → wbportfolio-1.59.11/wbportfolio/tests/models/orders}/__init__.py +0 -0
  502. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_account_reconciliation.py +0 -0
  503. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_assets.py +0 -0
  504. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_custodians.py +0 -0
  505. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_customer_trades.py +0 -0
  506. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_dividends.py +0 -0
  507. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_instrument_mixins.py +0 -0
  508. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_merge.py +0 -0
  509. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_portfolio_cash_flow.py +0 -0
  510. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_portfolio_cash_targets.py +0 -0
  511. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_portfolio_swing_pricings.py +0 -0
  512. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_product_groups.py +0 -0
  513. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/test_roles.py +0 -0
  514. {wbportfolio-1.52.6/wbportfolio/tests/viewsets → wbportfolio-1.59.11/wbportfolio/tests/models/transactions}/__init__.py +0 -0
  515. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/transactions/test_claim.py +0 -0
  516. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/transactions/test_fees.py +0 -0
  517. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/models/utils.py +0 -0
  518. {wbportfolio-1.52.6/wbportfolio/tests/viewsets/transactions → wbportfolio-1.59.11/wbportfolio/tests/pms}/__init__.py +0 -0
  519. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/serializers/test_claims.py +0 -0
  520. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/viewsets/test_assets.py +0 -0
  521. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/viewsets/test_performances.py +0 -0
  522. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/tests/viewsets/transactions/test_claims.py +0 -0
  523. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/utils.py +0 -0
  524. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/adjustments.py +0 -0
  525. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/assets_and_net_new_money_progression.py +0 -0
  526. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/__init__.py +0 -0
  527. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/buttons/adjustments.py +0 -0
  528. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/buttons/claims.py +0 -0
  529. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/buttons/custodians.py +0 -0
  530. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/buttons/fees.py +0 -0
  531. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/buttons/reconciliations.py +0 -0
  532. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/buttons/registers.py +0 -0
  533. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/buttons/signals.py +0 -0
  534. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/adjustments.py +0 -0
  535. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/claim.py +0 -0
  536. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/custodians.py +0 -0
  537. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/esg.py +0 -0
  538. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/fees.py +0 -0
  539. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/portfolio_cash_flow.py +0 -0
  540. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/portfolio_relationship.py +0 -0
  541. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/positions.py +0 -0
  542. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/product_groups.py +0 -0
  543. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/product_performance.py +0 -0
  544. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/registers.py +0 -0
  545. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/display/roles.py +0 -0
  546. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/adjustments.py +0 -0
  547. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/assets.py +0 -0
  548. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/claim.py +0 -0
  549. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/custodians.py +0 -0
  550. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/esg.py +0 -0
  551. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/fees.py +0 -0
  552. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/portfolio_relationship.py +0 -0
  553. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/portfolios.py +0 -0
  554. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/positions.py +0 -0
  555. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/product_groups.py +0 -0
  556. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/product_performance.py +0 -0
  557. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/products.py +0 -0
  558. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/rebalancing.py +0 -0
  559. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/reconciliations.py +0 -0
  560. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/endpoints/roles.py +0 -0
  561. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/adjustments.py +0 -0
  562. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/assets.py +0 -0
  563. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/claim.py +0 -0
  564. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/custodians.py +0 -0
  565. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/fees.py +0 -0
  566. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/instrument_prices.py +0 -0
  567. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/portfolio_cash_flow.py +0 -0
  568. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/portfolios.py +0 -0
  569. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/positions.py +0 -0
  570. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/product_groups.py +0 -0
  571. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/product_performance.py +0 -0
  572. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/products.py +0 -0
  573. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/reconciliations.py +0 -0
  574. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/registers.py +0 -0
  575. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/roles.py +0 -0
  576. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/menu/trades.py +0 -0
  577. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/previews/__init__.py +0 -0
  578. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/previews/portfolios.py +0 -0
  579. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/__init__.py +0 -0
  580. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/adjustments.py +0 -0
  581. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/assets.py +0 -0
  582. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/assets_and_net_new_money_progression.py +0 -0
  583. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/claim.py +0 -0
  584. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/custodians.py +0 -0
  585. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/esg.py +0 -0
  586. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/fees.py +0 -0
  587. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/instrument_prices.py +0 -0
  588. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/portfolios.py +0 -0
  589. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/positions.py +0 -0
  590. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/product_groups.py +0 -0
  591. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/product_performance.py +0 -0
  592. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/products.py +0 -0
  593. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/registers.py +0 -0
  594. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/roles.py +0 -0
  595. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/configs/titles/trades.py +0 -0
  596. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/custodians.py +0 -0
  597. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/mixins.py +0 -0
  598. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/portfolio_cash_flow.py +0 -0
  599. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/portfolio_cash_targets.py +0 -0
  600. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/portfolio_relationship.py +0 -0
  601. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/portfolio_swing_pricing.py +0 -0
  602. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/product_groups.py +0 -0
  603. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/products.py +0 -0
  604. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/reconciliations.py +0 -0
  605. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/registers.py +0 -0
  606. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/roles.py +0 -0
  607. {wbportfolio-1.52.6 → wbportfolio-1.59.11}/wbportfolio/viewsets/transactions/mixins.py +0 -0
@@ -1,24 +1,23 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbportfolio
3
- Version: 1.52.6
3
+ Version: 1.59.11
4
4
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
5
5
  License-File: LICENSE
6
- Requires-Dist: cryptography==3.4.*
7
6
  Requires-Dist: dateparser==1.*
8
- Requires-Dist: django-storages==1.14.*
9
7
  Requires-Dist: fuzzywuzzy==0.*
10
8
  Requires-Dist: jinjasql2==0.1.*
11
- Requires-Dist: msoffcrypto-tool==4.10.*
9
+ Requires-Dist: msoffcrypto-tool==5.4.*
12
10
  Requires-Dist: networkx>=3.4.2
13
11
  Requires-Dist: pydot>=3.0.4
14
12
  Requires-Dist: python-levenshtein==0.*
15
- Requires-Dist: reportlab==3.*
16
13
  Requires-Dist: scipy>=1
17
- Requires-Dist: skfolio==0.6.*
14
+ Requires-Dist: skfolio==0.*
18
15
  Requires-Dist: wbcompliance
19
16
  Requires-Dist: wbcore
20
17
  Requires-Dist: wbcrm
21
18
  Requires-Dist: wbfdm
19
+ Requires-Dist: wbmailing
22
20
  Requires-Dist: wbnews
21
+ Requires-Dist: wbreport
23
22
  Requires-Dist: xlrd==2.*
24
23
  Requires-Dist: xlsxwriter==3.*
@@ -10,21 +10,21 @@ dependencies = [
10
10
  "wbfdm",
11
11
  "wbcompliance",
12
12
  "wbnews",
13
- "cryptography == 3.4.*",
13
+ "wbreport",
14
+ "wbmailing",
15
+
14
16
  # Reporting Tools
15
17
  "xlrd == 2.*",
16
18
  "XlsxWriter == 3.*",
17
19
  # MS Office Crypto Tools
18
- "msoffcrypto-tool == 4.10.*",
20
+ "msoffcrypto-tool == 5.4.*",
19
21
  # String pattern matching
20
22
  "dateparser == 1.*",
21
23
  "scipy >= 1",
22
24
  "fuzzywuzzy == 0.*",
23
25
  "python-Levenshtein == 0.*",
24
- "reportlab == 3.*",
25
- "django-storages == 1.14.*", # handling silk file is dependant of the django storage version. Version 1.14.* drops support for django 4
26
26
  "jinjasql2 == 0.1.*",
27
- "skfolio == 0.6.*",
27
+ "skfolio == 0.*",
28
28
  "pydot>=3.0.4",
29
29
  "networkx>=3.4.2",
30
30
  ]
@@ -10,3 +10,5 @@ from .registers import RegisterModelAdmin
10
10
  from .roles import PortfolioRoleAdmin
11
11
  from .transactions import DividendAdmin, FeesAdmin, TradeAdmin
12
12
  from .reconciliations import AccountReconciliationAdmin
13
+ from .orders import OrderProposalAdmin
14
+ from .rebalancing import RebalancingModelAdmin, RebalancerAdmin
@@ -10,6 +10,6 @@ class IndexAdmin(InstrumentModelAdmin):
10
10
  ("Instrument Information", InstrumentModelAdmin.fieldsets[0][1]),
11
11
  (
12
12
  "Index Information",
13
- {"fields": (("net_asset_value_computation_method_path",),)},
13
+ {"fields": (("net_asset_value_computation_method_path", "order_routing_custodian_adapter"),)},
14
14
  ),
15
15
  )
@@ -0,0 +1,2 @@
1
+ from .orders import OrderTabularInline
2
+ from .order_proposals import OrderProposalAdmin
@@ -0,0 +1,16 @@
1
+ from django.contrib import admin
2
+
3
+ from wbportfolio.models import OrderProposal
4
+
5
+ from .orders import OrderTabularInline
6
+
7
+
8
+ @admin.register(OrderProposal)
9
+ class OrderProposalAdmin(admin.ModelAdmin):
10
+ search_fields = ["portfolio__name", "comment"]
11
+
12
+ list_display = ("portfolio", "rebalancing_model", "trade_date", "status")
13
+ autocomplete_fields = ["portfolio", "rebalancing_model"]
14
+ inlines = [OrderTabularInline]
15
+
16
+ raw_id_fields = ["portfolio", "creator", "approver"]
@@ -0,0 +1,32 @@
1
+ from django.contrib import admin
2
+
3
+ from wbportfolio.models.orders import Order
4
+
5
+
6
+ class OrderTabularInline(admin.TabularInline):
7
+ model = Order
8
+ fk_name = "order_proposal"
9
+
10
+ readonly_fields = [
11
+ "_effective_weight",
12
+ "_target_weight",
13
+ "_effective_shares",
14
+ "_target_shares",
15
+ "total_value",
16
+ "total_value_gross",
17
+ "total_value_fx_portfolio",
18
+ "total_value_gross_fx_portfolio",
19
+ "created",
20
+ "updated",
21
+ ]
22
+
23
+ fields = [
24
+ "underlying_instrument",
25
+ "_effective_weight",
26
+ "_target_weight",
27
+ "weighting",
28
+ "shares",
29
+ "daily_return",
30
+ ]
31
+
32
+ raw_id_fields = ["underlying_instrument"]
@@ -10,10 +10,6 @@ from wbportfolio.models import (
10
10
  PortfolioSwingPricing,
11
11
  )
12
12
 
13
- from .portfolio_relationships import (
14
- PortfolioInstrumentPreferredClassificationThroughInlineModelAdmin,
15
- )
16
-
17
13
 
18
14
  @admin.register(PortfolioBankAccountThroughModel)
19
15
  class PortfolioBankAccountThroughModelModelAdmin(admin.ModelAdmin):
@@ -60,7 +56,17 @@ class PortfolioModelAdmin(admin.ModelAdmin):
60
56
  "is_manageable",
61
57
  "is_active",
62
58
  ),
63
- ("is_tracked", "only_weighting", "is_lookthrough"),
59
+ ("is_tracked", "only_keep_essential_positions", "only_weighting", "is_lookthrough"),
60
+ )
61
+ },
62
+ ),
63
+ (
64
+ "OMS",
65
+ {
66
+ "fields": (
67
+ "default_order_proposal_min_order_value",
68
+ "default_order_proposal_min_weighting",
69
+ "default_order_proposal_total_cash_weight",
64
70
  )
65
71
  },
66
72
  ),
@@ -73,12 +79,13 @@ class PortfolioModelAdmin(admin.ModelAdmin):
73
79
  "hedged_currency",
74
80
  "is_manageable",
75
81
  "is_tracked",
82
+ "only_keep_essential_positions",
76
83
  "is_lookthrough",
77
84
  )
78
85
  inlines = [
79
86
  PortfolioBankAccountThroughModelAdmin,
80
87
  InstrumentPortfolioThroughModelAdmin,
81
- PortfolioInstrumentPreferredClassificationThroughInlineModelAdmin,
88
+ # PortfolioInstrumentPreferredClassificationThroughInlineModelAdmin,
82
89
  PortfolioPortfolioThroughModelInlineAdmin,
83
90
  ]
84
91
  raw_id_fields = [
@@ -30,7 +30,7 @@ class ProductGroupAdmin(InstrumentModelAdmin):
30
30
  ("type", "category", "umbrella"),
31
31
  ("management_company", "depositary", "transfer_agent", "administrator"),
32
32
  ("investment_manager", "auditor", "paying_agent"),
33
- ("net_asset_value_computation_method_path", "risk_scale"),
33
+ ("net_asset_value_computation_method_path", "order_routing_custodian_adapter", "risk_scale"),
34
34
  )
35
35
  },
36
36
  ),
@@ -37,7 +37,7 @@ class ProductAdmin(InstrumentModelAdmin):
37
37
  {
38
38
  "fields": (
39
39
  ("share_price", "initial_high_water_mark", "bank"),
40
- ("termsheet", "fee_calculation", "net_asset_value_computation_method_path"),
40
+ ("fee_calculation", "net_asset_value_computation_method_path", "order_routing_custodian_adapter"),
41
41
  (
42
42
  "white_label_customers",
43
43
  "default_account",
@@ -55,6 +55,7 @@ class ProductAdmin(InstrumentModelAdmin):
55
55
  (
56
56
  "jurisdiction",
57
57
  "dividend",
58
+ "termsheet",
58
59
  ),
59
60
  ("external_webpage", "minimum_subscription", "cut_off_time"),
60
61
  )
@@ -20,7 +20,7 @@ class RebalancerAdmin(admin.ModelAdmin):
20
20
  "rebalancing_model",
21
21
  "portfolio",
22
22
  "parameters",
23
- "approve_trade_proposal_automatically",
23
+ "apply_order_proposal_automatically",
24
24
  "activation_date",
25
25
  "frequency",
26
26
  )
@@ -2,4 +2,3 @@ from .claim import ClaimModelAdmin
2
2
  from .dividends import DividendAdmin
3
3
  from .fees import FeesAdmin
4
4
  from .trades import TradeAdmin
5
- from .rebalancing import RebalancingModelAdmin, RebalancerAdmin
@@ -1,6 +1,6 @@
1
1
  from django.contrib import admin
2
2
 
3
- from wbportfolio.models import Trade, TradeProposal
3
+ from wbportfolio.models import Trade
4
4
 
5
5
 
6
6
  @admin.register(Trade)
@@ -8,7 +8,6 @@ class TradeAdmin(admin.ModelAdmin):
8
8
  search_fields = ["portfolio__name", "underlying_instrument__computed_str", "bank"]
9
9
  list_filter = ("portfolio", "pending")
10
10
  list_display = (
11
- "status",
12
11
  "transaction_subtype",
13
12
  "transaction_date",
14
13
  "underlying_instrument",
@@ -23,10 +22,6 @@ class TradeAdmin(admin.ModelAdmin):
23
22
  )
24
23
 
25
24
  readonly_fields = [
26
- "_effective_weight",
27
- "_target_weight",
28
- "_effective_shares",
29
- "_target_shares",
30
25
  "total_value",
31
26
  "total_value_gross",
32
27
  "total_value_fx_portfolio",
@@ -39,7 +34,7 @@ class TradeAdmin(admin.ModelAdmin):
39
34
  "Transaction Information",
40
35
  {
41
36
  "fields": (
42
- ("transaction_subtype", "status"),
37
+ ("transaction_subtype",),
43
38
  ("pending", "marked_for_deletion", "exclude_from_history"),
44
39
  (
45
40
  "portfolio",
@@ -50,8 +45,6 @@ class TradeAdmin(admin.ModelAdmin):
50
45
  ("price", "currency", "currency_fx_rate"),
51
46
  ("total_value", "total_value_gross"),
52
47
  ("total_value_fx_portfolio", "total_value_gross_fx_portfolio"),
53
- ("_effective_weight", "_target_weight", "weighting"),
54
- ("_effective_shares", "_target_shares", "shares"),
55
48
  ("register", "custodian", "bank", "external_id", "external_id_alternative"),
56
49
  ("created", "updated"),
57
50
  ("comment",),
@@ -62,11 +55,3 @@ class TradeAdmin(admin.ModelAdmin):
62
55
  autocomplete_fields = ["portfolio", "underlying_instrument", "currency", "register", "custodian"]
63
56
  ordering = ("-transaction_date",)
64
57
  raw_id_fields = ["import_source", "underlying_instrument", "portfolio", "register", "custodian"]
65
-
66
-
67
- @admin.register(TradeProposal)
68
- class TradeProposalAdmin(admin.ModelAdmin):
69
- search_fields = ["portfolio__name", "comment"]
70
-
71
- list_display = ("portfolio", "rebalancing_model", "trade_date", "status")
72
- autocomplete_fields = ["portfolio", "rebalancing_model"]
@@ -58,13 +58,12 @@ class ConsolidatedTradeSummary:
58
58
  self.pivot_label = pivot_label
59
59
  self.queryset = self.queryset.annotate(
60
60
  internal_trade=F("trade__marked_as_internal"),
61
- date_considered=ExpressionWrapper(
62
- Greatest("trade__transaction_date", "date") + 1, output_field=DateField()
63
- ),
61
+ valid_date=Greatest("trade__transaction_date", "date"),
62
+ date_considered=ExpressionWrapper(F("valid_date") + 1, output_field=DateField()),
64
63
  net_value=InstrumentPrice.subquery_closest_value(
65
- "net_value", date_name="date_considered", instrument_pk_name="product__pk", date_lookup="exact"
64
+ "net_value", date_name="valid_date", instrument_pk_name="product__pk", date_lookup="exact"
66
65
  ),
67
- fx_rate=CurrencyFXRates.get_fx_rates_subquery("date_considered", lookup_expr="exact"),
66
+ fx_rate=CurrencyFXRates.get_fx_rates_subquery("valid_date", lookup_expr="exact"),
68
67
  aum=ExpressionWrapper(F("fx_rate") * F("net_value") * F("shares"), output_field=DecimalField()),
69
68
  )
70
69
  self.queryset = Account.annotate_root_account_info(self.queryset)
@@ -158,8 +157,8 @@ class ConsolidatedTradeSummary:
158
157
  df = df.fillna(0)
159
158
  # Prepare dataframe
160
159
  df["sum_aum_start"] = df.sum_shares_start * df.price_start
161
- df["sum_aum_end"] = df.sum_shares_end * df.price_end
162
160
 
161
+ df["sum_aum_end"] = df.sum_shares_end * df.price_end
163
162
  # Sanitize dataframe
164
163
  df = df.drop(
165
164
  columns=df.columns.difference(["id", "sum_shares_start", "sum_shares_end", "sum_aum_start", "sum_aum_end"])
@@ -0,0 +1,162 @@
1
+ from datetime import date, datetime, timedelta
2
+ from json import JSONDecodeError
3
+
4
+ import requests
5
+ from django.conf import settings
6
+ from django.utils import timezone
7
+ from requests import HTTPError
8
+
9
+
10
+ class UBSNeoAPIClient:
11
+ BASE_URL = "https://neo.ubs.com/api"
12
+ SUCCESS_VALUE = "SUCCESS"
13
+ VIRTUAL_AMC_ISIN = "TEST_API_001"
14
+
15
+ def __init__(
16
+ self,
17
+ initial_jwt_token: str,
18
+ jwt_token_expiry_timestamp: datetime | None = None,
19
+ ):
20
+ """
21
+ :param service_account_id: Identifier for your UBS service account (for reference).
22
+ :param initial_jwt_token: JWT token string initially provided to authenticate API calls.
23
+ :param jwt_token_expiry_timestamp: UNIX timestamp when the token expires - to manage renewal.
24
+ """
25
+ self.jwt_token = initial_jwt_token
26
+ self.jwt_token_expiry = (
27
+ jwt_token_expiry_timestamp if jwt_token_expiry_timestamp else timezone.now() + timedelta(days=1)
28
+ )
29
+
30
+ def _is_token_expired(self) -> bool:
31
+ """Check if the current token is expired or near expiry (e.g. within 5 minutes)."""
32
+ return timezone.now() > self.jwt_token_expiry - timedelta(minutes=5)
33
+
34
+ def _renew_token(self):
35
+ """
36
+ Placeholder: Implement token renewal logic here.
37
+ This usually involves interacting with UBS Neo application or token service
38
+ before expiry to obtain a new token. This must be customized per your process.
39
+ """
40
+ raise ValueError("Token has expired. Please go to https://neo.ubs.com/ and renew it.")
41
+
42
+ def _get_headers(self) -> dict[str, str]:
43
+ """Prepare HTTP headers including Authorization bearer token."""
44
+ if self._is_token_expired():
45
+ self._renew_token()
46
+ return {"Authorization": f"Bearer {self.jwt_token}", "Content-Type": "application/json"}
47
+
48
+ def _get_json(self, response) -> dict:
49
+ try:
50
+ return response.json()
51
+ except JSONDecodeError:
52
+ return dict()
53
+
54
+ def _validate_isin(self, isin: str, test: bool = False) -> str:
55
+ # ensure the given isin can be used for rebalancing (e.g. debug or dev mode)
56
+ if test or settings.DEBUG:
57
+ return self.VIRTUAL_AMC_ISIN
58
+ return isin
59
+
60
+ def _raise_for_status(self, response):
61
+ try:
62
+ response.raise_for_status()
63
+ except HTTPError as e:
64
+ json_response = response.json()
65
+ raise HTTPError(json_response.get("errors", json_response.get("message"))) from e
66
+
67
+ def get_rebalance_service_status(self) -> dict:
68
+ """Check API connection status."""
69
+ url = f"{self.BASE_URL}/ged-amc/external/rebalance/v1/status"
70
+ response = requests.get(url, headers=self._get_headers(), timeout=10)
71
+ self._raise_for_status(response)
72
+ return self._get_json(response)
73
+
74
+ def get_rebalance_status_for_isin(self, isin: str) -> dict:
75
+ """Check certificate accessibility and workflow status for given ISIN."""
76
+ url = f"{self.BASE_URL}/ged-amc/external/rebalance/v1/status/{isin}"
77
+ response = requests.get(url, headers=self._get_headers(), timeout=10)
78
+ self._raise_for_status(response)
79
+ return self._get_json(response)
80
+
81
+ def submit_rebalance(self, isin: str, items: list[dict[str, str]], test: bool = False) -> dict:
82
+ """
83
+ Submit a rebalance request.
84
+ :param isin: Certificate ISIN string.
85
+ :param orders: List of dto representing order instructions.
86
+ :param test: If True, submits to test endpoint to validate syntax only (no persistence).
87
+ """
88
+ isin = self._validate_isin(isin, test=test)
89
+ url = f"{self.BASE_URL}/ged-amc/external/rebalance/v1/submit/{isin}"
90
+ payload = {"items": items}
91
+ response = requests.post(url, json=payload, headers=self._get_headers(), timeout=60)
92
+ self._raise_for_status(response)
93
+ return self._get_json(response)
94
+
95
+ def save_draft(self, isin: str, items: list[dict[str, str]]) -> dict:
96
+ """Save a rebalance draft."""
97
+ isin = self._validate_isin(isin)
98
+ url = f"{self.BASE_URL}/ged-amc/external/rebalance/v1/savedraft/{isin}"
99
+ payload = {"items": items}
100
+ response = requests.post(url, json=payload, headers=self._get_headers(), timeout=60)
101
+ self._raise_for_status(response)
102
+ return self._get_json(response)
103
+
104
+ def cancel_rebalance(self, isin: str) -> dict:
105
+ """Cancel a rebalance request."""
106
+ isin = self._validate_isin(isin)
107
+ url = f"{self.BASE_URL}/ged-amc/external/rebalance/v1/cancel/{isin}"
108
+ response = requests.delete(url, headers=self._get_headers(), timeout=60)
109
+ self._raise_for_status(response)
110
+ return self._get_json(response)
111
+
112
+ def get_current_rebalance_request(self, isin: str) -> dict:
113
+ """Fetch the current rebalance request for a certificate."""
114
+ url = f"{self.BASE_URL}/ged-amc/external/rebalance/v1/currentRebalanceRequest/{isin}"
115
+ response = requests.get(url, headers=self._get_headers(), timeout=60)
116
+ self._raise_for_status(response)
117
+ return self._get_json(response)
118
+
119
+ def get_rebalance_reports(self, isin: str, from_date: date, to_date: date) -> dict:
120
+ """Fetch the current rebalance request for a certificate."""
121
+ url = f"{self.BASE_URL}/ged-amc/external/report/v1/rebalance/{isin}"
122
+ response = requests.get(
123
+ url,
124
+ headers=self._get_headers(),
125
+ timeout=60,
126
+ params={"fromDate": from_date.strftime("%Y-%m-%d"), "toDate": to_date.strftime("%Y-%m-%d")},
127
+ )
128
+ self._raise_for_status(response)
129
+ return self._get_json(response)
130
+
131
+ def get_portfolio_at_date(self, isin: str, val_date: date) -> dict:
132
+ url = f"https://neo.ubs.com/api/ged-amc/external/report/v1/valuation/{isin}/{val_date:%Y-%m-%d}"
133
+ response = requests.get(url, headers=self._get_headers(), timeout=10)
134
+ self._raise_for_status(response)
135
+ return self._get_json(response)
136
+
137
+ def get_management_fees(self, isin: str, from_date: date, to_date: date) -> dict:
138
+ url = f"https://neo.ubs.com/api/ged-amc/external/fee/v1/management/{isin}"
139
+ response = requests.get(
140
+ url,
141
+ headers=self._get_headers(),
142
+ params={"fromDate": from_date.strftime("%Y-%m-%d"), "toDate": to_date.strftime("%Y-%m-%d")},
143
+ timeout=30,
144
+ )
145
+ self._raise_for_status(response)
146
+ return self._get_json(response)
147
+
148
+ def get_performance_fees(self, isin: str, from_date: date, to_date: date) -> dict:
149
+ url = f"https://neo.ubs.com/api/ged-amc/external/fee/v1/performance/{isin}"
150
+ response = requests.get(
151
+ url,
152
+ headers=self._get_headers(),
153
+ params={"fromDate": from_date.strftime("%Y-%m-%d"), "toDate": to_date.strftime("%Y-%m-%d")},
154
+ timeout=30,
155
+ )
156
+ self._raise_for_status(response)
157
+ return self._get_json(response)
158
+
159
+ def validate_response(self, response: dict) -> dict:
160
+ if response.get("status", "") == self.SUCCESS_VALUE:
161
+ return response
162
+ return dict()
@@ -0,0 +1 @@
1
+ EQUITY_TYPE_KEYS = ["american_depository_receipt", "equity"] # TODO might want to move this into a dynamic preference
@@ -1,8 +1,8 @@
1
1
  from typing import Optional
2
2
 
3
3
  from django.utils.translation import gettext as _
4
- from wbcore.contrib.directory.viewsets.display.entries import CompanyModelDisplay as CMD
5
- from wbcore.contrib.directory.viewsets.display.entries import PersonModelDisplay as PMD
4
+ from wbcore.contrib.directory.viewsets.display.entries import CompanyModelDisplay as BaseCompanyModelDisplay
5
+ from wbcore.contrib.directory.viewsets.display.entries import PersonModelDisplay as BasePersonModelDisplay
6
6
  from wbcore.metadata.configs import display as dp
7
7
  from wbcore.metadata.configs.display.instance_display import (
8
8
  Inline,
@@ -62,14 +62,20 @@ AUM_FIELDS = Section(
62
62
  )
63
63
 
64
64
 
65
- class CompanyModelDisplay(CMD):
65
+ class CompanyModelDisplay(BaseCompanyModelDisplay):
66
66
  def get_list_display(self) -> Optional[dp.ListDisplay]:
67
67
  list_display = super().get_list_display()
68
68
  list_display.fields = (
69
69
  *list_display.fields[:5],
70
- dp.Field(key="invested_assets_under_management_usd", label="AUM Invested"),
71
- dp.Field(key="asset_under_management", label="AUM"),
72
- dp.Field(key="potential", label="Potential"),
70
+ dp.Field(
71
+ key=None,
72
+ label=_("AUM"),
73
+ children=[
74
+ dp.Field(key="invested_assets_under_management_usd", label="AUM Invested", width=100),
75
+ dp.Field(key="asset_under_management", label="AUM", width=100),
76
+ dp.Field(key="potential", label="Potential", width=100),
77
+ ],
78
+ ),
73
79
  *list_display.fields[5:],
74
80
  )
75
81
  return list_display
@@ -134,15 +140,21 @@ class CompanyModelDisplay(CMD):
134
140
  return instance_display
135
141
 
136
142
 
137
- class PersonModelDisplay(PMD):
143
+ class PersonModelDisplay(BasePersonModelDisplay):
138
144
  def get_list_display(self) -> Optional[dp.ListDisplay]:
139
145
  list_display = super().get_list_display()
140
146
 
141
147
  list_display.fields = (
142
148
  *list_display.fields[:7],
143
- dp.Field(key="invested_assets_under_management_usd", label="AUM Invested"),
144
- dp.Field(key="asset_under_management", label="AUM"),
145
- dp.Field(key="potential", label="Potential"),
149
+ dp.Field(
150
+ key=None,
151
+ label=_("AUM"),
152
+ children=[
153
+ dp.Field(key="invested_assets_under_management_usd", label="AUM Invested", width=100),
154
+ dp.Field(key="asset_under_management", label="AUM", width=100),
155
+ dp.Field(key="potential", label="Potential", width=100),
156
+ ],
157
+ ),
146
158
  *list_display.fields[7:],
147
159
  )
148
160
  return list_display
@@ -1,3 +1,5 @@
1
+ from contextlib import suppress
2
+
1
3
  from wbcore.contrib.directory.viewsets.previews import EntryPreviewConfig
2
4
  from wbcore.contrib.icons import WBIcon
3
5
  from wbcore.metadata.configs import buttons as bt
@@ -17,12 +19,10 @@ class CompanyPreviewConfig(EntryPreviewConfig):
17
19
  ["asset_under_management", "invested_assets_under_management_usd"],
18
20
  [repeat_field(2, "potential")],
19
21
  ]
20
- try:
22
+ with suppress(Exception):
21
23
  entry = self.view.get_object()
22
24
  if entry.profile_image:
23
25
  fields.insert(0, [repeat_field(2, "profile_image")])
24
- except Exception:
25
- pass
26
26
 
27
27
  return create_simple_display(fields)
28
28
 
@@ -1,6 +1,6 @@
1
1
  from wbcore import filters
2
- from wbcore.contrib.directory.filters import CompanyFilter as CF
3
- from wbcore.contrib.directory.filters import PersonFilter as PF
2
+ from wbcore.contrib.directory.filters import CompanyFilter as BaseCompanyFilter
3
+ from wbcore.contrib.directory.filters import PersonFilter as BasePersonFilter
4
4
  from wbcore.contrib.directory.models import Company, Person
5
5
 
6
6
 
@@ -99,29 +99,29 @@ class EntryPortfolioFilter(filters.FilterSet):
99
99
  return queryset
100
100
 
101
101
 
102
- class CompanyFilter(CF, EntryPortfolioFilter):
102
+ class CompanyFilter(BaseCompanyFilter, EntryPortfolioFilter):
103
103
  @classmethod
104
104
  def get_filter_class_for_remote_filter(cls):
105
105
  """
106
106
  Define which filterset class sender to user for remote filter registration
107
107
  """
108
- return CF
108
+ return BaseCompanyFilter
109
109
 
110
- class Meta(CF.Meta):
110
+ class Meta(BaseCompanyFilter.Meta):
111
111
  fields = {
112
- **CF.Meta.fields,
112
+ **BaseCompanyFilter.Meta.fields,
113
113
  }
114
114
 
115
115
 
116
- class PersonFilter(PF, EntryPortfolioFilter):
116
+ class PersonFilter(BasePersonFilter, EntryPortfolioFilter):
117
117
  @classmethod
118
118
  def get_filter_class_for_remote_filter(cls):
119
119
  """
120
120
  Define which filterset class sender to user for remote filter registration
121
121
  """
122
- return PF
122
+ return BasePersonFilter
123
123
 
124
- class Meta(PF.Meta):
124
+ class Meta(BasePersonFilter.Meta):
125
125
  fields = {
126
- **PF.Meta.fields,
126
+ **BasePersonFilter.Meta.fields,
127
127
  }