wbfdm 1.49.5__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.
Files changed (109) hide show
  1. wbfdm/admin/exchanges.py +1 -1
  2. wbfdm/admin/instruments.py +3 -2
  3. wbfdm/analysis/financial_analysis/change_point_detection.py +88 -0
  4. wbfdm/analysis/financial_analysis/statement_with_estimates.py +5 -6
  5. wbfdm/analysis/financial_analysis/utils.py +6 -0
  6. wbfdm/contrib/dsws/client.py +3 -3
  7. wbfdm/contrib/dsws/dataloaders/market_data.py +31 -3
  8. wbfdm/contrib/internal/dataloaders/market_data.py +43 -9
  9. wbfdm/contrib/metric/backends/base.py +2 -2
  10. wbfdm/contrib/metric/backends/statistics.py +47 -13
  11. wbfdm/contrib/metric/dispatch.py +3 -0
  12. wbfdm/contrib/metric/exceptions.py +1 -1
  13. wbfdm/contrib/metric/filters.py +19 -0
  14. wbfdm/contrib/metric/models.py +6 -0
  15. wbfdm/contrib/metric/orchestrators.py +4 -4
  16. wbfdm/contrib/metric/signals.py +7 -0
  17. wbfdm/contrib/metric/tasks.py +2 -3
  18. wbfdm/contrib/metric/viewsets/configs/display.py +2 -2
  19. wbfdm/contrib/metric/viewsets/mixins.py +6 -6
  20. wbfdm/contrib/msci/client.py +6 -2
  21. wbfdm/contrib/qa/database_routers.py +1 -1
  22. wbfdm/contrib/qa/dataloaders/adjustments.py +2 -1
  23. wbfdm/contrib/qa/dataloaders/corporate_actions.py +2 -1
  24. wbfdm/contrib/qa/dataloaders/financials.py +19 -1
  25. wbfdm/contrib/qa/dataloaders/fx_rates.py +86 -0
  26. wbfdm/contrib/qa/dataloaders/market_data.py +29 -40
  27. wbfdm/contrib/qa/dataloaders/officers.py +1 -1
  28. wbfdm/contrib/qa/dataloaders/statements.py +18 -3
  29. wbfdm/contrib/qa/jinja2/qa/sql/ibes/financials.sql +1 -1
  30. wbfdm/contrib/qa/sync/exchanges.py +2 -1
  31. wbfdm/contrib/qa/sync/utils.py +76 -17
  32. wbfdm/dataloaders/protocols.py +12 -1
  33. wbfdm/dataloaders/proxies.py +15 -1
  34. wbfdm/dataloaders/types.py +7 -1
  35. wbfdm/enums.py +2 -0
  36. wbfdm/factories/instruments.py +4 -2
  37. wbfdm/figures/financials/financial_analysis_charts.py +2 -8
  38. wbfdm/filters/classifications.py +2 -2
  39. wbfdm/filters/financials.py +9 -18
  40. wbfdm/filters/financials_analysis.py +36 -16
  41. wbfdm/filters/instrument_prices.py +8 -5
  42. wbfdm/filters/instruments.py +21 -7
  43. wbfdm/import_export/backends/cbinsights/utils/client.py +8 -8
  44. wbfdm/import_export/backends/refinitiv/utils/controller.py +1 -1
  45. wbfdm/import_export/handlers/instrument.py +160 -104
  46. wbfdm/import_export/handlers/option.py +2 -2
  47. wbfdm/import_export/parsers/cbinsights/equities.py +2 -3
  48. wbfdm/jinja2.py +2 -1
  49. wbfdm/locale/de/LC_MESSAGES/django.mo +0 -0
  50. wbfdm/locale/de/LC_MESSAGES/django.po +257 -0
  51. wbfdm/locale/en/LC_MESSAGES/django.mo +0 -0
  52. wbfdm/locale/en/LC_MESSAGES/django.po +255 -0
  53. wbfdm/locale/fr/LC_MESSAGES/django.mo +0 -0
  54. wbfdm/locale/fr/LC_MESSAGES/django.po +257 -0
  55. wbfdm/migrations/0031_exchange_apply_round_lot_size_and_more.py +23 -0
  56. wbfdm/migrations/0032_alter_instrumentprice_outstanding_shares.py +18 -0
  57. wbfdm/migrations/0033_alter_controversy_review.py +18 -0
  58. wbfdm/migrations/0034_alter_instrumentlist_instrument_list_type.py +18 -0
  59. wbfdm/models/esg/controversies.py +19 -23
  60. wbfdm/models/exchanges/exchanges.py +8 -4
  61. wbfdm/models/fields.py +2 -2
  62. wbfdm/models/fk_fields.py +3 -3
  63. wbfdm/models/instruments/instrument_lists.py +1 -0
  64. wbfdm/models/instruments/instrument_prices.py +8 -1
  65. wbfdm/models/instruments/instrument_relationships.py +3 -0
  66. wbfdm/models/instruments/instruments.py +139 -26
  67. wbfdm/models/instruments/llm/create_instrument_news_relationships.py +29 -22
  68. wbfdm/models/instruments/mixin/financials_computed.py +0 -4
  69. wbfdm/models/instruments/mixin/financials_serializer_fields.py +118 -118
  70. wbfdm/models/instruments/mixin/instruments.py +7 -4
  71. wbfdm/models/instruments/options.py +6 -0
  72. wbfdm/models/instruments/private_equities.py +3 -0
  73. wbfdm/models/instruments/querysets.py +138 -37
  74. wbfdm/models/instruments/utils.py +5 -0
  75. wbfdm/serializers/exchanges.py +1 -0
  76. wbfdm/serializers/instruments/__init__.py +1 -0
  77. wbfdm/serializers/instruments/instruments.py +9 -2
  78. wbfdm/serializers/instruments/mixins.py +3 -3
  79. wbfdm/tasks.py +13 -2
  80. wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +0 -1
  81. wbfdm/tests/models/test_instrument_prices.py +0 -14
  82. wbfdm/tests/models/test_instruments.py +21 -9
  83. wbfdm/tests/models/test_queryset.py +89 -0
  84. wbfdm/viewsets/configs/display/exchanges.py +1 -1
  85. wbfdm/viewsets/configs/display/financial_summary.py +2 -2
  86. wbfdm/viewsets/configs/display/instrument_prices.py +2 -70
  87. wbfdm/viewsets/configs/display/instruments.py +3 -4
  88. wbfdm/viewsets/configs/display/instruments_relationships.py +3 -1
  89. wbfdm/viewsets/configs/display/prices.py +1 -0
  90. wbfdm/viewsets/configs/display/statement_with_estimates.py +1 -2
  91. wbfdm/viewsets/configs/endpoints/classifications.py +0 -12
  92. wbfdm/viewsets/configs/endpoints/instrument_prices.py +4 -23
  93. wbfdm/viewsets/configs/titles/instrument_prices.py +2 -1
  94. wbfdm/viewsets/esg.py +2 -2
  95. wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +2 -2
  96. wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +1 -1
  97. wbfdm/viewsets/financial_analysis/financial_summary.py +6 -6
  98. wbfdm/viewsets/financial_analysis/statement_with_estimates.py +7 -3
  99. wbfdm/viewsets/instruments/financials_analysis.py +9 -12
  100. wbfdm/viewsets/instruments/instrument_prices.py +9 -9
  101. wbfdm/viewsets/instruments/instruments.py +9 -7
  102. wbfdm/viewsets/instruments/utils.py +3 -3
  103. wbfdm/viewsets/market_data.py +1 -1
  104. wbfdm/viewsets/prices.py +5 -0
  105. wbfdm/viewsets/statements/statements.py +7 -3
  106. {wbfdm-1.49.5.dist-info → wbfdm-1.59.4.dist-info}/METADATA +2 -1
  107. {wbfdm-1.49.5.dist-info → wbfdm-1.59.4.dist-info}/RECORD +108 -95
  108. {wbfdm-1.49.5.dist-info → wbfdm-1.59.4.dist-info}/WHEEL +1 -1
  109. wbfdm/menu.py +0 -11
