wbportfolio 1.52.0__py2.py3-none-any.whl → 1.59.4__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 (273) hide show
  1. wbportfolio/admin/__init__.py +3 -1
  2. wbportfolio/admin/indexes.py +1 -1
  3. wbportfolio/admin/orders/__init__.py +2 -0
  4. wbportfolio/admin/orders/order_proposals.py +16 -0
  5. wbportfolio/admin/orders/orders.py +32 -0
  6. wbportfolio/admin/portfolio.py +11 -5
  7. wbportfolio/admin/product_groups.py +1 -1
  8. wbportfolio/admin/products.py +2 -1
  9. wbportfolio/admin/{transactions/rebalancing.py → rebalancing.py} +1 -1
  10. wbportfolio/admin/transactions/__init__.py +0 -2
  11. wbportfolio/admin/transactions/dividends.py +40 -4
  12. wbportfolio/admin/transactions/fees.py +24 -14
  13. wbportfolio/admin/transactions/trades.py +34 -27
  14. wbportfolio/analysis/claims.py +5 -6
  15. wbportfolio/api_clients/ubs.py +162 -0
  16. wbportfolio/constants.py +1 -0
  17. wbportfolio/contrib/company_portfolio/configs/display.py +22 -10
  18. wbportfolio/contrib/company_portfolio/configs/previews.py +3 -3
  19. wbportfolio/contrib/company_portfolio/filters.py +10 -10
  20. wbportfolio/contrib/company_portfolio/models.py +69 -39
  21. wbportfolio/contrib/company_portfolio/scripts.py +7 -2
  22. wbportfolio/contrib/company_portfolio/serializers.py +32 -22
  23. wbportfolio/contrib/company_portfolio/tasks.py +12 -1
  24. wbportfolio/contrib/company_portfolio/tests/conftest.py +2 -2
  25. wbportfolio/defaults/fees/default.py +7 -15
  26. wbportfolio/factories/__init__.py +2 -2
  27. wbportfolio/factories/assets.py +1 -1
  28. wbportfolio/factories/dividends.py +8 -3
  29. wbportfolio/factories/fees.py +8 -4
  30. wbportfolio/factories/orders/__init__.py +2 -0
  31. wbportfolio/factories/orders/order_proposals.py +21 -0
  32. wbportfolio/factories/orders/orders.py +34 -0
  33. wbportfolio/factories/portfolios.py +2 -1
  34. wbportfolio/factories/product_groups.py +3 -3
  35. wbportfolio/factories/products.py +3 -3
  36. wbportfolio/factories/rebalancing.py +1 -1
  37. wbportfolio/factories/trades.py +12 -16
  38. wbportfolio/filters/assets.py +18 -4
  39. wbportfolio/filters/orders/__init__.py +2 -0
  40. wbportfolio/filters/orders/order_proposals.py +55 -0
  41. wbportfolio/filters/orders/orders.py +11 -0
  42. wbportfolio/filters/portfolios.py +38 -1
  43. wbportfolio/filters/positions.py +0 -1
  44. wbportfolio/filters/transactions/__init__.py +1 -2
  45. wbportfolio/filters/transactions/fees.py +5 -12
  46. wbportfolio/filters/transactions/trades.py +16 -8
  47. wbportfolio/filters/transactions/utils.py +42 -0
  48. wbportfolio/import_export/backends/ubs/__init__.py +1 -0
  49. wbportfolio/import_export/backends/ubs/asset_position.py +6 -7
  50. wbportfolio/import_export/backends/ubs/fees.py +10 -20
  51. wbportfolio/import_export/backends/ubs/instrument_price.py +6 -6
  52. wbportfolio/import_export/backends/ubs/trade.py +48 -0
  53. wbportfolio/import_export/backends/utils.py +0 -17
  54. wbportfolio/import_export/handlers/asset_position.py +22 -10
  55. wbportfolio/import_export/handlers/dividend.py +8 -8
  56. wbportfolio/import_export/handlers/fees.py +13 -23
  57. wbportfolio/import_export/handlers/orders.py +71 -0
  58. wbportfolio/import_export/handlers/trade.py +53 -77
  59. wbportfolio/import_export/parsers/default_mapping.py +1 -1
  60. wbportfolio/import_export/parsers/jpmorgan/customer_trade.py +2 -2
  61. wbportfolio/import_export/parsers/jpmorgan/fees.py +4 -4
  62. wbportfolio/import_export/parsers/jpmorgan/strategy.py +59 -85
  63. wbportfolio/import_export/parsers/jpmorgan/valuation.py +2 -2
  64. wbportfolio/import_export/parsers/leonteq/customer_trade.py +5 -5
  65. wbportfolio/import_export/parsers/leonteq/fees.py +11 -7
  66. wbportfolio/import_export/parsers/leonteq/trade.py +2 -6
  67. wbportfolio/import_export/parsers/natixis/d1_fees.py +2 -2
  68. wbportfolio/import_export/parsers/natixis/dividend.py +4 -9
  69. wbportfolio/import_export/parsers/natixis/equity.py +22 -4
  70. wbportfolio/import_export/parsers/natixis/fees.py +7 -9
  71. wbportfolio/import_export/parsers/natixis/utils.py +13 -19
  72. wbportfolio/import_export/parsers/sg_lux/customer_trade_pending_slk.py +1 -1
  73. wbportfolio/import_export/parsers/sg_lux/equity.py +10 -10
  74. wbportfolio/import_export/parsers/sg_lux/fees.py +2 -2
  75. wbportfolio/import_export/parsers/sg_lux/perf_fees.py +2 -2
  76. wbportfolio/import_export/parsers/sg_lux/sylk.py +12 -11
  77. wbportfolio/import_export/parsers/sg_lux/utils.py +2 -2
  78. wbportfolio/import_export/parsers/sg_lux/valuation.py +4 -2
  79. wbportfolio/import_export/parsers/societe_generale/strategy.py +5 -5
  80. wbportfolio/import_export/parsers/tellco/customer_trade.py +2 -1
  81. wbportfolio/import_export/parsers/tellco/valuation.py +4 -3
  82. wbportfolio/import_export/parsers/ubs/api/fees.py +2 -2
  83. wbportfolio/import_export/parsers/ubs/api/trade.py +39 -0
  84. wbportfolio/import_export/parsers/ubs/customer_trade.py +7 -5
  85. wbportfolio/import_export/parsers/ubs/equity.py +3 -2
  86. wbportfolio/import_export/parsers/ubs/valuation.py +2 -1
  87. wbportfolio/import_export/parsers/vontobel/customer_trade.py +2 -3
  88. wbportfolio/import_export/parsers/vontobel/historical_customer_trade.py +0 -1
  89. wbportfolio/import_export/parsers/vontobel/management_fees.py +12 -20
  90. wbportfolio/import_export/parsers/vontobel/performance_fees.py +5 -8
  91. wbportfolio/import_export/parsers/vontobel/valuation_api.py +4 -1
  92. wbportfolio/import_export/resources/trades.py +3 -3
  93. wbportfolio/import_export/utils.py +3 -1
  94. wbportfolio/jinja2/wbportfolio/sql/aum_nnm.sql +2 -2
  95. wbportfolio/metric/backends/base.py +2 -2
  96. wbportfolio/migrations/0059_fees_unique_fees.py +1 -1
  97. wbportfolio/migrations/0077_remove_transaction_currency_and_more.py +622 -0
  98. wbportfolio/migrations/0078_trade_drift_factor.py +26 -0
  99. wbportfolio/migrations/0079_alter_trade_drift_factor.py +19 -0
  100. wbportfolio/migrations/0080_alter_trade_drift_factor_alter_trade_weighting.py +19 -0
  101. wbportfolio/migrations/0081_alter_trade_drift_factor.py +19 -0
  102. wbportfolio/migrations/0082_remove_tradeproposal_creator_and_more.py +93 -0
  103. wbportfolio/migrations/0083_order_alter_trade_options_and_more.py +181 -0
  104. wbportfolio/migrations/0084_orderproposal_min_order_value.py +25 -0
  105. wbportfolio/migrations/0085_order_desired_target_weight.py +26 -0
  106. wbportfolio/migrations/0086_orderproposal_total_cash_weight.py +19 -0
  107. wbportfolio/migrations/0087_product_order_routing_custodian_adapter.py +94 -0
  108. wbportfolio/migrations/0088_orderproposal_total_effective_portfolio_contribution.py +19 -0
  109. wbportfolio/migrations/0089_orderproposal_min_weighting.py +71 -0
  110. wbportfolio/migrations/0090_dividendtransaction_price_fx_portfolio_and_more.py +44 -0
  111. wbportfolio/migrations/0091_remove_order_execution_confirmed_and_more.py +32 -0
  112. wbportfolio/migrations/0092_order_quantization_error_alter_orderproposal_status.py +49 -0
  113. wbportfolio/migrations/0093_remove_portfolioportfoliothroughmodel_unique_primary_and_more.py +35 -0
  114. wbportfolio/models/__init__.py +2 -0
  115. wbportfolio/models/adjustments.py +1 -1
  116. wbportfolio/models/asset.py +28 -170
  117. wbportfolio/models/builder.py +323 -0
  118. wbportfolio/models/custodians.py +3 -3
  119. wbportfolio/models/exceptions.py +1 -1
  120. wbportfolio/models/graphs/portfolio.py +1 -1
  121. wbportfolio/models/graphs/utils.py +11 -11
  122. wbportfolio/models/mixins/instruments.py +7 -0
  123. wbportfolio/models/mixins/liquidity_stress_test.py +4 -4
  124. wbportfolio/models/orders/__init__.py +2 -0
  125. wbportfolio/models/orders/order_proposals.py +1414 -0
  126. wbportfolio/models/orders/orders.py +410 -0
  127. wbportfolio/models/portfolio.py +311 -289
  128. wbportfolio/models/portfolio_relationship.py +6 -0
  129. wbportfolio/models/products.py +12 -0
  130. wbportfolio/models/{transactions/rebalancing.py → rebalancing.py} +40 -27
  131. wbportfolio/models/roles.py +4 -10
  132. wbportfolio/models/transactions/__init__.py +0 -4
  133. wbportfolio/models/transactions/claim.py +7 -6
  134. wbportfolio/models/transactions/dividends.py +42 -5
  135. wbportfolio/models/transactions/fees.py +55 -22
  136. wbportfolio/models/transactions/trades.py +121 -442
  137. wbportfolio/models/transactions/transactions.py +78 -158
  138. wbportfolio/models/utils.py +100 -1
  139. wbportfolio/order_routing/__init__.py +35 -0
  140. wbportfolio/order_routing/adapters/__init__.py +65 -0
  141. wbportfolio/order_routing/adapters/ubs.py +195 -0
  142. wbportfolio/order_routing/router.py +33 -0
  143. wbportfolio/order_routing/tests/__init__.py +0 -0
  144. wbportfolio/order_routing/tests/test_router.py +110 -0
  145. wbportfolio/permissions.py +7 -0
  146. wbportfolio/pms/analytics/portfolio.py +17 -9
  147. wbportfolio/pms/analytics/utils.py +9 -0
  148. wbportfolio/pms/trading/__init__.py +0 -1
  149. wbportfolio/pms/trading/optimizer.py +61 -0
  150. wbportfolio/pms/typing.py +198 -63
  151. wbportfolio/rebalancing/base.py +12 -1
  152. wbportfolio/rebalancing/decorators.py +1 -1
  153. wbportfolio/rebalancing/models/composite.py +4 -8
  154. wbportfolio/rebalancing/models/equally_weighted.py +13 -11
  155. wbportfolio/rebalancing/models/market_capitalization_weighted.py +21 -14
  156. wbportfolio/rebalancing/models/model_portfolio.py +14 -18
  157. wbportfolio/risk_management/backends/__init__.py +1 -0
  158. wbportfolio/risk_management/backends/controversy_portfolio.py +2 -2
  159. wbportfolio/risk_management/backends/esg_aggregation_portfolio.py +64 -0
  160. wbportfolio/risk_management/backends/exposure_portfolio.py +4 -4
  161. wbportfolio/risk_management/backends/instrument_list_portfolio.py +3 -3
  162. wbportfolio/risk_management/tests/test_esg_aggregation_portfolio.py +49 -0
  163. wbportfolio/risk_management/tests/test_exposure_portfolio.py +1 -1
  164. wbportfolio/risk_management/tests/test_stop_loss_instrument.py +2 -2
  165. wbportfolio/risk_management/tests/test_stop_loss_portfolio.py +1 -1
  166. wbportfolio/serializers/__init__.py +1 -0
  167. wbportfolio/serializers/orders/__init__.py +2 -0
  168. wbportfolio/serializers/orders/order_proposals.py +115 -0
  169. wbportfolio/serializers/orders/orders.py +283 -0
  170. wbportfolio/serializers/portfolios.py +7 -7
  171. wbportfolio/serializers/positions.py +2 -2
  172. wbportfolio/serializers/rebalancing.py +1 -1
  173. wbportfolio/serializers/signals.py +9 -12
  174. wbportfolio/serializers/transactions/__init__.py +1 -10
  175. wbportfolio/serializers/transactions/claim.py +2 -2
  176. wbportfolio/serializers/transactions/dividends.py +37 -9
  177. wbportfolio/serializers/transactions/fees.py +39 -10
  178. wbportfolio/serializers/transactions/trades.py +55 -157
  179. wbportfolio/tasks.py +43 -5
  180. wbportfolio/tests/analysis/__init__.py +0 -0
  181. wbportfolio/tests/analysis/test_claims.py +85 -0
  182. wbportfolio/tests/conftest.py +12 -12
  183. wbportfolio/tests/models/orders/__init__.py +0 -0
  184. wbportfolio/tests/models/orders/test_order_proposals.py +1046 -0
  185. wbportfolio/tests/models/test_assets.py +7 -3
  186. wbportfolio/tests/models/test_imports.py +9 -13
  187. wbportfolio/tests/models/test_portfolios.py +102 -95
  188. wbportfolio/tests/models/test_products.py +11 -0
  189. wbportfolio/tests/models/test_splits.py +1 -6
  190. wbportfolio/tests/models/test_utils.py +140 -0
  191. wbportfolio/tests/models/transactions/test_fees.py +7 -13
  192. wbportfolio/tests/models/transactions/test_rebalancing.py +5 -5
  193. wbportfolio/tests/models/transactions/test_trades.py +0 -20
  194. wbportfolio/tests/pms/test_analytics.py +22 -3
  195. wbportfolio/tests/rebalancing/test_models.py +51 -57
  196. wbportfolio/tests/signals.py +10 -20
  197. wbportfolio/tests/tests.py +3 -1
  198. wbportfolio/tests/viewsets/test_products.py +1 -0
  199. wbportfolio/urls.py +10 -13
  200. wbportfolio/viewsets/__init__.py +9 -4
  201. wbportfolio/viewsets/assets.py +3 -204
  202. wbportfolio/viewsets/charts/__init__.py +6 -1
  203. wbportfolio/viewsets/charts/assets.py +344 -154
  204. wbportfolio/viewsets/configs/buttons/__init__.py +2 -2
  205. wbportfolio/viewsets/configs/buttons/assets.py +1 -1
  206. wbportfolio/viewsets/configs/buttons/mixins.py +4 -4
  207. wbportfolio/viewsets/configs/buttons/portfolios.py +45 -1
  208. wbportfolio/viewsets/configs/buttons/products.py +32 -2
  209. wbportfolio/viewsets/configs/display/__init__.py +2 -5
  210. wbportfolio/viewsets/configs/display/assets.py +6 -19
  211. wbportfolio/viewsets/configs/display/fees.py +3 -3
  212. wbportfolio/viewsets/configs/display/portfolios.py +5 -5
  213. wbportfolio/viewsets/configs/display/products.py +1 -1
  214. wbportfolio/viewsets/configs/display/rebalancing.py +2 -2
  215. wbportfolio/viewsets/configs/display/reconciliations.py +4 -4
  216. wbportfolio/viewsets/configs/display/trades.py +1 -189
  217. wbportfolio/viewsets/configs/endpoints/__init__.py +3 -7
  218. wbportfolio/viewsets/configs/endpoints/fees.py +2 -2
  219. wbportfolio/viewsets/configs/endpoints/trades.py +0 -41
  220. wbportfolio/viewsets/configs/menu/__init__.py +1 -1
  221. wbportfolio/viewsets/configs/menu/orders.py +11 -0
  222. wbportfolio/viewsets/configs/titles/__init__.py +2 -3
  223. wbportfolio/viewsets/configs/titles/fees.py +4 -8
  224. wbportfolio/viewsets/esg.py +3 -5
  225. wbportfolio/viewsets/mixins.py +5 -1
  226. wbportfolio/viewsets/orders/__init__.py +6 -0
  227. wbportfolio/viewsets/orders/configs/__init__.py +4 -0
  228. wbportfolio/viewsets/orders/configs/buttons/__init__.py +2 -0
  229. wbportfolio/viewsets/orders/configs/buttons/order_proposals.py +188 -0
  230. wbportfolio/viewsets/orders/configs/buttons/orders.py +113 -0
  231. wbportfolio/viewsets/orders/configs/displays/__init__.py +2 -0
  232. wbportfolio/viewsets/orders/configs/displays/order_proposals.py +157 -0
  233. wbportfolio/viewsets/orders/configs/displays/orders.py +232 -0
  234. wbportfolio/viewsets/orders/configs/endpoints/__init__.py +2 -0
  235. wbportfolio/viewsets/orders/configs/endpoints/order_proposals.py +21 -0
  236. wbportfolio/viewsets/orders/configs/endpoints/orders.py +28 -0
  237. wbportfolio/viewsets/orders/configs/titles/__init__.py +0 -0
  238. wbportfolio/viewsets/orders/configs/titles/orders.py +0 -0
  239. wbportfolio/viewsets/orders/order_proposals.py +252 -0
  240. wbportfolio/viewsets/orders/orders.py +277 -0
  241. wbportfolio/viewsets/portfolios.py +36 -12
  242. wbportfolio/viewsets/positions.py +3 -2
  243. wbportfolio/viewsets/products.py +6 -6
  244. wbportfolio/viewsets/{transactions/rebalancing.py → rebalancing.py} +2 -2
  245. wbportfolio/viewsets/transactions/__init__.py +3 -14
  246. wbportfolio/viewsets/transactions/fees.py +22 -22
  247. wbportfolio/viewsets/transactions/trades.py +1 -180
  248. {wbportfolio-1.52.0.dist-info → wbportfolio-1.59.4.dist-info}/METADATA +3 -1
  249. {wbportfolio-1.52.0.dist-info → wbportfolio-1.59.4.dist-info}/RECORD +252 -203
  250. {wbportfolio-1.52.0.dist-info → wbportfolio-1.59.4.dist-info}/WHEEL +1 -1
  251. wbportfolio/admin/transactions/transactions.py +0 -38
  252. wbportfolio/factories/transactions.py +0 -22
  253. wbportfolio/fdm/tasks.py +0 -13
  254. wbportfolio/filters/transactions/transactions.py +0 -99
  255. wbportfolio/models/transactions/expiry.py +0 -7
  256. wbportfolio/models/transactions/trade_proposals.py +0 -704
  257. wbportfolio/pms/trading/handler.py +0 -161
  258. wbportfolio/serializers/transactions/expiry.py +0 -18
  259. wbportfolio/serializers/transactions/trade_proposals.py +0 -76
  260. wbportfolio/serializers/transactions/transactions.py +0 -85
  261. wbportfolio/tests/models/transactions/test_trade_proposals.py +0 -410
  262. wbportfolio/viewsets/configs/buttons/trade_proposals.py +0 -66
  263. wbportfolio/viewsets/configs/display/trade_proposals.py +0 -100
  264. wbportfolio/viewsets/configs/display/transactions.py +0 -55
  265. wbportfolio/viewsets/configs/endpoints/trade_proposals.py +0 -18
  266. wbportfolio/viewsets/configs/endpoints/transactions.py +0 -14
  267. wbportfolio/viewsets/configs/menu/transactions.py +0 -9
  268. wbportfolio/viewsets/configs/titles/transactions.py +0 -9
  269. wbportfolio/viewsets/signals.py +0 -43
  270. wbportfolio/viewsets/transactions/trade_proposals.py +0 -139
  271. wbportfolio/viewsets/transactions/transactions.py +0 -122
  272. /wbportfolio/{fdm → api_clients}/__init__.py +0 -0
  273. {wbportfolio-1.52.0.dist-info → wbportfolio-1.59.4.dist-info}/licenses/LICENSE +0 -0
