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,3836 @@
1
+ # Generated by Django 4.1.7 on 2023-04-19 06:07
2
+
3
+ from decimal import Decimal
4
+
5
+ import django.contrib.postgres.fields
6
+ import django.contrib.postgres.fields.ranges
7
+ import django.core.validators
8
+ import django.db.models.deletion
9
+ import django.utils.timezone
10
+ import django_better_admin_arrayfield.models.fields
11
+ import django_fsm
12
+ import wbcore.models.fields
13
+ from django.db import migrations, models
14
+
15
+
16
+ class Migration(migrations.Migration):
17
+ dependencies = [
18
+ ("tags", "0001_initial"),
19
+ ("currency", "0001_initial"),
20
+ ("wbportfolio", "0001_initial_squashed"),
21
+ ("geography", "0001_initial"),
22
+ ("io", "0001_initial_squashed"),
23
+ ("directory", "0001_initial"),
24
+ ("contenttypes", "0002_remove_content_type_name"),
25
+ ("wbcore", "0001_initial_squashed_squashed_0010_preset_appliedpreset"),
26
+ ]
27
+
28
+ operations = [
29
+ migrations.AlterField(
30
+ model_name="product",
31
+ name="termsheet",
32
+ field=models.FileField(blank=True, max_length=256, null=True, upload_to="portfolio/product/termsheets"),
33
+ ),
34
+ migrations.AddField(
35
+ model_name="portfolio",
36
+ name="active",
37
+ field=models.BooleanField(default=True),
38
+ ),
39
+ migrations.AddField(
40
+ model_name="classification",
41
+ name="analyst_view",
42
+ field=models.IntegerField(
43
+ blank=True, choices=[(-1, "Negative"), (0, "Neutral"), (1, "Positive")], null=True
44
+ ),
45
+ ),
46
+ migrations.AddField(
47
+ model_name="classification",
48
+ name="macro_long_term",
49
+ field=models.IntegerField(
50
+ blank=True,
51
+ choices=[
52
+ (-2, "Very Negative"),
53
+ (-1, "Negative"),
54
+ (0, "Neutral"),
55
+ (1, "Positive"),
56
+ (2, "Very Positive"),
57
+ ],
58
+ null=True,
59
+ ),
60
+ ),
61
+ migrations.AddField(
62
+ model_name="classification",
63
+ name="macro_medium_term",
64
+ field=models.IntegerField(
65
+ blank=True,
66
+ choices=[
67
+ (-2, "Very Negative"),
68
+ (-1, "Negative"),
69
+ (0, "Neutral"),
70
+ (1, "Positive"),
71
+ (2, "Very Positive"),
72
+ ],
73
+ null=True,
74
+ ),
75
+ ),
76
+ migrations.AddField(
77
+ model_name="classification",
78
+ name="macro_short_term",
79
+ field=models.IntegerField(
80
+ blank=True,
81
+ choices=[
82
+ (-2, "Very Negative"),
83
+ (-1, "Negative"),
84
+ (0, "Neutral"),
85
+ (1, "Positive"),
86
+ (2, "Very Positive"),
87
+ ],
88
+ null=True,
89
+ ),
90
+ ),
91
+ migrations.AddField(
92
+ model_name="instrumentclassificationthroughmodel",
93
+ name="tag_detail_endpoint",
94
+ field=models.CharField(blank=True, max_length=255, null=True),
95
+ ),
96
+ migrations.AddField(
97
+ model_name="instrumentclassificationthroughmodel",
98
+ name="tag_representation",
99
+ field=models.CharField(blank=True, max_length=255, null=True),
100
+ ),
101
+ migrations.RenameModel(
102
+ old_name="FiscalQuarterPeriod",
103
+ new_name="FiscalPeriod",
104
+ ),
105
+ migrations.RemoveIndex(
106
+ model_name="fundamental",
107
+ name="fundamental_idx",
108
+ ),
109
+ migrations.RemoveIndex(
110
+ model_name="geographicsegment",
111
+ name="geographic_segment_idx",
112
+ ),
113
+ migrations.RemoveIndex(
114
+ model_name="fiscalperiod",
115
+ name="fiscal_period_idx",
116
+ ),
117
+ migrations.AddField(
118
+ model_name="fundamental",
119
+ name="computed_str",
120
+ field=models.CharField(blank=True, max_length=512, null=True),
121
+ ),
122
+ migrations.AddField(
123
+ model_name="geographicsegment",
124
+ name="computed_str",
125
+ field=models.CharField(blank=True, max_length=512, null=True),
126
+ ),
127
+ migrations.AlterUniqueTogether(
128
+ name="fundamental",
129
+ unique_together=set(),
130
+ ),
131
+ migrations.AlterUniqueTogether(
132
+ name="geographicsegment",
133
+ unique_together=set(),
134
+ ),
135
+ migrations.AddField(
136
+ model_name="fundamental",
137
+ name="period",
138
+ field=models.ForeignKey(
139
+ blank=True,
140
+ null=True,
141
+ on_delete=django.db.models.deletion.CASCADE,
142
+ related_name="%(class)s",
143
+ to="wbportfolio.fiscalperiod",
144
+ ),
145
+ preserve_default=False,
146
+ ),
147
+ migrations.AddField(
148
+ model_name="geographicsegment",
149
+ name="period",
150
+ field=models.ForeignKey(
151
+ blank=True,
152
+ null=True,
153
+ on_delete=django.db.models.deletion.CASCADE,
154
+ related_name="%(class)s",
155
+ to="wbportfolio.fiscalperiod",
156
+ ),
157
+ preserve_default=False,
158
+ ),
159
+ migrations.AddIndex(
160
+ model_name="fundamental",
161
+ index=models.Index(fields=["instrument", "period"], name="fundamental_idx"),
162
+ ),
163
+ migrations.AddIndex(
164
+ model_name="geographicsegment",
165
+ index=models.Index(fields=["instrument", "period"], name="geographic_segment_idx"),
166
+ ),
167
+ migrations.AlterField(
168
+ model_name="instrument",
169
+ name="last_fiscal_quarterly_period",
170
+ field=models.OneToOneField(
171
+ blank=True,
172
+ null=True,
173
+ on_delete=django.db.models.deletion.SET_NULL,
174
+ related_name="last_of_instrument",
175
+ to="wbportfolio.fiscalperiod",
176
+ verbose_name="Last Fiscal Quarterly Period",
177
+ ),
178
+ ),
179
+ migrations.AlterUniqueTogether(
180
+ name="fundamental",
181
+ unique_together={("instrument", "period")},
182
+ ),
183
+ migrations.AlterUniqueTogether(
184
+ name="geographicsegment",
185
+ unique_together={("instrument", "period", "level", "field")},
186
+ ),
187
+ migrations.RenameField(
188
+ model_name="fiscalperiod",
189
+ old_name="fiscal_quarter_end_date",
190
+ new_name="period_end_date",
191
+ ),
192
+ migrations.RenameField(
193
+ model_name="fiscalperiod",
194
+ old_name="fiscal_quarter",
195
+ new_name="quarter",
196
+ ),
197
+ migrations.RenameField(
198
+ model_name="fiscalperiod",
199
+ old_name="fiscal_year",
200
+ new_name="year",
201
+ ),
202
+ migrations.RenameField(
203
+ model_name="fiscalperiod",
204
+ old_name="fiscal_year_end_date",
205
+ new_name="year_end_date",
206
+ ),
207
+ migrations.AlterUniqueTogether(
208
+ name="fiscalperiod",
209
+ unique_together=set(),
210
+ ),
211
+ migrations.AddField(
212
+ model_name="fiscalperiod",
213
+ name="computed_str",
214
+ field=models.CharField(blank=True, max_length=512, null=True),
215
+ ),
216
+ migrations.AddField(
217
+ model_name="fiscalperiod",
218
+ name="date_range",
219
+ field=django.contrib.postgres.fields.ranges.DateRangeField(blank=True, null=True),
220
+ preserve_default=False,
221
+ ),
222
+ migrations.AlterField(
223
+ model_name="fiscalperiod",
224
+ name="instrument",
225
+ field=models.ForeignKey(
226
+ on_delete=django.db.models.deletion.CASCADE, related_name="fiscal_periods", to="wbportfolio.instrument"
227
+ ),
228
+ ),
229
+ migrations.AlterUniqueTogether(
230
+ name="fiscalperiod",
231
+ unique_together={("instrument", "year", "quarter")},
232
+ ),
233
+ migrations.AddIndex(
234
+ model_name="fiscalperiod",
235
+ index=models.Index(fields=["instrument", "quarter", "year"], name="fiscal_period_idx"),
236
+ ),
237
+ migrations.RemoveIndex(
238
+ model_name="fiscalperiod",
239
+ name="fiscal_period_idx",
240
+ ),
241
+ migrations.RemoveField(
242
+ model_name="fundamental",
243
+ name="date_range",
244
+ ),
245
+ migrations.RemoveField(
246
+ model_name="fundamental",
247
+ name="fiscal_quarter",
248
+ ),
249
+ migrations.RemoveField(
250
+ model_name="fundamental",
251
+ name="fiscal_year",
252
+ ),
253
+ migrations.RemoveField(
254
+ model_name="geographicsegment",
255
+ name="date_range",
256
+ ),
257
+ migrations.RemoveField(
258
+ model_name="geographicsegment",
259
+ name="fiscal_quarter",
260
+ ),
261
+ migrations.RemoveField(
262
+ model_name="geographicsegment",
263
+ name="fiscal_year",
264
+ ),
265
+ migrations.AlterField(
266
+ model_name="fundamental",
267
+ name="period",
268
+ field=models.ForeignKey(
269
+ default=None,
270
+ on_delete=django.db.models.deletion.CASCADE,
271
+ related_name="%(class)s",
272
+ to="wbportfolio.fiscalperiod",
273
+ ),
274
+ preserve_default=False,
275
+ ),
276
+ migrations.AlterField(
277
+ model_name="geographicsegment",
278
+ name="period",
279
+ field=models.ForeignKey(
280
+ default=None,
281
+ on_delete=django.db.models.deletion.CASCADE,
282
+ related_name="%(class)s",
283
+ to="wbportfolio.fiscalperiod",
284
+ ),
285
+ preserve_default=False,
286
+ ),
287
+ migrations.AlterField(
288
+ model_name="fiscalperiod",
289
+ name="date_range",
290
+ field=django.contrib.postgres.fields.ranges.DateRangeField(default=None),
291
+ preserve_default=False,
292
+ ),
293
+ migrations.AlterField(
294
+ model_name="instrument",
295
+ name="tag_representation",
296
+ field=models.CharField(blank=True, max_length=512, null=True),
297
+ ),
298
+ migrations.AlterField(
299
+ model_name="instrumentclassificationthroughmodel",
300
+ name="tag_representation",
301
+ field=models.CharField(blank=True, max_length=512, null=True),
302
+ ),
303
+ migrations.AddIndex(
304
+ model_name="fiscalperiod",
305
+ index=models.Index(fields=["instrument", "quarter", "year"], name="fiscal_period_idx"),
306
+ ),
307
+ migrations.RenameField(
308
+ model_name="portfolio",
309
+ old_name="active",
310
+ new_name="is_active",
311
+ ),
312
+ migrations.AddField(
313
+ model_name="portfolio",
314
+ name="deletion_datetime",
315
+ field=models.DateTimeField(blank=True, null=True),
316
+ ),
317
+ migrations.AddField(
318
+ model_name="classification",
319
+ name="investable",
320
+ field=models.BooleanField(default=True, help_text="Is this classification investable for us?"),
321
+ ),
322
+ migrations.CreateModel(
323
+ name="ThemeReviewTemplate",
324
+ fields=[
325
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
326
+ (
327
+ "name",
328
+ models.CharField(
329
+ default="", help_text="The name of the template.", max_length=32, verbose_name="Name"
330
+ ),
331
+ ),
332
+ (
333
+ "template_path",
334
+ models.CharField(blank=True, max_length=512, null=True, verbose_name="Template Path"),
335
+ ),
336
+ ("context_path", models.CharField(blank=True, max_length=512, null=True, verbose_name="Context Path")),
337
+ (
338
+ "internal_employee",
339
+ models.BooleanField(
340
+ default=True, help_text="A marker to know if the template is available for internal employees."
341
+ ),
342
+ ),
343
+ ],
344
+ options={
345
+ "verbose_name": "Theme Review Template",
346
+ "verbose_name_plural": "Theme Review Templates",
347
+ },
348
+ ),
349
+ migrations.CreateModel(
350
+ name="ListElementResearch",
351
+ fields=[
352
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
353
+ (
354
+ "title",
355
+ models.CharField(help_text="Title - Maximum 255 character)", max_length=255, verbose_name="Title"),
356
+ ),
357
+ ("description", models.TextField(blank=True, default="", verbose_name="Description")),
358
+ ],
359
+ options={
360
+ "verbose_name": "List Element Research",
361
+ "verbose_name_plural": "List Element Researches",
362
+ },
363
+ ),
364
+ migrations.CreateModel(
365
+ name="ReferenceResearch",
366
+ fields=[
367
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
368
+ (
369
+ "title",
370
+ models.CharField(help_text="Title - Maximum 255 character)", max_length=255, verbose_name="Title"),
371
+ ),
372
+ (
373
+ "reference_type",
374
+ models.CharField(
375
+ choices=[
376
+ ("ARTICLE", "Article"),
377
+ ("BOOK", "Book"),
378
+ ("CONFERENCE", "Conference"),
379
+ ("JOURNAL", "Journal"),
380
+ ("REPORT", "Report"),
381
+ ("WEBSITE", "Website"),
382
+ ("OTHER", "Other"),
383
+ ],
384
+ default="ARTICLE",
385
+ max_length=16,
386
+ verbose_name="Type of source",
387
+ ),
388
+ ),
389
+ ("source", models.CharField(blank=True, default="", max_length=256, verbose_name="Source")),
390
+ ("date", models.DateField(blank=True, null=True)),
391
+ ("url", models.URLField(blank=True, default="", max_length=2048, null=True, verbose_name="URL")),
392
+ ],
393
+ options={
394
+ "verbose_name": "Reference Research",
395
+ "verbose_name_plural": "Reference Researches",
396
+ },
397
+ ),
398
+ migrations.CreateModel(
399
+ name="RelationshipResearch",
400
+ fields=[
401
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
402
+ (
403
+ "relationship_type",
404
+ models.CharField(
405
+ choices=[("KOL", "KOL"), ("ACADEMIC", "Academic"), ("COMPANY", "Company"), ("OTHER", "Other")],
406
+ default="KOL",
407
+ max_length=32,
408
+ verbose_name="Relationship Type",
409
+ ),
410
+ ),
411
+ ],
412
+ options={
413
+ "verbose_name": "Relationship Research",
414
+ "verbose_name_plural": "Relationship Researches",
415
+ },
416
+ ),
417
+ migrations.CreateModel(
418
+ name="Research",
419
+ fields=[
420
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
421
+ ("computed_str", models.CharField(blank=True, max_length=512, null=True)),
422
+ (
423
+ "research_type",
424
+ models.CharField(
425
+ choices=[
426
+ ("ONE_TEXT", "One Sentence"),
427
+ ("TWO_TEXT", "Two Sentence"),
428
+ ("SWOT", "SWOT"),
429
+ ("OUTLOOK", "Outlook"),
430
+ ("PORTER_FIVE", "Porter Five"),
431
+ ("LIST_RESEARCH", "List Research"),
432
+ ("RELATIONSHIP", "Relationship"),
433
+ ("REFERENCE", "Reference"),
434
+ ("TIMELINE", "Timeline"),
435
+ ],
436
+ default="ONE_TEXT",
437
+ max_length=32,
438
+ verbose_name="Type",
439
+ ),
440
+ ),
441
+ ("preview", models.TextField(blank=True, null=True)),
442
+ ("iteration", models.PositiveIntegerField(default=0)),
443
+ ("object_id", models.PositiveIntegerField(blank=True, null=True)),
444
+ ],
445
+ ),
446
+ migrations.CreateModel(
447
+ name="ResearchTopic",
448
+ fields=[
449
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
450
+ (
451
+ "research_type",
452
+ models.CharField(
453
+ choices=[
454
+ ("ONE_TEXT", "One Sentence"),
455
+ ("TWO_TEXT", "Two Sentence"),
456
+ ("SWOT", "SWOT"),
457
+ ("OUTLOOK", "Outlook"),
458
+ ("PORTER_FIVE", "Porter Five"),
459
+ ("LIST_RESEARCH", "List Research"),
460
+ ("RELATIONSHIP", "Relationship"),
461
+ ("REFERENCE", "Reference"),
462
+ ("TIMELINE", "Timeline"),
463
+ ],
464
+ default="ONE_TEXT",
465
+ max_length=32,
466
+ verbose_name="Research Type",
467
+ ),
468
+ ),
469
+ (
470
+ "allowed_model",
471
+ models.CharField(
472
+ choices=[("classification", "Classification"), ("instrument", "Instrument")],
473
+ default="classification",
474
+ max_length=32,
475
+ verbose_name="Type",
476
+ ),
477
+ ),
478
+ ("name", models.CharField(max_length=255, unique=True, verbose_name="Name")),
479
+ ("iteration", models.PositiveIntegerField(blank=True, null=True, verbose_name="Iteration")),
480
+ ("guideline", models.TextField(blank=True, default="")),
481
+ ],
482
+ options={
483
+ "verbose_name": "Research Topic",
484
+ "verbose_name_plural": "Research Topics",
485
+ },
486
+ ),
487
+ migrations.CreateModel(
488
+ name="ResearchTopicRelationship",
489
+ fields=[
490
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
491
+ ("object_id", models.PositiveIntegerField(blank=True, null=True)),
492
+ ],
493
+ ),
494
+ migrations.CreateModel(
495
+ name="ResearchTemplate",
496
+ fields=[
497
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
498
+ ("template_path", models.CharField(max_length=256, verbose_name="Template Path")),
499
+ ("name", models.CharField(max_length=256, verbose_name="Name")),
500
+ ("parameters", models.JSONField(blank=True, default=dict, null=True)),
501
+ ],
502
+ ),
503
+ migrations.CreateModel(
504
+ name="TimelineResearch",
505
+ fields=[
506
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
507
+ ("date", models.DateField(blank=True, null=True, verbose_name="Date")),
508
+ (
509
+ "text",
510
+ models.TextField(
511
+ blank=True,
512
+ default="",
513
+ help_text="Give some context and why now it is the 'right' time from a historical perspective.",
514
+ verbose_name="Text",
515
+ ),
516
+ ),
517
+ ("year", models.IntegerField(blank=True, null=True, verbose_name="Year")),
518
+ ],
519
+ options={
520
+ "verbose_name": "Timeline Research",
521
+ "verbose_name_plural": "Timeline Researches",
522
+ },
523
+ ),
524
+ migrations.AddField(
525
+ model_name="classification",
526
+ name="description",
527
+ field=models.TextField(
528
+ blank=True,
529
+ default="",
530
+ help_text="Give a basic definition and description",
531
+ verbose_name="Definition/Description",
532
+ ),
533
+ ),
534
+ migrations.AddField(
535
+ model_name="instrumentclassificationthroughmodel",
536
+ name="pure_player",
537
+ field=models.BooleanField(default=False, help_text="Pure Players Companies", verbose_name="Pure Player"),
538
+ ),
539
+ migrations.AddField(
540
+ model_name="instrumentclassificationthroughmodel",
541
+ name="reason",
542
+ field=models.TextField(blank=True, default="", verbose_name="Reason for the choice"),
543
+ ),
544
+ migrations.AddField(
545
+ model_name="instrumentclassificationthroughmodel",
546
+ name="top_player",
547
+ field=models.BooleanField(default=False, help_text="Top Players Companies", verbose_name="Top Player"),
548
+ ),
549
+ migrations.AddConstraint(
550
+ model_name="instrumentclassificationthroughmodel",
551
+ constraint=models.UniqueConstraint(
552
+ fields=("instrument", "classification"), name="unique_classifiedinstrument"
553
+ ),
554
+ ),
555
+ migrations.CreateModel(
556
+ name="ListResearch",
557
+ fields=[
558
+ (
559
+ "research_ptr",
560
+ models.OneToOneField(
561
+ auto_created=True,
562
+ on_delete=django.db.models.deletion.CASCADE,
563
+ parent_link=True,
564
+ primary_key=True,
565
+ serialize=False,
566
+ to="wbportfolio.research",
567
+ ),
568
+ ),
569
+ (
570
+ "summary",
571
+ models.TextField(blank=True, default="", verbose_name="Bottom Line (Maximum 1000 characters)"),
572
+ ),
573
+ ],
574
+ options={
575
+ "verbose_name": "List Research",
576
+ "verbose_name_plural": "List Researches",
577
+ },
578
+ bases=("wbportfolio.research",),
579
+ ),
580
+ migrations.CreateModel(
581
+ name="OneTextBoxResearch",
582
+ fields=[
583
+ (
584
+ "research_ptr",
585
+ models.OneToOneField(
586
+ auto_created=True,
587
+ on_delete=django.db.models.deletion.CASCADE,
588
+ parent_link=True,
589
+ primary_key=True,
590
+ serialize=False,
591
+ to="wbportfolio.research",
592
+ ),
593
+ ),
594
+ ("text", models.TextField(blank=True, default="", verbose_name="Text")),
595
+ ],
596
+ options={
597
+ "verbose_name": "One TextBox Research",
598
+ "verbose_name_plural": "One TextBox Researches",
599
+ },
600
+ bases=("wbportfolio.research",),
601
+ ),
602
+ migrations.CreateModel(
603
+ name="OutlookResearch",
604
+ fields=[
605
+ (
606
+ "research_ptr",
607
+ models.OneToOneField(
608
+ auto_created=True,
609
+ on_delete=django.db.models.deletion.CASCADE,
610
+ parent_link=True,
611
+ primary_key=True,
612
+ serialize=False,
613
+ to="wbportfolio.research",
614
+ ),
615
+ ),
616
+ (
617
+ "short_term",
618
+ models.TextField(
619
+ blank=True,
620
+ default="",
621
+ help_text="What to watch for the future. Think forward and give several possible outcomes of the overall theme/scenarios) state of the theme. What is the possible addressable market for each period? What (and why) are the possible (and prevailing) technologies/products that we would see in the future? What (and why) are the technologies/products likely to command the highest market share?",
622
+ verbose_name="Short Term (up to 2 years)",
623
+ ),
624
+ ),
625
+ (
626
+ "medium_term",
627
+ models.TextField(
628
+ blank=True,
629
+ default="",
630
+ help_text="What to watch for the future. Think forward and give several possible outcomes of the overall theme/scenarios) state of the theme. What is the possible addressable market for each period? What (and why) are the possible (and prevailing) technologies/products that we would see in the future? What (and why) are the technologies/products likely to command the highest market share?",
631
+ verbose_name="Medium Term (from 3 to 5 years)",
632
+ ),
633
+ ),
634
+ (
635
+ "long_term",
636
+ models.TextField(
637
+ blank=True,
638
+ default="",
639
+ help_text="What to watch for the future. Think forward and give several possible outcomes of the overall theme/scenarios) state of the theme. What is the possible addressable market for each period? What (and why) are the possible (and prevailing) technologies/products that we would see in the future? What (and why) are the technologies/products likely to command the highest market share?",
640
+ verbose_name="Long Term (from 5 to 10 years)",
641
+ ),
642
+ ),
643
+ (
644
+ "very_long_term",
645
+ models.TextField(
646
+ blank=True,
647
+ default="",
648
+ help_text="What to watch for the future. Think forward and give several possible outcomes of the overall theme/scenarios) state of the theme. What is the possible addressable market for each period? What (and why) are the possible (and prevailing) technologies/products that we would see in the future? What (and why) are the technologies/products likely to command the highest market share?",
649
+ verbose_name="Very long Term scenario thinking (15 to 30 years)",
650
+ ),
651
+ ),
652
+ (
653
+ "summary",
654
+ models.TextField(
655
+ blank=True, default="", verbose_name="Outlook Bottom Line (Maximum 1000 characters)"
656
+ ),
657
+ ),
658
+ ],
659
+ options={
660
+ "verbose_name": "Outlook Research",
661
+ "verbose_name_plural": "Outlook Researches",
662
+ },
663
+ bases=("wbportfolio.research",),
664
+ ),
665
+ migrations.CreateModel(
666
+ name="PorterFiveResearch",
667
+ fields=[
668
+ (
669
+ "research_ptr",
670
+ models.OneToOneField(
671
+ auto_created=True,
672
+ on_delete=django.db.models.deletion.CASCADE,
673
+ parent_link=True,
674
+ primary_key=True,
675
+ serialize=False,
676
+ to="wbportfolio.research",
677
+ ),
678
+ ),
679
+ (
680
+ "rivalry_competitors",
681
+ models.TextField(blank=True, default="", verbose_name="Rivalry among existing competitors"),
682
+ ),
683
+ (
684
+ "power_suppliers",
685
+ models.TextField(blank=True, default="", verbose_name="Bargaining power of suppliers"),
686
+ ),
687
+ (
688
+ "threat_new_entrants",
689
+ models.TextField(blank=True, default="", verbose_name="Threat of new entrants"),
690
+ ),
691
+ ("power_buyers", models.TextField(blank=True, default="", verbose_name="Bargaining power of buyers")),
692
+ (
693
+ "threat_substitutes",
694
+ models.TextField(
695
+ blank=True,
696
+ default="",
697
+ verbose_name="Threat of substitute products (can be expanded with a sixth force: role of complementors).",
698
+ ),
699
+ ),
700
+ (
701
+ "summary",
702
+ models.TextField(blank=True, default="", verbose_name="Bottom Line (Maximum 1000 characters)"),
703
+ ),
704
+ ],
705
+ options={
706
+ "verbose_name": "Porter Five Research",
707
+ "verbose_name_plural": "Porter Five Researches",
708
+ },
709
+ bases=("wbportfolio.research",),
710
+ ),
711
+ migrations.CreateModel(
712
+ name="SWOTResearch",
713
+ fields=[
714
+ (
715
+ "research_ptr",
716
+ models.OneToOneField(
717
+ auto_created=True,
718
+ on_delete=django.db.models.deletion.CASCADE,
719
+ parent_link=True,
720
+ primary_key=True,
721
+ serialize=False,
722
+ to="wbportfolio.research",
723
+ ),
724
+ ),
725
+ (
726
+ "strengths",
727
+ models.TextField(
728
+ blank=True,
729
+ default="",
730
+ help_text="Describe the strengths for the theme/subtheme.",
731
+ verbose_name="Strengths",
732
+ ),
733
+ ),
734
+ (
735
+ "weaknesses",
736
+ models.TextField(
737
+ blank=True,
738
+ default="",
739
+ help_text="Describe the weaknesses for the theme/subtheme.",
740
+ verbose_name="Weaknesses",
741
+ ),
742
+ ),
743
+ (
744
+ "opportunities",
745
+ models.TextField(
746
+ blank=True,
747
+ default="",
748
+ help_text="Describe the opportunities for the theme/subtheme.",
749
+ verbose_name="Opportunities",
750
+ ),
751
+ ),
752
+ (
753
+ "threats",
754
+ models.TextField(
755
+ blank=True,
756
+ default="",
757
+ help_text="Describe the threats for the theme/subtheme.",
758
+ verbose_name="Threats",
759
+ ),
760
+ ),
761
+ (
762
+ "summary",
763
+ models.TextField(blank=True, default="", verbose_name="Bottom Line (Maximum 1000 characters)"),
764
+ ),
765
+ ],
766
+ options={
767
+ "verbose_name": "SWOT Research",
768
+ "verbose_name_plural": "SWOT Researches",
769
+ },
770
+ bases=("wbportfolio.research",),
771
+ ),
772
+ migrations.CreateModel(
773
+ name="TwoTextBoxResearch",
774
+ fields=[
775
+ (
776
+ "research_ptr",
777
+ models.OneToOneField(
778
+ auto_created=True,
779
+ on_delete=django.db.models.deletion.CASCADE,
780
+ parent_link=True,
781
+ primary_key=True,
782
+ serialize=False,
783
+ to="wbportfolio.research",
784
+ ),
785
+ ),
786
+ ("text", models.TextField(blank=True, default="", verbose_name="Text")),
787
+ ("summary", models.TextField(blank=True, default="", verbose_name="Summary")),
788
+ ],
789
+ options={
790
+ "verbose_name": "Two TextBox Research",
791
+ "verbose_name_plural": "Two TextBox Researches",
792
+ },
793
+ bases=("wbportfolio.research",),
794
+ ),
795
+ migrations.AddField(
796
+ model_name="researchtemplate",
797
+ name="content_type",
798
+ field=models.OneToOneField(
799
+ blank=True,
800
+ null=True,
801
+ on_delete=django.db.models.deletion.CASCADE,
802
+ related_name="researche_templates",
803
+ to="contenttypes.contenttype",
804
+ ),
805
+ ),
806
+ migrations.AddField(
807
+ model_name="researchtopicrelationship",
808
+ name="topic",
809
+ field=models.ForeignKey(
810
+ on_delete=django.db.models.deletion.CASCADE,
811
+ related_name="relationships",
812
+ to="wbportfolio.researchtopic",
813
+ verbose_name="Relationship",
814
+ ),
815
+ ),
816
+ migrations.AddField(
817
+ model_name="researchtopicrelationship",
818
+ name="object_repr",
819
+ field=models.CharField(blank=True, max_length=512, null=True),
820
+ ),
821
+ migrations.AddField(
822
+ model_name="researchtopicrelationship",
823
+ name="content_type",
824
+ field=models.ForeignKey(
825
+ blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="contenttypes.contenttype"
826
+ ),
827
+ ),
828
+ migrations.AddField(
829
+ model_name="research",
830
+ name="content_type",
831
+ field=models.ForeignKey(
832
+ blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to="contenttypes.contenttype"
833
+ ),
834
+ ),
835
+ migrations.AddField(
836
+ model_name="research",
837
+ name="research_topic",
838
+ field=models.ForeignKey(
839
+ on_delete=django.db.models.deletion.PROTECT,
840
+ related_name="researches",
841
+ to="wbportfolio.researchtopic",
842
+ verbose_name="Research Topic",
843
+ ),
844
+ ),
845
+ migrations.AddField(
846
+ model_name="timelineresearch",
847
+ name="list_research",
848
+ field=models.ForeignKey(
849
+ on_delete=django.db.models.deletion.CASCADE,
850
+ related_name="related_timelines",
851
+ to="wbportfolio.listresearch",
852
+ verbose_name="List Research",
853
+ ),
854
+ ),
855
+ migrations.AddIndex(
856
+ model_name="research",
857
+ index=models.Index(
858
+ fields=["research_type", "research_topic", "content_type", "object_id", "iteration"],
859
+ name="research_idx",
860
+ ),
861
+ ),
862
+ migrations.AlterUniqueTogether(
863
+ name="research",
864
+ unique_together={("research_type", "research_topic", "content_type", "object_id", "iteration")},
865
+ ),
866
+ migrations.AddField(
867
+ model_name="relationshipresearch",
868
+ name="list_research",
869
+ field=models.ForeignKey(
870
+ on_delete=django.db.models.deletion.CASCADE,
871
+ related_name="related_relationships",
872
+ to="wbportfolio.listresearch",
873
+ verbose_name="List Research",
874
+ ),
875
+ ),
876
+ migrations.AddField(
877
+ model_name="referenceresearch",
878
+ name="list_research",
879
+ field=models.ForeignKey(
880
+ on_delete=django.db.models.deletion.CASCADE,
881
+ related_name="related_references",
882
+ to="wbportfolio.listresearch",
883
+ verbose_name="List Research",
884
+ ),
885
+ ),
886
+ migrations.AddField(
887
+ model_name="listelementresearch",
888
+ name="list_research",
889
+ field=models.ForeignKey(
890
+ on_delete=django.db.models.deletion.CASCADE,
891
+ related_name="related_list_research",
892
+ to="wbportfolio.listresearch",
893
+ verbose_name="List Research",
894
+ ),
895
+ ),
896
+ migrations.AlterField(
897
+ model_name="research",
898
+ name="research_type",
899
+ field=models.CharField(
900
+ choices=[
901
+ ("ONE_TEXT", "One Sentence"),
902
+ ("TWO_TEXT", "Two Sentences"),
903
+ ("SWOT", "SWOT"),
904
+ ("OUTLOOK", "Outlook"),
905
+ ("PORTER_FIVE", "Porter Five"),
906
+ ("LIST_RESEARCH", "List Research"),
907
+ ("RELATIONSHIP", "Relationship"),
908
+ ("REFERENCE", "Reference"),
909
+ ("TIMELINE", "Timeline"),
910
+ ],
911
+ default="ONE_TEXT",
912
+ max_length=32,
913
+ verbose_name="Type",
914
+ ),
915
+ ),
916
+ migrations.AlterField(
917
+ model_name="researchtopic",
918
+ name="research_type",
919
+ field=models.CharField(
920
+ choices=[
921
+ ("ONE_TEXT", "One Sentence"),
922
+ ("TWO_TEXT", "Two Sentences"),
923
+ ("SWOT", "SWOT"),
924
+ ("OUTLOOK", "Outlook"),
925
+ ("PORTER_FIVE", "Porter Five"),
926
+ ("LIST_RESEARCH", "List Research"),
927
+ ("RELATIONSHIP", "Relationship"),
928
+ ("REFERENCE", "Reference"),
929
+ ("TIMELINE", "Timeline"),
930
+ ],
931
+ default="ONE_TEXT",
932
+ max_length=32,
933
+ verbose_name="Research Type",
934
+ ),
935
+ ),
936
+ migrations.AddConstraint(
937
+ model_name="researchtopicrelationship",
938
+ constraint=models.UniqueConstraint(
939
+ fields=("topic", "content_type", "object_id"), name="unique_research_topic_relationship"
940
+ ),
941
+ ),
942
+ migrations.AlterModelOptions(
943
+ name="researchtopicrelationship",
944
+ options={
945
+ "verbose_name": "Research Topic Relationship",
946
+ "verbose_name_plural": "Research Topic Relationships",
947
+ },
948
+ ),
949
+ migrations.AddField(
950
+ model_name="researchtopic",
951
+ name="order",
952
+ field=models.PositiveIntegerField(blank=True, null=True, verbose_name="Order"),
953
+ ),
954
+ migrations.AlterField(
955
+ model_name="researchtopic",
956
+ name="iteration",
957
+ field=models.PositiveIntegerField(default=0, verbose_name="Iteration"),
958
+ ),
959
+ migrations.AddField(
960
+ model_name="instrumentclassificationthroughmodel",
961
+ name="percent_of_revenue",
962
+ field=models.DecimalField(
963
+ blank=True,
964
+ decimal_places=4,
965
+ max_digits=5,
966
+ null=True,
967
+ validators=[
968
+ django.core.validators.MinValueValidator(0.0),
969
+ django.core.validators.MaxValueValidator(1.0),
970
+ ],
971
+ verbose_name="% of revenue",
972
+ ),
973
+ ),
974
+ migrations.DeleteModel(
975
+ name="ThemeReviewTemplate",
976
+ ),
977
+ migrations.AddField(
978
+ model_name="product",
979
+ name="theme",
980
+ field=models.ForeignKey(
981
+ blank=True,
982
+ null=True,
983
+ on_delete=django.db.models.deletion.SET_NULL,
984
+ related_name="products",
985
+ to="wbportfolio.theme",
986
+ ),
987
+ ),
988
+ migrations.AddField(
989
+ model_name="equity",
990
+ name="status",
991
+ field=django_fsm.FSMField(
992
+ choices=[("PRIVATE", "Private"), ("PUBLIC", "Public"), ("MERGED", "M&A"), ("INACTIVE", "Inactive")],
993
+ default="PUBLIC",
994
+ max_length=50,
995
+ ),
996
+ ),
997
+ migrations.CreateModel(
998
+ name="Deal",
999
+ fields=[
1000
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1001
+ (
1002
+ "type",
1003
+ models.CharField(
1004
+ choices=[
1005
+ ("DEAL", "Deal"),
1006
+ ("FUNDING", "Funding"),
1007
+ ("INVESTMENT", "Investment"),
1008
+ ("PORTFOLIO_EXIT", "Portfolio Exit"),
1009
+ ],
1010
+ default="DEAL",
1011
+ help_text="The deal type",
1012
+ max_length=14,
1013
+ verbose_name="Type",
1014
+ ),
1015
+ ),
1016
+ ("date", models.DateField()),
1017
+ ("transaction_amount", models.FloatField(help_text="Deal Size (in millions")),
1018
+ ("funding_round", models.CharField(max_length=128, verbose_name="Funding Round")),
1019
+ ("funding_round_category", models.CharField(max_length=128, verbose_name="Funding Round Category")),
1020
+ (
1021
+ "valuation",
1022
+ models.FloatField(
1023
+ help_text="Valuation of the funded organization after this transaction (in Millions USD).",
1024
+ verbose_name="Valuaton",
1025
+ ),
1026
+ ),
1027
+ (
1028
+ "valuation_estimated",
1029
+ models.BooleanField(
1030
+ default=False,
1031
+ help_text="True if the valuation is an estimate",
1032
+ verbose_name="Is valuation estimated",
1033
+ ),
1034
+ ),
1035
+ (
1036
+ "valuation_source_type",
1037
+ models.CharField(
1038
+ choices=[
1039
+ ("STATE_FILING", "State Filing"),
1040
+ ("VENTURE_SOURCE_ACTUAL", "Venture Source Actual"),
1041
+ ("VENTURE_SOURCE_ESTIMATE", "Venture Source Estimate"),
1042
+ ("MEDIA_MENTION", "Media Mention"),
1043
+ ("COMPARABLE", "Comparable"),
1044
+ ],
1045
+ default="VENTURE_SOURCE_ACTUAL",
1046
+ help_text="The source type of the valuation",
1047
+ max_length=24,
1048
+ ),
1049
+ ),
1050
+ (
1051
+ "valuation_media_mention_source_urls",
1052
+ django.contrib.postgres.fields.ArrayField(
1053
+ base_field=models.URLField(),
1054
+ help_text="List of URLs used to source the valuation for the Media Mentions source type.",
1055
+ size=None,
1056
+ ),
1057
+ ),
1058
+ (
1059
+ "equity",
1060
+ models.ForeignKey(
1061
+ limit_choices_to={"status": "PRIVATE"},
1062
+ on_delete=django.db.models.deletion.CASCADE,
1063
+ related_name="deals",
1064
+ to="wbportfolio.equity",
1065
+ ),
1066
+ ),
1067
+ (
1068
+ "investors",
1069
+ models.ManyToManyField(
1070
+ blank=True,
1071
+ help_text="Investors",
1072
+ related_name="invested_deals",
1073
+ to="wbportfolio.instrument",
1074
+ verbose_name="Investors",
1075
+ ),
1076
+ ),
1077
+ ],
1078
+ ),
1079
+ migrations.AlterField(
1080
+ model_name="trade",
1081
+ name="delta_weight",
1082
+ field=models.DecimalField(
1083
+ decimal_places=6,
1084
+ default=Decimal("0"),
1085
+ help_text="The weight to be multiplied against the target for rebalancing",
1086
+ max_digits=16,
1087
+ verbose_name="Delta Weight",
1088
+ ),
1089
+ ),
1090
+ migrations.AlterField(
1091
+ model_name="trade",
1092
+ name="target_weight",
1093
+ field=models.DecimalField(
1094
+ decimal_places=6,
1095
+ default=Decimal("0"),
1096
+ help_text="The Target weight (delta_weight = target_weight/effective_weight)",
1097
+ max_digits=16,
1098
+ verbose_name="Target Weight",
1099
+ ),
1100
+ ),
1101
+ migrations.AlterField(
1102
+ model_name="classification",
1103
+ name="computed_str",
1104
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
1105
+ ),
1106
+ migrations.AlterField(
1107
+ model_name="fiscalperiod",
1108
+ name="computed_str",
1109
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
1110
+ ),
1111
+ migrations.AlterField(
1112
+ model_name="fundamental",
1113
+ name="computed_str",
1114
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
1115
+ ),
1116
+ migrations.AlterField(
1117
+ model_name="geographicsegment",
1118
+ name="computed_str",
1119
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
1120
+ ),
1121
+ migrations.AlterField(
1122
+ model_name="research",
1123
+ name="computed_str",
1124
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Name"),
1125
+ ),
1126
+ migrations.AddField(
1127
+ model_name="trade",
1128
+ name="order",
1129
+ field=models.PositiveSmallIntegerField(blank=True, null=True),
1130
+ ),
1131
+ migrations.AlterUniqueTogether(
1132
+ name="portfolioinstrumentpreferedclassificationthroughmodel",
1133
+ unique_together={("portfolio", "instrument", "classification_group")},
1134
+ ),
1135
+ migrations.CreateModel(
1136
+ name="InstrumentClassificationRelatedInstrument",
1137
+ fields=[
1138
+ ("id", models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name="ID")),
1139
+ (
1140
+ "related_instrument_type",
1141
+ models.CharField(
1142
+ blank=True,
1143
+ choices=[
1144
+ ("PARTNER", "Partner"),
1145
+ ("SUPPLIER", "Supplier"),
1146
+ ("PEER", "Peer"),
1147
+ ("COMPETITOR", "Competitor"),
1148
+ ("BIGGEST_THREAT", "Biggest Threat"),
1149
+ ("CUSTOMER", "Customer"),
1150
+ ],
1151
+ max_length=16,
1152
+ null=True,
1153
+ ),
1154
+ ),
1155
+ ],
1156
+ ),
1157
+ migrations.AddField(
1158
+ model_name="instrumentclassificationthroughmodel",
1159
+ name="related_instruments",
1160
+ field=models.ManyToManyField(
1161
+ blank=True,
1162
+ through="wbportfolio.InstrumentClassificationRelatedInstrument",
1163
+ to="wbportfolio.instrument",
1164
+ ),
1165
+ ),
1166
+ migrations.AddField(
1167
+ model_name="instrumentclassificationrelatedinstrument",
1168
+ name="classified_instrument",
1169
+ field=models.ForeignKey(
1170
+ on_delete=django.db.models.deletion.CASCADE,
1171
+ related_name="related_instruements",
1172
+ to="wbportfolio.instrumentclassificationthroughmodel",
1173
+ ),
1174
+ ),
1175
+ migrations.AddField(
1176
+ model_name="instrumentclassificationrelatedinstrument",
1177
+ name="related_instrument",
1178
+ field=models.ForeignKey(
1179
+ on_delete=django.db.models.deletion.CASCADE,
1180
+ related_name="instrument_classification_related",
1181
+ to="wbportfolio.instrument",
1182
+ ),
1183
+ ),
1184
+ migrations.AlterModelTable(
1185
+ name="assetposition",
1186
+ table=None,
1187
+ ),
1188
+ migrations.AlterModelTable(
1189
+ name="bond",
1190
+ table=None,
1191
+ ),
1192
+ migrations.AlterModelTable(
1193
+ name="cash",
1194
+ table=None,
1195
+ ),
1196
+ migrations.AlterModelTable(
1197
+ name="classification",
1198
+ table=None,
1199
+ ),
1200
+ migrations.AlterModelTable(
1201
+ name="classificationgroup",
1202
+ table=None,
1203
+ ),
1204
+ migrations.AlterModelTable(
1205
+ name="custodian",
1206
+ table=None,
1207
+ ),
1208
+ migrations.AlterModelTable(
1209
+ name="equity",
1210
+ table=None,
1211
+ ),
1212
+ migrations.AlterModelTable(
1213
+ name="exchange",
1214
+ table=None,
1215
+ ),
1216
+ migrations.AlterModelTable(
1217
+ name="exchangeinstrumentthroughmodel",
1218
+ table=None,
1219
+ ),
1220
+ migrations.AlterModelTable(
1221
+ name="expiry",
1222
+ table=None,
1223
+ ),
1224
+ migrations.AlterModelTable(
1225
+ name="feecalculation",
1226
+ table=None,
1227
+ ),
1228
+ migrations.AlterModelTable(
1229
+ name="fees",
1230
+ table=None,
1231
+ ),
1232
+ migrations.AlterModelTable(
1233
+ name="index",
1234
+ table=None,
1235
+ ),
1236
+ migrations.AlterModelTable(
1237
+ name="instrument",
1238
+ table=None,
1239
+ ),
1240
+ migrations.AlterModelTable(
1241
+ name="instrumentfavoritegroup",
1242
+ table=None,
1243
+ ),
1244
+ migrations.AlterModelTable(
1245
+ name="instrumentportfoliothroughmodel",
1246
+ table=None,
1247
+ ),
1248
+ migrations.AlterModelTable(
1249
+ name="instrumentprice",
1250
+ table=None,
1251
+ ),
1252
+ migrations.AlterModelTable(
1253
+ name="interestratederivative",
1254
+ table=None,
1255
+ ),
1256
+ migrations.AlterModelTable(
1257
+ name="portfolio",
1258
+ table=None,
1259
+ ),
1260
+ migrations.AlterModelTable(
1261
+ name="portfolioinstrumentpreferedclassificationthroughmodel",
1262
+ table=None,
1263
+ ),
1264
+ migrations.AlterModelTable(
1265
+ name="portfoliorole",
1266
+ table=None,
1267
+ ),
1268
+ migrations.AlterModelTable(
1269
+ name="product",
1270
+ table=None,
1271
+ ),
1272
+ migrations.AlterModelTable(
1273
+ name="productgroup",
1274
+ table=None,
1275
+ ),
1276
+ migrations.AlterModelTable(
1277
+ name="productgrouprepresentant",
1278
+ table=None,
1279
+ ),
1280
+ migrations.AlterModelTable(
1281
+ name="register",
1282
+ table=None,
1283
+ ),
1284
+ migrations.AlterModelTable(
1285
+ name="trade",
1286
+ table=None,
1287
+ ),
1288
+ migrations.AlterModelTable(
1289
+ name="transaction",
1290
+ table=None,
1291
+ ),
1292
+ migrations.RemoveIndex(
1293
+ model_name="fiscalperiod",
1294
+ name="fiscal_period_idx",
1295
+ ),
1296
+ migrations.RenameField(
1297
+ model_name="assetposition",
1298
+ old_name="latest_split",
1299
+ new_name="applied_split",
1300
+ ),
1301
+ migrations.RenameField(
1302
+ model_name="fundamental",
1303
+ old_name="cash_equivalents",
1304
+ new_name="cash_and_cash_equivalents",
1305
+ ),
1306
+ migrations.RenameField(
1307
+ model_name="fundamental",
1308
+ old_name="cash_st_investments",
1309
+ new_name="cash_and_short_term_investments",
1310
+ ),
1311
+ migrations.RenameField(
1312
+ model_name="fundamental",
1313
+ old_name="cash_st_investments_to_current_assets_ratio",
1314
+ new_name="cash_and_short_term_investments_to_current_assets_ratio",
1315
+ ),
1316
+ migrations.AlterUniqueTogether(
1317
+ name="fiscalperiod",
1318
+ unique_together=set(),
1319
+ ),
1320
+ migrations.RemoveField(
1321
+ model_name="assetposition",
1322
+ name="market_share",
1323
+ ),
1324
+ migrations.RemoveField(
1325
+ model_name="assetposition",
1326
+ name="price_fx_portfolio",
1327
+ ),
1328
+ migrations.RemoveField(
1329
+ model_name="assetposition",
1330
+ name="price_multiplier",
1331
+ ),
1332
+ migrations.RemoveField(
1333
+ model_name="assetposition",
1334
+ name="total_value",
1335
+ ),
1336
+ migrations.RemoveField(
1337
+ model_name="assetposition",
1338
+ name="total_value_fx_portfolio",
1339
+ ),
1340
+ migrations.RemoveField(
1341
+ model_name="dailyfundamental",
1342
+ name="eps",
1343
+ ),
1344
+ migrations.RemoveField(
1345
+ model_name="forecast",
1346
+ name="expected_book_value_y1",
1347
+ ),
1348
+ migrations.RemoveField(
1349
+ model_name="forecast",
1350
+ name="expected_book_value_y2",
1351
+ ),
1352
+ migrations.RemoveField(
1353
+ model_name="forecast",
1354
+ name="expected_book_value_y3",
1355
+ ),
1356
+ migrations.RemoveField(
1357
+ model_name="forecast",
1358
+ name="expected_book_value_y4",
1359
+ ),
1360
+ migrations.RemoveField(
1361
+ model_name="forecast",
1362
+ name="expected_book_value_y5",
1363
+ ),
1364
+ migrations.RemoveField(
1365
+ model_name="fundamental",
1366
+ name="free_cash_flow_5y_cagr",
1367
+ ),
1368
+ migrations.RemoveField(
1369
+ model_name="fundamental",
1370
+ name="revenue_growth_5y_cagr",
1371
+ ),
1372
+ migrations.RenameField(
1373
+ model_name="assetposition",
1374
+ old_name="currency_fx_rate",
1375
+ new_name="initial_currency_fx_rate",
1376
+ ),
1377
+ migrations.RenameField(
1378
+ model_name="assetposition",
1379
+ old_name="price",
1380
+ new_name="initial_price",
1381
+ ),
1382
+ migrations.RenameField(
1383
+ model_name="assetposition",
1384
+ old_name="shares",
1385
+ new_name="initial_shares",
1386
+ ),
1387
+ migrations.AddField(
1388
+ model_name="dailyfundamental",
1389
+ name="eps_3y_cagr",
1390
+ field=wbcore.models.fields.DynamicFloatField(
1391
+ blank=True,
1392
+ help_text="3-year Cumulative Annual Growth Rate of EPS %",
1393
+ null=True,
1394
+ verbose_name="EPS 3 Year CAGR",
1395
+ ),
1396
+ ),
1397
+ migrations.AddField(
1398
+ model_name="dailyfundamental",
1399
+ name="eps_ftw",
1400
+ field=models.FloatField(
1401
+ blank=True, help_text="Earning per Shares (FTW)", null=True, verbose_name="EPS FTW"
1402
+ ),
1403
+ ),
1404
+ migrations.AddField(
1405
+ model_name="dailyfundamental",
1406
+ name="free_cash_flow_3y_cagr",
1407
+ field=wbcore.models.fields.DynamicFloatField(
1408
+ blank=True,
1409
+ help_text="3-year Cumulative Annual Growth Rate of FCFs %",
1410
+ null=True,
1411
+ verbose_name="Latest 3Y FCFs CAGR",
1412
+ ),
1413
+ ),
1414
+ migrations.AddField(
1415
+ model_name="dailyfundamental",
1416
+ name="revenue_growth_3y_cagr",
1417
+ field=wbcore.models.fields.DynamicFloatField(
1418
+ blank=True,
1419
+ help_text="3-year Cumulative Annual Growth Rate of revenue %",
1420
+ null=True,
1421
+ verbose_name="3Y Revenue Growth CAGR",
1422
+ ),
1423
+ ),
1424
+ migrations.AddField(
1425
+ model_name="fiscalperiod",
1426
+ name="period",
1427
+ field=models.PositiveIntegerField(
1428
+ default=1,
1429
+ validators=[
1430
+ django.core.validators.MaxValueValidator(limit_value=4),
1431
+ django.core.validators.MinValueValidator(limit_value=1),
1432
+ ],
1433
+ ),
1434
+ ),
1435
+ migrations.AddField(
1436
+ model_name="fiscalperiod",
1437
+ name="period_type",
1438
+ field=models.CharField(
1439
+ choices=[
1440
+ ("Y", "Annual"),
1441
+ ("6M", "Semester Interim"),
1442
+ ("4M", "Trimester Interim"),
1443
+ ("Q", "Quarterly Interim"),
1444
+ ],
1445
+ default="Q",
1446
+ max_length=52,
1447
+ ),
1448
+ ),
1449
+ migrations.AddField(
1450
+ model_name="forecast",
1451
+ name="deprecation_and_amortization_y1",
1452
+ field=wbcore.models.fields.DynamicFloatField(
1453
+ blank=True,
1454
+ help_text="Deprecation and Amortization Current FY (FY1e)",
1455
+ null=True,
1456
+ verbose_name="Deprecation and Amortization (FY1e)",
1457
+ ),
1458
+ ),
1459
+ migrations.AddField(
1460
+ model_name="forecast",
1461
+ name="deprecation_and_amortization_y2",
1462
+ field=wbcore.models.fields.DynamicFloatField(
1463
+ blank=True,
1464
+ help_text="Deprecation and Amortization (next fiscal year)",
1465
+ null=True,
1466
+ verbose_name="Deprecation and Amortization (FY2e)",
1467
+ ),
1468
+ ),
1469
+ migrations.AddField(
1470
+ model_name="forecast",
1471
+ name="deprecation_and_amortization_y3",
1472
+ field=wbcore.models.fields.DynamicFloatField(
1473
+ blank=True,
1474
+ help_text="Deprecation and Amortization (fiscal year + 2)",
1475
+ null=True,
1476
+ verbose_name="Deprecation and Amortization (FY3e)",
1477
+ ),
1478
+ ),
1479
+ migrations.AddField(
1480
+ model_name="forecast",
1481
+ name="deprecation_and_amortization_y4",
1482
+ field=wbcore.models.fields.DynamicFloatField(
1483
+ blank=True,
1484
+ help_text="Deprecation and Amortization (fiscal year + 3)",
1485
+ null=True,
1486
+ verbose_name="Deprecation and Amortization (FY4e)",
1487
+ ),
1488
+ ),
1489
+ migrations.AddField(
1490
+ model_name="forecast",
1491
+ name="deprecation_and_amortization_y5",
1492
+ field=wbcore.models.fields.DynamicFloatField(
1493
+ blank=True,
1494
+ help_text="Deprecation and Amortization (fiscal year + 4)",
1495
+ null=True,
1496
+ verbose_name="Deprecation and Amortization (FY5e)",
1497
+ ),
1498
+ ),
1499
+ migrations.AddField(
1500
+ model_name="forecast",
1501
+ name="eps_growth_y1",
1502
+ field=wbcore.models.fields.DynamicFloatField(
1503
+ blank=True,
1504
+ help_text="EPS Growth current fiscal year",
1505
+ null=True,
1506
+ verbose_name="EPS Growth Current FY (FY1e)",
1507
+ ),
1508
+ ),
1509
+ migrations.AddField(
1510
+ model_name="forecast",
1511
+ name="eps_growth_y2",
1512
+ field=wbcore.models.fields.DynamicFloatField(
1513
+ blank=True, help_text="EPS Growth FY2e", null=True, verbose_name="EPS Growth FY2e"
1514
+ ),
1515
+ ),
1516
+ migrations.AddField(
1517
+ model_name="forecast",
1518
+ name="eps_growth_y3",
1519
+ field=wbcore.models.fields.DynamicFloatField(
1520
+ blank=True, help_text="EPS Growth FY3e", null=True, verbose_name="EPS Growth FY3e"
1521
+ ),
1522
+ ),
1523
+ migrations.AddField(
1524
+ model_name="forecast",
1525
+ name="eps_growth_y4",
1526
+ field=wbcore.models.fields.DynamicFloatField(
1527
+ blank=True, help_text="EPS Growth FY4e", null=True, verbose_name="EPS Growth FY4e"
1528
+ ),
1529
+ ),
1530
+ migrations.AddField(
1531
+ model_name="forecast",
1532
+ name="eps_growth_y5",
1533
+ field=wbcore.models.fields.DynamicFloatField(
1534
+ blank=True, help_text="EPS Growth FY5e", null=True, verbose_name="EPS Growth FY5e"
1535
+ ),
1536
+ ),
1537
+ migrations.AddField(
1538
+ model_name="forecast",
1539
+ name="expected_book_value_per_share_y1",
1540
+ field=models.FloatField(
1541
+ blank=True,
1542
+ help_text="Expected Book value Per Share current fiscal year",
1543
+ null=True,
1544
+ verbose_name="Expected Book value Per Share Current FY (FY1e)",
1545
+ ),
1546
+ ),
1547
+ migrations.AddField(
1548
+ model_name="forecast",
1549
+ name="expected_book_value_per_share_y2",
1550
+ field=models.FloatField(
1551
+ blank=True,
1552
+ help_text="Expected Book value Per Share fiscal year +1",
1553
+ null=True,
1554
+ verbose_name="Expected Book value Per Share (FY2e)",
1555
+ ),
1556
+ ),
1557
+ migrations.AddField(
1558
+ model_name="forecast",
1559
+ name="expected_book_value_per_share_y3",
1560
+ field=models.FloatField(
1561
+ blank=True,
1562
+ help_text="Expected Book value Per Share fiscal year +2",
1563
+ null=True,
1564
+ verbose_name="Expected Book value Per Share (FY3e)",
1565
+ ),
1566
+ ),
1567
+ migrations.AddField(
1568
+ model_name="forecast",
1569
+ name="expected_book_value_per_share_y4",
1570
+ field=models.FloatField(
1571
+ blank=True,
1572
+ help_text="Expected Book value Per Share fiscal year +3",
1573
+ null=True,
1574
+ verbose_name="Expected Book value Per Share (FY4e)",
1575
+ ),
1576
+ ),
1577
+ migrations.AddField(
1578
+ model_name="forecast",
1579
+ name="expected_book_value_per_share_y5",
1580
+ field=models.FloatField(
1581
+ blank=True,
1582
+ help_text="Expected Book value Per Share fiscal year +4",
1583
+ null=True,
1584
+ verbose_name="Expected Book value Per Share (FY5e)",
1585
+ ),
1586
+ ),
1587
+ migrations.AddField(
1588
+ model_name="forecast",
1589
+ name="gross_profit_margin_without_depreciation_y1",
1590
+ field=models.FloatField(
1591
+ blank=True,
1592
+ help_text="Gross profit Margin (excl. D&A) Current FY (FY1e)",
1593
+ null=True,
1594
+ verbose_name="Gross profit Margin (excl. D&A) (FY1e)",
1595
+ ),
1596
+ ),
1597
+ migrations.AddField(
1598
+ model_name="forecast",
1599
+ name="gross_profit_margin_without_depreciation_y2",
1600
+ field=models.FloatField(
1601
+ blank=True,
1602
+ help_text="Expected Gross profit margin without D&A (next fiscal year)",
1603
+ null=True,
1604
+ verbose_name="Gross profit Margin (excl. D&A) (FY2e)",
1605
+ ),
1606
+ ),
1607
+ migrations.AddField(
1608
+ model_name="forecast",
1609
+ name="gross_profit_margin_without_depreciation_y3",
1610
+ field=models.FloatField(
1611
+ blank=True,
1612
+ help_text="Expected Gross profit margin without D&A (fiscal year + 2)",
1613
+ null=True,
1614
+ verbose_name="Gross profit Margin (excl. D&A) (FY3e)",
1615
+ ),
1616
+ ),
1617
+ migrations.AddField(
1618
+ model_name="forecast",
1619
+ name="gross_profit_margin_without_depreciation_y4",
1620
+ field=models.FloatField(
1621
+ blank=True,
1622
+ help_text="Expected Gross profit margin without D&A (fiscal year + 3)",
1623
+ null=True,
1624
+ verbose_name="Gross profit Margin (excl. D&A) (FY4e)",
1625
+ ),
1626
+ ),
1627
+ migrations.AddField(
1628
+ model_name="forecast",
1629
+ name="gross_profit_margin_without_depreciation_y5",
1630
+ field=models.FloatField(
1631
+ blank=True,
1632
+ help_text="Expected Gross profit margin without D&A (fiscal year + 4)",
1633
+ null=True,
1634
+ verbose_name="Gross profit Margin (excl. D&A) (FY5e)",
1635
+ ),
1636
+ ),
1637
+ migrations.AddField(
1638
+ model_name="fundamental",
1639
+ name="cost_of_good_sold_without_depreciation",
1640
+ field=models.FloatField(blank=True, null=True, verbose_name="COGS (Excl Depreciation)"),
1641
+ ),
1642
+ migrations.AddField(
1643
+ model_name="fundamental",
1644
+ name="deprecation_and_amortization",
1645
+ field=models.FloatField(blank=True, null=True, verbose_name="D&A"),
1646
+ ),
1647
+ migrations.AddField(
1648
+ model_name="fundamental",
1649
+ name="deprecation_and_amortization_to_sales_ratio",
1650
+ field=wbcore.models.fields.DynamicFloatField(blank=True, null=True, verbose_name="D&A to Sales Ratio"),
1651
+ ),
1652
+ migrations.AddField(
1653
+ model_name="fundamental",
1654
+ name="eps_growth",
1655
+ field=wbcore.models.fields.DynamicFloatField(blank=True, null=True, verbose_name="EPS Growth"),
1656
+ ),
1657
+ migrations.AddField(
1658
+ model_name="fundamental",
1659
+ name="interest_expense_to_sales_ratio",
1660
+ field=wbcore.models.fields.DynamicFloatField(
1661
+ blank=True, null=True, verbose_name="Interest Expense to Sales Ratio"
1662
+ ),
1663
+ ),
1664
+ migrations.AddField(
1665
+ model_name="instrument",
1666
+ name="last_fundamental_current",
1667
+ field=models.OneToOneField(
1668
+ blank=True,
1669
+ null=True,
1670
+ on_delete=django.db.models.deletion.SET_NULL,
1671
+ related_name="last_current_fundamental_of_instruments",
1672
+ to="wbportfolio.fundamental",
1673
+ verbose_name="Current Fundamental (Year 1)",
1674
+ ),
1675
+ ),
1676
+ migrations.AddField(
1677
+ model_name="instrumentprice",
1678
+ name="performance_1d",
1679
+ field=wbcore.models.fields.DynamicDecimalField(
1680
+ blank=True,
1681
+ decimal_places=6,
1682
+ help_text="Performance 1D",
1683
+ max_digits=16,
1684
+ null=True,
1685
+ verbose_name="Performance 1D",
1686
+ ),
1687
+ ),
1688
+ migrations.AddField(
1689
+ model_name="instrumentprice",
1690
+ name="performance_30d",
1691
+ field=wbcore.models.fields.DynamicDecimalField(
1692
+ blank=True,
1693
+ decimal_places=6,
1694
+ help_text="Performance 30 days rolling",
1695
+ max_digits=16,
1696
+ null=True,
1697
+ verbose_name="Performance (1M)",
1698
+ ),
1699
+ ),
1700
+ migrations.AddField(
1701
+ model_name="instrumentprice",
1702
+ name="performance_365d",
1703
+ field=wbcore.models.fields.DynamicDecimalField(
1704
+ blank=True,
1705
+ decimal_places=6,
1706
+ help_text="Performance 365 days rolling",
1707
+ max_digits=16,
1708
+ null=True,
1709
+ verbose_name="Performance (1Y)",
1710
+ ),
1711
+ ),
1712
+ migrations.AddField(
1713
+ model_name="instrumentprice",
1714
+ name="performance_7d",
1715
+ field=wbcore.models.fields.DynamicDecimalField(
1716
+ blank=True,
1717
+ decimal_places=6,
1718
+ help_text="Performance 7 days rolling",
1719
+ max_digits=16,
1720
+ null=True,
1721
+ verbose_name="Performance (1W)",
1722
+ ),
1723
+ ),
1724
+ migrations.AddField(
1725
+ model_name="instrumentprice",
1726
+ name="performance_90d",
1727
+ field=wbcore.models.fields.DynamicDecimalField(
1728
+ blank=True,
1729
+ decimal_places=6,
1730
+ help_text="Performance 90 days rolling",
1731
+ max_digits=16,
1732
+ null=True,
1733
+ verbose_name="Performance (1Q)",
1734
+ ),
1735
+ ),
1736
+ migrations.AddField(
1737
+ model_name="instrumentprice",
1738
+ name="performance_inception",
1739
+ field=wbcore.models.fields.DynamicDecimalField(
1740
+ blank=True,
1741
+ decimal_places=6,
1742
+ help_text="Performance since inception",
1743
+ max_digits=16,
1744
+ null=True,
1745
+ verbose_name="Performance (Inception)",
1746
+ ),
1747
+ ),
1748
+ migrations.AddField(
1749
+ model_name="instrumentprice",
1750
+ name="performance_ytd",
1751
+ field=wbcore.models.fields.DynamicDecimalField(
1752
+ blank=True,
1753
+ decimal_places=6,
1754
+ help_text="Performance Year-to-date",
1755
+ max_digits=16,
1756
+ null=True,
1757
+ verbose_name="Performance (YTD)",
1758
+ ),
1759
+ ),
1760
+ migrations.AddField(
1761
+ model_name="splitdata",
1762
+ name="cumulative_factor",
1763
+ field=models.DecimalField(
1764
+ decimal_places=3, default=Decimal("1"), max_digits=9, verbose_name="Cumulative Factor"
1765
+ ),
1766
+ ),
1767
+ migrations.AlterField(
1768
+ model_name="assetposition",
1769
+ name="weighting",
1770
+ field=models.DecimalField(
1771
+ decimal_places=6,
1772
+ default=Decimal("0"),
1773
+ help_text="The Weight of the Asset on the price date of the Asset.",
1774
+ max_digits=7,
1775
+ verbose_name="Weight",
1776
+ ),
1777
+ ),
1778
+ migrations.AlterField(
1779
+ model_name="dailyfundamental",
1780
+ name="eps_ttm",
1781
+ field=wbcore.models.fields.DynamicFloatField(
1782
+ blank=True, help_text="Trailing Twelve Month EPS", null=True, verbose_name="EPS TTM"
1783
+ ),
1784
+ ),
1785
+ migrations.AlterField(
1786
+ model_name="fiscalperiod",
1787
+ name="period_end_date",
1788
+ field=models.DateField(help_text="The Fiscal Period end date"),
1789
+ ),
1790
+ migrations.AlterField(
1791
+ model_name="fiscalperiod",
1792
+ name="year",
1793
+ field=models.PositiveIntegerField(
1794
+ validators=[
1795
+ django.core.validators.MaxLengthValidator(limit_value=4),
1796
+ django.core.validators.MinLengthValidator(limit_value=1),
1797
+ ]
1798
+ ),
1799
+ ),
1800
+ migrations.AlterField(
1801
+ model_name="forecast",
1802
+ name="capital_expenditures_y1",
1803
+ field=models.FloatField(
1804
+ blank=True,
1805
+ help_text="Capital Expenditures current fiscal year",
1806
+ null=True,
1807
+ verbose_name="Capital Expenditures Current FY (FY1e)",
1808
+ ),
1809
+ ),
1810
+ migrations.AlterField(
1811
+ model_name="forecast",
1812
+ name="capital_expenditures_y2",
1813
+ field=models.FloatField(
1814
+ blank=True,
1815
+ help_text="Capital Expenditures fiscal year +1",
1816
+ null=True,
1817
+ verbose_name="Capital Expenditures (FY2e)",
1818
+ ),
1819
+ ),
1820
+ migrations.AlterField(
1821
+ model_name="forecast",
1822
+ name="capital_expenditures_y3",
1823
+ field=models.FloatField(
1824
+ blank=True,
1825
+ help_text="Capital Expenditures fiscal year +2",
1826
+ null=True,
1827
+ verbose_name="Capital Expenditures (FY3e)",
1828
+ ),
1829
+ ),
1830
+ migrations.AlterField(
1831
+ model_name="forecast",
1832
+ name="capital_expenditures_y4",
1833
+ field=models.FloatField(
1834
+ blank=True,
1835
+ help_text="Capital Expenditures fiscal year +3",
1836
+ null=True,
1837
+ verbose_name="Capital Expenditures (FY4e)",
1838
+ ),
1839
+ ),
1840
+ migrations.AlterField(
1841
+ model_name="forecast",
1842
+ name="capital_expenditures_y5",
1843
+ field=models.FloatField(
1844
+ blank=True,
1845
+ help_text="Capital Expenditures fiscal year +4",
1846
+ null=True,
1847
+ verbose_name="Capital Expenditures (FY5e)",
1848
+ ),
1849
+ ),
1850
+ migrations.AlterField(
1851
+ model_name="forecast",
1852
+ name="gross_profit_margin_y1",
1853
+ field=wbcore.models.fields.DynamicFloatField(
1854
+ blank=True,
1855
+ help_text="Gross profit Margin Current FY (FY1e)",
1856
+ null=True,
1857
+ verbose_name="Gross profit Margin (FY1e)",
1858
+ ),
1859
+ ),
1860
+ migrations.AlterField(
1861
+ model_name="forecast",
1862
+ name="gross_profit_margin_y2",
1863
+ field=wbcore.models.fields.DynamicFloatField(
1864
+ blank=True,
1865
+ help_text="Expected Gross profit margin (next fiscal year)",
1866
+ null=True,
1867
+ verbose_name="Gross profit Margin (FY2e)",
1868
+ ),
1869
+ ),
1870
+ migrations.AlterField(
1871
+ model_name="forecast",
1872
+ name="gross_profit_margin_y3",
1873
+ field=wbcore.models.fields.DynamicFloatField(
1874
+ blank=True,
1875
+ help_text="Expected Gross profit margin (fiscal year + 2)",
1876
+ null=True,
1877
+ verbose_name="Gross profit Margin (FY3e)",
1878
+ ),
1879
+ ),
1880
+ migrations.AlterField(
1881
+ model_name="forecast",
1882
+ name="gross_profit_margin_y4",
1883
+ field=wbcore.models.fields.DynamicFloatField(
1884
+ blank=True,
1885
+ help_text="Expected Gross profit margin (fiscal year + 3)",
1886
+ null=True,
1887
+ verbose_name="Gross profit Margin (FY4e)",
1888
+ ),
1889
+ ),
1890
+ migrations.AlterField(
1891
+ model_name="forecast",
1892
+ name="gross_profit_margin_y5",
1893
+ field=wbcore.models.fields.DynamicFloatField(
1894
+ blank=True,
1895
+ help_text="Expected Gross profit margin (fiscal year + 4)",
1896
+ null=True,
1897
+ verbose_name="Gross profit Margin (FY5e)",
1898
+ ),
1899
+ ),
1900
+ migrations.AlterField(
1901
+ model_name="fundamental",
1902
+ name="cost_of_good_sold",
1903
+ field=wbcore.models.fields.DynamicFloatField(
1904
+ blank=True,
1905
+ help_text="Cost of Goods Sold (excluding Depreciation and Amortization)",
1906
+ null=True,
1907
+ verbose_name="COGS (ex D&A)",
1908
+ ),
1909
+ ),
1910
+ migrations.AlterField(
1911
+ model_name="instrument",
1912
+ name="last_fundamental_y0",
1913
+ field=models.OneToOneField(
1914
+ blank=True,
1915
+ null=True,
1916
+ on_delete=django.db.models.deletion.SET_NULL,
1917
+ related_name="last_fundamental_of_instruments",
1918
+ to="wbportfolio.fundamental",
1919
+ verbose_name="Last Fundamental (Year 0)",
1920
+ ),
1921
+ ),
1922
+ migrations.AlterField(
1923
+ model_name="splitdata",
1924
+ name="status",
1925
+ field=django_fsm.FSMField(
1926
+ choices=[("PENDING", "Pending"), ("APPLIED", "Applied"), ("DENIED", "Denied")],
1927
+ default="PENDING",
1928
+ max_length=50,
1929
+ verbose_name="Status",
1930
+ ),
1931
+ ),
1932
+ migrations.AlterUniqueTogether(
1933
+ name="fiscalperiod",
1934
+ unique_together={("instrument", "period_type", "year", "period")},
1935
+ ),
1936
+ migrations.AddIndex(
1937
+ model_name="fiscalperiod",
1938
+ index=models.Index(fields=["instrument", "period_type", "year", "period"], name="fiscal_period_idx"),
1939
+ ),
1940
+ migrations.AddConstraint(
1941
+ model_name="fiscalperiod",
1942
+ constraint=models.CheckConstraint(
1943
+ check=models.Q(
1944
+ models.Q(("period_type", "Y"), ("period", 1)),
1945
+ models.Q(("period_type", "6M"), ("period__lte", 2)),
1946
+ models.Q(("period_type", "4M"), ("period__lte", 3)),
1947
+ models.Q(("period_type", "Q"), ("period__lte", 4)),
1948
+ _connector="OR",
1949
+ ),
1950
+ name="annual_period_is_always_1",
1951
+ ),
1952
+ ),
1953
+ migrations.RemoveField(
1954
+ model_name="fiscalperiod",
1955
+ name="quarter",
1956
+ ),
1957
+ migrations.RemoveField(
1958
+ model_name="fiscalperiod",
1959
+ name="year_end_date",
1960
+ ),
1961
+ migrations.RemoveField(
1962
+ model_name="instrumentprice",
1963
+ name="latest_split",
1964
+ ),
1965
+ migrations.AlterField(
1966
+ model_name="assetposition",
1967
+ name="initial_currency_fx_rate",
1968
+ field=models.DecimalField(
1969
+ decimal_places=14,
1970
+ default=1.0,
1971
+ help_text="The Currency Exchange Rate that is applied to the Asset to convert it into the Portfolio's currency.",
1972
+ max_digits=28,
1973
+ verbose_name="Initial Currency FX Rate",
1974
+ ),
1975
+ ),
1976
+ migrations.AlterField(
1977
+ model_name="assetposition",
1978
+ name="initial_price",
1979
+ field=models.DecimalField(decimal_places=4, default=None, max_digits=16, verbose_name="Initial Price"),
1980
+ preserve_default=False,
1981
+ ),
1982
+ migrations.AlterField(
1983
+ model_name="assetposition",
1984
+ name="initial_shares",
1985
+ field=models.DecimalField(
1986
+ blank=True,
1987
+ decimal_places=4,
1988
+ help_text="The amount of Units of the Asset on the price date of the Asset.",
1989
+ max_digits=14,
1990
+ null=True,
1991
+ verbose_name="Initial Quantity",
1992
+ ),
1993
+ ),
1994
+ migrations.RemoveConstraint(
1995
+ model_name="fiscalperiod",
1996
+ name="annual_period_is_always_1",
1997
+ ),
1998
+ migrations.RemoveIndex(
1999
+ model_name="fiscalperiod",
2000
+ name="fiscal_period_idx",
2001
+ ),
2002
+ migrations.RenameField(
2003
+ model_name="fiscalperiod",
2004
+ old_name="period",
2005
+ new_name="period_index",
2006
+ ),
2007
+ migrations.AlterUniqueTogether(
2008
+ name="fiscalperiod",
2009
+ unique_together=set(),
2010
+ ),
2011
+ migrations.AddField(
2012
+ model_name="fiscalperiod",
2013
+ name="period_interim",
2014
+ field=models.BooleanField(default=True, verbose_name="Interim Period"),
2015
+ ),
2016
+ migrations.AddField(
2017
+ model_name="fiscalperiod",
2018
+ name="period_year",
2019
+ field=models.PositiveIntegerField(
2020
+ default=None,
2021
+ help_text="The calendar period year",
2022
+ validators=[
2023
+ django.core.validators.MaxLengthValidator(limit_value=4),
2024
+ django.core.validators.MinLengthValidator(limit_value=1),
2025
+ ],
2026
+ ),
2027
+ preserve_default=False,
2028
+ ),
2029
+ migrations.AlterField(
2030
+ model_name="fiscalperiod",
2031
+ name="period_type",
2032
+ field=models.CharField(
2033
+ choices=[("Y", "Annual"), ("6M", "Semester"), ("4M", "Trimester"), ("Q", "Quarter")],
2034
+ default="Q",
2035
+ max_length=52,
2036
+ ),
2037
+ ),
2038
+ migrations.AlterUniqueTogether(
2039
+ name="fiscalperiod",
2040
+ unique_together={("instrument", "period_interim", "period_year", "period_index")},
2041
+ ),
2042
+ migrations.AddIndex(
2043
+ model_name="fiscalperiod",
2044
+ index=models.Index(
2045
+ fields=["instrument", "period_interim", "period_year", "period_index"], name="fiscal_period_idx"
2046
+ ),
2047
+ ),
2048
+ migrations.AddConstraint(
2049
+ model_name="fiscalperiod",
2050
+ constraint=models.CheckConstraint(
2051
+ check=models.Q(
2052
+ models.Q(("period_type", "Y"), ("period_index", 1)),
2053
+ models.Q(("period_type", "6M"), ("period_index__lte", 2)),
2054
+ models.Q(("period_type", "4M"), ("period_index__lte", 3)),
2055
+ models.Q(("period_type", "Q"), ("period_index__lte", 4)),
2056
+ _connector="OR",
2057
+ ),
2058
+ name="annual_period_is_always_1",
2059
+ ),
2060
+ ),
2061
+ migrations.RemoveField(
2062
+ model_name="fiscalperiod",
2063
+ name="year",
2064
+ ),
2065
+ migrations.RemoveIndex(
2066
+ model_name="fiscalperiod",
2067
+ name="fiscal_period_idx",
2068
+ ),
2069
+ migrations.AlterUniqueTogether(
2070
+ name="fiscalperiod",
2071
+ unique_together={("instrument", "period_interim", "period_type", "period_year", "period_index")},
2072
+ ),
2073
+ migrations.AddIndex(
2074
+ model_name="fiscalperiod",
2075
+ index=models.Index(
2076
+ fields=["instrument", "period_interim", "period_type", "period_year", "period_index"],
2077
+ name="fiscal_period_idx",
2078
+ ),
2079
+ ),
2080
+ migrations.RenameField(
2081
+ model_name="instrument",
2082
+ old_name="last_fiscal_quarterly_period",
2083
+ new_name="last_quaterly_period",
2084
+ ),
2085
+ migrations.RemoveField(
2086
+ model_name="fiscalperiod",
2087
+ name="company_expected_report_date",
2088
+ ),
2089
+ migrations.AlterField(
2090
+ model_name="fiscalperiod",
2091
+ name="expected_report_date",
2092
+ field=models.DateField(blank=True, help_text="The expected report date", null=True),
2093
+ ),
2094
+ migrations.AddField(
2095
+ model_name="instrument",
2096
+ name="next_quarterly_period",
2097
+ field=models.OneToOneField(
2098
+ blank=True,
2099
+ null=True,
2100
+ on_delete=django.db.models.deletion.SET_NULL,
2101
+ related_name="next_of_instrument",
2102
+ to="wbportfolio.fiscalperiod",
2103
+ verbose_name="Next Fiscal Quarterly Period",
2104
+ ),
2105
+ ),
2106
+ migrations.RemoveField(
2107
+ model_name="instrument",
2108
+ name="last_quaterly_period",
2109
+ ),
2110
+ migrations.AddField(
2111
+ model_name="instrument",
2112
+ name="last_quarterly_period",
2113
+ field=models.OneToOneField(
2114
+ blank=True,
2115
+ null=True,
2116
+ on_delete=django.db.models.deletion.SET_NULL,
2117
+ related_name="last_of_instrument",
2118
+ to="wbportfolio.fiscalperiod",
2119
+ verbose_name="Last Fiscal Quarterly Period",
2120
+ ),
2121
+ ),
2122
+ migrations.AlterField(
2123
+ model_name="instrumentprice",
2124
+ name="free_float",
2125
+ field=wbcore.models.fields.DynamicFloatField(
2126
+ blank=True, help_text="Free Float Number Of Shares", null=True, verbose_name="Free Float"
2127
+ ),
2128
+ ),
2129
+ migrations.AddField(
2130
+ model_name="dailyfundamental",
2131
+ name="free_cash",
2132
+ field=models.FloatField(
2133
+ blank=True, help_text="Daily Free Cash", null=True, verbose_name="Free Cash (Daily)"
2134
+ ),
2135
+ ),
2136
+ migrations.AlterField(
2137
+ model_name="dailyfundamental",
2138
+ name="free_cash_flow",
2139
+ field=wbcore.models.fields.DynamicFloatField(
2140
+ blank=True, help_text="Current Free Cash Flow", null=True, verbose_name="Daily FCFs"
2141
+ ),
2142
+ ),
2143
+ migrations.RemoveField(
2144
+ model_name="dailyfundamental",
2145
+ name="free_cash_flow_growth",
2146
+ ),
2147
+ migrations.AddField(
2148
+ model_name="dailyfundamental",
2149
+ name="free_cash_flow_ttm_growth",
2150
+ field=wbcore.models.fields.DynamicFloatField(
2151
+ blank=True,
2152
+ help_text="Current Free Cash Trailing Twelve Month Flow Growth",
2153
+ null=True,
2154
+ verbose_name="Daily FCFs TTM Growth",
2155
+ ),
2156
+ ),
2157
+ migrations.AddField(
2158
+ model_name="fundamental",
2159
+ name="total_liabilities",
2160
+ field=models.FloatField(
2161
+ blank=True, help_text="Total Liabilities", null=True, verbose_name="Total Liabilities"
2162
+ ),
2163
+ ),
2164
+ migrations.AddField(
2165
+ model_name="dailyfundamental",
2166
+ name="lock_dynamic_fields",
2167
+ field=models.BooleanField(default=False, help_text="If True, will not allow dynamic fields to be updated"),
2168
+ ),
2169
+ migrations.AddField(
2170
+ model_name="forecast",
2171
+ name="lock_dynamic_fields",
2172
+ field=models.BooleanField(default=False, help_text="If True, will not allow dynamic fields to be updated"),
2173
+ ),
2174
+ migrations.AddField(
2175
+ model_name="fundamental",
2176
+ name="lock_dynamic_fields",
2177
+ field=models.BooleanField(default=False, help_text="If True, will not allow dynamic fields to be updated"),
2178
+ ),
2179
+ migrations.AddField(
2180
+ model_name="geographicsegment",
2181
+ name="lock_dynamic_fields",
2182
+ field=models.BooleanField(default=False, help_text="If True, will not allow dynamic fields to be updated"),
2183
+ ),
2184
+ migrations.AddField(
2185
+ model_name="instrumentprice",
2186
+ name="lock_dynamic_fields",
2187
+ field=models.BooleanField(default=False, help_text="If True, will not allow dynamic fields to be updated"),
2188
+ ),
2189
+ migrations.AddField(
2190
+ model_name="dailyfundamental",
2191
+ name="updated_at",
2192
+ field=models.DateTimeField(auto_now=True),
2193
+ ),
2194
+ migrations.AddField(
2195
+ model_name="forecast",
2196
+ name="updated_at",
2197
+ field=models.DateTimeField(auto_now=True),
2198
+ ),
2199
+ migrations.AddField(
2200
+ model_name="fundamental",
2201
+ name="updated_at",
2202
+ field=models.DateTimeField(auto_now=True),
2203
+ ),
2204
+ migrations.AddField(
2205
+ model_name="geographicsegment",
2206
+ name="updated_at",
2207
+ field=models.DateTimeField(auto_now=True),
2208
+ ),
2209
+ migrations.AddField(
2210
+ model_name="instrumentprice",
2211
+ name="updated_at",
2212
+ field=models.DateTimeField(auto_now=True),
2213
+ ),
2214
+ migrations.RenameIndex(
2215
+ model_name="assetposition",
2216
+ new_name="wbportfolio_date_0a7c0a_idx",
2217
+ old_name="portfolio_a_date_397efc_idx",
2218
+ ),
2219
+ migrations.RenameIndex(
2220
+ model_name="assetposition",
2221
+ new_name="wbportfolio_date_da82d2_idx",
2222
+ old_name="portfolio_a_date_5e33e1_idx",
2223
+ ),
2224
+ migrations.AlterField(
2225
+ model_name="assetposition",
2226
+ name="asset_valuation_date",
2227
+ field=models.DateField(
2228
+ default=None,
2229
+ help_text="An alternate Valuation Date, if the price date of the Asset is different from the overlying Portfolio.",
2230
+ verbose_name="Alternate Valuation Date",
2231
+ ),
2232
+ preserve_default=False,
2233
+ ),
2234
+ migrations.AddField(
2235
+ model_name="fiscalperiod",
2236
+ name="expected_year_end_date",
2237
+ field=models.DateField(blank=True, help_text="Expected Fiscal year end", null=True),
2238
+ ),
2239
+ migrations.RenameField(
2240
+ model_name="dailyfundamental",
2241
+ old_name="lock_dynamic_fields",
2242
+ new_name="lock_all_dynamic_fields",
2243
+ ),
2244
+ migrations.RenameField(
2245
+ model_name="forecast",
2246
+ old_name="lock_dynamic_fields",
2247
+ new_name="lock_all_dynamic_fields",
2248
+ ),
2249
+ migrations.RenameField(
2250
+ model_name="fundamental",
2251
+ old_name="lock_dynamic_fields",
2252
+ new_name="lock_all_dynamic_fields",
2253
+ ),
2254
+ migrations.RenameField(
2255
+ model_name="geographicsegment",
2256
+ old_name="lock_dynamic_fields",
2257
+ new_name="lock_all_dynamic_fields",
2258
+ ),
2259
+ migrations.RenameField(
2260
+ model_name="instrumentprice",
2261
+ old_name="lock_dynamic_fields",
2262
+ new_name="lock_all_dynamic_fields",
2263
+ ),
2264
+ migrations.AddField(
2265
+ model_name="dailyfundamental",
2266
+ name="locked_dynamic_fields",
2267
+ field=django_better_admin_arrayfield.models.fields.ArrayField(
2268
+ base_field=models.CharField(max_length=128), blank=True, default=list, size=None
2269
+ ),
2270
+ ),
2271
+ migrations.AddField(
2272
+ model_name="forecast",
2273
+ name="locked_dynamic_fields",
2274
+ field=django_better_admin_arrayfield.models.fields.ArrayField(
2275
+ base_field=models.CharField(max_length=128), blank=True, default=list, size=None
2276
+ ),
2277
+ ),
2278
+ migrations.AddField(
2279
+ model_name="fundamental",
2280
+ name="locked_dynamic_fields",
2281
+ field=django_better_admin_arrayfield.models.fields.ArrayField(
2282
+ base_field=models.CharField(max_length=128), blank=True, default=list, size=None
2283
+ ),
2284
+ ),
2285
+ migrations.AddField(
2286
+ model_name="geographicsegment",
2287
+ name="locked_dynamic_fields",
2288
+ field=django_better_admin_arrayfield.models.fields.ArrayField(
2289
+ base_field=models.CharField(max_length=128), blank=True, default=list, size=None
2290
+ ),
2291
+ ),
2292
+ migrations.AddField(
2293
+ model_name="instrumentprice",
2294
+ name="locked_dynamic_fields",
2295
+ field=django_better_admin_arrayfield.models.fields.ArrayField(
2296
+ base_field=models.CharField(max_length=128), blank=True, default=list, size=None
2297
+ ),
2298
+ ),
2299
+ migrations.RemoveField(
2300
+ model_name="forecast",
2301
+ name="net_profit_y1",
2302
+ ),
2303
+ migrations.RemoveField(
2304
+ model_name="forecast",
2305
+ name="net_profit_y2",
2306
+ ),
2307
+ migrations.RemoveField(
2308
+ model_name="forecast",
2309
+ name="net_profit_y3",
2310
+ ),
2311
+ migrations.RemoveField(
2312
+ model_name="forecast",
2313
+ name="net_profit_y4",
2314
+ ),
2315
+ migrations.RemoveField(
2316
+ model_name="forecast",
2317
+ name="net_profit_y5",
2318
+ ),
2319
+ migrations.AddField(
2320
+ model_name="forecast",
2321
+ name="adjusted_net_profit_y1",
2322
+ field=models.FloatField(
2323
+ blank=True,
2324
+ help_text="Expected Net Profit Adjusted current fiscal year",
2325
+ null=True,
2326
+ verbose_name="Net Profit Adjusted Current FY (FY1e)",
2327
+ ),
2328
+ ),
2329
+ migrations.AddField(
2330
+ model_name="forecast",
2331
+ name="adjusted_net_profit_y2",
2332
+ field=models.FloatField(
2333
+ blank=True,
2334
+ help_text="Expected Net Profit Adjusted next fiscal year",
2335
+ null=True,
2336
+ verbose_name="Net Profit Adjusted (FY2e)",
2337
+ ),
2338
+ ),
2339
+ migrations.AddField(
2340
+ model_name="forecast",
2341
+ name="adjusted_net_profit_y3",
2342
+ field=models.FloatField(
2343
+ blank=True,
2344
+ help_text="Expected Net Profit Adjusted fiscal year + 2",
2345
+ null=True,
2346
+ verbose_name="Net Profit Adjusted (FY3e)",
2347
+ ),
2348
+ ),
2349
+ migrations.AddField(
2350
+ model_name="forecast",
2351
+ name="adjusted_net_profit_y4",
2352
+ field=models.FloatField(
2353
+ blank=True,
2354
+ help_text="Expected Net Profit Adjusted fiscal year + 3",
2355
+ null=True,
2356
+ verbose_name="Net Profit Adjusted (FY4e)",
2357
+ ),
2358
+ ),
2359
+ migrations.AddField(
2360
+ model_name="forecast",
2361
+ name="adjusted_net_profit_y5",
2362
+ field=models.FloatField(
2363
+ blank=True,
2364
+ help_text="Expected Net Profit Adjusted fiscal year + 4",
2365
+ null=True,
2366
+ verbose_name="Net Profit Adjusted (FY5e)",
2367
+ ),
2368
+ ),
2369
+ migrations.AddField(
2370
+ model_name="forecast",
2371
+ name="reported_net_profit_y1",
2372
+ field=models.FloatField(
2373
+ blank=True,
2374
+ help_text="Expected Net Profit Reported current fiscal year",
2375
+ null=True,
2376
+ verbose_name="Net Profit Reported Current FY (FY1e)",
2377
+ ),
2378
+ ),
2379
+ migrations.AddField(
2380
+ model_name="forecast",
2381
+ name="reported_net_profit_y2",
2382
+ field=models.FloatField(
2383
+ blank=True,
2384
+ help_text="Expected Net Profit Reported next fiscal year",
2385
+ null=True,
2386
+ verbose_name="Net Profit Reported (FY2e)",
2387
+ ),
2388
+ ),
2389
+ migrations.AddField(
2390
+ model_name="forecast",
2391
+ name="reported_net_profit_y3",
2392
+ field=models.FloatField(
2393
+ blank=True,
2394
+ help_text="Expected Net Profit Reported fiscal year + 2",
2395
+ null=True,
2396
+ verbose_name="Net Profit Reported (FY3e)",
2397
+ ),
2398
+ ),
2399
+ migrations.AddField(
2400
+ model_name="forecast",
2401
+ name="reported_net_profit_y4",
2402
+ field=models.FloatField(
2403
+ blank=True,
2404
+ help_text="Expected Net Profit Reported fiscal year + 3",
2405
+ null=True,
2406
+ verbose_name="Net Profit Reported (FY4e)",
2407
+ ),
2408
+ ),
2409
+ migrations.AddField(
2410
+ model_name="forecast",
2411
+ name="reported_net_profit_y5",
2412
+ field=models.FloatField(
2413
+ blank=True,
2414
+ help_text="Expected Net Profit Reported fiscal year + 4",
2415
+ null=True,
2416
+ verbose_name="Net Profit Reported (FY5e)",
2417
+ ),
2418
+ ),
2419
+ migrations.AddField(
2420
+ model_name="deal",
2421
+ name="external_id",
2422
+ field=models.CharField(blank=True, max_length=64, null=True),
2423
+ ),
2424
+ migrations.AddField(
2425
+ model_name="instrument",
2426
+ name="additional_urls",
2427
+ field=django.contrib.postgres.fields.ArrayField(
2428
+ base_field=models.URLField(blank=True, null=True), blank=True, default=list, size=None
2429
+ ),
2430
+ ),
2431
+ migrations.AddField(
2432
+ model_name="instrument",
2433
+ name="alternative_titles",
2434
+ field=django.contrib.postgres.fields.ArrayField(
2435
+ base_field=models.CharField(blank=True, max_length=255, null=True), default=list, size=None
2436
+ ),
2437
+ ),
2438
+ migrations.AddField(
2439
+ model_name="instrument",
2440
+ name="founded_year",
2441
+ field=models.IntegerField(blank=True, null=True, verbose_name="Founded Year"),
2442
+ ),
2443
+ migrations.AddField(
2444
+ model_name="instrument",
2445
+ name="headquarter_address",
2446
+ field=models.CharField(blank=True, help_text="The company Headquarter address", max_length=512, null=True),
2447
+ ),
2448
+ migrations.AddField(
2449
+ model_name="instrument",
2450
+ name="primary_url",
2451
+ field=models.URLField(blank=True, help_text="The Company website url", null=True),
2452
+ ),
2453
+ migrations.AlterField(
2454
+ model_name="deal",
2455
+ name="valuation",
2456
+ field=models.FloatField(
2457
+ blank=True,
2458
+ help_text="Valuation of the funded organization after this transaction (in Millions USD).",
2459
+ null=True,
2460
+ verbose_name="Valuaton",
2461
+ ),
2462
+ ),
2463
+ migrations.AlterField(
2464
+ model_name="deal",
2465
+ name="valuation_media_mention_source_urls",
2466
+ field=django.contrib.postgres.fields.ArrayField(
2467
+ base_field=models.URLField(),
2468
+ blank=True,
2469
+ help_text="List of URLs used to source the valuation for the Media Mentions source type.",
2470
+ null=True,
2471
+ size=None,
2472
+ ),
2473
+ ),
2474
+ migrations.AlterField(
2475
+ model_name="deal",
2476
+ name="valuation_source_type",
2477
+ field=models.CharField(blank=True, help_text="The source type of the valuation", max_length=24, null=True),
2478
+ ),
2479
+ migrations.AddField(
2480
+ model_name="instrumentprice",
2481
+ name="market_capitalization_consolidated",
2482
+ field=wbcore.models.fields.DynamicFloatField(
2483
+ blank=True,
2484
+ help_text="the consolidated market value of a company in local currency.",
2485
+ null=True,
2486
+ verbose_name="Market Capitalization (Consolidated)",
2487
+ ),
2488
+ ),
2489
+ migrations.AddField(
2490
+ model_name="instrumentprice",
2491
+ name="outstanding_shares_consolidated",
2492
+ field=wbcore.models.fields.DynamicDecimalField(
2493
+ blank=True,
2494
+ decimal_places=4,
2495
+ help_text="The amount of outstanding share for this instrument",
2496
+ max_digits=16,
2497
+ null=True,
2498
+ verbose_name="Outstanding Shares (Consolidated)",
2499
+ ),
2500
+ ),
2501
+ migrations.AddField(
2502
+ model_name="product",
2503
+ name="initial_high_water_mark",
2504
+ field=models.PositiveIntegerField(
2505
+ default=100, help_text="Initial High Water Mark", verbose_name="Initial High Water Mark"
2506
+ ),
2507
+ ),
2508
+ migrations.AddField(
2509
+ model_name="forecast",
2510
+ name="return_on_assets_y1",
2511
+ field=wbcore.models.fields.DynamicFloatField(
2512
+ blank=True, help_text="Return On Assets current fiscal year", null=True, verbose_name="ROA (%) (FY1e)"
2513
+ ),
2514
+ ),
2515
+ migrations.AddField(
2516
+ model_name="forecast",
2517
+ name="return_on_assets_y2",
2518
+ field=wbcore.models.fields.DynamicFloatField(
2519
+ blank=True, help_text="Return On Assets fiscal year +1", null=True, verbose_name="ROA (%) (FY2e)"
2520
+ ),
2521
+ ),
2522
+ migrations.AddField(
2523
+ model_name="forecast",
2524
+ name="return_on_assets_y3",
2525
+ field=wbcore.models.fields.DynamicFloatField(
2526
+ blank=True, help_text="Return On Assets fiscal year +2", null=True, verbose_name="ROA (%) (FY3e)"
2527
+ ),
2528
+ ),
2529
+ migrations.AddField(
2530
+ model_name="forecast",
2531
+ name="return_on_assets_y4",
2532
+ field=wbcore.models.fields.DynamicFloatField(
2533
+ blank=True, help_text="Return On Assets fiscal year +3", null=True, verbose_name="ROA (%) (FY4e)"
2534
+ ),
2535
+ ),
2536
+ migrations.AddField(
2537
+ model_name="forecast",
2538
+ name="return_on_assets_y5",
2539
+ field=wbcore.models.fields.DynamicFloatField(
2540
+ blank=True, help_text="Return On Assets fiscal year +4", null=True, verbose_name="ROA (%) (FY5e)"
2541
+ ),
2542
+ ),
2543
+ migrations.AddField(
2544
+ model_name="forecast",
2545
+ name="return_on_capital_employed_y1",
2546
+ field=wbcore.models.fields.DynamicFloatField(
2547
+ blank=True,
2548
+ help_text="Return on Capital Employed current fiscal year",
2549
+ null=True,
2550
+ verbose_name="ROCE (%) (FY1e)",
2551
+ ),
2552
+ ),
2553
+ migrations.AddField(
2554
+ model_name="forecast",
2555
+ name="return_on_capital_employed_y2",
2556
+ field=wbcore.models.fields.DynamicFloatField(
2557
+ blank=True,
2558
+ help_text="Return on Capital Employed fiscal year +1",
2559
+ null=True,
2560
+ verbose_name="ROCE (%) (FY2e)",
2561
+ ),
2562
+ ),
2563
+ migrations.AddField(
2564
+ model_name="forecast",
2565
+ name="return_on_capital_employed_y3",
2566
+ field=wbcore.models.fields.DynamicFloatField(
2567
+ blank=True,
2568
+ help_text="Return on Capital Employed fiscal year +2",
2569
+ null=True,
2570
+ verbose_name="ROCE (%) (FY3e)",
2571
+ ),
2572
+ ),
2573
+ migrations.AddField(
2574
+ model_name="forecast",
2575
+ name="return_on_capital_employed_y4",
2576
+ field=wbcore.models.fields.DynamicFloatField(
2577
+ blank=True,
2578
+ help_text="Return on Capital Employed fiscal year +3",
2579
+ null=True,
2580
+ verbose_name="ROCE (%) (FY4e)",
2581
+ ),
2582
+ ),
2583
+ migrations.AddField(
2584
+ model_name="forecast",
2585
+ name="return_on_capital_employed_y5",
2586
+ field=wbcore.models.fields.DynamicFloatField(
2587
+ blank=True,
2588
+ help_text="Return on Capital Employed fiscal year +4",
2589
+ null=True,
2590
+ verbose_name="ROCE (%) (FY5e)",
2591
+ ),
2592
+ ),
2593
+ migrations.AddField(
2594
+ model_name="forecast",
2595
+ name="return_on_equity_y1",
2596
+ field=wbcore.models.fields.DynamicFloatField(
2597
+ blank=True, help_text="Return on Equity current fiscal year", null=True, verbose_name="ROE (%) (FY1e)"
2598
+ ),
2599
+ ),
2600
+ migrations.AddField(
2601
+ model_name="forecast",
2602
+ name="return_on_equity_y2",
2603
+ field=wbcore.models.fields.DynamicFloatField(
2604
+ blank=True, help_text="Return on Equity fiscal year +1", null=True, verbose_name="ROE (%) (FY2e)"
2605
+ ),
2606
+ ),
2607
+ migrations.AddField(
2608
+ model_name="forecast",
2609
+ name="return_on_equity_y3",
2610
+ field=wbcore.models.fields.DynamicFloatField(
2611
+ blank=True, help_text="Return on Equity fiscal year +2", null=True, verbose_name="ROE (%) (FY3e)"
2612
+ ),
2613
+ ),
2614
+ migrations.AddField(
2615
+ model_name="forecast",
2616
+ name="return_on_equity_y4",
2617
+ field=wbcore.models.fields.DynamicFloatField(
2618
+ blank=True, help_text="Return on Equity fiscal year +3", null=True, verbose_name="ROE (%) (FY4e)"
2619
+ ),
2620
+ ),
2621
+ migrations.AddField(
2622
+ model_name="forecast",
2623
+ name="return_on_equity_y5",
2624
+ field=wbcore.models.fields.DynamicFloatField(
2625
+ blank=True, help_text="Return on Equity fiscal year +4", null=True, verbose_name="ROE (%) (FY5e)"
2626
+ ),
2627
+ ),
2628
+ migrations.AddField(
2629
+ model_name="forecast",
2630
+ name="return_on_invested_capital_y1",
2631
+ field=wbcore.models.fields.DynamicFloatField(
2632
+ blank=True,
2633
+ help_text="Return On Invested Capital current fiscal year",
2634
+ null=True,
2635
+ verbose_name="ROIC (%) (FY1e)",
2636
+ ),
2637
+ ),
2638
+ migrations.AddField(
2639
+ model_name="forecast",
2640
+ name="return_on_invested_capital_y2",
2641
+ field=wbcore.models.fields.DynamicFloatField(
2642
+ blank=True,
2643
+ help_text="Return On Invested Capital fiscal year +1",
2644
+ null=True,
2645
+ verbose_name="ROIC (%) (FY2e)",
2646
+ ),
2647
+ ),
2648
+ migrations.AddField(
2649
+ model_name="forecast",
2650
+ name="return_on_invested_capital_y3",
2651
+ field=wbcore.models.fields.DynamicFloatField(
2652
+ blank=True,
2653
+ help_text="Return On Invested Capital fiscal year +2",
2654
+ null=True,
2655
+ verbose_name="ROIC (%) (FY3e)",
2656
+ ),
2657
+ ),
2658
+ migrations.AddField(
2659
+ model_name="forecast",
2660
+ name="return_on_invested_capital_y4",
2661
+ field=wbcore.models.fields.DynamicFloatField(
2662
+ blank=True,
2663
+ help_text="Return On Invested Capital fiscal year +3",
2664
+ null=True,
2665
+ verbose_name="ROIC (%) (FY4e)",
2666
+ ),
2667
+ ),
2668
+ migrations.AddField(
2669
+ model_name="forecast",
2670
+ name="return_on_invested_capital_y5",
2671
+ field=wbcore.models.fields.DynamicFloatField(
2672
+ blank=True,
2673
+ help_text="Return On Invested Capital fiscal year +4",
2674
+ null=True,
2675
+ verbose_name="ROIC (%) (FY5e)",
2676
+ ),
2677
+ ),
2678
+ migrations.AddField(
2679
+ model_name="forecast",
2680
+ name="interest_coverage_ratio_y1",
2681
+ field=wbcore.models.fields.DynamicFloatField(
2682
+ blank=True,
2683
+ help_text="Times Earnings Before Interest And Taxes pay interest current fiscal year",
2684
+ null=True,
2685
+ verbose_name="Interest Coverage Ratio (FY1e)",
2686
+ ),
2687
+ ),
2688
+ migrations.AddField(
2689
+ model_name="forecast",
2690
+ name="interest_coverage_ratio_y2",
2691
+ field=wbcore.models.fields.DynamicFloatField(
2692
+ blank=True,
2693
+ help_text="Times Earnings Before Interest And Taxes pay interest fiscal year +1",
2694
+ null=True,
2695
+ verbose_name="Interest Coverage Ratio (FY2e)",
2696
+ ),
2697
+ ),
2698
+ migrations.AddField(
2699
+ model_name="forecast",
2700
+ name="interest_coverage_ratio_y3",
2701
+ field=wbcore.models.fields.DynamicFloatField(
2702
+ blank=True,
2703
+ help_text="Times Earnings Before Interest And Taxes pay interest fiscal year +2",
2704
+ null=True,
2705
+ verbose_name="Interest Coverage Ratio (FY3e)",
2706
+ ),
2707
+ ),
2708
+ migrations.AddField(
2709
+ model_name="forecast",
2710
+ name="interest_coverage_ratio_y4",
2711
+ field=wbcore.models.fields.DynamicFloatField(
2712
+ blank=True,
2713
+ help_text="Times Earnings Before Interest And Taxes pay interest fiscal year +3",
2714
+ null=True,
2715
+ verbose_name="Interest Coverage Ratio (FY4e)",
2716
+ ),
2717
+ ),
2718
+ migrations.AddField(
2719
+ model_name="forecast",
2720
+ name="interest_coverage_ratio_y5",
2721
+ field=wbcore.models.fields.DynamicFloatField(
2722
+ blank=True,
2723
+ help_text="Times Earnings Before Interest And Taxes pay interest fiscal year +4",
2724
+ null=True,
2725
+ verbose_name="Interest Coverage Ratio (FY5e)",
2726
+ ),
2727
+ ),
2728
+ migrations.AddConstraint(
2729
+ model_name="assetposition",
2730
+ constraint=models.CheckConstraint(
2731
+ check=models.Q(("date__week_day__in", [1, 7]), _negated=True),
2732
+ name="wbportfolio_assetposition_weekday_constraint",
2733
+ ),
2734
+ ),
2735
+ migrations.RemoveField(
2736
+ model_name="classification",
2737
+ name="analyst_view",
2738
+ ),
2739
+ migrations.RemoveField(
2740
+ model_name="classification",
2741
+ name="macro_long_term",
2742
+ ),
2743
+ migrations.RemoveField(
2744
+ model_name="classification",
2745
+ name="macro_medium_term",
2746
+ ),
2747
+ migrations.RemoveField(
2748
+ model_name="classification",
2749
+ name="macro_short_term",
2750
+ ),
2751
+ migrations.RemoveField(
2752
+ model_name="product",
2753
+ name="theme",
2754
+ ),
2755
+ migrations.AlterField(
2756
+ model_name="research",
2757
+ name="iteration",
2758
+ field=models.PositiveIntegerField(default=0, verbose_name="Version"),
2759
+ ),
2760
+ migrations.AlterField(
2761
+ model_name="researchtopic",
2762
+ name="iteration",
2763
+ field=models.PositiveIntegerField(default=0, verbose_name="Version"),
2764
+ ),
2765
+ migrations.CreateModel(
2766
+ name="MutualFund",
2767
+ fields=[
2768
+ (
2769
+ "instrument_ptr",
2770
+ models.OneToOneField(
2771
+ auto_created=True,
2772
+ on_delete=django.db.models.deletion.CASCADE,
2773
+ parent_link=True,
2774
+ primary_key=True,
2775
+ serialize=False,
2776
+ to="wbportfolio.instrument",
2777
+ ),
2778
+ ),
2779
+ ],
2780
+ options={
2781
+ "verbose_name": "Mutual Fund",
2782
+ "verbose_name_plural": "Mutual Funds",
2783
+ },
2784
+ bases=("wbportfolio.instrument",),
2785
+ ),
2786
+ migrations.AlterField(
2787
+ model_name="instrument",
2788
+ name="instrument_type",
2789
+ field=models.CharField(
2790
+ blank=True,
2791
+ choices=[
2792
+ ("Product", "Product"),
2793
+ ("Index", "Index"),
2794
+ ("ProductGroup", "Product Group"),
2795
+ ("MutualFund", "Mutual Fund"),
2796
+ ("Equity", "Equity"),
2797
+ ("ETF", "ETF"),
2798
+ ("ETP", "ETP"),
2799
+ ("Cash", "Cash"),
2800
+ ("Option", "Option"),
2801
+ ("Right", "Right"),
2802
+ ("Bond", "Bond"),
2803
+ ("InterestRateDerivative", "Interest Rate Derivate"),
2804
+ ("Future", "Future"),
2805
+ ("Forward", "Forward"),
2806
+ ("Swap", "Swap"),
2807
+ ("Coupon", "Coupon"),
2808
+ ("Crypto", "Crypto"),
2809
+ ("Commodity", "Commodity"),
2810
+ ],
2811
+ max_length=255,
2812
+ null=True,
2813
+ verbose_name="Type",
2814
+ ),
2815
+ ),
2816
+ migrations.AlterField(
2817
+ model_name="instrumentrequest",
2818
+ name="instrument_type",
2819
+ field=models.CharField(
2820
+ choices=[
2821
+ ("Product", "Product"),
2822
+ ("Index", "Index"),
2823
+ ("ProductGroup", "Product Group"),
2824
+ ("MutualFund", "Mutual Fund"),
2825
+ ("Equity", "Equity"),
2826
+ ("ETF", "ETF"),
2827
+ ("ETP", "ETP"),
2828
+ ("Cash", "Cash"),
2829
+ ("Option", "Option"),
2830
+ ("Right", "Right"),
2831
+ ("Bond", "Bond"),
2832
+ ("InterestRateDerivative", "Interest Rate Derivate"),
2833
+ ("Future", "Future"),
2834
+ ("Forward", "Forward"),
2835
+ ("Swap", "Swap"),
2836
+ ("Coupon", "Coupon"),
2837
+ ("Crypto", "Crypto"),
2838
+ ("Commodity", "Commodity"),
2839
+ ],
2840
+ max_length=255,
2841
+ verbose_name="Type",
2842
+ ),
2843
+ ),
2844
+ migrations.AlterField(
2845
+ model_name="instrumentrequest",
2846
+ name="created_instrument",
2847
+ field=models.OneToOneField(
2848
+ blank=True,
2849
+ null=True,
2850
+ on_delete=django.db.models.deletion.CASCADE,
2851
+ related_name="creation_request",
2852
+ to="wbportfolio.instrument",
2853
+ ),
2854
+ ),
2855
+ migrations.AlterUniqueTogether(
2856
+ name="instrumentportfoliothroughmodel",
2857
+ unique_together={("instrument", "portfolio")},
2858
+ ),
2859
+ migrations.AlterField(
2860
+ model_name="researchtopicrelationship",
2861
+ name="object_repr",
2862
+ field=models.CharField(blank=True, max_length=512, null=True, verbose_name="Relationship"),
2863
+ ),
2864
+ migrations.AddField(
2865
+ model_name="portfolio",
2866
+ name="is_invested",
2867
+ field=models.BooleanField(default=False),
2868
+ ),
2869
+ migrations.RemoveField(
2870
+ model_name="product",
2871
+ name="no_aggregation",
2872
+ ),
2873
+ migrations.AlterField(
2874
+ model_name="research",
2875
+ name="research_type",
2876
+ field=models.CharField(
2877
+ choices=[
2878
+ ("ONE_TEXT", "One Sentence"),
2879
+ ("TWO_TEXT", "Two Sentences"),
2880
+ ("SWOT", "SWOT"),
2881
+ ("OUTLOOK", "Outlook"),
2882
+ ("PORTER_FIVE", "Porter Five"),
2883
+ ("TEXT_LIST_RESEARCH", "Text List Research"),
2884
+ ("OPTION_LIST_RESEARCH", "Option List Research"),
2885
+ ("RELATIONSHIP", "Relationship"),
2886
+ ("REFERENCE", "Reference"),
2887
+ ("TIMELINE", "Timeline"),
2888
+ ],
2889
+ default="ONE_TEXT",
2890
+ max_length=32,
2891
+ verbose_name="Type",
2892
+ ),
2893
+ ),
2894
+ migrations.AlterField(
2895
+ model_name="researchtopic",
2896
+ name="research_type",
2897
+ field=models.CharField(
2898
+ choices=[
2899
+ ("ONE_TEXT", "One Sentence"),
2900
+ ("TWO_TEXT", "Two Sentences"),
2901
+ ("SWOT", "SWOT"),
2902
+ ("OUTLOOK", "Outlook"),
2903
+ ("PORTER_FIVE", "Porter Five"),
2904
+ ("TEXT_LIST_RESEARCH", "Text List Research"),
2905
+ ("OPTION_LIST_RESEARCH", "Option List Research"),
2906
+ ("RELATIONSHIP", "Relationship"),
2907
+ ("REFERENCE", "Reference"),
2908
+ ("TIMELINE", "Timeline"),
2909
+ ],
2910
+ default="ONE_TEXT",
2911
+ max_length=32,
2912
+ verbose_name="Research Type",
2913
+ ),
2914
+ ),
2915
+ migrations.AddField(
2916
+ model_name="researchtopic",
2917
+ name="group",
2918
+ field=models.ManyToManyField(
2919
+ blank=True,
2920
+ help_text="If not specify, all employees will be able to update the search",
2921
+ related_name="research_topics_of_group",
2922
+ to="auth.group",
2923
+ verbose_name="Group allowed to update research",
2924
+ ),
2925
+ ),
2926
+ migrations.CreateModel(
2927
+ name="OptionListResearchTopic",
2928
+ fields=[
2929
+ (
2930
+ "researchtopic_ptr",
2931
+ models.OneToOneField(
2932
+ auto_created=True,
2933
+ on_delete=django.db.models.deletion.CASCADE,
2934
+ parent_link=True,
2935
+ primary_key=True,
2936
+ serialize=False,
2937
+ to="wbportfolio.researchtopic",
2938
+ ),
2939
+ ),
2940
+ (
2941
+ "options",
2942
+ django.contrib.postgres.fields.ArrayField(
2943
+ base_field=models.CharField(max_length=32, verbose_name="Options"),
2944
+ blank=True,
2945
+ default=list,
2946
+ size=None,
2947
+ ),
2948
+ ),
2949
+ ("multiple_choice", models.BooleanField(default=False, verbose_name="Multiple choice")),
2950
+ ],
2951
+ options={
2952
+ "verbose_name": "Option List Research Topic",
2953
+ "verbose_name_plural": "Option List Research Topics",
2954
+ },
2955
+ bases=("wbportfolio.researchtopic",),
2956
+ ),
2957
+ migrations.RemoveConstraint(
2958
+ model_name="researchtopicrelationship",
2959
+ name="unique_research_topic_relationship",
2960
+ ),
2961
+ migrations.AddConstraint(
2962
+ model_name="researchtopicrelationship",
2963
+ constraint=models.UniqueConstraint(
2964
+ fields=("topic", "content_type", "object_id", "object_repr"), name="unique_research_topic_relationship"
2965
+ ),
2966
+ ),
2967
+ migrations.AddField(
2968
+ model_name="research",
2969
+ name="changed",
2970
+ field=models.DateTimeField(auto_now=True),
2971
+ ),
2972
+ migrations.AddConstraint(
2973
+ model_name="researchtopic",
2974
+ constraint=models.UniqueConstraint(fields=("name", "allowed_model"), name="unique_research_topic"),
2975
+ ),
2976
+ migrations.AlterField(
2977
+ model_name="researchtopic",
2978
+ name="name",
2979
+ field=models.CharField(max_length=255, verbose_name="Name"),
2980
+ ),
2981
+ migrations.AlterField(
2982
+ model_name="research",
2983
+ name="changed",
2984
+ field=models.DateField(auto_now=True),
2985
+ ),
2986
+ migrations.AlterModelOptions(
2987
+ name="tradeproposal",
2988
+ options={"verbose_name": "Trade Proposal", "verbose_name_plural": "Trade Proposals"},
2989
+ ),
2990
+ migrations.RenameField(
2991
+ model_name="trade",
2992
+ old_name="delta_weight",
2993
+ new_name="weighting",
2994
+ ),
2995
+ migrations.RemoveField(
2996
+ model_name="trade",
2997
+ name="effective_weight",
2998
+ ),
2999
+ migrations.RemoveField(
3000
+ model_name="trade",
3001
+ name="target_weight",
3002
+ ),
3003
+ migrations.AlterUniqueTogether(
3004
+ name="tradeproposal",
3005
+ unique_together={("portfolio", "trade_date")},
3006
+ ),
3007
+ migrations.AlterField(
3008
+ model_name="trade",
3009
+ name="weighting",
3010
+ field=models.DecimalField(
3011
+ decimal_places=6,
3012
+ default=Decimal("0"),
3013
+ help_text="The weight to be multiplied against the target",
3014
+ max_digits=16,
3015
+ verbose_name="Weight",
3016
+ ),
3017
+ ),
3018
+ migrations.RemoveField(
3019
+ model_name="fundamental",
3020
+ name="computed_str",
3021
+ ),
3022
+ migrations.RemoveField(
3023
+ model_name="geographicsegment",
3024
+ name="computed_str",
3025
+ ),
3026
+ migrations.AlterField(
3027
+ model_name="assetposition",
3028
+ name="initial_shares",
3029
+ field=models.DecimalField(
3030
+ blank=True,
3031
+ decimal_places=4,
3032
+ help_text="The amount of Units of the Asset on the price date of the Asset.",
3033
+ max_digits=18,
3034
+ null=True,
3035
+ verbose_name="Initial Quantity",
3036
+ ),
3037
+ ),
3038
+ migrations.AddField(
3039
+ model_name="assetposition",
3040
+ name="import_source",
3041
+ field=models.ForeignKey(
3042
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="io.importsource"
3043
+ ),
3044
+ ),
3045
+ migrations.AddField(
3046
+ model_name="dailyfundamental",
3047
+ name="import_source",
3048
+ field=models.ForeignKey(
3049
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="io.importsource"
3050
+ ),
3051
+ ),
3052
+ migrations.AddField(
3053
+ model_name="deal",
3054
+ name="import_source",
3055
+ field=models.ForeignKey(
3056
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="io.importsource"
3057
+ ),
3058
+ ),
3059
+ migrations.AddField(
3060
+ model_name="fiscalperiod",
3061
+ name="import_source",
3062
+ field=models.ForeignKey(
3063
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="io.importsource"
3064
+ ),
3065
+ ),
3066
+ migrations.AddField(
3067
+ model_name="forecast",
3068
+ name="import_source",
3069
+ field=models.ForeignKey(
3070
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="io.importsource"
3071
+ ),
3072
+ ),
3073
+ migrations.AddField(
3074
+ model_name="fundamental",
3075
+ name="import_source",
3076
+ field=models.ForeignKey(
3077
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="io.importsource"
3078
+ ),
3079
+ ),
3080
+ migrations.AddField(
3081
+ model_name="geographicsegment",
3082
+ name="import_source",
3083
+ field=models.ForeignKey(
3084
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="io.importsource"
3085
+ ),
3086
+ ),
3087
+ migrations.AddField(
3088
+ model_name="instrument",
3089
+ name="import_source",
3090
+ field=models.ForeignKey(
3091
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="io.importsource"
3092
+ ),
3093
+ ),
3094
+ migrations.AddField(
3095
+ model_name="instrumentprice",
3096
+ name="import_source",
3097
+ field=models.ForeignKey(
3098
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="io.importsource"
3099
+ ),
3100
+ ),
3101
+ migrations.AddField(
3102
+ model_name="register",
3103
+ name="import_source",
3104
+ field=models.ForeignKey(
3105
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="io.importsource"
3106
+ ),
3107
+ ),
3108
+ migrations.AddField(
3109
+ model_name="splitdata",
3110
+ name="import_source",
3111
+ field=models.ForeignKey(
3112
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="io.importsource"
3113
+ ),
3114
+ ),
3115
+ migrations.AddField(
3116
+ model_name="transaction",
3117
+ name="import_source",
3118
+ field=models.ForeignKey(
3119
+ blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to="io.importsource"
3120
+ ),
3121
+ ),
3122
+ migrations.AddField(
3123
+ model_name="exchange",
3124
+ name="city",
3125
+ field=models.ForeignKey(
3126
+ blank=True,
3127
+ help_text="The city where this Exchange is located at.",
3128
+ limit_choices_to={"level": 3},
3129
+ null=True,
3130
+ on_delete=django.db.models.deletion.PROTECT,
3131
+ related_name="portfolio_exchanges_city",
3132
+ to="geography.geography",
3133
+ verbose_name="City",
3134
+ ),
3135
+ ),
3136
+ migrations.AddField(
3137
+ model_name="exchange",
3138
+ name="country",
3139
+ field=models.ForeignKey(
3140
+ blank=True,
3141
+ help_text="The country where this exchange is located at.",
3142
+ limit_choices_to={"level": 1},
3143
+ null=True,
3144
+ on_delete=django.db.models.deletion.PROTECT,
3145
+ related_name="portfolio_exchanges_country",
3146
+ to="geography.geography",
3147
+ verbose_name="Country",
3148
+ ),
3149
+ ),
3150
+ migrations.AddField(
3151
+ model_name="geographicfocus",
3152
+ name="country",
3153
+ field=models.ForeignKey(
3154
+ default=None,
3155
+ on_delete=django.db.models.deletion.PROTECT,
3156
+ to="geography.geography",
3157
+ verbose_name="Location",
3158
+ ),
3159
+ preserve_default=False,
3160
+ ),
3161
+ migrations.AddField(
3162
+ model_name="instrument",
3163
+ name="country",
3164
+ field=models.ForeignKey(
3165
+ blank=True,
3166
+ help_text="Country in which this instrument is issued and bonded by law. The country of jurisdiction.",
3167
+ limit_choices_to={"level": 1},
3168
+ null=True,
3169
+ on_delete=django.db.models.deletion.SET_NULL,
3170
+ related_name="instruments",
3171
+ to="geography.geography",
3172
+ verbose_name="Country",
3173
+ ),
3174
+ ),
3175
+ migrations.AddField(
3176
+ model_name="product",
3177
+ name="jurisdiction",
3178
+ field=models.ForeignKey(
3179
+ blank=True,
3180
+ help_text="The country of jurisdiction",
3181
+ limit_choices_to={"level": 1},
3182
+ null=True,
3183
+ on_delete=django.db.models.deletion.SET_NULL,
3184
+ related_name="products",
3185
+ to="geography.geography",
3186
+ verbose_name="Country on which this product is issued and bonded by law",
3187
+ ),
3188
+ ),
3189
+ migrations.AddField(
3190
+ model_name="productgrouprepresentant",
3191
+ name="country",
3192
+ field=models.ForeignKey(
3193
+ blank=True,
3194
+ limit_choices_to={"level": 1},
3195
+ null=True,
3196
+ on_delete=django.db.models.deletion.PROTECT,
3197
+ to="geography.geography",
3198
+ ),
3199
+ preserve_default=False,
3200
+ ),
3201
+ migrations.AddField(
3202
+ model_name="register",
3203
+ name="citizenship",
3204
+ field=models.ForeignKey(
3205
+ blank=True,
3206
+ limit_choices_to={"level": 1},
3207
+ null=True,
3208
+ on_delete=django.db.models.deletion.PROTECT,
3209
+ related_name="register_citizenship_registers",
3210
+ to="geography.geography",
3211
+ ),
3212
+ preserve_default=False,
3213
+ ),
3214
+ migrations.AddField(
3215
+ model_name="register",
3216
+ name="custodian_country",
3217
+ field=models.ForeignKey(
3218
+ blank=True,
3219
+ limit_choices_to={"level": 1},
3220
+ null=True,
3221
+ on_delete=django.db.models.deletion.PROTECT,
3222
+ related_name="register_custodian_country_registers",
3223
+ to="geography.geography",
3224
+ ),
3225
+ preserve_default=False,
3226
+ ),
3227
+ migrations.AddField(
3228
+ model_name="register",
3229
+ name="outlet_country",
3230
+ field=models.ForeignKey(
3231
+ blank=True,
3232
+ limit_choices_to={"level": 1},
3233
+ null=True,
3234
+ on_delete=django.db.models.deletion.SET_NULL,
3235
+ related_name="register_outlet_country_registers",
3236
+ to="geography.geography",
3237
+ ),
3238
+ ),
3239
+ migrations.AddField(
3240
+ model_name="register",
3241
+ name="residence",
3242
+ field=models.ForeignKey(
3243
+ blank=True,
3244
+ limit_choices_to={"level": 1},
3245
+ null=True,
3246
+ on_delete=django.db.models.deletion.PROTECT,
3247
+ related_name="register_residence_registers",
3248
+ to="geography.geography",
3249
+ ),
3250
+ preserve_default=False,
3251
+ ),
3252
+ migrations.AddField(
3253
+ model_name="register",
3254
+ name="custodian_city",
3255
+ field=models.ForeignKey(
3256
+ blank=True,
3257
+ limit_choices_to={"level": 3},
3258
+ null=True,
3259
+ on_delete=django.db.models.deletion.PROTECT,
3260
+ related_name="register_custodian_city_registers",
3261
+ to="geography.geography",
3262
+ ),
3263
+ preserve_default=False,
3264
+ ),
3265
+ migrations.AddField(
3266
+ model_name="register",
3267
+ name="outlet_city",
3268
+ field=models.ForeignKey(
3269
+ blank=True,
3270
+ limit_choices_to={"level": 3},
3271
+ null=True,
3272
+ on_delete=django.db.models.deletion.SET_NULL,
3273
+ related_name="register_outlet_city_registers",
3274
+ to="geography.geography",
3275
+ ),
3276
+ ),
3277
+ migrations.AddField(
3278
+ model_name="instrument",
3279
+ name="headquarter_city",
3280
+ field=models.ForeignKey(
3281
+ blank=True,
3282
+ help_text="The company's headquarter city",
3283
+ limit_choices_to={"level": 3},
3284
+ null=True,
3285
+ on_delete=django.db.models.deletion.SET_NULL,
3286
+ related_name="headquarters_of",
3287
+ to="geography.geography",
3288
+ verbose_name="Headquarter City",
3289
+ ),
3290
+ ),
3291
+ migrations.AddConstraint(
3292
+ model_name="productgrouprepresentant",
3293
+ constraint=models.UniqueConstraint(
3294
+ fields=("product_group", "country"), name="unique_country_product_group"
3295
+ ),
3296
+ ),
3297
+ migrations.AlterField(
3298
+ model_name="exchange",
3299
+ name="city",
3300
+ field=models.ForeignKey(
3301
+ blank=True,
3302
+ help_text="The city where this Exchange is located at.",
3303
+ limit_choices_to={"level": 3},
3304
+ null=True,
3305
+ on_delete=django.db.models.deletion.PROTECT,
3306
+ related_name="portfolio_exchanges_city",
3307
+ to="geography.geography",
3308
+ verbose_name="City",
3309
+ ),
3310
+ ),
3311
+ migrations.AlterField(
3312
+ model_name="exchange",
3313
+ name="country",
3314
+ field=models.ForeignKey(
3315
+ blank=True,
3316
+ help_text="The country where this exchange is located at.",
3317
+ limit_choices_to={"level": 1},
3318
+ null=True,
3319
+ on_delete=django.db.models.deletion.PROTECT,
3320
+ related_name="portfolio_exchanges_country",
3321
+ to="geography.geography",
3322
+ verbose_name="Country",
3323
+ ),
3324
+ ),
3325
+ migrations.AlterField(
3326
+ model_name="geographicfocus",
3327
+ name="country",
3328
+ field=models.ForeignKey(
3329
+ on_delete=django.db.models.deletion.PROTECT, to="geography.geography", verbose_name="Location"
3330
+ ),
3331
+ ),
3332
+ migrations.AlterField(
3333
+ model_name="instrument",
3334
+ name="country",
3335
+ field=models.ForeignKey(
3336
+ blank=True,
3337
+ help_text="Country in which this instrument is issued and bonded by law. The country of jurisdiction.",
3338
+ limit_choices_to={"level": 1},
3339
+ null=True,
3340
+ on_delete=django.db.models.deletion.SET_NULL,
3341
+ related_name="instruments",
3342
+ to="geography.geography",
3343
+ verbose_name="Country",
3344
+ ),
3345
+ ),
3346
+ migrations.AlterField(
3347
+ model_name="instrument",
3348
+ name="headquarter_city",
3349
+ field=models.ForeignKey(
3350
+ blank=True,
3351
+ help_text="The company's headquarter city",
3352
+ limit_choices_to={"level": 3},
3353
+ null=True,
3354
+ on_delete=django.db.models.deletion.SET_NULL,
3355
+ related_name="headquarters_of",
3356
+ to="geography.geography",
3357
+ verbose_name="Headquarter City",
3358
+ ),
3359
+ ),
3360
+ migrations.AlterField(
3361
+ model_name="product",
3362
+ name="jurisdiction",
3363
+ field=models.ForeignKey(
3364
+ blank=True,
3365
+ help_text="The country of jurisdiction",
3366
+ limit_choices_to={"level": 1},
3367
+ null=True,
3368
+ on_delete=django.db.models.deletion.SET_NULL,
3369
+ related_name="products",
3370
+ to="geography.geography",
3371
+ verbose_name="Country on which this product is issued and bonded by law",
3372
+ ),
3373
+ ),
3374
+ migrations.AlterField(
3375
+ model_name="productgrouprepresentant",
3376
+ name="country",
3377
+ field=models.ForeignKey(
3378
+ blank=True,
3379
+ limit_choices_to={"level": 1},
3380
+ null=True,
3381
+ on_delete=django.db.models.deletion.PROTECT,
3382
+ to="geography.geography",
3383
+ ),
3384
+ ),
3385
+ migrations.AlterField(
3386
+ model_name="register",
3387
+ name="citizenship",
3388
+ field=models.ForeignKey(
3389
+ blank=True,
3390
+ limit_choices_to={"level": 1},
3391
+ null=True,
3392
+ on_delete=django.db.models.deletion.PROTECT,
3393
+ related_name="register_citizenship_registers",
3394
+ to="geography.geography",
3395
+ ),
3396
+ ),
3397
+ migrations.AlterField(
3398
+ model_name="register",
3399
+ name="custodian_city",
3400
+ field=models.ForeignKey(
3401
+ blank=True,
3402
+ limit_choices_to={"level": 3},
3403
+ null=True,
3404
+ on_delete=django.db.models.deletion.PROTECT,
3405
+ related_name="register_custodian_city_registers",
3406
+ to="geography.geography",
3407
+ ),
3408
+ ),
3409
+ migrations.AlterField(
3410
+ model_name="register",
3411
+ name="custodian_country",
3412
+ field=models.ForeignKey(
3413
+ blank=True,
3414
+ limit_choices_to={"level": 1},
3415
+ null=True,
3416
+ on_delete=django.db.models.deletion.PROTECT,
3417
+ related_name="register_custodian_country_registers",
3418
+ to="geography.geography",
3419
+ ),
3420
+ ),
3421
+ migrations.AlterField(
3422
+ model_name="register",
3423
+ name="outlet_city",
3424
+ field=models.ForeignKey(
3425
+ blank=True,
3426
+ limit_choices_to={"level": 3},
3427
+ null=True,
3428
+ on_delete=django.db.models.deletion.SET_NULL,
3429
+ related_name="register_outlet_city_registers",
3430
+ to="geography.geography",
3431
+ ),
3432
+ ),
3433
+ migrations.AlterField(
3434
+ model_name="register",
3435
+ name="outlet_country",
3436
+ field=models.ForeignKey(
3437
+ blank=True,
3438
+ limit_choices_to={"level": 1},
3439
+ null=True,
3440
+ on_delete=django.db.models.deletion.SET_NULL,
3441
+ related_name="register_outlet_country_registers",
3442
+ to="geography.geography",
3443
+ ),
3444
+ ),
3445
+ migrations.AlterField(
3446
+ model_name="register",
3447
+ name="residence",
3448
+ field=models.ForeignKey(
3449
+ blank=True,
3450
+ limit_choices_to={"level": 1},
3451
+ null=True,
3452
+ on_delete=django.db.models.deletion.PROTECT,
3453
+ related_name="register_residence_registers",
3454
+ to="geography.geography",
3455
+ ),
3456
+ ),
3457
+ migrations.AddField(
3458
+ model_name="assetposition",
3459
+ name="currency",
3460
+ field=models.ForeignKey(
3461
+ help_text="The Currency of the Asset.",
3462
+ on_delete=django.db.models.deletion.PROTECT,
3463
+ related_name="portfolio_currencies_asset",
3464
+ to="currency.currency",
3465
+ verbose_name="Currency",
3466
+ ),
3467
+ ),
3468
+ migrations.AddField(
3469
+ model_name="assetposition",
3470
+ name="currency_fx_rate_instrument_to_usd",
3471
+ field=models.ForeignKey(
3472
+ blank=True,
3473
+ help_text="Rate to between instrument currency and USD",
3474
+ null=True,
3475
+ on_delete=django.db.models.deletion.PROTECT,
3476
+ related_name="instrument_assets",
3477
+ to="currency.currencyfxrates",
3478
+ verbose_name="Instrument Currency Rate",
3479
+ ),
3480
+ ),
3481
+ migrations.AddField(
3482
+ model_name="assetposition",
3483
+ name="currency_fx_rate_portfolio_to_usd",
3484
+ field=models.ForeignKey(
3485
+ blank=True,
3486
+ help_text="Rate to between portfolio currency and USD",
3487
+ null=True,
3488
+ on_delete=django.db.models.deletion.PROTECT,
3489
+ related_name="portfolio_assets",
3490
+ to="currency.currencyfxrates",
3491
+ verbose_name="Portfolio Currency Rate",
3492
+ ),
3493
+ ),
3494
+ migrations.AddField(
3495
+ model_name="companyportfoliodata",
3496
+ name="assets_under_management_currency",
3497
+ field=models.ForeignKey(
3498
+ blank=True,
3499
+ null=True,
3500
+ on_delete=django.db.models.deletion.PROTECT,
3501
+ to="currency.currency",
3502
+ verbose_name="AUM Currency",
3503
+ ),
3504
+ ),
3505
+ migrations.AddField(
3506
+ model_name="companyportfoliodata",
3507
+ name="potential_currency",
3508
+ field=models.ForeignKey(
3509
+ blank=True,
3510
+ null=True,
3511
+ on_delete=django.db.models.deletion.PROTECT,
3512
+ related_name="wbportfolio_potential_currencies",
3513
+ to="currency.currency",
3514
+ ),
3515
+ ),
3516
+ migrations.AddField(
3517
+ model_name="instrument",
3518
+ name="currency",
3519
+ field=models.ForeignKey(
3520
+ on_delete=django.db.models.deletion.PROTECT,
3521
+ related_name="instruments",
3522
+ to="currency.currency",
3523
+ verbose_name="Currency",
3524
+ ),
3525
+ ),
3526
+ migrations.AddField(
3527
+ model_name="portfolio",
3528
+ name="currency",
3529
+ field=models.ForeignKey(
3530
+ help_text="The currency of the portfolio.",
3531
+ on_delete=django.db.models.deletion.PROTECT,
3532
+ related_name="portfolios",
3533
+ to="currency.currency",
3534
+ verbose_name="Currency",
3535
+ ),
3536
+ ),
3537
+ migrations.AddField(
3538
+ model_name="product",
3539
+ name="index_hedged_currency",
3540
+ field=models.ForeignKey(
3541
+ blank=True,
3542
+ help_text="The currency upon to which the product's strategies is hedged. Default to None",
3543
+ null=True,
3544
+ on_delete=django.db.models.deletion.PROTECT,
3545
+ related_name="hedged_products",
3546
+ to="currency.currency",
3547
+ verbose_name="Index Hedged Currency",
3548
+ ),
3549
+ ),
3550
+ migrations.AddField(
3551
+ model_name="transaction",
3552
+ name="currency",
3553
+ field=models.ForeignKey(
3554
+ on_delete=django.db.models.deletion.PROTECT,
3555
+ related_name="transactions",
3556
+ to="currency.currency",
3557
+ verbose_name="Currency",
3558
+ ),
3559
+ ),
3560
+ migrations.AddField(
3561
+ model_name="instrument",
3562
+ name="tags",
3563
+ field=models.ManyToManyField(blank=True, related_name="%(app_label)s_%(class)s_items", to="tags.tag"),
3564
+ ),
3565
+ migrations.AddField(
3566
+ model_name="instrumentclassificationthroughmodel",
3567
+ name="tags",
3568
+ field=models.ManyToManyField(blank=True, related_name="%(app_label)s_%(class)s_items", to="tags.tag"),
3569
+ ),
3570
+ migrations.AddField(
3571
+ model_name="assetallocation",
3572
+ name="company",
3573
+ field=models.ForeignKey(
3574
+ on_delete=django.db.models.deletion.CASCADE, related_name="asset_allocations", to="directory.company"
3575
+ ),
3576
+ ),
3577
+ migrations.AddField(
3578
+ model_name="companyportfoliodata",
3579
+ name="company",
3580
+ field=models.OneToOneField(
3581
+ on_delete=django.db.models.deletion.CASCADE, related_name="portfolio_data", to="directory.company"
3582
+ ),
3583
+ ),
3584
+ migrations.AddField(
3585
+ model_name="custodian",
3586
+ name="company",
3587
+ field=models.ForeignKey(
3588
+ blank=True,
3589
+ null=True,
3590
+ on_delete=django.db.models.deletion.SET_NULL,
3591
+ related_name="custodians",
3592
+ to="directory.company",
3593
+ ),
3594
+ ),
3595
+ migrations.AddField(
3596
+ model_name="geographicfocus",
3597
+ name="company",
3598
+ field=models.ForeignKey(
3599
+ on_delete=django.db.models.deletion.CASCADE, related_name="geographic_focuses", to="directory.company"
3600
+ ),
3601
+ ),
3602
+ migrations.AddField(
3603
+ model_name="instrumentfavoritegroup",
3604
+ name="owner",
3605
+ field=models.ForeignKey(
3606
+ blank=True,
3607
+ null=True,
3608
+ on_delete=django.db.models.deletion.CASCADE,
3609
+ related_name="favorite_instruments_groups",
3610
+ to="directory.person",
3611
+ ),
3612
+ ),
3613
+ migrations.AddField(
3614
+ model_name="instrumentrequest",
3615
+ name="handler",
3616
+ field=models.ForeignKey(
3617
+ blank=True,
3618
+ null=True,
3619
+ on_delete=django.db.models.deletion.SET_NULL,
3620
+ related_name="handled_instrument_requests",
3621
+ to="directory.person",
3622
+ verbose_name="Handler",
3623
+ ),
3624
+ ),
3625
+ migrations.AddField(
3626
+ model_name="instrumentrequest",
3627
+ name="requester",
3628
+ field=models.ForeignKey(
3629
+ blank=True,
3630
+ null=True,
3631
+ on_delete=django.db.models.deletion.SET_NULL,
3632
+ related_name="instrument_requests",
3633
+ to="directory.person",
3634
+ verbose_name="Requester",
3635
+ ),
3636
+ ),
3637
+ migrations.AddField(
3638
+ model_name="portfoliorole",
3639
+ name="person",
3640
+ field=models.ForeignKey(
3641
+ on_delete=django.db.models.deletion.CASCADE,
3642
+ related_name="portfolio_roles",
3643
+ to="directory.person",
3644
+ verbose_name="Person",
3645
+ ),
3646
+ ),
3647
+ migrations.AddField(
3648
+ model_name="product",
3649
+ name="bank",
3650
+ field=models.ForeignKey(
3651
+ help_text="The Bank that holds the product. A company from the CRM.",
3652
+ on_delete=django.db.models.deletion.PROTECT,
3653
+ related_name="issues_products",
3654
+ to="directory.company",
3655
+ verbose_name="Bank",
3656
+ ),
3657
+ ),
3658
+ migrations.AddField(
3659
+ model_name="product",
3660
+ name="white_label_customers",
3661
+ field=models.ManyToManyField(
3662
+ blank=True,
3663
+ help_text="Specifies whether a product is a white label product or not. If at least one customer is specified, this product becomes a white label product and can only be seen by the respected customers.",
3664
+ related_name="white_label_customer_products",
3665
+ to="directory.entry",
3666
+ verbose_name="White Label Customers",
3667
+ ),
3668
+ ),
3669
+ migrations.AddField(
3670
+ model_name="productgroup",
3671
+ name="administrator",
3672
+ field=models.ForeignKey(
3673
+ blank=True,
3674
+ null=True,
3675
+ on_delete=django.db.models.deletion.SET_NULL,
3676
+ related_name="administrator_groups",
3677
+ to="directory.company",
3678
+ ),
3679
+ ),
3680
+ migrations.AddField(
3681
+ model_name="productgroup",
3682
+ name="auditor",
3683
+ field=models.ForeignKey(
3684
+ blank=True,
3685
+ null=True,
3686
+ on_delete=django.db.models.deletion.SET_NULL,
3687
+ related_name="auditor_groups",
3688
+ to="directory.company",
3689
+ ),
3690
+ ),
3691
+ migrations.AddField(
3692
+ model_name="productgroup",
3693
+ name="depositary",
3694
+ field=models.ForeignKey(
3695
+ blank=True,
3696
+ null=True,
3697
+ on_delete=django.db.models.deletion.SET_NULL,
3698
+ related_name="depositary_product_groups",
3699
+ to="directory.company",
3700
+ ),
3701
+ ),
3702
+ migrations.AddField(
3703
+ model_name="productgroup",
3704
+ name="investment_manager",
3705
+ field=models.ForeignKey(
3706
+ blank=True,
3707
+ null=True,
3708
+ on_delete=django.db.models.deletion.SET_NULL,
3709
+ related_name="investment_manager_groups",
3710
+ to="directory.company",
3711
+ ),
3712
+ ),
3713
+ migrations.AddField(
3714
+ model_name="productgroup",
3715
+ name="management_company",
3716
+ field=models.ForeignKey(
3717
+ blank=True,
3718
+ null=True,
3719
+ on_delete=django.db.models.deletion.SET_NULL,
3720
+ related_name="management_company_product_groups",
3721
+ to="directory.company",
3722
+ ),
3723
+ ),
3724
+ migrations.AddField(
3725
+ model_name="productgroup",
3726
+ name="paying_agent",
3727
+ field=models.ForeignKey(
3728
+ blank=True,
3729
+ null=True,
3730
+ on_delete=django.db.models.deletion.SET_NULL,
3731
+ related_name="paying_agent_groups",
3732
+ to="directory.company",
3733
+ ),
3734
+ ),
3735
+ migrations.AddField(
3736
+ model_name="productgroup",
3737
+ name="transfer_agent",
3738
+ field=models.ForeignKey(
3739
+ blank=True,
3740
+ null=True,
3741
+ on_delete=django.db.models.deletion.SET_NULL,
3742
+ related_name="transfer_agent_product_groups",
3743
+ to="directory.company",
3744
+ ),
3745
+ ),
3746
+ migrations.AddField(
3747
+ model_name="productgrouprepresentant",
3748
+ name="representant",
3749
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to="directory.company"),
3750
+ ),
3751
+ migrations.AddField(
3752
+ model_name="relationshipresearch",
3753
+ name="entry",
3754
+ field=models.ForeignKey(
3755
+ on_delete=django.db.models.deletion.CASCADE,
3756
+ related_name="entries_relationship_researches",
3757
+ to="directory.entry",
3758
+ verbose_name="Relationship From",
3759
+ ),
3760
+ ),
3761
+ migrations.AddField(
3762
+ model_name="splitdata",
3763
+ name="last_handler",
3764
+ field=models.ForeignKey(
3765
+ blank=True,
3766
+ null=True,
3767
+ on_delete=django.db.models.deletion.SET_NULL,
3768
+ related_name="last_handled_splits",
3769
+ to="directory.person",
3770
+ ),
3771
+ ),
3772
+ migrations.AddField(
3773
+ model_name="tradeproposal",
3774
+ name="creator",
3775
+ field=models.ForeignKey(
3776
+ blank=True,
3777
+ null=True,
3778
+ on_delete=django.db.models.deletion.PROTECT,
3779
+ related_name="trade_proposals",
3780
+ to="directory.person",
3781
+ verbose_name="Owner",
3782
+ ),
3783
+ ),
3784
+ migrations.RemoveField(
3785
+ model_name="classificationperformanceanalysis",
3786
+ name="classification",
3787
+ ),
3788
+ migrations.RemoveField(
3789
+ model_name="instrumentperformanceanalysis",
3790
+ name="classification",
3791
+ ),
3792
+ migrations.RemoveField(
3793
+ model_name="instrumentperformanceanalysis",
3794
+ name="instrument",
3795
+ ),
3796
+ migrations.RemoveField(
3797
+ model_name="instrumentperformanceanalysis",
3798
+ name="performance_peers",
3799
+ ),
3800
+ migrations.RemoveField(
3801
+ model_name="theme",
3802
+ name="benchmarks",
3803
+ ),
3804
+ migrations.RemoveField(
3805
+ model_name="theme",
3806
+ name="classification",
3807
+ ),
3808
+ migrations.RemoveField(
3809
+ model_name="theme",
3810
+ name="composite",
3811
+ ),
3812
+ migrations.RemoveField(
3813
+ model_name="theme",
3814
+ name="model_portfolio",
3815
+ ),
3816
+ migrations.RemoveField(
3817
+ model_name="theme",
3818
+ name="peers",
3819
+ ),
3820
+ migrations.RemoveField(
3821
+ model_name="theme",
3822
+ name="products",
3823
+ ),
3824
+ migrations.DeleteModel(
3825
+ name="AddressableMarket",
3826
+ ),
3827
+ migrations.DeleteModel(
3828
+ name="ClassificationPerformanceAnalysis",
3829
+ ),
3830
+ migrations.DeleteModel(
3831
+ name="InstrumentPerformanceAnalysis",
3832
+ ),
3833
+ migrations.DeleteModel(
3834
+ name="Theme",
3835
+ ),
3836
+ ]