@@ -0,0 +1,255 @@
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the PACKAGE package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: PACKAGE VERSION\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "POT-Creation-Date: 2025-05-30 11:37+0200\n"
11
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
+ "Language: \n"
15
+ "MIME-Version: 1.0\n"
16
+ "Content-Type: text/plain; charset=UTF-8\n"
17
+ "Content-Transfer-Encoding: 8bit\n"
18
+
19
+ #: contrib/metric/filters.py:27
20
+ msgid "Basket Content Type"
21
+ msgstr ""
22
+
23
+ #: contrib/metric/viewsets/configs/utils.py:127
24
+ msgid "Fundamentals"
25
+ msgstr ""
26
+
27
+ #: models/exchanges/exchanges.py:184 viewsets/configs/display/instruments.py:77
28
+ msgid "Exchange"
29
+ msgstr ""
30
+
31
+ #: models/exchanges/exchanges.py:185
32
+ msgid "Exchanges"
33
+ msgstr ""
34
+
35
+ #: models/instruments/instrument_requests.py:116
36
+ #: models/instruments/instrument_requests.py:182
37
+ msgid "An instrument already exists with the proposed identifier"
38
+ msgstr ""
39
+
40
+ #: viewsets/configs/buttons/classifications.py:10
41
+ msgid "Tree Chart"
42
+ msgstr ""
43
+
44
+ #: viewsets/configs/buttons/classifications.py:11
45
+ msgid "Icicle Chart"
46
+ msgstr ""
47
+
48
+ #: viewsets/configs/display/classifications.py:40
49
+ msgid "Child Classifications"
50
+ msgstr ""
51
+
52
+ #: viewsets/configs/display/classifications.py:43
53
+ msgid "Instruments"
54
+ msgstr ""
55
+
56
+ #: viewsets/configs/display/classifications.py:69
57
+ msgid "Classification"
58
+ msgstr ""
59
+
60
+ #: viewsets/configs/display/classifications.py:112
61
+ msgid "Related Instruments"
62
+ msgstr ""
63
+
64
+ #: viewsets/configs/display/esg.py:14
65
+ msgid "Initiated"
66
+ msgstr ""
67
+
68
+ #: viewsets/configs/display/esg.py:15
69
+ msgid "Review"
70
+ msgstr ""
71
+
72
+ #: viewsets/configs/display/esg.py:16
73
+ msgid "Headline"
74
+ msgstr ""
75
+
76
+ #: viewsets/configs/display/esg.py:17
77
+ msgid "Narrative"
78
+ msgstr ""
79
+
80
+ #: viewsets/configs/display/esg.py:18
81
+ msgid "Source"
82
+ msgstr ""
83
+
84
+ #: viewsets/configs/display/esg.py:19
85
+ msgid "Status"
86
+ msgstr ""
87
+
88
+ #: viewsets/configs/display/esg.py:20
89
+ msgid "Type"
90
+ msgstr ""
91
+
92
+ #: viewsets/configs/display/esg.py:21
93
+ msgid "Assessment"
94
+ msgstr ""
95
+
96
+ #: viewsets/configs/display/esg.py:22
97
+ msgid "Response"
98
+ msgstr ""
99
+
100
+ #: viewsets/configs/display/esg.py:70
101
+ msgid "Section"
102
+ msgstr ""
103
+
104
+ #: viewsets/configs/display/esg.py:71
105
+ msgid "Adverse sustainability indicator"
106
+ msgstr ""
107
+
108
+ #: viewsets/configs/display/esg.py:72
109
+ msgid "Metric"
110
+ msgstr ""
111
+
112
+ #: viewsets/configs/display/esg.py:73
113
+ msgid "Factor"
114
+ msgstr ""
115
+
116
+ #: viewsets/configs/display/esg.py:74
117
+ msgid "Value"
118
+ msgstr ""
119
+
120
+ #: viewsets/configs/display/instrument_lists.py:34
121
+ msgid "Exclusion List"
122
+ msgstr ""
123
+
124
+ #: viewsets/configs/display/instrument_lists.py:105
125
+ msgid "Validated"
126
+ msgstr ""
127
+
128
+ #: viewsets/configs/display/instrument_lists.py:109
129
+ msgid "Not Validated"
130
+ msgstr ""
131
+
132
+ #: viewsets/configs/display/instrument_requests.py:95
133
+ msgid "Instrument Data"
134
+ msgstr ""
135
+
136
+ #: viewsets/configs/display/instruments.py:70
137
+ #: viewsets/configs/display/officers.py:11
138
+ msgid "Name"
139
+ msgstr ""
140
+
141
+ #: viewsets/configs/display/instruments.py:73
142
+ msgid "Information"
143
+ msgstr ""
144
+
145
+ #: viewsets/configs/display/instruments.py:76
146
+ msgid "Instrument Type"
147
+ msgstr ""
148
+
149
+ #: viewsets/configs/display/instruments.py:78
150
+ msgid "ISIN"
151
+ msgstr ""
152
+
153
+ #: viewsets/configs/display/instruments.py:79
154
+ msgid "Ticker"
155
+ msgstr ""
156
+
157
+ #: viewsets/configs/display/instruments.py:80
158
+ msgid "RIC"
159
+ msgstr ""
160
+
161
+ #: viewsets/configs/display/instruments.py:81
162
+ msgid "Refinitiv Mnemonic"
163
+ msgstr ""
164
+
165
+ #: viewsets/configs/display/instruments.py:82
166
+ msgid "Description"
167
+ msgstr ""
168
+
169
+ #: viewsets/configs/display/instruments.py:83
170
+ msgid "Currency"
171
+ msgstr ""
172
+
173
+ #: viewsets/configs/display/instruments.py:84
174
+ msgid "Country"
175
+ msgstr ""
176
+
177
+ #: viewsets/configs/display/instruments.py:91
178
+ msgid "Extra"
179
+ msgstr ""
180
+
181
+ #: viewsets/configs/display/instruments.py:94
182
+ msgid "Primary"
183
+ msgstr ""
184
+
185
+ #: viewsets/configs/display/instruments.py:95
186
+ msgid "Investable Universe"
187
+ msgstr ""
188
+
189
+ #: viewsets/configs/display/instruments.py:96
190
+ msgid "Security"
191
+ msgstr ""
192
+
193
+ #: viewsets/configs/display/instruments.py:97
194
+ msgid "Internally Managed"
195
+ msgstr ""
196
+
197
+ #: viewsets/configs/display/instruments.py:100
198
+ msgid "Performance"
199
+ msgstr ""
200
+
201
+ #: viewsets/configs/display/instruments.py:330
202
+ msgid "Hierarchy"
203
+ msgstr ""
204
+
205
+ #: viewsets/configs/display/instruments.py:343
206
+ msgid "News"
207
+ msgstr ""
208
+
209
+ #: viewsets/configs/display/officers.py:10
210
+ msgid "Position"
211
+ msgstr ""
212
+
213
+ #: viewsets/configs/display/officers.py:12
214
+ msgid "Age"
215
+ msgstr ""
216
+
217
+ #: viewsets/configs/display/officers.py:13
218
+ msgid "Sex"
219
+ msgstr ""
220
+
221
+ #: viewsets/configs/display/officers.py:14
222
+ msgid "Start"
223
+ msgstr ""
224
+
225
+ #: viewsets/configs/display/prices.py:12
226
+ msgid "Date"
227
+ msgstr ""
228
+
229
+ #: viewsets/configs/display/prices.py:13
230
+ msgid "Open"
231
+ msgstr ""
232
+
233
+ #: viewsets/configs/display/prices.py:14
234
+ msgid "High"
235
+ msgstr ""
236
+
237
+ #: viewsets/configs/display/prices.py:15
238
+ msgid "Low"
239
+ msgstr ""
240
+
241
+ #: viewsets/configs/display/prices.py:16
242
+ msgid "Close"
243
+ msgstr ""
244
+
245
+ #: viewsets/configs/display/prices.py:17
246
+ msgid "Volume"
247
+ msgstr ""
248
+
249
+ #: viewsets/configs/display/prices.py:18
250
+ msgid "Oustanding Shares"
251
+ msgstr ""
252
+
253
+ #: viewsets/configs/display/prices.py:19
254
+ msgid "Market Cap."
255
+ msgstr ""
Binary file
@@ -0,0 +1,257 @@
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the PACKAGE package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ #, fuzzy
7
+ msgid ""
8
+ msgstr ""
9
+ "Project-Id-Version: PACKAGE VERSION\n"
10
+ "Report-Msgid-Bugs-To: \n"
11
+ "POT-Creation-Date: 2025-05-30 11:37+0200\n"
12
+ "PO-Revision-Date: 2025-05-30 09:40+0000\n"
13
+ "Language-Team: French (https://app.transifex.com/stainly/teams/171242/fr/)\n"
14
+ "MIME-Version: 1.0\n"
15
+ "Content-Type: text/plain; charset=UTF-8\n"
16
+ "Content-Transfer-Encoding: 8bit\n"
17
+ "Language: fr\n"
18
+ "Plural-Forms: nplurals=3; plural=(n == 0 || n == 1) ? 0 : n != 0 && n % 1000000 == 0 ? 1 : 2;\n"
19
+
20
+ #: contrib/metric/filters.py:27
21
+ msgid "Basket Content Type"
22
+ msgstr ""
23
+
24
+ #: contrib/metric/viewsets/configs/utils.py:127
25
+ msgid "Fundamentals"
26
+ msgstr ""
27
+
28
+ #: models/exchanges/exchanges.py:184
29
+ #: viewsets/configs/display/instruments.py:77
30
+ msgid "Exchange"
31
+ msgstr ""
32
+
33
+ #: models/exchanges/exchanges.py:185
34
+ msgid "Exchanges"
35
+ msgstr ""
36
+
37
+ #: models/instruments/instrument_requests.py:116
38
+ #: models/instruments/instrument_requests.py:182
39
+ msgid "An instrument already exists with the proposed identifier"
40
+ msgstr ""
41
+
42
+ #: viewsets/configs/buttons/classifications.py:10
43
+ msgid "Tree Chart"
44
+ msgstr ""
45
+
46
+ #: viewsets/configs/buttons/classifications.py:11
47
+ msgid "Icicle Chart"
48
+ msgstr ""
49
+
50
+ #: viewsets/configs/display/classifications.py:40
51
+ msgid "Child Classifications"
52
+ msgstr ""
53
+
54
+ #: viewsets/configs/display/classifications.py:43
55
+ msgid "Instruments"
56
+ msgstr ""
57
+
58
+ #: viewsets/configs/display/classifications.py:69
59
+ msgid "Classification"
60
+ msgstr ""
61
+
62
+ #: viewsets/configs/display/classifications.py:112
63
+ msgid "Related Instruments"
64
+ msgstr ""
65
+
66
+ #: viewsets/configs/display/esg.py:14
67
+ msgid "Initiated"
68
+ msgstr ""
69
+
70
+ #: viewsets/configs/display/esg.py:15
71
+ msgid "Review"
72
+ msgstr ""
73
+
74
+ #: viewsets/configs/display/esg.py:16
75
+ msgid "Headline"
76
+ msgstr ""
77
+
78
+ #: viewsets/configs/display/esg.py:17
79
+ msgid "Narrative"
80
+ msgstr ""
81
+
82
+ #: viewsets/configs/display/esg.py:18
83
+ msgid "Source"
84
+ msgstr ""
85
+
86
+ #: viewsets/configs/display/esg.py:19
87
+ msgid "Status"
88
+ msgstr ""
89
+
90
+ #: viewsets/configs/display/esg.py:20
91
+ msgid "Type"
92
+ msgstr ""
93
+
94
+ #: viewsets/configs/display/esg.py:21
95
+ msgid "Assessment"
96
+ msgstr ""
97
+
98
+ #: viewsets/configs/display/esg.py:22
99
+ msgid "Response"
100
+ msgstr ""
101
+
102
+ #: viewsets/configs/display/esg.py:70
103
+ msgid "Section"
104
+ msgstr ""
105
+
106
+ #: viewsets/configs/display/esg.py:71
107
+ msgid "Adverse sustainability indicator"
108
+ msgstr ""
109
+
110
+ #: viewsets/configs/display/esg.py:72
111
+ msgid "Metric"
112
+ msgstr ""
113
+
114
+ #: viewsets/configs/display/esg.py:73
115
+ msgid "Factor"
116
+ msgstr ""
117
+
118
+ #: viewsets/configs/display/esg.py:74
119
+ msgid "Value"
120
+ msgstr ""
121
+
122
+ #: viewsets/configs/display/instrument_lists.py:34
123
+ msgid "Exclusion List"
124
+ msgstr ""
125
+
126
+ #: viewsets/configs/display/instrument_lists.py:105
127
+ msgid "Validated"
128
+ msgstr ""
129
+
130
+ #: viewsets/configs/display/instrument_lists.py:109
131
+ msgid "Not Validated"
132
+ msgstr ""
133
+
134
+ #: viewsets/configs/display/instrument_requests.py:95
135
+ msgid "Instrument Data"
136
+ msgstr ""
137
+
138
+ #: viewsets/configs/display/instruments.py:70
139
+ #: viewsets/configs/display/officers.py:11
140
+ msgid "Name"
141
+ msgstr ""
142
+
143
+ #: viewsets/configs/display/instruments.py:73
144
+ msgid "Information"
145
+ msgstr ""
146
+
147
+ #: viewsets/configs/display/instruments.py:76
148
+ msgid "Instrument Type"
149
+ msgstr ""
150
+
151
+ #: viewsets/configs/display/instruments.py:78
152
+ msgid "ISIN"
153
+ msgstr ""
154
+
155
+ #: viewsets/configs/display/instruments.py:79
156
+ msgid "Ticker"
157
+ msgstr ""
158
+
159
+ #: viewsets/configs/display/instruments.py:80
160
+ msgid "RIC"
161
+ msgstr ""
162
+
163
+ #: viewsets/configs/display/instruments.py:81
164
+ msgid "Refinitiv Mnemonic"
165
+ msgstr ""
166
+
167
+ #: viewsets/configs/display/instruments.py:82
168
+ msgid "Description"
169
+ msgstr ""
170
+
171
+ #: viewsets/configs/display/instruments.py:83
172
+ msgid "Currency"
173
+ msgstr ""
174
+
175
+ #: viewsets/configs/display/instruments.py:84
176
+ msgid "Country"
177
+ msgstr ""
178
+
179
+ #: viewsets/configs/display/instruments.py:91
180
+ msgid "Extra"
181
+ msgstr ""
182
+
183
+ #: viewsets/configs/display/instruments.py:94
184
+ msgid "Primary"
185
+ msgstr ""
186
+
187
+ #: viewsets/configs/display/instruments.py:95
188
+ msgid "Investable Universe"
189
+ msgstr ""
190
+
191
+ #: viewsets/configs/display/instruments.py:96
192
+ msgid "Security"
193
+ msgstr ""
194
+
195
+ #: viewsets/configs/display/instruments.py:97
196
+ msgid "Internally Managed"
197
+ msgstr ""
198
+
199
+ #: viewsets/configs/display/instruments.py:100
200
+ msgid "Performance"
201
+ msgstr ""
202
+
203
+ #: viewsets/configs/display/instruments.py:330
204
+ msgid "Hierarchy"
205
+ msgstr ""
206
+
207
+ #: viewsets/configs/display/instruments.py:343
208
+ msgid "News"
209
+ msgstr ""
210
+
211
+ #: viewsets/configs/display/officers.py:10
212
+ msgid "Position"
213
+ msgstr ""
214
+
215
+ #: viewsets/configs/display/officers.py:12
216
+ msgid "Age"
217
+ msgstr ""
218
+
219
+ #: viewsets/configs/display/officers.py:13
220
+ msgid "Sex"
221
+ msgstr ""
222
+
223
+ #: viewsets/configs/display/officers.py:14
224
+ msgid "Start"
225
+ msgstr ""
226
+
227
+ #: viewsets/configs/display/prices.py:12
228
+ msgid "Date"
229
+ msgstr ""
230
+
231
+ #: viewsets/configs/display/prices.py:13
232
+ msgid "Open"
233
+ msgstr ""
234
+
235
+ #: viewsets/configs/display/prices.py:14
236
+ msgid "High"
237
+ msgstr ""
238
+
239
+ #: viewsets/configs/display/prices.py:15
240
+ msgid "Low"
241
+ msgstr ""
242
+
243
+ #: viewsets/configs/display/prices.py:16
244
+ msgid "Close"
245
+ msgstr ""
246
+
247
+ #: viewsets/configs/display/prices.py:17
248
+ msgid "Volume"
249
+ msgstr ""
250
+
251
+ #: viewsets/configs/display/prices.py:18
252
+ msgid "Oustanding Shares"
253
+ msgstr ""
254
+
255
+ #: viewsets/configs/display/prices.py:19
256
+ msgid "Market Cap."
257
+ msgstr ""
@@ -0,0 +1,23 @@
1
+ # Generated by Django 5.0.14 on 2025-07-02 07:50
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('wbfdm', '0030_alter_relatedinstrumentthroughmodel_related_type'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='exchange',
15
+ name='apply_round_lot_size',
16
+ field=models.BooleanField(default=True, help_text='If False, the quotes linked to this instrument will ignore their round lot size (will be considered 1).', verbose_name='Apply Round Lot Size'),
17
+ ),
18
+ migrations.AddField(
19
+ model_name='instrument',
20
+ name='round_lot_size',
21
+ field=models.IntegerField(default=1, help_text='A round lot (or board lot) is the normal unit of trading of a security.', verbose_name='Round Lot Size'),
22
+ ),
23
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.0.14 on 2025-08-27 07:59
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('wbfdm', '0031_exchange_apply_round_lot_size_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='instrumentprice',
15
+ name='outstanding_shares',
16
+ field=models.DecimalField(blank=True, decimal_places=4, help_text='The amount of outstanding share for this instrument', max_digits=16, null=True, verbose_name='Outstanding Shares'),
17
+ ),
18
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.0.12 on 2025-09-08 11:39
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('wbfdm', '0032_alter_instrumentprice_outstanding_shares'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='controversy',
15
+ name='review',
16
+ field=models.DateField(blank=True, null=True, verbose_name='Reviewed'),
17
+ ),
18
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.0.12 on 2025-11-24 15:42
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('wbfdm', '0033_alter_controversy_review'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='instrumentlist',
15
+ name='instrument_list_type',
16
+ field=models.CharField(blank=True, choices=[('WATCH', 'Watch List'), ('EXCLUSION', 'Exclusion List'), ('INCLUSION', 'Inclusion List')], max_length=32, null=True),
17
+ ),
18
+ ]
@@ -8,7 +8,6 @@ from wbfdm.enums import (
8
8
  ESGControveryStatus,
9
9
  ESGControveryType,
10
10
  )