@@ -0,0 +1,622 @@
1
+ # Generated by Django 5.0.14 on 2025-06-17 13:58
2
+
3
+ import django.db.models.deletion
4
+ import django.db.models.expressions
5
+ import django.utils.timezone
6
+ from decimal import Decimal
7
+ from django.db import migrations, models
8
+ from django.db.migrations.operations.models import ModelOptionOperation
9
+ from django.db.models import Count
10
+
11
+
12
+ def remove_duplicate(apps, schema_editor):
13
+ Trade = apps.get_model("wbportfolio", "Trade")
14
+ for row in Trade.objects.filter(trade_proposal__isnull=False).values("underlying_instrument", "transaction_date", "portfolio").annotate(c=Count("*")).filter(c__gt=1):
15
+ qs = Trade.objects.filter(underlying_instrument=row["underlying_instrument"], transaction_date=row["transaction_date"], portfolio=row["portfolio"])
16
+ for t in qs[1:]:
17
+ t.delete()
18
+
19
+ class SetModelBasesOptionOperation(ModelOptionOperation):
20
+ """
21
+ A migration operation that updates the bases of a model.
22
+ This can be used to separate a model from its parent. Specifically
23
+ when multi-table inheritance is used.
24
+ """
25
+ def __init__(self, name, bases):
26
+ super().__init__(name)
27
+ self.bases = bases
28
+
29
+ def deconstruct(self):
30
+ return (self.__class__.__qualname__, [], {"bases": self.bases})
31
+
32
+ def state_forwards(self, app_label, state):
33
+ model_state = state.models[app_label, self.name_lower]
34
+ model_state.bases = self.bases
35
+ state.reload_model(app_label, self.name_lower, delay=True)
36
+
37
+ def database_forwards(self, app_label, schema_editor, from_state, to_state):
38
+ pass
39
+
40
+ def database_backwards(self, app_label, schema_editor, from_state, to_state):
41
+ pass
42
+
43
+ def describe(self):
44
+ return "Update bases of the model %s" % self.name
45
+
46
+ @property
47
+ def migration_name_fragment(self):
48
+ return "set_%s_bases" % self.name_lower
49
+
50
+ class Migration(migrations.Migration):
51
+
52
+ dependencies = [
53
+ ('currency', '0001_initial'),
54
+ ('io', '0008_importsource_resource_kwargs'),
55
+ ('wbfdm', '0030_alter_relatedinstrumentthroughmodel_related_type'),
56
+ ('wbportfolio', '0076_alter_dividendtransaction_price_and_more'),
57
+ ]
58
+
59
+ operations = [
60
+ migrations.AlterField(
61
+ model_name='transaction',
62
+ name='transaction_type',
63
+ field=models.CharField(
64
+ choices=[('Trade', 'Trade'), ('DividendTransaction', 'Dividend Transaction'), ('Fees', 'Fees')],
65
+ default='Trade', max_length=255, verbose_name='Type'),
66
+ ),
67
+ migrations.DeleteModel(
68
+ name='Expiry',
69
+ ),
70
+ migrations.RemoveIndex(
71
+ model_name='fees',
72
+ name='wbportfolio_linked__a49c5d_idx',
73
+ ),
74
+ migrations.RemoveIndex(
75
+ model_name='fees',
76
+ name='wbportfolio_transac_1f7a29_idx',
77
+ ),
78
+ migrations.RenameField(
79
+ model_name='fees',
80
+ old_name='linked_product',
81
+ new_name='product',
82
+ ),
83
+ migrations.RenameField(
84
+ model_name='trade',
85
+ old_name='external_identifier2',
86
+ new_name='external_id_alternative',
87
+ ),
88
+ SetModelBasesOptionOperation("Fees", (models.Model, )),
89
+ SetModelBasesOptionOperation("Trade", (models.Model, )),
90
+ SetModelBasesOptionOperation("DividendTransaction", (models.Model, )),
91
+ migrations.RenameField(
92
+ model_name='dividendtransaction',
93
+ old_name='transaction_ptr',
94
+ new_name='id',
95
+ ),
96
+ migrations.RenameField(
97
+ model_name='fees',
98
+ old_name='transaction_ptr',
99
+ new_name='id',
100
+ ),
101
+ migrations.RenameField(
102
+ model_name='trade',
103
+ old_name='transaction_ptr',
104
+ new_name='id',
105
+ ),
106
+ migrations.AlterField(
107
+ model_name='dividendtransaction',
108
+ name='id',
109
+ field=models.AutoField(auto_created=True, primary_key=True, serialize=False,
110
+ verbose_name='ID'),
111
+ ),
112
+ migrations.AlterField(
113
+ model_name='fees',
114
+ name='id',
115
+ field=models.AutoField(auto_created=True, primary_key=True, serialize=False,
116
+ verbose_name='ID'),
117
+ ),
118
+ migrations.AlterField(
119
+ model_name='trade',
120
+ name='id',
121
+ field=models.AutoField(auto_created=True, primary_key=True, serialize=False,
122
+ verbose_name='ID'),
123
+ ),
124
+ migrations.AlterField(
125
+ model_name='dividendtransaction',
126
+ name='price',
127
+ field=models.DecimalField(decimal_places=4, help_text='The amount paid per share', max_digits=15,
128
+ verbose_name='DPS'),
129
+ ),
130
+ migrations.AlterField(
131
+ model_name='dividendtransaction',
132
+ name='shares',
133
+ field=models.DecimalField(decimal_places=4, default=Decimal('0.0'),
134
+ help_text='The number of shares held at record date, used to calculate the dividend',
135
+ max_digits=15, verbose_name='Shares / Quantity'),
136
+ ),
137
+ migrations.AlterField(
138
+ model_name='fees',
139
+ name='fee_date',
140
+ field=models.DateField(help_text='The date that this fee was paid.', verbose_name='Fees Date'),
141
+ ),
142
+
143
+
144
+ migrations.AddField(
145
+ model_name='dividendtransaction',
146
+ name='comment',
147
+ field=models.TextField(blank=True, default='', verbose_name='Comment'),
148
+ ),
149
+ migrations.AddField(
150
+ model_name='dividendtransaction',
151
+ name='created',
152
+ field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
153
+ preserve_default=False,
154
+ ),
155
+ migrations.AddField(
156
+ model_name='dividendtransaction',
157
+ name='currency',
158
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='%(class)ss', to='currency.currency', verbose_name='Currency'),
159
+ preserve_default=False,
160
+ ),
161
+ migrations.AddField(
162
+ model_name='dividendtransaction',
163
+ name='currency_fx_rate',
164
+ field=models.DecimalField(decimal_places=8, default=Decimal('1'), max_digits=14, verbose_name='FOREX rate'),
165
+ ),
166
+ migrations.AddField(
167
+ model_name='dividendtransaction',
168
+ name='distribution_method',
169
+ field=models.CharField(choices=[('Payment', 'Payment'), ('Reinvestment', 'Reinvestment')], default='Payment', max_length=255, verbose_name='Type'),
170
+ ),
171
+ migrations.AddField(
172
+ model_name='dividendtransaction',
173
+ name='ex_date',
174
+ field=models.DateField(blank=True, null=True, help_text='The date on which the stock starts trading without the dividend', verbose_name='Ex-Dividend Date'),
175
+ preserve_default=False,
176
+ ),
177
+ migrations.AddField(
178
+ model_name='dividendtransaction',
179
+ name='import_source',
180
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, to='io.importsource'),
181
+ ),
182
+ migrations.AddField(
183
+ model_name='dividendtransaction',
184
+ name='portfolio',
185
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='%(class)ss', to='wbportfolio.portfolio', verbose_name='Portfolio'),
186
+ preserve_default=False,
187
+ ),
188
+ migrations.AddField(
189
+ model_name='dividendtransaction',
190
+ name='record_date',
191
+ field=models.DateField(blank=True, null=True, help_text='The date on which the holder must own the shares to be eligible for the dividend', verbose_name='Record Date'),
192
+ preserve_default=False,
193
+ ),
194
+ migrations.AddField(
195
+ model_name='dividendtransaction',
196
+ name='underlying_instrument',
197
+ field=models.ForeignKey(blank=True, null=True, help_text='The instrument that is this transaction.', limit_choices_to=models.Q(('children__isnull', True)), on_delete=django.db.models.deletion.PROTECT, related_name='%(class)ss', to='wbfdm.instrument', verbose_name='Underlying Instrument'),
198
+ preserve_default=False,
199
+ ),
200
+ migrations.AddField(
201
+ model_name='dividendtransaction',
202
+ name='updated',
203
+ field=models.DateTimeField(auto_now=True),
204
+ ),
205
+ migrations.AddField(
206
+ model_name='dividendtransaction',
207
+ name='value_date',
208
+ field=models.DateField(blank=True, null=True, help_text='The date that this transaction was valuated/paid.', verbose_name='Value Date'),
209
+ preserve_default=False,
210
+ ),
211
+
212
+ migrations.AddField(
213
+ model_name='fees',
214
+ name='currency',
215
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT,
216
+ related_name='fees', to='currency.currency', verbose_name='Currency'),
217
+ preserve_default=False,
218
+ ),
219
+ migrations.AddField(
220
+ model_name='fees',
221
+ name='import_source',
222
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
223
+ to='io.importsource'),
224
+ ),
225
+ migrations.AddField(
226
+ model_name='fees',
227
+ name='currency_fx_rate',
228
+ field=models.DecimalField(decimal_places=8, default=Decimal('1'), max_digits=14, verbose_name='FOREX rate'),
229
+ ),
230
+ migrations.AddField(
231
+ model_name='fees',
232
+ name='created',
233
+ field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
234
+ preserve_default=False,
235
+ ),
236
+ migrations.AddField(
237
+ model_name='fees',
238
+ name='total_value',
239
+ field=models.DecimalField(decimal_places=4, blank=True, null=True, max_digits=20, verbose_name='Total Value'),
240
+ preserve_default=False,
241
+ ),
242
+ migrations.AddField(
243
+ model_name='fees',
244
+ name='total_value_gross',
245
+ field=models.DecimalField(decimal_places=4, blank=True, null=True, max_digits=20, verbose_name='Total Value Gross'),
246
+ preserve_default=False,
247
+ ),
248
+ migrations.AddField(
249
+ model_name='fees',
250
+ name='updated',
251
+ field=models.DateTimeField(auto_now=True),
252
+ ),
253
+
254
+
255
+ migrations.AddField(
256
+ model_name='trade',
257
+ name='currency_fx_rate',
258
+ field=models.DecimalField(decimal_places=8, default=Decimal('1'), max_digits=14, verbose_name='FOREX rate'),
259
+ ),
260
+ migrations.AddField(
261
+ model_name='trade',
262
+ name='book_date',
263
+ field=models.DateField(blank=True, null=True, help_text='The date that this transaction was booked.', verbose_name='Trade Date'),
264
+ preserve_default=False,
265
+ ),
266
+ migrations.AddField(
267
+ model_name='trade',
268
+ name='comment',
269
+ field=models.TextField(blank=True, default='', verbose_name='Comment'),
270
+ ),
271
+ migrations.AddField(
272
+ model_name='trade',
273
+ name='created',
274
+ field=models.DateTimeField(auto_now_add=True, default=django.utils.timezone.now),
275
+ preserve_default=False,
276
+ ),
277
+ migrations.AddField(
278
+ model_name='trade',
279
+ name='external_id',
280
+ field=models.CharField(blank=True, help_text='An external identifier that was supplied.', max_length=255, null=True, verbose_name='External Identifier'),
281
+ ),
282
+ migrations.AddField(
283
+ model_name='trade',
284
+ name='transaction_date',
285
+ field=models.DateField(blank=True, null=True, help_text='The date that this transaction was traded.', verbose_name='Trade Date'),
286
+ preserve_default=False,
287
+ ),
288
+ migrations.AddField(
289
+ model_name='trade',
290
+ name='updated',
291
+ field=models.DateTimeField(auto_now=True),
292
+ ),
293
+ migrations.AddField(
294
+ model_name='trade',
295
+ name='value_date',
296
+ field=models.DateField(blank=True, null=True, help_text='The date that this transaction was valuated/paid.', verbose_name='Value Date'),
297
+ preserve_default=False,
298
+ ),
299
+ migrations.AddField(
300
+ model_name='trade',
301
+ name='currency',
302
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT,
303
+ related_name='%(class)ss', to='currency.currency', verbose_name='Currency'),
304
+ preserve_default=False,
305
+ ),
306
+ migrations.AddField(
307
+ model_name='trade',
308
+ name='import_source',
309
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
310
+ to='io.importsource'),
311
+ ),
312
+ migrations.AddField(
313
+ model_name='trade',
314
+ name='portfolio',
315
+ field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT,
316
+ related_name='%(class)ss', to='wbportfolio.portfolio', verbose_name='Portfolio'),
317
+ preserve_default=False,
318
+ ),
319
+ migrations.AddField(
320
+ model_name='trade',
321
+ name='underlying_instrument',
322
+ field=models.ForeignKey(blank=True, null=True, help_text='The instrument that is this transaction.',
323
+ limit_choices_to=models.Q(('children__isnull', True)),
324
+ on_delete=django.db.models.deletion.PROTECT, related_name='%(class)ss',
325
+ to='wbfdm.instrument', verbose_name='Underlying Instrument'),
326
+ preserve_default=False,
327
+ ),
328
+
329
+
330
+ migrations.RunSQL(
331
+ """
332
+ UPDATE wbportfolio_dividendtransaction AS o
333
+ SET comment = t.comment, currency_id = t.currency_id, currency_fx_rate = t.currency_fx_rate, ex_date = t.transaction_date, import_source_id = t.import_source_id, portfolio_id = t.portfolio_id, record_date = t.transaction_date, underlying_instrument_id = t.underlying_instrument_id, value_date = t.value_date
334
+ FROM wbportfolio_transaction AS t
335
+ WHERE o.id = t.id
336
+ """
337
+ ),
338
+ migrations.RunSQL(
339
+ """
340
+ UPDATE wbportfolio_fees AS o
341
+ SET currency_id = t.currency_id, import_source_id = t.import_source_id, currency_fx_rate = t.currency_fx_rate, total_value = t.total_value, total_value_gross = t.total_value_gross
342
+ FROM wbportfolio_transaction AS t
343
+ WHERE o.id = t.id
344
+ """
345
+ ),
346
+ migrations.RunSQL(
347
+ """
348
+ UPDATE wbportfolio_trade o
349
+ SET underlying_instrument_id = t.underlying_instrument_id, portfolio_id = t.portfolio_id, currency_fx_rate = t.currency_fx_rate, book_date = t.book_date, comment = t.comment, external_id = t.external_id, transaction_date = t.transaction_date, value_date = t.value_date, currency_id = t.currency_id, import_source_id = t.import_source_id
350
+ FROM wbportfolio_transaction AS t
351
+ WHERE o.id = t.id
352
+ """
353
+ ),
354
+
355
+
356
+
357
+ migrations.AlterField(
358
+ model_name='dividendtransaction',
359
+ name='currency',
360
+ field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, related_name='%(class)ss',
361
+ to='currency.currency', verbose_name='Currency'),
362
+ preserve_default=False,
363
+ ),
364
+ migrations.AlterField(
365
+ model_name='dividendtransaction',
366
+ name='ex_date',
367
+ field=models.DateField(default=None,
368
+ help_text='The date on which the stock starts trading without the dividend',
369
+ verbose_name='Ex-Dividend Date'),
370
+ preserve_default=False,
371
+ ),
372
+ migrations.AlterField(
373
+ model_name='dividendtransaction',
374
+ name='portfolio',
375
+ field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, related_name='%(class)ss',
376
+ to='wbportfolio.portfolio', verbose_name='Portfolio'),
377
+ preserve_default=False,
378
+ ),
379
+ migrations.AlterField(
380
+ model_name='dividendtransaction',
381
+ name='record_date',
382
+ field=models.DateField(default=None,
383
+ help_text='The date on which the holder must own the shares to be eligible for the dividend',
384
+ verbose_name='Record Date'),
385
+ preserve_default=False,
386
+ ),
387
+ migrations.AlterField(
388
+ model_name='dividendtransaction',
389
+ name='underlying_instrument',
390
+ field=models.ForeignKey(default=None, help_text='The instrument that is this transaction.',
391
+ limit_choices_to=models.Q(('children__isnull', True)),
392
+ on_delete=django.db.models.deletion.PROTECT, related_name='%(class)ss',
393
+ to='wbfdm.instrument', verbose_name='Underlying Instrument'),
394
+ preserve_default=False,
395
+ ),
396
+ migrations.AlterField(
397
+ model_name='dividendtransaction',
398
+ name='value_date',
399
+ field=models.DateField(default=None, help_text='The date that this transaction was valuated/paid.',
400
+ verbose_name='Value Date'),
401
+ preserve_default=False,
402
+ ),
403
+ migrations.AlterField(
404
+ model_name='fees',
405
+ name='currency',
406
+ field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, related_name='fees',
407
+ to='currency.currency', verbose_name='Currency'),
408
+ preserve_default=False,
409
+ ),
410
+ migrations.AlterField(
411
+ model_name='fees',
412
+ name='total_value',
413
+ field=models.DecimalField(decimal_places=4, default=None, max_digits=20, verbose_name='Total Value'),
414
+ preserve_default=False,
415
+ ),
416
+ migrations.AlterField(
417
+ model_name='fees',
418
+ name='total_value_gross',
419
+ field=models.DecimalField(decimal_places=4, default=None, max_digits=20, verbose_name='Total Value Gross'),
420
+ preserve_default=False,
421
+ ),
422
+ migrations.AlterField(
423
+ model_name='fees',
424
+ name='product',
425
+ field=models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='fees',
426
+ to='wbportfolio.product', verbose_name='Product'),
427
+ ),
428
+ migrations.AlterField(
429
+ model_name='trade',
430
+ name='book_date',
431
+ field=models.DateField(default=None, help_text='The date that this transaction was booked.',
432
+ verbose_name='Trade Date'),
433
+ preserve_default=False,
434
+ ),
435
+ migrations.AlterField(
436
+ model_name='trade',
437
+ name='currency',
438
+ field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, related_name='%(class)ss',
439
+ to='currency.currency', verbose_name='Currency'),
440
+ preserve_default=False,
441
+ ),
442
+ migrations.AlterField(
443
+ model_name='trade',
444
+ name='external_id_alternative',
445
+ field=models.CharField(blank=True, help_text='A second external identifier that was supplied.',
446
+ max_length=255, null=True, verbose_name='Alternative External Identifier'),
447
+ ),
448
+ migrations.AlterField(
449
+ model_name='trade',
450
+ name='portfolio',
451
+ field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.PROTECT, related_name='%(class)ss',
452
+ to='wbportfolio.portfolio', verbose_name='Portfolio'),
453
+ preserve_default=False,
454
+ ),
455
+ migrations.AlterField(
456
+ model_name='trade',
457
+ name='transaction_date',
458
+ field=models.DateField(default=None, help_text='The date that this transaction was traded.',
459
+ verbose_name='Trade Date'),
460
+ preserve_default=False,
461
+ ),
462
+ migrations.AlterField(
463
+ model_name='trade',
464
+ name='underlying_instrument',
465
+ field=models.ForeignKey(default=None, help_text='The instrument that is this transaction.',
466
+ limit_choices_to=models.Q(('children__isnull', True)),
467
+ on_delete=django.db.models.deletion.PROTECT, related_name='%(class)ss',
468
+ to='wbfdm.instrument', verbose_name='Underlying Instrument'),
469
+ preserve_default=False,
470
+ ),
471
+ migrations.AlterField(
472
+ model_name='trade',
473
+ name='value_date',
474
+ field=models.DateField(default=None, help_text='The date that this transaction was valuated/paid.',
475
+ verbose_name='Value Date'),
476
+ preserve_default=False,
477
+ ),
478
+
479
+ migrations.AddField(
480
+ model_name='dividendtransaction',
481
+ name='fees',
482
+ field=models.GeneratedField(db_persist=True, expression=django.db.models.expressions.CombinedExpression(
483
+ models.F('price_gross'), '-', models.F('price')),
484
+ output_field=models.DecimalField(decimal_places=4, max_digits=20)),
485
+ ),
486
+ migrations.AddField(
487
+ model_name='dividendtransaction',
488
+ name='total_value',
489
+ field=models.GeneratedField(db_persist=True,
490
+ expression=django.db.models.expressions.CombinedExpression(models.F('price'),
491
+ '*',
492
+ models.F('shares')),
493
+ output_field=models.DecimalField(decimal_places=4, max_digits=20)),
494
+ ),
495
+ migrations.AddField(
496
+ model_name='dividendtransaction',
497
+ name='total_value_fx_portfolio',
498
+ field=models.GeneratedField(db_persist=True, expression=django.db.models.expressions.CombinedExpression(
499
+ django.db.models.expressions.CombinedExpression(models.F('currency_fx_rate'), '*', models.F('price')),
500
+ '*', models.F('shares')), output_field=models.DecimalField(decimal_places=4, max_digits=20)),
501
+ ),
502
+ migrations.AddField(
503
+ model_name='dividendtransaction',
504
+ name='total_value_gross',
505
+ field=models.GeneratedField(db_persist=True, expression=django.db.models.expressions.CombinedExpression(
506
+ django.db.models.expressions.CombinedExpression(models.F('price'), '*', models.F('shares')), '*',
507
+ models.F('retrocession')), output_field=models.DecimalField(decimal_places=4, max_digits=20)),
508
+ ),
509
+ migrations.AddField(
510
+ model_name='dividendtransaction',
511
+ name='total_value_gross_fx_portfolio',
512
+ field=models.GeneratedField(db_persist=True, expression=django.db.models.expressions.CombinedExpression(
513
+ django.db.models.expressions.CombinedExpression(models.F('currency_fx_rate'), '*',
514
+ models.F('price_gross')), '*', models.F('shares')),
515
+ output_field=models.DecimalField(decimal_places=4, max_digits=20)),
516
+ ),
517
+ migrations.AddField(
518
+ model_name='trade',
519
+ name='total_value',
520
+ field=models.GeneratedField(db_persist=True,
521
+ expression=django.db.models.expressions.CombinedExpression(models.F('price'),
522
+ '*',
523
+ models.F('shares')),
524
+ output_field=models.DecimalField(decimal_places=4, max_digits=20)),
525
+ ),
526
+ migrations.AddField(
527
+ model_name='trade',
528
+ name='total_value_gross',
529
+ field=models.GeneratedField(db_persist=True, expression=django.db.models.expressions.CombinedExpression(
530
+ models.F('price_gross'), '*', models.F('shares')),
531
+ output_field=models.DecimalField(decimal_places=4, max_digits=20)),
532
+ ),
533
+ migrations.AddField(
534
+ model_name='trade',
535
+ name='fees',
536
+ field=models.GeneratedField(db_persist=True, expression=django.db.models.expressions.CombinedExpression(
537
+ models.F('price_gross'), '-', models.F('price')),
538
+ output_field=models.DecimalField(decimal_places=4, max_digits=20)),
539
+ ),
540
+ migrations.AddField(
541
+ model_name='trade',
542
+ name='total_value_fx_portfolio',
543
+ field=models.GeneratedField(db_persist=True, expression=django.db.models.expressions.CombinedExpression(
544
+ django.db.models.expressions.CombinedExpression(models.F('currency_fx_rate'), '*', models.F('price')),
545
+ '*', models.F('shares')), output_field=models.DecimalField(decimal_places=4, max_digits=20)),
546
+ ),
547
+ migrations.AddField(
548
+ model_name='trade',
549
+ name='total_value_gross_fx_portfolio',
550
+ field=models.GeneratedField(db_persist=True, expression=django.db.models.expressions.CombinedExpression(
551
+ django.db.models.expressions.CombinedExpression(models.F('currency_fx_rate'), '*',
552
+ models.F('price_gross')), '*', models.F('shares')),
553
+ output_field=models.DecimalField(decimal_places=4, max_digits=20)),
554
+ ),
555
+ migrations.AlterField(
556
+ model_name='trade',
557
+ name='price',
558
+ field=models.DecimalField(decimal_places=4, help_text='The price per share.', max_digits=16,
559
+ verbose_name='Price'),
560
+ ),
561
+ migrations.AddField(
562
+ model_name='fees',
563
+ name='total_value_fx_portfolio',
564
+ field=models.GeneratedField(db_persist=True, expression=django.db.models.expressions.CombinedExpression(
565
+ models.F('currency_fx_rate'), '*', models.F('total_value')),
566
+ output_field=models.DecimalField(decimal_places=4, max_digits=20)),
567
+ ),
568
+ migrations.AddField(
569
+ model_name='fees',
570
+ name='total_value_gross_fx_portfolio',
571
+ field=models.GeneratedField(db_persist=True, expression=django.db.models.expressions.CombinedExpression(
572
+ models.F('currency_fx_rate'), '*', models.F('total_value_gross')),
573
+ output_field=models.DecimalField(decimal_places=4, max_digits=20)),
574
+ ),
575
+
576
+ # cleanup
577
+ migrations.RemoveField(
578
+ model_name='transaction',
579
+ name='currency',
580
+ ),
581
+ migrations.RemoveField(
582
+ model_name='transaction',
583
+ name='import_source',
584
+ ),
585
+ migrations.RemoveField(
586
+ model_name='transaction',
587
+ name='portfolio',
588
+ ),
589
+ migrations.RemoveField(
590
+ model_name='transaction',
591
+ name='underlying_instrument',
592
+ ),
593
+ migrations.DeleteModel(
594
+ name='Transaction',
595
+ ),
596
+ migrations.AddIndex(
597
+ model_name='fees',
598
+ index=models.Index(fields=['product'], name='wbportfolio_product_daf107_idx'),
599
+ ),
600
+ migrations.AddIndex(
601
+ model_name='fees',
602
+ index=models.Index(fields=['transaction_subtype', 'product', 'fee_date', 'calculated'],
603
+ name='wbportfolio_transac_7355c2_idx'),
604
+ ),
605
+ migrations.AddIndex(
606
+ model_name='trade',
607
+ index=models.Index(fields=['underlying_instrument', 'transaction_date'],
608
+ name='wbportfolio_underly_a0f0ff_idx'),
609
+ ),
610
+ migrations.AddIndex(
611
+ model_name='trade',
612
+ index=models.Index(fields=['portfolio', 'underlying_instrument', 'transaction_date'],
613
+ name='wbportfolio_portfol_6a42a2_idx'),
614
+ ),
615
+ migrations.RunPython(remove_duplicate),
616
+ migrations.AddConstraint(
617
+ model_name='trade',
618
+ constraint=models.UniqueConstraint(condition=models.Q(('trade_proposal__isnull', False)),
619
+ fields=('portfolio', 'transaction_date', 'underlying_instrument'),
620
+ name='unique_manual_trade'),
621
+ ),
622
+ ]
@@ -0,0 +1,26 @@
1
+ # Generated by Django 5.0.14 on 2025-07-02 13:10
2
+
3
+ from decimal import Decimal
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('wbportfolio', '0077_remove_transaction_currency_and_more'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AddField(
15
+ model_name='trade',
16
+ name='drift_factor',
17
+ field=models.DecimalField(decimal_places=6, default=Decimal('1'), help_text='Drift factor to be applied to the previous portfolio weight to get the actual effective weight including daily return', max_digits=16, verbose_name='Drift Factor'),
18
+ ),
19
+ migrations.AlterField(
20
+ model_name='trade',
21
+ name='weighting',
22
+ field=models.DecimalField(decimal_places=8, default=Decimal('0'),
23
+ help_text='The weight to be multiplied against the target', max_digits=9,
24
+ verbose_name='Weight'),
25
+ ),
26
+ ]
@@ -0,0 +1,19 @@
1
+ # Generated by Django 5.0.14 on 2025-07-08 08:11
2
+
3
+ from decimal import Decimal
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('wbportfolio', '0078_trade_drift_factor'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.AlterField(
15
+ model_name='trade',
16
+ name='drift_factor',
17
+ field=models.DecimalField(decimal_places=8, default=Decimal('1'), help_text='Drift factor to be applied to the previous portfolio weight to get the actual effective weight including daily return', max_digits=16, verbose_name='Drift Factor'),
18
+ ),
19
+ ]