wbportfolio 2.2.1__py2.py3-none-any.whl

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 (486) hide show
  1. wbportfolio/__init__.py +1 -0
  2. wbportfolio/admin/__init__.py +12 -0
  3. wbportfolio/admin/asset.py +47 -0
  4. wbportfolio/admin/custodians.py +9 -0
  5. wbportfolio/admin/portfolio.py +127 -0
  6. wbportfolio/admin/portfolio_relationships.py +22 -0
  7. wbportfolio/admin/product_groups.py +42 -0
  8. wbportfolio/admin/products.py +80 -0
  9. wbportfolio/admin/reconciliations.py +14 -0
  10. wbportfolio/admin/registers.py +17 -0
  11. wbportfolio/admin/roles.py +19 -0
  12. wbportfolio/admin/synchronization/__init__.py +2 -0
  13. wbportfolio/admin/synchronization/admin.py +114 -0
  14. wbportfolio/admin/synchronization/portfolio_synchronization.py +18 -0
  15. wbportfolio/admin/synchronization/price_computation.py +21 -0
  16. wbportfolio/admin/transactions/__init__.py +5 -0
  17. wbportfolio/admin/transactions/claim.py +16 -0
  18. wbportfolio/admin/transactions/dividends.py +14 -0
  19. wbportfolio/admin/transactions/fees.py +35 -0
  20. wbportfolio/admin/transactions/trades.py +49 -0
  21. wbportfolio/admin/transactions/transactions.py +37 -0
  22. wbportfolio/analysis/__init__.py +0 -0
  23. wbportfolio/analysis/claims.py +235 -0
  24. wbportfolio/apps.py +5 -0
  25. wbportfolio/contrib/__init__.py +0 -0
  26. wbportfolio/contrib/company_portfolio/__init__.py +0 -0
  27. wbportfolio/contrib/company_portfolio/admin.py +28 -0
  28. wbportfolio/contrib/company_portfolio/apps.py +29 -0
  29. wbportfolio/contrib/company_portfolio/configs/__init__.py +3 -0
  30. wbportfolio/contrib/company_portfolio/configs/display.py +182 -0
  31. wbportfolio/contrib/company_portfolio/configs/endpoints.py +34 -0
  32. wbportfolio/contrib/company_portfolio/configs/previews.py +37 -0
  33. wbportfolio/contrib/company_portfolio/constants.py +1 -0
  34. wbportfolio/contrib/company_portfolio/dynamic_preferences_registry.py +87 -0
  35. wbportfolio/contrib/company_portfolio/factories.py +32 -0
  36. wbportfolio/contrib/company_portfolio/filters.py +127 -0
  37. wbportfolio/contrib/company_portfolio/management.py +19 -0
  38. wbportfolio/contrib/company_portfolio/migrations/0001_initial.py +214 -0
  39. wbportfolio/contrib/company_portfolio/migrations/__init__.py +0 -0
  40. wbportfolio/contrib/company_portfolio/models.py +334 -0
  41. wbportfolio/contrib/company_portfolio/scripts.py +76 -0
  42. wbportfolio/contrib/company_portfolio/serializers.py +303 -0
  43. wbportfolio/contrib/company_portfolio/tasks.py +19 -0
  44. wbportfolio/contrib/company_portfolio/tests/__init__.py +0 -0
  45. wbportfolio/contrib/company_portfolio/tests/conftest.py +161 -0
  46. wbportfolio/contrib/company_portfolio/tests/test_models.py +161 -0
  47. wbportfolio/contrib/company_portfolio/urls.py +29 -0
  48. wbportfolio/contrib/company_portfolio/viewsets.py +195 -0
  49. wbportfolio/defaults/__init__.py +0 -0
  50. wbportfolio/defaults/fees/__init__.py +0 -0
  51. wbportfolio/defaults/fees/default.py +92 -0
  52. wbportfolio/defaults/portfolio/__init__.py +0 -0
  53. wbportfolio/defaults/portfolio/default_rebalancing.py +45 -0
  54. wbportfolio/dynamic_preferences_registry.py +58 -0
  55. wbportfolio/factories/__init__.py +35 -0
  56. wbportfolio/factories/adjustments.py +17 -0
  57. wbportfolio/factories/assets.py +75 -0
  58. wbportfolio/factories/claim.py +39 -0
  59. wbportfolio/factories/custodians.py +11 -0
  60. wbportfolio/factories/dividends.py +14 -0
  61. wbportfolio/factories/fees.py +15 -0
  62. wbportfolio/factories/indexes.py +17 -0
  63. wbportfolio/factories/portfolio_cash_flow.py +20 -0
  64. wbportfolio/factories/portfolio_cash_targets.py +15 -0
  65. wbportfolio/factories/portfolio_swing_pricings.py +15 -0
  66. wbportfolio/factories/portfolios.py +59 -0
  67. wbportfolio/factories/product_groups.py +28 -0
  68. wbportfolio/factories/products.py +56 -0
  69. wbportfolio/factories/pytest_utils.py +121 -0
  70. wbportfolio/factories/reconciliations.py +23 -0
  71. wbportfolio/factories/roles.py +20 -0
  72. wbportfolio/factories/synchronization.py +40 -0
  73. wbportfolio/factories/trades.py +35 -0
  74. wbportfolio/factories/transactions.py +21 -0
  75. wbportfolio/fdm/__init__.py +0 -0
  76. wbportfolio/fdm/tasks.py +12 -0
  77. wbportfolio/filters/__init__.py +32 -0
  78. wbportfolio/filters/assets.py +485 -0
  79. wbportfolio/filters/assets_and_net_new_money_progression.py +42 -0
  80. wbportfolio/filters/custodians.py +10 -0
  81. wbportfolio/filters/esg.py +22 -0
  82. wbportfolio/filters/performances.py +171 -0
  83. wbportfolio/filters/portfolios.py +24 -0
  84. wbportfolio/filters/positions.py +178 -0
  85. wbportfolio/filters/products.py +157 -0
  86. wbportfolio/filters/roles.py +26 -0
  87. wbportfolio/filters/signals.py +92 -0
  88. wbportfolio/filters/transactions/__init__.py +20 -0
  89. wbportfolio/filters/transactions/claim.py +394 -0
  90. wbportfolio/filters/transactions/fees.py +66 -0
  91. wbportfolio/filters/transactions/trades.py +224 -0
  92. wbportfolio/filters/transactions/transactions.py +98 -0
  93. wbportfolio/import_export/__init__.py +0 -0
  94. wbportfolio/import_export/backends/__init__.py +2 -0
  95. wbportfolio/import_export/backends/ubs/__init__.py +3 -0
  96. wbportfolio/import_export/backends/ubs/asset_position.py +45 -0
  97. wbportfolio/import_export/backends/ubs/fees.py +63 -0
  98. wbportfolio/import_export/backends/ubs/instrument_price.py +44 -0
  99. wbportfolio/import_export/backends/ubs/mixin.py +15 -0
  100. wbportfolio/import_export/backends/utils.py +58 -0
  101. wbportfolio/import_export/backends/wbfdm/__init__.py +2 -0
  102. wbportfolio/import_export/backends/wbfdm/adjustment.py +50 -0
  103. wbportfolio/import_export/backends/wbfdm/dividend.py +16 -0
  104. wbportfolio/import_export/backends/wbfdm/mixin.py +15 -0
  105. wbportfolio/import_export/handlers/__init__.py +0 -0
  106. wbportfolio/import_export/handlers/adjustment.py +39 -0
  107. wbportfolio/import_export/handlers/asset_position.py +167 -0
  108. wbportfolio/import_export/handlers/dividend.py +80 -0
  109. wbportfolio/import_export/handlers/fees.py +58 -0
  110. wbportfolio/import_export/handlers/portfolio_cash_flow.py +57 -0
  111. wbportfolio/import_export/handlers/register.py +43 -0
  112. wbportfolio/import_export/handlers/trade.py +191 -0
  113. wbportfolio/import_export/parsers/__init__.py +0 -0
  114. wbportfolio/import_export/parsers/default_mapping.py +30 -0
  115. wbportfolio/import_export/parsers/jpmorgan/__init__.py +0 -0
  116. wbportfolio/import_export/parsers/jpmorgan/customer_trade.py +63 -0
  117. wbportfolio/import_export/parsers/jpmorgan/fees.py +64 -0
  118. wbportfolio/import_export/parsers/jpmorgan/strategy.py +116 -0
  119. wbportfolio/import_export/parsers/jpmorgan/valuation.py +41 -0
  120. wbportfolio/import_export/parsers/leonteq/__init__.py +0 -0
  121. wbportfolio/import_export/parsers/leonteq/customer_trade.py +47 -0
  122. wbportfolio/import_export/parsers/leonteq/equity.py +81 -0
  123. wbportfolio/import_export/parsers/leonteq/fees.py +70 -0
  124. wbportfolio/import_export/parsers/leonteq/trade.py +94 -0
  125. wbportfolio/import_export/parsers/leonteq/valuation.py +39 -0
  126. wbportfolio/import_export/parsers/natixis/__init__.py +0 -0
  127. wbportfolio/import_export/parsers/natixis/customer_trade.py +62 -0
  128. wbportfolio/import_export/parsers/natixis/d1_customer_trade.py +66 -0
  129. wbportfolio/import_export/parsers/natixis/d1_equity.py +80 -0
  130. wbportfolio/import_export/parsers/natixis/d1_fees.py +58 -0
  131. wbportfolio/import_export/parsers/natixis/d1_trade.py +70 -0
  132. wbportfolio/import_export/parsers/natixis/d1_valuation.py +41 -0
  133. wbportfolio/import_export/parsers/natixis/dividend.py +53 -0
  134. wbportfolio/import_export/parsers/natixis/equity.py +60 -0
  135. wbportfolio/import_export/parsers/natixis/fees.py +53 -0
  136. wbportfolio/import_export/parsers/natixis/trade.py +63 -0
  137. wbportfolio/import_export/parsers/natixis/utils.py +76 -0
  138. wbportfolio/import_export/parsers/natixis/valuation.py +46 -0
  139. wbportfolio/import_export/parsers/refinitiv/__init__.py +0 -0
  140. wbportfolio/import_export/parsers/refinitiv/adjustment.py +24 -0
  141. wbportfolio/import_export/parsers/sg_lux/__init__.py +0 -0
  142. wbportfolio/import_export/parsers/sg_lux/custodian_positions.py +70 -0
  143. wbportfolio/import_export/parsers/sg_lux/customer_trade.py +75 -0
  144. wbportfolio/import_export/parsers/sg_lux/customer_trade_pending_slk.py +140 -0
  145. wbportfolio/import_export/parsers/sg_lux/customer_trade_slk.py +80 -0
  146. wbportfolio/import_export/parsers/sg_lux/customer_trade_without_pw.py +57 -0
  147. wbportfolio/import_export/parsers/sg_lux/equity.py +137 -0
  148. wbportfolio/import_export/parsers/sg_lux/fees.py +56 -0
  149. wbportfolio/import_export/parsers/sg_lux/perf_fees.py +51 -0
  150. wbportfolio/import_export/parsers/sg_lux/portfolio_cash_flow.py +29 -0
  151. wbportfolio/import_export/parsers/sg_lux/portfolio_future_cash_flow.py +36 -0
  152. wbportfolio/import_export/parsers/sg_lux/registers.py +210 -0
  153. wbportfolio/import_export/parsers/sg_lux/sylk.py +248 -0
  154. wbportfolio/import_export/parsers/sg_lux/utils.py +36 -0
  155. wbportfolio/import_export/parsers/sg_lux/valuation.py +53 -0
  156. wbportfolio/import_export/parsers/societe_generale/__init__.py +0 -0
  157. wbportfolio/import_export/parsers/societe_generale/customer_trade.py +54 -0
  158. wbportfolio/import_export/parsers/societe_generale/strategy.py +94 -0
  159. wbportfolio/import_export/parsers/societe_generale/valuation.py +37 -0
  160. wbportfolio/import_export/parsers/tellco/__init__.py +0 -0
  161. wbportfolio/import_export/parsers/tellco/customer_trade.py +64 -0
  162. wbportfolio/import_export/parsers/tellco/equity.py +86 -0
  163. wbportfolio/import_export/parsers/tellco/valuation.py +52 -0
  164. wbportfolio/import_export/parsers/ubs/__init__.py +0 -0
  165. wbportfolio/import_export/parsers/ubs/api/__init__.py +0 -0
  166. wbportfolio/import_export/parsers/ubs/api/asset_position.py +106 -0
  167. wbportfolio/import_export/parsers/ubs/api/fees.py +31 -0
  168. wbportfolio/import_export/parsers/ubs/api/instrument_price.py +20 -0
  169. wbportfolio/import_export/parsers/ubs/api/utils.py +0 -0
  170. wbportfolio/import_export/parsers/ubs/customer_trade.py +60 -0
  171. wbportfolio/import_export/parsers/ubs/equity.py +97 -0
  172. wbportfolio/import_export/parsers/ubs/historical_customer_trade.py +67 -0
  173. wbportfolio/import_export/parsers/ubs/valuation.py +52 -0
  174. wbportfolio/import_export/parsers/vontobel/__init__.py +0 -0
  175. wbportfolio/import_export/parsers/vontobel/asset_position.py +97 -0
  176. wbportfolio/import_export/parsers/vontobel/customer_trade.py +54 -0
  177. wbportfolio/import_export/parsers/vontobel/historical_customer_trade.py +40 -0
  178. wbportfolio/import_export/parsers/vontobel/instrument.py +34 -0
  179. wbportfolio/import_export/parsers/vontobel/management_fees.py +86 -0
  180. wbportfolio/import_export/parsers/vontobel/performance_fees.py +35 -0
  181. wbportfolio/import_export/parsers/vontobel/trade.py +38 -0
  182. wbportfolio/import_export/parsers/vontobel/utils.py +17 -0
  183. wbportfolio/import_export/parsers/vontobel/valuation.py +29 -0
  184. wbportfolio/import_export/resources/__init__.py +0 -0
  185. wbportfolio/import_export/resources/assets.py +68 -0
  186. wbportfolio/import_export/resources/trades.py +41 -0
  187. wbportfolio/import_export/utils.py +42 -0
  188. wbportfolio/metric/__init__.py +0 -0
  189. wbportfolio/metric/backends/__init__.py +2 -0
  190. wbportfolio/metric/backends/base.py +86 -0
  191. wbportfolio/metric/backends/constants.py +222 -0
  192. wbportfolio/metric/backends/portfolio_base.py +255 -0
  193. wbportfolio/metric/backends/portfolio_esg.py +66 -0
  194. wbportfolio/metric/tests/__init__.py +0 -0
  195. wbportfolio/metric/tests/conftest.py +4 -0
  196. wbportfolio/metric/tests/test_portfolio_base.py +135 -0
  197. wbportfolio/metric/tests/test_portfolio_esg.py +69 -0
  198. wbportfolio/migrations/0001_initial_squashed.py +13848 -0
  199. wbportfolio/migrations/0002_product_default_sub_account_squashed_0039_alter_assetallocation_company_and_more.py +3836 -0
  200. wbportfolio/migrations/0040_instrument_financial_instrument.py +26 -0
  201. wbportfolio/migrations/0041_remove_listresearch_research_ptr_and_more.py +129 -0
  202. wbportfolio/migrations/0042_instrumentlist_instrumentlistthroughmodel_and_more.py +71 -0
  203. wbportfolio/migrations/0043_alter_instrumentlistthroughmodel_options_and_more.py +238 -0
  204. wbportfolio/migrations/0044_alter_instrumentlist_identifier.py +35 -0
  205. wbportfolio/migrations/0045_alter_instrument_financial_instrument.py +26 -0
  206. wbportfolio/migrations/0046_add_product_default_account.py +166 -0
  207. wbportfolio/migrations/0047_remove_product_default_sub_account.py +14 -0
  208. wbportfolio/migrations/0048_alter_trade_status.py +29 -0
  209. wbportfolio/migrations/0049_trade_claimed_shares.py +25 -0
  210. wbportfolio/migrations/0050_fees_fee_date_fees_wbportfolio_transac_1f7a29_idx.py +44 -0
  211. wbportfolio/migrations/0051_delete_macroreview.py +11 -0
  212. wbportfolio/migrations/0052_remove_cash_instrument_ptr_and_more.py +888 -0
  213. wbportfolio/migrations/0053_remove_product_group.py +132 -0
  214. wbportfolio/migrations/0054_portfolioinstrumentpreferredclassificationthroughmodel_and_more.py +270 -0
  215. wbportfolio/migrations/0055_remove_product__custom_management_rebates_and_more.py +139 -0
  216. wbportfolio/migrations/0056_remove_companyportfoliodata_assets_under_management_currency_and_more.py +56 -0
  217. wbportfolio/migrations/0057_alter_portfolio_preferred_instrument_classifications_and_more.py +36 -0
  218. wbportfolio/migrations/0058_pmsinstrument.py +23 -0
  219. wbportfolio/migrations/0059_fees_unique_fees.py +51 -0
  220. wbportfolio/migrations/0060_alter_portfolioportfoliothroughmodel_type.py +21 -0
  221. wbportfolio/migrations/0061_portfolio_bank_accounts_product_bank_account_and_more.py +175 -0
  222. wbportfolio/migrations/0062_alter_dailyportfoliocashflow_options.py +20 -0
  223. wbportfolio/migrations/0063_accountreconciliation_accountreconciliationline_and_more.py +133 -0
  224. wbportfolio/migrations/0064_alter_portfolio_managers_portfolio_is_tracked_and_more.py +40 -0
  225. wbportfolio/migrations/0065_alter_portfolio_managers_claim_as_shares_and_more.py +73 -0
  226. wbportfolio/migrations/0066_assetposition_initial_shares_at_custodian_and_more.py +108 -0
  227. wbportfolio/migrations/0067_assetposition_unique_asset_position.py +77 -0
  228. wbportfolio/migrations/0068_trade_internal_trade_trade_marked_as_internal_and_more.py +59 -0
  229. wbportfolio/migrations/0069_remove_portfolio_is_invested_and_more.py +56 -0
  230. wbportfolio/migrations/0070_remove_assetposition_unique_asset_position_and_more.py +82 -0
  231. wbportfolio/migrations/0071_alter_trade_options_alter_trade_order.py +22 -0
  232. wbportfolio/migrations/__init__.py +0 -0
  233. wbportfolio/models/__init__.py +26 -0
  234. wbportfolio/models/adjustments.py +246 -0
  235. wbportfolio/models/asset.py +869 -0
  236. wbportfolio/models/custodians.py +101 -0
  237. wbportfolio/models/indexes.py +33 -0
  238. wbportfolio/models/mixins/__init__.py +0 -0
  239. wbportfolio/models/mixins/instruments.py +127 -0
  240. wbportfolio/models/mixins/liquidity_stress_test.py +1307 -0
  241. wbportfolio/models/portfolio.py +1039 -0
  242. wbportfolio/models/portfolio_cash_flow.py +167 -0
  243. wbportfolio/models/portfolio_cash_targets.py +46 -0
  244. wbportfolio/models/portfolio_relationship.py +135 -0
  245. wbportfolio/models/portfolio_swing_pricings.py +51 -0
  246. wbportfolio/models/product_groups.py +230 -0
  247. wbportfolio/models/products.py +569 -0
  248. wbportfolio/models/reconciliations/__init__.py +2 -0
  249. wbportfolio/models/reconciliations/account_reconciliation_lines.py +192 -0
  250. wbportfolio/models/reconciliations/account_reconciliations.py +102 -0
  251. wbportfolio/models/reconciliations/reconciliations.py +25 -0
  252. wbportfolio/models/registers.py +132 -0
  253. wbportfolio/models/roles.py +208 -0
  254. wbportfolio/models/synchronization/__init__.py +3 -0
  255. wbportfolio/models/synchronization/portfolio_synchronization.py +292 -0
  256. wbportfolio/models/synchronization/price_computation.py +200 -0
  257. wbportfolio/models/synchronization/synchronization.py +188 -0
  258. wbportfolio/models/transactions/__init__.py +7 -0
  259. wbportfolio/models/transactions/claim.py +634 -0
  260. wbportfolio/models/transactions/dividends.py +31 -0
  261. wbportfolio/models/transactions/expiry.py +7 -0
  262. wbportfolio/models/transactions/fees.py +153 -0
  263. wbportfolio/models/transactions/trade_proposals.py +502 -0
  264. wbportfolio/models/transactions/trades.py +704 -0
  265. wbportfolio/models/transactions/transactions.py +211 -0
  266. wbportfolio/models/utils.py +12 -0
  267. wbportfolio/permissions.py +13 -0
  268. wbportfolio/pms/__init__.py +0 -0
  269. wbportfolio/pms/statistics/__init__.py +0 -0
  270. wbportfolio/pms/trading/__init__.py +1 -0
  271. wbportfolio/pms/trading/handler.py +164 -0
  272. wbportfolio/pms/typing.py +194 -0
  273. wbportfolio/preferences.py +6 -0
  274. wbportfolio/reports/__init__.py +0 -0
  275. wbportfolio/reports/monthly_position_report.py +74 -0
  276. wbportfolio/risk_management/__init__.py +0 -0
  277. wbportfolio/risk_management/backends/__init__.py +11 -0
  278. wbportfolio/risk_management/backends/accounts.py +166 -0
  279. wbportfolio/risk_management/backends/controversy_portfolio.py +63 -0
  280. wbportfolio/risk_management/backends/exposure_portfolio.py +203 -0
  281. wbportfolio/risk_management/backends/instrument_list_portfolio.py +89 -0
  282. wbportfolio/risk_management/backends/liquidity_risk.py +86 -0
  283. wbportfolio/risk_management/backends/liquidity_stress_instrument.py +86 -0
  284. wbportfolio/risk_management/backends/mixins.py +220 -0
  285. wbportfolio/risk_management/backends/product_integrity.py +111 -0
  286. wbportfolio/risk_management/backends/stop_loss_instrument.py +24 -0
  287. wbportfolio/risk_management/backends/stop_loss_portfolio.py +36 -0
  288. wbportfolio/risk_management/backends/ucits_portfolio.py +63 -0
  289. wbportfolio/risk_management/tests/__init__.py +0 -0
  290. wbportfolio/risk_management/tests/conftest.py +15 -0
  291. wbportfolio/risk_management/tests/test_accounts.py +98 -0
  292. wbportfolio/risk_management/tests/test_controversy_portfolio.py +33 -0
  293. wbportfolio/risk_management/tests/test_exposure_portfolio.py +94 -0
  294. wbportfolio/risk_management/tests/test_instrument_list_portfolio.py +60 -0
  295. wbportfolio/risk_management/tests/test_liquidity_risk.py +47 -0
  296. wbportfolio/risk_management/tests/test_product_integrity.py +55 -0
  297. wbportfolio/risk_management/tests/test_stop_loss_instrument.py +110 -0
  298. wbportfolio/risk_management/tests/test_stop_loss_portfolio.py +119 -0
  299. wbportfolio/risk_management/tests/test_ucits_portfolio.py +39 -0
  300. wbportfolio/serializers/__init__.py +42 -0
  301. wbportfolio/serializers/adjustments.py +24 -0
  302. wbportfolio/serializers/assets.py +166 -0
  303. wbportfolio/serializers/custodians.py +26 -0
  304. wbportfolio/serializers/portfolio_cash_flow.py +48 -0
  305. wbportfolio/serializers/portfolio_cash_targets.py +20 -0
  306. wbportfolio/serializers/portfolio_relationship.py +53 -0
  307. wbportfolio/serializers/portfolio_swing_pricing.py +20 -0
  308. wbportfolio/serializers/portfolios.py +143 -0
  309. wbportfolio/serializers/positions.py +76 -0
  310. wbportfolio/serializers/product_group.py +88 -0
  311. wbportfolio/serializers/products.py +331 -0
  312. wbportfolio/serializers/reconciliations.py +171 -0
  313. wbportfolio/serializers/registers.py +72 -0
  314. wbportfolio/serializers/roles.py +60 -0
  315. wbportfolio/serializers/signals.py +157 -0
  316. wbportfolio/serializers/synchronization.py +18 -0
  317. wbportfolio/serializers/transactions/__init__.py +24 -0
  318. wbportfolio/serializers/transactions/claim.py +310 -0
  319. wbportfolio/serializers/transactions/dividends.py +18 -0
  320. wbportfolio/serializers/transactions/expiry.py +18 -0
  321. wbportfolio/serializers/transactions/fees.py +32 -0
  322. wbportfolio/serializers/transactions/trades.py +315 -0
  323. wbportfolio/serializers/transactions/transactions.py +84 -0
  324. wbportfolio/tasks.py +125 -0
  325. wbportfolio/tests/__init__.py +0 -0
  326. wbportfolio/tests/conftest.py +164 -0
  327. wbportfolio/tests/models/__init__.py +0 -0
  328. wbportfolio/tests/models/test_account_reconciliation.py +191 -0
  329. wbportfolio/tests/models/test_assets.py +193 -0
  330. wbportfolio/tests/models/test_custodians.py +12 -0
  331. wbportfolio/tests/models/test_customer_trades.py +113 -0
  332. wbportfolio/tests/models/test_dividends.py +7 -0
  333. wbportfolio/tests/models/test_imports.py +192 -0
  334. wbportfolio/tests/models/test_instrument_mixins.py +48 -0
  335. wbportfolio/tests/models/test_merge.py +133 -0
  336. wbportfolio/tests/models/test_portfolio_cash_flow.py +112 -0
  337. wbportfolio/tests/models/test_portfolio_cash_targets.py +27 -0
  338. wbportfolio/tests/models/test_portfolio_swing_pricings.py +42 -0
  339. wbportfolio/tests/models/test_portfolios.py +676 -0
  340. wbportfolio/tests/models/test_product_groups.py +80 -0
  341. wbportfolio/tests/models/test_products.py +187 -0
  342. wbportfolio/tests/models/test_roles.py +82 -0
  343. wbportfolio/tests/models/test_splits.py +233 -0
  344. wbportfolio/tests/models/test_synchronization.py +617 -0
  345. wbportfolio/tests/models/transactions/__init__.py +0 -0
  346. wbportfolio/tests/models/transactions/test_claim.py +129 -0
  347. wbportfolio/tests/models/transactions/test_fees.py +65 -0
  348. wbportfolio/tests/models/transactions/test_trades.py +204 -0
  349. wbportfolio/tests/models/utils.py +13 -0
  350. wbportfolio/tests/serializers/__init__.py +0 -0
  351. wbportfolio/tests/serializers/test_claims.py +21 -0
  352. wbportfolio/tests/signals.py +151 -0
  353. wbportfolio/tests/tests.py +31 -0
  354. wbportfolio/tests/viewsets/__init__.py +0 -0
  355. wbportfolio/tests/viewsets/test_assets.py +67 -0
  356. wbportfolio/tests/viewsets/test_performances.py +72 -0
  357. wbportfolio/tests/viewsets/test_products.py +92 -0
  358. wbportfolio/tests/viewsets/transactions/__init__.py +0 -0
  359. wbportfolio/tests/viewsets/transactions/test_claims.py +146 -0
  360. wbportfolio/urls.py +247 -0
  361. wbportfolio/utils.py +30 -0
  362. wbportfolio/viewsets/__init__.py +57 -0
  363. wbportfolio/viewsets/adjustments.py +46 -0
  364. wbportfolio/viewsets/assets.py +562 -0
  365. wbportfolio/viewsets/assets_and_net_new_money_progression.py +117 -0
  366. wbportfolio/viewsets/charts/__init__.py +1 -0
  367. wbportfolio/viewsets/charts/assets.py +247 -0
  368. wbportfolio/viewsets/configs/__init__.py +6 -0
  369. wbportfolio/viewsets/configs/buttons/__init__.py +23 -0
  370. wbportfolio/viewsets/configs/buttons/adjustments.py +13 -0
  371. wbportfolio/viewsets/configs/buttons/assets.py +145 -0
  372. wbportfolio/viewsets/configs/buttons/claims.py +83 -0
  373. wbportfolio/viewsets/configs/buttons/custodians.py +76 -0
  374. wbportfolio/viewsets/configs/buttons/fees.py +14 -0
  375. wbportfolio/viewsets/configs/buttons/mixins.py +88 -0
  376. wbportfolio/viewsets/configs/buttons/portfolios.py +115 -0
  377. wbportfolio/viewsets/configs/buttons/products.py +41 -0
  378. wbportfolio/viewsets/configs/buttons/reconciliations.py +65 -0
  379. wbportfolio/viewsets/configs/buttons/registers.py +11 -0
  380. wbportfolio/viewsets/configs/buttons/signals.py +68 -0
  381. wbportfolio/viewsets/configs/buttons/trade_proposals.py +25 -0
  382. wbportfolio/viewsets/configs/buttons/trades.py +144 -0
  383. wbportfolio/viewsets/configs/display/__init__.py +61 -0
  384. wbportfolio/viewsets/configs/display/adjustments.py +81 -0
  385. wbportfolio/viewsets/configs/display/assets.py +265 -0
  386. wbportfolio/viewsets/configs/display/claim.py +299 -0
  387. wbportfolio/viewsets/configs/display/custodians.py +24 -0
  388. wbportfolio/viewsets/configs/display/esg.py +88 -0
  389. wbportfolio/viewsets/configs/display/fees.py +133 -0
  390. wbportfolio/viewsets/configs/display/portfolio_cash_flow.py +103 -0
  391. wbportfolio/viewsets/configs/display/portfolio_relationship.py +38 -0
  392. wbportfolio/viewsets/configs/display/portfolios.py +125 -0
  393. wbportfolio/viewsets/configs/display/positions.py +75 -0
  394. wbportfolio/viewsets/configs/display/product_groups.py +54 -0
  395. wbportfolio/viewsets/configs/display/product_performance.py +241 -0
  396. wbportfolio/viewsets/configs/display/products.py +249 -0
  397. wbportfolio/viewsets/configs/display/reconciliations.py +151 -0
  398. wbportfolio/viewsets/configs/display/registers.py +71 -0
  399. wbportfolio/viewsets/configs/display/roles.py +49 -0
  400. wbportfolio/viewsets/configs/display/trade_proposals.py +97 -0
  401. wbportfolio/viewsets/configs/display/trades.py +359 -0
  402. wbportfolio/viewsets/configs/display/transactions.py +55 -0
  403. wbportfolio/viewsets/configs/endpoints/__init__.py +75 -0
  404. wbportfolio/viewsets/configs/endpoints/adjustments.py +17 -0
  405. wbportfolio/viewsets/configs/endpoints/assets.py +115 -0
  406. wbportfolio/viewsets/configs/endpoints/claim.py +106 -0
  407. wbportfolio/viewsets/configs/endpoints/custodians.py +6 -0
  408. wbportfolio/viewsets/configs/endpoints/esg.py +14 -0
  409. wbportfolio/viewsets/configs/endpoints/fees.py +26 -0
  410. wbportfolio/viewsets/configs/endpoints/portfolio_relationship.py +23 -0
  411. wbportfolio/viewsets/configs/endpoints/portfolios.py +43 -0
  412. wbportfolio/viewsets/configs/endpoints/positions.py +18 -0
  413. wbportfolio/viewsets/configs/endpoints/product_groups.py +11 -0
  414. wbportfolio/viewsets/configs/endpoints/product_performance.py +29 -0
  415. wbportfolio/viewsets/configs/endpoints/products.py +37 -0
  416. wbportfolio/viewsets/configs/endpoints/reconciliations.py +31 -0
  417. wbportfolio/viewsets/configs/endpoints/roles.py +9 -0
  418. wbportfolio/viewsets/configs/endpoints/trade_proposals.py +17 -0
  419. wbportfolio/viewsets/configs/endpoints/trades.py +82 -0
  420. wbportfolio/viewsets/configs/endpoints/transactions.py +17 -0
  421. wbportfolio/viewsets/configs/menu/__init__.py +30 -0
  422. wbportfolio/viewsets/configs/menu/adjustments.py +8 -0
  423. wbportfolio/viewsets/configs/menu/assets.py +8 -0
  424. wbportfolio/viewsets/configs/menu/claim.py +41 -0
  425. wbportfolio/viewsets/configs/menu/custodians.py +11 -0
  426. wbportfolio/viewsets/configs/menu/fees.py +13 -0
  427. wbportfolio/viewsets/configs/menu/instrument_prices.py +10 -0
  428. wbportfolio/viewsets/configs/menu/portfolio_cash_flow.py +8 -0
  429. wbportfolio/viewsets/configs/menu/portfolios.py +15 -0
  430. wbportfolio/viewsets/configs/menu/positions.py +14 -0
  431. wbportfolio/viewsets/configs/menu/product_groups.py +10 -0
  432. wbportfolio/viewsets/configs/menu/product_performance.py +25 -0
  433. wbportfolio/viewsets/configs/menu/products.py +15 -0
  434. wbportfolio/viewsets/configs/menu/reconciliations.py +7 -0
  435. wbportfolio/viewsets/configs/menu/registers.py +10 -0
  436. wbportfolio/viewsets/configs/menu/roles.py +16 -0
  437. wbportfolio/viewsets/configs/menu/trades.py +18 -0
  438. wbportfolio/viewsets/configs/menu/transactions.py +8 -0
  439. wbportfolio/viewsets/configs/previews/__init__.py +1 -0
  440. wbportfolio/viewsets/configs/previews/portfolios.py +21 -0
  441. wbportfolio/viewsets/configs/titles/__init__.py +65 -0
  442. wbportfolio/viewsets/configs/titles/adjustments.py +19 -0
  443. wbportfolio/viewsets/configs/titles/assets.py +57 -0
  444. wbportfolio/viewsets/configs/titles/assets_and_net_new_money_progression.py +6 -0
  445. wbportfolio/viewsets/configs/titles/claim.py +81 -0
  446. wbportfolio/viewsets/configs/titles/custodians.py +12 -0
  447. wbportfolio/viewsets/configs/titles/esg.py +10 -0
  448. wbportfolio/viewsets/configs/titles/fees.py +25 -0
  449. wbportfolio/viewsets/configs/titles/instrument_prices.py +20 -0
  450. wbportfolio/viewsets/configs/titles/portfolios.py +32 -0
  451. wbportfolio/viewsets/configs/titles/positions.py +11 -0
  452. wbportfolio/viewsets/configs/titles/product_groups.py +12 -0
  453. wbportfolio/viewsets/configs/titles/product_performance.py +16 -0
  454. wbportfolio/viewsets/configs/titles/products.py +6 -0
  455. wbportfolio/viewsets/configs/titles/registers.py +12 -0
  456. wbportfolio/viewsets/configs/titles/roles.py +23 -0
  457. wbportfolio/viewsets/configs/titles/trades.py +51 -0
  458. wbportfolio/viewsets/configs/titles/transactions.py +8 -0
  459. wbportfolio/viewsets/custodians.py +66 -0
  460. wbportfolio/viewsets/esg.py +165 -0
  461. wbportfolio/viewsets/mixins.py +48 -0
  462. wbportfolio/viewsets/portfolio_cash_flow.py +31 -0
  463. wbportfolio/viewsets/portfolio_cash_targets.py +8 -0
  464. wbportfolio/viewsets/portfolio_relationship.py +46 -0
  465. wbportfolio/viewsets/portfolio_swing_pricing.py +8 -0
  466. wbportfolio/viewsets/portfolios.py +154 -0
  467. wbportfolio/viewsets/positions.py +292 -0
  468. wbportfolio/viewsets/product_groups.py +84 -0
  469. wbportfolio/viewsets/product_performance.py +646 -0
  470. wbportfolio/viewsets/products.py +529 -0
  471. wbportfolio/viewsets/reconciliations.py +160 -0
  472. wbportfolio/viewsets/registers.py +75 -0
  473. wbportfolio/viewsets/roles.py +44 -0
  474. wbportfolio/viewsets/signals.py +42 -0
  475. wbportfolio/viewsets/synchronization.py +25 -0
  476. wbportfolio/viewsets/transactions/__init__.py +40 -0
  477. wbportfolio/viewsets/transactions/claim.py +933 -0
  478. wbportfolio/viewsets/transactions/fees.py +190 -0
  479. wbportfolio/viewsets/transactions/mixins.py +19 -0
  480. wbportfolio/viewsets/transactions/trade_proposals.py +93 -0
  481. wbportfolio/viewsets/transactions/trades.py +395 -0
  482. wbportfolio/viewsets/transactions/transactions.py +123 -0
  483. wbportfolio-2.2.1.dist-info/METADATA +21 -0
  484. wbportfolio-2.2.1.dist-info/RECORD +486 -0
  485. wbportfolio-2.2.1.dist-info/WHEEL +5 -0
  486. wbportfolio-2.2.1.dist-info/licenses/LICENSE +4 -0