11
- from wbfdm.models.instruments.instruments import Instrument
12
11
 
13
12
 
14
13
  class Controversy(models.Model):
@@ -54,29 +53,26 @@ class Controversy(models.Model):
54
53
  direct_involvement = models.BooleanField(default=True, verbose_name="Direct Involvement")
55
54
  company_response = models.CharField(max_length=512, null=True, blank=True)
56
55
 
57
- review = models.DateField(verbose_name="Reviewed")
56
+ review = models.DateField(verbose_name="Reviewed", null=True, blank=True)
58
57
  initiated = models.DateField(verbose_name="initiated", null=True, blank=True)
59
58
 
60
- @classmethod
61
- def sync_from_dataloader(cls, controversy: dict[str, Any]) -> Self:
62
- instrument = Instrument.objects.get(
63
- pk=controversy["instrument_id"]
64
- ).get_root() # we link it only to root level
59
+ def __str__(self) -> str:
60
+ return f"{self.headline} ({self.instrument})"
65
61
 
66
- return cls.objects.update_or_create(
62
+ @classmethod
63
+ def dict_to_model(cls, controversy: dict[str, Any], instrument) -> Self:
64
+ return Controversy(
67
65
  external_id=controversy["id"],
68
- defaults={
69
- "instrument": instrument,
70
- "headline": controversy["headline"],
71
- "description": controversy["narrative"],
72
- "source": controversy["source"],
73
- "direct_involvement": controversy.get("direct_involvement", True),
74
- "company_response": controversy["response"],
75
- "review": controversy["review"],
76
- "initiated": controversy["initiated"],
77
- "flag": controversy["flag"],
78
- "status": controversy["status"],
79
- "type": controversy["type"],
80
- "severity": controversy["assessment"],
81
- },
82
- )[0]
66
+ instrument=instrument,
67
+ headline=controversy["headline"],
68
+ description=controversy["narrative"],
69
+ source=controversy["source"],
70
+ direct_involvement=controversy.get("direct_involvement", True),
71
+ company_response=controversy["response"],
72
+ review=controversy["review"],
73
+ initiated=controversy["initiated"],
74
+ flag=controversy["flag"],
75
+ status=controversy["status"],
76
+ type=controversy["type"],
77
+ severity=controversy["assessment"],
78
+ )
@@ -152,7 +152,11 @@ class Exchange(WBModel):
152
152
  verbose_name="Comments",
153
153
  help_text="Any comments for this exchange",
154
154
  )
155
-
155
+ apply_round_lot_size = models.BooleanField(
156
+ default=True,
157
+ verbose_name="Apply Round Lot Size",
158
+ help_text="If False, the quotes linked to this instrument will ignore their round lot size (will be considered 1).",
159
+ )
156
160
  last_updated = models.DateTimeField(auto_now=True)
157
161
 
158
162
  objects = ExchangeManager()
@@ -175,9 +179,9 @@ class Exchange(WBModel):
175
179
  def __str__(self) -> str:
176
180
  repr = self.identifier_repr
177
181
  if self.name:
178
- repr = f"{self.name} ({self.identifier_repr})"
182
+ repr = f"{self.name} - {self.identifier_repr}"
179
183
  elif self.mic_name:
180
- repr = f"{self.mic_name} ({self.identifier_repr})"
184
+ repr = f"{self.mic_name} - {self.identifier_repr}"
181
185
  return repr
182
186
 
183
187
  class Meta:
@@ -215,7 +219,7 @@ class Exchange(WBModel):
215
219
 
216
220
  @classmethod
217
221
  def get_representation_label_key(cls):
218
- return "{{name}} ({{mic_code}})"
222
+ return "{{name}}"
219
223
 
220
224
  @property
221
225
  def time_zone(self):