@@ -0,0 +1 @@
1
+ __version__ = "1.0.0"
@@ -0,0 +1,12 @@
1
+ # Import CRM Relevant Data
2
+ from .portfolio_relationships import PortfolioInstrumentPreferredClassificationThroughInlineModelAdmin
3
+ from .asset import AssetPositionModelAdmin
4
+ from .custodians import CustodianModelAdmin
5
+ from .products import ProductAdmin
6
+ from .product_groups import ProductGroupAdmin
7
+ from .portfolio import PortfolioModelAdmin
8
+ from .registers import RegisterModelAdmin
9
+ from .roles import PortfolioRoleAdmin
10
+ from .synchronization import *
11
+ from .transactions import DividendAdmin, FeesAdmin, TradeAdmin, TransactionModelAdmin
12
+ from .reconciliations import AccountReconciliationAdmin
@@ -0,0 +1,47 @@
1
+ from django.contrib import admin
2
+ from wbportfolio.models import AssetPosition
3
+
4
+
5
+ @admin.register(AssetPosition)
6
+ class AssetPositionModelAdmin(admin.ModelAdmin):
7
+ list_filter = ("underlying_instrument", "portfolio")
8
+ search_fields = (
9
+ "underlying_instrument__name",
10
+ "underlying_instrument__ticker",
11
+ )
12
+ # date_hierarchy = "date"
13
+ list_filter = ("underlying_instrument__instrument_type",)
14
+ list_display = (
15
+ "date",
16
+ "_price",
17
+ "currency",
18
+ "_currency_fx_rate",
19
+ "_shares",
20
+ "_total_value_fx_usd",
21
+ "weighting",
22
+ "portfolio",
23
+ "underlying_instrument",
24
+ )
25
+ readonly_fields = [
26
+ "_market_capitalization",
27
+ "_price",
28
+ "_currency_fx_rate",
29
+ "_price_fx_portfolio",
30
+ "_total_value",
31
+ "_total_value_fx_usd",
32
+ "_total_value_fx_portfolio",
33
+ "_market_share",
34
+ ]
35
+ autocomplete_fields = [
36
+ "portfolio",
37
+ "currency",
38
+ "underlying_instrument",
39
+ ]
40
+ ordering = ("-date",)
41
+ raw_id_fields = [
42
+ "import_source",
43
+ "applied_adjustment",
44
+ "underlying_instrument_price",
45
+ "currency_fx_rate_instrument_to_usd",
46
+ "currency_fx_rate_portfolio_to_usd",
47
+ ]
@@ -0,0 +1,9 @@
1
+ from django.contrib import admin
2
+ from django_better_admin_arrayfield.admin.mixins import DynamicArrayMixin
3
+ from wbportfolio.models import Custodian
4
+
5
+
6
+ @admin.register(Custodian)
7
+ class CustodianModelAdmin(admin.ModelAdmin, DynamicArrayMixin):
8
+ search_fields = ("name", "mapping")
9
+ list_display = ("name", "mapping", "company")
@@ -0,0 +1,127 @@
1
+ from django.contrib import admin
2
+ from wbportfolio.models import (
3
+ DailyPortfolioCashFlow,
4
+ InstrumentPortfolioThroughModel,
5
+ Portfolio,
6
+ PortfolioBankAccountThroughModel,
7
+ PortfolioCashTarget,
8
+ PortfolioPortfolioThroughModel,
9
+ PortfolioSwingPricing,
10
+ )
11
+
12
+ from .portfolio_relationships import (
13
+ PortfolioInstrumentPreferredClassificationThroughInlineModelAdmin,
14
+ )
15
+
16
+
17
+ @admin.register(PortfolioBankAccountThroughModel)
18
+ class PortfolioBankAccountThroughModelModelAdmin(admin.ModelAdmin):
19
+ autocomplete_fields = ["bank_account", "portfolio"]
20
+ list_display = ["bank_account", "portfolio", "portfolio_bank_account_type"]
21
+
22
+
23
+ class InstrumentPortfolioThroughModelAdmin(admin.TabularInline):
24
+ model = InstrumentPortfolioThroughModel
25
+ fk_name = "portfolio"
26
+ raw_id_fields = ["portfolio", "instrument"]
27
+
28
+
29
+ class PortfolioPortfolioThroughModelInlineAdmin(admin.TabularInline):
30
+ model = PortfolioPortfolioThroughModel
31
+ fk_name = "portfolio"
32
+ fields = ["dependency_portfolio", "type"]
33
+ autocomplete_fields = ["portfolio", "dependency_portfolio"]
34
+
35
+
36
+ @admin.register(PortfolioPortfolioThroughModel)
37
+ class PortfolioPortfolioThroughModelModelAdmin(admin.ModelAdmin):
38
+ list_display = ["portfolio", "dependency_portfolio", "type"]
39
+
40
+
41
+ class PortfolioBankAccountThroughModelAdmin(admin.TabularInline):
42
+ model = PortfolioBankAccountThroughModel
43
+ fields = ["bank_account", "portfolio_bank_account_type"]
44
+
45
+
46
+ @admin.register(Portfolio)
47
+ class PortfolioModelAdmin(admin.ModelAdmin):
48
+ search_fields = ("name",)
49
+
50
+ fieldsets = (
51
+ (
52
+ "Main Information",
53
+ {
54
+ "fields": (
55
+ ("name", "portfolio_synchronization", "last_synchronization"),
56
+ ("currency", "hedged_currency"),
57
+ ("invested_timespan", "is_manageable", "is_active", "is_tracked", "only_weighting"),
58
+ )
59
+ },
60
+ ),
61
+ )
62
+ readonly_fields = ["last_synchronization"]
63
+ list_display = (
64
+ "name",
65
+ "currency",
66
+ "hedged_currency",
67
+ "portfolio_synchronization",
68
+ "is_manageable",
69
+ "is_active",
70
+ "is_tracked",
71
+ )
72
+ inlines = [
73
+ PortfolioBankAccountThroughModelAdmin,
74
+ InstrumentPortfolioThroughModelAdmin,
75
+ PortfolioInstrumentPreferredClassificationThroughInlineModelAdmin,
76
+ PortfolioPortfolioThroughModelInlineAdmin,
77
+ ]
78
+ raw_id_fields = [
79
+ "portfolio_synchronization",
80
+ "depends_on",
81
+ "preferred_instrument_classifications",
82
+ "currency",
83
+ "hedged_currency",
84
+ ]
85
+ autocomplete_fields = ["currency", "hedged_currency", "portfolio_synchronization"]
86
+
87
+ def get_queryset(self, request):
88
+ return Portfolio.all_objects.all()
89
+
90
+ def update_preferred_classification_per_instrument(self, request, queryset):
91
+ for portfolio in queryset.all():
92
+ portfolio.update_preferred_classification_per_instrument()
93
+
94
+ actions = [update_preferred_classification_per_instrument]
95
+
96
+
97
+ @admin.register(DailyPortfolioCashFlow)
98
+ class DailyPortfolioCashFlowModelAdmin(admin.ModelAdmin):
99
+ autocomplete_fields = ["portfolio"]
100
+ raw_id_fields = ["import_source"]
101
+ list_display = [
102
+ "portfolio",
103
+ "value_date",
104
+ ]
105
+ readonly_fields = [
106
+ "estimated_total_assets",
107
+ "true_cash",
108
+ "true_cash_pct",
109
+ "cash_pct",
110
+ "target_cash",
111
+ "excess_cash",
112
+ "min_target_cash_pct",
113
+ "target_cash_pct",
114
+ "max_target_cash_pct",
115
+ "proposed_rebalancing",
116
+ "rebalancing",
117
+ ]
118
+
119
+
120
+ @admin.register(PortfolioCashTarget)
121
+ class PortfolioCashTargetModelAdmin(admin.ModelAdmin):
122
+ autocomplete_fields = ["portfolio"]
123
+
124
+
125
+ @admin.register(PortfolioSwingPricing)
126
+ class PortfolioSwingPricingModelAdmin(admin.ModelAdmin):
127
+ autocomplete_fields = ["portfolio"]
@@ -0,0 +1,22 @@
1
+ from django.contrib import admin
2
+ from wbportfolio.models import InstrumentPortfolioThroughModel
3
+ from wbportfolio.models.portfolio_relationship import (
4
+ PortfolioInstrumentPreferredClassificationThroughModel,
5
+ )
6
+
7
+
8
+ class PortfolioInstrumentPreferredClassificationThroughInlineModelAdmin(admin.TabularInline):
9
+ model = PortfolioInstrumentPreferredClassificationThroughModel
10
+ fk_name = "portfolio"
11
+ raw_id_fields = [
12
+ "portfolio",
13
+ "instrument",
14
+ "classification",
15
+ "classification_group",
16
+ ]
17
+
18
+
19
+ class InstrumentPortfolioThroughModelAdmin(admin.TabularInline):
20
+ model = InstrumentPortfolioThroughModel
21
+ fk_name = "instrument"
22
+ autocomplete_fields = ["portfolio"]
@@ -0,0 +1,42 @@
1
+ from django.contrib import admin
2
+ from wbfdm.admin.instruments import InstrumentModelAdmin
3
+ from wbportfolio.models import ProductGroup, ProductGroupRepresentant
4
+
5
+ from .portfolio_relationships import InstrumentPortfolioThroughModelAdmin
6
+
7
+
8
+ @admin.register(ProductGroup)
9
+ class ProductGroupAdmin(InstrumentModelAdmin):
10
+ search_fields = ("name", "currency")
11
+
12
+ autocomplete_fields = [
13
+ "management_company",
14
+ "depositary",
15
+ "transfer_agent",
16
+ "administrator",
17
+ "investment_manager",
18
+ "auditor",
19
+ "paying_agent",
20
+ "currency",
21
+ ] + InstrumentModelAdmin.autocomplete_fields
22
+
23
+ fieldsets = (
24
+ ("Instrument Information", InstrumentModelAdmin.fieldsets[0][1]),
25
+ (
26
+ "Group Information",
27
+ {
28
+ "fields": (
29
+ ("type", "category", "umbrella"),
30
+ ("management_company", "depositary", "transfer_agent", "administrator"),
31
+ ("investment_manager", "auditor", "paying_agent"),
32
+ )
33
+ },
34
+ ),
35
+ )
36
+
37
+ inlines = [InstrumentPortfolioThroughModelAdmin]
38
+
39
+
40
+ @admin.register(ProductGroupRepresentant)
41
+ class ProductGroupRepresentantModelAdmin(admin.ModelAdmin):
42
+ autocomplete_fields = ["representant"]
@@ -0,0 +1,80 @@
1
+ from django.contrib import admin
2
+ from wbfdm.admin import InstrumentModelAdmin
3
+ from wbportfolio.models import FeeProductPercentage, Product
4
+
5
+ from .roles import PortfolioRoleInline
6
+
7
+
8
+ class FeeProductPercentagTabularInline(admin.TabularInline):
9
+ model = FeeProductPercentage
10
+ fk_name = "product"
11
+ fields = [
12
+ "type",
13
+ "vat_deduction",
14
+ "percent",
15
+ "timespan",
16
+ ]
17
+
18
+
19
+ @admin.register(Product)
20
+ class ProductAdmin(InstrumentModelAdmin):
21
+ search_fields = ("name", "isin", "ticker")
22
+ list_display = ("name", "ticker", "isin", "bank", "primary_benchmark", "_is_invested")
23
+ autocomplete_fields = [
24
+ "country",
25
+ "jurisdiction",
26
+ "white_label_customers",
27
+ "bank",
28
+ "default_account",
29
+ "parent",
30
+ *InstrumentModelAdmin.autocomplete_fields,
31
+ ]
32
+ fieldsets = (
33
+ ("Instrument Information", InstrumentModelAdmin.fieldsets[0][1]),
34
+ (
35
+ "Product Information",
36
+ {
37
+ "fields": (
38
+ ("share_price", "initial_high_water_mark", "bank"),
39
+ ("termsheet", "fee_calculation"),
40
+ (
41
+ "white_label_customers",
42
+ "default_account",
43
+ "bank_account",
44
+ ),
45
+ )
46
+ },
47
+ ),
48
+ (
49
+ "Factsheet",
50
+ {
51
+ "fields": (
52
+ ("type_of_return", "asset_class", "legal_structure"),
53
+ ("investment_index", "liquidity", "risk_scale"),
54
+ (
55
+ "jurisdiction",
56
+ "dividend",
57
+ ),
58
+ ("external_webpage", "minimum_subscription", "cut_off_time"),
59
+ )
60
+ },
61
+ ),
62
+ )
63
+
64
+ inlines = [FeeProductPercentagTabularInline, PortfolioRoleInline, *InstrumentModelAdmin.inlines]
65
+ raw_id_fields = [
66
+ "country",
67
+ "jurisdiction",
68
+ "white_label_customers",
69
+ "bank",
70
+ "default_account",
71
+ "parent",
72
+ *InstrumentModelAdmin.raw_id_fields,
73
+ ]
74
+
75
+ def update_preferred_classification_per_instrument(self, request, queryset):
76
+ for product in queryset.all():
77
+ if portfolio := product.portfolio:
78
+ portfolio.update_preferred_classification_per_instrument()
79
+
80
+ actions = [update_preferred_classification_per_instrument]
@@ -0,0 +1,14 @@
1
+ from django.contrib import admin
2
+ from wbportfolio.models import AccountReconciliation, AccountReconciliationLine
3
+
4
+
5
+ class AccountReconciliationLineInline(admin.TabularInline):
6
+ model = AccountReconciliationLine
7
+ fields = ("product", "price", "price_date", "shares", "shares_external")
8
+ extra = 0
9
+
10
+
11
+ @admin.register(AccountReconciliation)
12
+ class AccountReconciliationAdmin(admin.ModelAdmin):
13
+ list_display = ("reconciliation_date", "account", "creator")
14
+ inlines = [AccountReconciliationLineInline]
@@ -0,0 +1,17 @@
1
+ from django.contrib import admin
2
+ from wbportfolio.models import Register
3
+
4
+
5
+ @admin.register(Register)
6
+ class RegisterModelAdmin(admin.ModelAdmin):
7
+ search_fields = [
8
+ "register_reference",
9
+ "register_name_1",
10
+ "register_name_2",
11
+ "custodian_reference",
12
+ "custodian_name_1",
13
+ "custodian_name_2",
14
+ "outlet_reference",
15
+ "outlet_name",
16
+ ]
17
+ list_display = ("register_reference", "global_register_reference", "register_name_1", "register_name_2")
@@ -0,0 +1,19 @@
1
+ from django.contrib import admin
2
+ from wbportfolio.models import PortfolioRole
3
+
4
+
5
+ class PortfolioRoleInline(admin.TabularInline):
6
+ model = PortfolioRole
7
+ extra = 0
8
+
9
+ autocomplete_fields = ["instrument", "person"]
10
+
11
+
12
+ @admin.register(PortfolioRole)
13
+ class PortfolioRoleAdmin(admin.ModelAdmin):
14
+ list_display = ["role_type", "instrument", "person", "start", "end"]
15
+
16
+ autocomplete_fields = [
17
+ "instrument",
18
+ "person",
19
+ ]
@@ -0,0 +1,2 @@
1
+ from .portfolio_synchronization import PortfolioSynchronizationModelAdmin
2
+ from .price_computation import PriceComputationModelAdmin
@@ -0,0 +1,114 @@
1
+ from django_celery_beat.admin import (
2
+ PeriodicTaskAdmin,
3
+ PeriodicTaskForm,
4
+ _,
5
+ loads,
6
+ messages,
7
+ pluralize,
8
+ )
9
+
10
+
11
+ class SynchronizationTaskForm(PeriodicTaskForm):
12
+ def clean(self):
13
+ return self.cleaned_data
14
+
15
+
16
+ class SynchronizationAdmin(PeriodicTaskAdmin):
17
+ form = SynchronizationTaskForm
18
+ search_fields = ("name",)
19
+ regtask = None
20
+ readonly_fields = (
21
+ "last_run_at",
22
+ # 'regtask',
23
+ "task",
24
+ "args",
25
+ # 'kwargs',
26
+ "expires",
27
+ "expire_seconds",
28
+ "queue",
29
+ "exchange",
30
+ "routing_key",
31
+ "priority",
32
+ "headers",
33
+ )
34
+ fieldsets = (
35
+ (
36
+ None,
37
+ {
38
+ "fields": (
39
+ "name",
40
+ "task",
41
+ "enabled",
42
+ "description",
43
+ ),
44
+ "classes": ("extrapretty", "wide"),
45
+ },
46
+ ),
47
+ (
48
+ "Schedule",
49
+ {
50
+ "fields": ("crontab", "start_time", "last_run_at", "one_off"),
51
+ "classes": ("extrapretty", "wide"),
52
+ },
53
+ ),
54
+ (
55
+ "Arguments",
56
+ {
57
+ "fields": ("args", "kwargs"),
58
+ "classes": ("extrapretty", "wide", "collapse", "in"),
59
+ },
60
+ ),
61
+ (
62
+ "Execution Options",
63
+ {
64
+ "fields": ("expires", "expire_seconds", "queue", "exchange", "routing_key", "priority", "headers"),
65
+ "classes": ("extrapretty", "wide", "collapse", "in"),
66
+ },
67
+ ),
68
+ )
69
+
70
+ def run_tasks(self, request, queryset):
71
+ def _load_kwargs(task):
72
+ kwargs = loads(task.kwargs)
73
+ kwargs["override_execution_datetime_validity"] = True
74
+ return kwargs
75
+
76
+ self.celery_app.loader.import_default_modules()
77
+
78
+ tasks = [
79
+ (self.celery_app.tasks.get(task.task), loads(task.args), _load_kwargs(task), task.queue)
80
+ for task in queryset
81
+ ]
82
+
83
+ if any(t[0] is None for t in tasks):
84
+ for i, t in enumerate(tasks):
85
+ if t[0] is None:
86
+ break
87
+
88
+ # variable "i" will be set because list "tasks" is not empty
89
+ not_found_task_name = queryset[i].task
90
+
91
+ self.message_user(
92
+ request,
93
+ _('task "{0}" not found'.format(not_found_task_name)),
94
+ level=messages.ERROR,
95
+ )
96
+ return
97
+
98
+ task_ids = [
99
+ task.apply_async(args=args, kwargs=kwargs, queue=queue)
100
+ if queue and len(queue)
101
+ else task.apply_async(args=args, kwargs=kwargs)
102
+ for task, args, kwargs, queue in tasks
103
+ ]
104
+ tasks_run = len(task_ids)
105
+ self.message_user(
106
+ request,
107
+ _("{0} task{1} {2} successfully run").format(
108
+ tasks_run,
109
+ pluralize(tasks_run),
110
+ pluralize(tasks_run, _("was,were")),
111
+ ),
112
+ )
113
+
114
+ run_tasks.short_description = _("Run selected tasks")
@@ -0,0 +1,18 @@
1
+ from django.contrib import admin
2
+ from wbportfolio.models import PortfolioSynchronization
3
+
4
+ from .admin import SynchronizationAdmin
5
+
6
+
7
+ @admin.register(PortfolioSynchronization)
8
+ class PortfolioSynchronizationModelAdmin(SynchronizationAdmin):
9
+ fieldsets = (
10
+ *SynchronizationAdmin.fieldsets,
11
+ (
12
+ "Synchronization",
13
+ {
14
+ "fields": ("import_path", "dependent_task", "is_automatic_validation"),
15
+ "classes": ("extrapretty", "wide"),
16
+ },
17
+ ),
18
+ )
@@ -0,0 +1,21 @@
1
+ from django.contrib import admin
2
+ from wbportfolio.models import PriceComputation
3
+
4
+ from .admin import SynchronizationAdmin
5
+
6
+
7
+ @admin.register(PriceComputation)
8
+ class PriceComputationModelAdmin(SynchronizationAdmin):
9
+ fieldsets = (
10
+ *SynchronizationAdmin.fieldsets,
11
+ (
12
+ "Synchronization",
13
+ {
14
+ "fields": (
15
+ "import_path",
16
+ "dependent_task",
17
+ ),
18
+ "classes": ("extrapretty", "wide"),
19
+ },
20
+ ),
21
+ )
@@ -0,0 +1,5 @@
1
+ from .transactions import TransactionModelAdmin # isort:skip
2
+ from .claim import ClaimModelAdmin
3
+ from .dividends import DividendAdmin
4
+ from .fees import FeesAdmin
5
+ from .trades import TradeAdmin
@@ -0,0 +1,16 @@
1
+ from django.contrib import admin
2
+ from wbportfolio.models.transactions.claim import Claim
3
+
4
+
5
+ class ClaimTabularInline(admin.TabularInline):
6
+ extra = 0
7
+ model = Claim
8
+ list_display = ["reference_id", "product", "shares", "nominal_value", "claimant"]
9
+ autocomplete_fields = ["account", "product", "claimant"]
10
+
11
+
12
+ @admin.register(Claim)
13
+ class ClaimModelAdmin(admin.ModelAdmin):
14
+ list_display = ["date", "reference_id", "product", "account", "shares", "nominal_value"]
15
+ autocomplete_fields = ["account", "product", "claimant"]
16
+ raw_id_fields = ["trade", "account", "product", "claimant", "creator"]
@@ -0,0 +1,14 @@
1
+ from django.contrib import admin
2
+ from wbportfolio.admin.transactions import TransactionModelAdmin
3
+ from wbportfolio.models import DividendTransaction
4
+
5
+
6
+ @admin.register(DividendTransaction)
7
+ class DividendAdmin(TransactionModelAdmin):
8
+ fieldsets = (
9
+ ("Transactions Information", TransactionModelAdmin.fieldsets[0][1]),
10
+ (
11
+ "Dividend Information",
12
+ {"fields": (("retrocession",),)},
13
+ ),
14
+ )
@@ -0,0 +1,35 @@
1
+ from django.contrib import admin
2
+ from django.db.models import Prefetch
3
+ from wbportfolio.admin.transactions import TransactionModelAdmin
4
+ from wbportfolio.models import Fees, Portfolio
5
+ from wbportfolio.models.transactions.fees import FeeCalculation
6
+
7
+
8
+ @admin.register(Fees)
9
+ class FeesAdmin(TransactionModelAdmin):
10
+ list_filter = [*TransactionModelAdmin.list_filter, "linked_product"]
11
+ list_display = ["transaction_subtype", *TransactionModelAdmin.list_display[1:], "calculated"]
12
+ fieldsets = (
13
+ ("Transaction Information", TransactionModelAdmin.fieldsets[0][1]),
14
+ ("Fees Information", {"fields": (("transaction_subtype", "calculated", "linked_product"),)}),
15
+ )
16
+ autocomplete_fields = [*TransactionModelAdmin.autocomplete_fields, "linked_product"]
17
+
18
+ def get_queryset(self, request):
19
+ return (
20
+ super()
21
+ .get_queryset(request)
22
+ .prefetch_related(Prefetch("portfolio", queryset=Portfolio.objects.all().only("id", "name")))
23
+ )
24
+
25
+ def calculate(self, request, queryset):
26
+ for fees in queryset:
27
+ fees.calculate_as_task.delay(fees)
28
+
29
+ calculate.short_description = "Recalculate selected Fees"
30
+ actions = [calculate]
31
+
32
+
33
+ @admin.register(FeeCalculation)
34
+ class FeeCalculationModelAdmin(admin.ModelAdmin):
35
+ search_fields = ("name",)