wbfdm 1.43.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 wbfdm might be problematic. Click here for more details.

Files changed (351) hide show
  1. wbfdm/__init__.py +2 -0
  2. wbfdm/admin/__init__.py +42 -0
  3. wbfdm/admin/classifications.py +39 -0
  4. wbfdm/admin/esg.py +23 -0
  5. wbfdm/admin/exchanges.py +53 -0
  6. wbfdm/admin/instrument_lists.py +23 -0
  7. wbfdm/admin/instrument_prices.py +62 -0
  8. wbfdm/admin/instrument_requests.py +33 -0
  9. wbfdm/admin/instruments.py +117 -0
  10. wbfdm/admin/instruments_relationships.py +25 -0
  11. wbfdm/admin/options.py +101 -0
  12. wbfdm/analysis/__init__.py +2 -0
  13. wbfdm/analysis/esg/__init__.py +0 -0
  14. wbfdm/analysis/esg/enums.py +82 -0
  15. wbfdm/analysis/esg/esg_analysis.py +217 -0
  16. wbfdm/analysis/esg/utils.py +13 -0
  17. wbfdm/analysis/financial_analysis/__init__.py +1 -0
  18. wbfdm/analysis/financial_analysis/financial_metric_analysis.py +88 -0
  19. wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +125 -0
  20. wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +277 -0
  21. wbfdm/analysis/financial_analysis/statement_with_estimates.py +558 -0
  22. wbfdm/analysis/financial_analysis/utils.py +316 -0
  23. wbfdm/analysis/technical_analysis/__init__.py +1 -0
  24. wbfdm/analysis/technical_analysis/technical_analysis.py +138 -0
  25. wbfdm/analysis/technical_analysis/traces.py +165 -0
  26. wbfdm/analysis/utils.py +32 -0
  27. wbfdm/apps.py +14 -0
  28. wbfdm/backends/dto.py +36 -0
  29. wbfdm/contrib/__init__.py +0 -0
  30. wbfdm/contrib/dsws/__init__.py +0 -0
  31. wbfdm/contrib/dsws/client.py +285 -0
  32. wbfdm/contrib/dsws/dataloaders/market_data.py +130 -0
  33. wbfdm/contrib/internal/__init__.py +0 -0
  34. wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
  35. wbfdm/contrib/internal/dataloaders/market_data.py +87 -0
  36. wbfdm/contrib/metric/__init__.py +0 -0
  37. wbfdm/contrib/metric/admin/__init__.py +2 -0
  38. wbfdm/contrib/metric/admin/instruments.py +12 -0
  39. wbfdm/contrib/metric/admin/metrics.py +43 -0
  40. wbfdm/contrib/metric/apps.py +10 -0
  41. wbfdm/contrib/metric/backends/__init__.py +2 -0
  42. wbfdm/contrib/metric/backends/base.py +159 -0
  43. wbfdm/contrib/metric/backends/performances.py +265 -0
  44. wbfdm/contrib/metric/backends/statistics.py +182 -0
  45. wbfdm/contrib/metric/decorators.py +14 -0
  46. wbfdm/contrib/metric/dispatch.py +23 -0
  47. wbfdm/contrib/metric/dto.py +88 -0
  48. wbfdm/contrib/metric/exceptions.py +6 -0
  49. wbfdm/contrib/metric/factories.py +33 -0
  50. wbfdm/contrib/metric/filters.py +28 -0
  51. wbfdm/contrib/metric/migrations/0001_initial.py +88 -0
  52. wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +26 -0
  53. wbfdm/contrib/metric/migrations/__init__.py +0 -0
  54. wbfdm/contrib/metric/models.py +180 -0
  55. wbfdm/contrib/metric/orchestrators.py +94 -0
  56. wbfdm/contrib/metric/registry.py +80 -0
  57. wbfdm/contrib/metric/serializers.py +44 -0
  58. wbfdm/contrib/metric/tasks.py +27 -0
  59. wbfdm/contrib/metric/tests/__init__.py +0 -0
  60. wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
  61. wbfdm/contrib/metric/tests/backends/test_performances.py +152 -0
  62. wbfdm/contrib/metric/tests/backends/test_statistics.py +48 -0
  63. wbfdm/contrib/metric/tests/conftest.py +92 -0
  64. wbfdm/contrib/metric/tests/test_dto.py +73 -0
  65. wbfdm/contrib/metric/tests/test_models.py +72 -0
  66. wbfdm/contrib/metric/tests/test_tasks.py +24 -0
  67. wbfdm/contrib/metric/tests/test_viewsets.py +79 -0
  68. wbfdm/contrib/metric/urls.py +19 -0
  69. wbfdm/contrib/metric/viewsets/__init__.py +1 -0
  70. wbfdm/contrib/metric/viewsets/configs/__init__.py +1 -0
  71. wbfdm/contrib/metric/viewsets/configs/display.py +92 -0
  72. wbfdm/contrib/metric/viewsets/configs/menus.py +11 -0
  73. wbfdm/contrib/metric/viewsets/configs/utils.py +137 -0
  74. wbfdm/contrib/metric/viewsets/mixins.py +248 -0
  75. wbfdm/contrib/metric/viewsets/viewsets.py +40 -0
  76. wbfdm/contrib/msci/__init__.py +0 -0
  77. wbfdm/contrib/msci/client.py +92 -0
  78. wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
  79. wbfdm/contrib/msci/dataloaders/esg.py +87 -0
  80. wbfdm/contrib/msci/dataloaders/esg_controversies.py +81 -0
  81. wbfdm/contrib/msci/sync.py +58 -0
  82. wbfdm/contrib/msci/tests/__init__.py +0 -0
  83. wbfdm/contrib/msci/tests/conftest.py +1 -0
  84. wbfdm/contrib/msci/tests/test_client.py +70 -0
  85. wbfdm/contrib/qa/__init__.py +0 -0
  86. wbfdm/contrib/qa/apps.py +22 -0
  87. wbfdm/contrib/qa/database_routers.py +25 -0
  88. wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
  89. wbfdm/contrib/qa/dataloaders/adjustments.py +56 -0
  90. wbfdm/contrib/qa/dataloaders/corporate_actions.py +59 -0
  91. wbfdm/contrib/qa/dataloaders/financials.py +83 -0
  92. wbfdm/contrib/qa/dataloaders/market_data.py +117 -0
  93. wbfdm/contrib/qa/dataloaders/officers.py +59 -0
  94. wbfdm/contrib/qa/dataloaders/reporting_dates.py +67 -0
  95. wbfdm/contrib/qa/dataloaders/statements.py +267 -0
  96. wbfdm/contrib/qa/jinja2/qa/sql/companies.sql +100 -0
  97. wbfdm/contrib/qa/jinja2/qa/sql/ibes/base_estimates.sql +33 -0
  98. wbfdm/contrib/qa/jinja2/qa/sql/ibes/calendarized.sql +37 -0
  99. wbfdm/contrib/qa/jinja2/qa/sql/ibes/complete.sql +9 -0
  100. wbfdm/contrib/qa/jinja2/qa/sql/ibes/estimates.sql +3 -0
  101. wbfdm/contrib/qa/jinja2/qa/sql/ibes/financials.sql +79 -0
  102. wbfdm/contrib/qa/jinja2/qa/sql/instruments.sql +100 -0
  103. wbfdm/contrib/qa/jinja2/qa/sql/quotes.sql +98 -0
  104. wbfdm/contrib/qa/sync/exchanges.py +70 -0
  105. wbfdm/contrib/qa/sync/instruments.py +94 -0
  106. wbfdm/contrib/qa/sync/utils.py +241 -0
  107. wbfdm/contrib/qa/tasks.py +0 -0
  108. wbfdm/dataloaders/__init__.py +0 -0
  109. wbfdm/dataloaders/cache.py +129 -0
  110. wbfdm/dataloaders/protocols.py +112 -0
  111. wbfdm/dataloaders/proxies.py +201 -0
  112. wbfdm/dataloaders/types.py +209 -0
  113. wbfdm/dynamic_preferences_registry.py +45 -0
  114. wbfdm/enums.py +657 -0
  115. wbfdm/factories/__init__.py +13 -0
  116. wbfdm/factories/classifications.py +56 -0
  117. wbfdm/factories/controversies.py +27 -0
  118. wbfdm/factories/exchanges.py +21 -0
  119. wbfdm/factories/instrument_list.py +22 -0
  120. wbfdm/factories/instrument_prices.py +79 -0
  121. wbfdm/factories/instruments.py +63 -0
  122. wbfdm/factories/instruments_relationships.py +31 -0
  123. wbfdm/factories/options.py +66 -0
  124. wbfdm/figures/__init__.py +1 -0
  125. wbfdm/figures/financials/__init__.py +1 -0
  126. wbfdm/figures/financials/financial_analysis_charts.py +469 -0
  127. wbfdm/figures/financials/financials_charts.py +711 -0
  128. wbfdm/filters/__init__.py +31 -0
  129. wbfdm/filters/classifications.py +100 -0
  130. wbfdm/filters/exchanges.py +22 -0
  131. wbfdm/filters/financials.py +95 -0
  132. wbfdm/filters/financials_analysis.py +119 -0
  133. wbfdm/filters/instrument_prices.py +112 -0
  134. wbfdm/filters/instruments.py +198 -0
  135. wbfdm/filters/utils.py +44 -0
  136. wbfdm/import_export/__init__.py +0 -0
  137. wbfdm/import_export/backends/__init__.py +0 -0
  138. wbfdm/import_export/backends/cbinsights/__init__.py +2 -0
  139. wbfdm/import_export/backends/cbinsights/deals.py +44 -0
  140. wbfdm/import_export/backends/cbinsights/equities.py +41 -0
  141. wbfdm/import_export/backends/cbinsights/mixin.py +15 -0
  142. wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
  143. wbfdm/import_export/backends/cbinsights/utils/classifications.py +4150 -0
  144. wbfdm/import_export/backends/cbinsights/utils/client.py +217 -0
  145. wbfdm/import_export/backends/refinitiv/__init__.py +5 -0
  146. wbfdm/import_export/backends/refinitiv/daily_fundamental.py +36 -0
  147. wbfdm/import_export/backends/refinitiv/fiscal_period.py +63 -0
  148. wbfdm/import_export/backends/refinitiv/forecast.py +178 -0
  149. wbfdm/import_export/backends/refinitiv/fundamental.py +103 -0
  150. wbfdm/import_export/backends/refinitiv/geographic_segment.py +32 -0
  151. wbfdm/import_export/backends/refinitiv/instrument.py +55 -0
  152. wbfdm/import_export/backends/refinitiv/instrument_price.py +77 -0
  153. wbfdm/import_export/backends/refinitiv/mixin.py +29 -0
  154. wbfdm/import_export/backends/refinitiv/utils/__init__.py +1 -0
  155. wbfdm/import_export/backends/refinitiv/utils/controller.py +182 -0
  156. wbfdm/import_export/handlers/__init__.py +0 -0
  157. wbfdm/import_export/handlers/instrument.py +253 -0
  158. wbfdm/import_export/handlers/instrument_list.py +101 -0
  159. wbfdm/import_export/handlers/instrument_price.py +71 -0
  160. wbfdm/import_export/handlers/option.py +54 -0
  161. wbfdm/import_export/handlers/private_equities.py +49 -0
  162. wbfdm/import_export/parsers/__init__.py +0 -0
  163. wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
  164. wbfdm/import_export/parsers/cbinsights/deals.py +39 -0
  165. wbfdm/import_export/parsers/cbinsights/equities.py +56 -0
  166. wbfdm/import_export/parsers/cbinsights/fundamentals.py +45 -0
  167. wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
  168. wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +7 -0
  169. wbfdm/import_export/parsers/refinitiv/forecast.py +7 -0
  170. wbfdm/import_export/parsers/refinitiv/fundamental.py +9 -0
  171. wbfdm/import_export/parsers/refinitiv/geographic_segment.py +7 -0
  172. wbfdm/import_export/parsers/refinitiv/instrument.py +75 -0
  173. wbfdm/import_export/parsers/refinitiv/instrument_price.py +26 -0
  174. wbfdm/import_export/parsers/refinitiv/utils.py +96 -0
  175. wbfdm/import_export/resources/__init__.py +0 -0
  176. wbfdm/import_export/resources/classification.py +23 -0
  177. wbfdm/import_export/resources/instrument_prices.py +33 -0
  178. wbfdm/import_export/resources/instruments.py +176 -0
  179. wbfdm/jinja2.py +7 -0
  180. wbfdm/management/__init__.py +30 -0
  181. wbfdm/menu.py +11 -0
  182. wbfdm/migrations/0001_initial.py +71 -0
  183. wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +144 -0
  184. wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +34 -0
  185. wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +86 -0
  186. wbfdm/migrations/0005_instrument_corporate_action_backend.py +29 -0
  187. wbfdm/migrations/0006_instrument_officer_backend.py +29 -0
  188. wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +117 -0
  189. wbfdm/migrations/0008_controversy.py +75 -0
  190. wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +85 -0
  191. wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +1299 -0
  192. wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +169 -0
  193. wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +564 -0
  194. wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +199 -0
  195. wbfdm/migrations/0014_alter_controversy_instrument.py +22 -0
  196. wbfdm/migrations/0015_instrument_instrument_investible_index.py +16 -0
  197. wbfdm/migrations/0016_instrumenttype_name_repr.py +18 -0
  198. wbfdm/migrations/0017_instrument_instrument_security_index.py +16 -0
  199. wbfdm/migrations/0018_instrument_instrument_level_index.py +20 -0
  200. wbfdm/migrations/0019_alter_controversy_source.py +17 -0
  201. wbfdm/migrations/0020_optionaggregate_option_and_more.py +249 -0
  202. wbfdm/migrations/0021_delete_instrumentdailystatistics.py +15 -0
  203. wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +91 -0
  204. wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +53 -0
  205. wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +36 -0
  206. wbfdm/migrations/0025_instrument_is_primary_and_more.py +29 -0
  207. wbfdm/migrations/0026_instrument_is_cash_equivalent.py +30 -0
  208. wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +100 -0
  209. wbfdm/migrations/0028_instrumentprice_annualized_daily_volatility.py +17 -0
  210. wbfdm/migrations/__init__.py +0 -0
  211. wbfdm/models/__init__.py +4 -0
  212. wbfdm/models/esg/__init__.py +1 -0
  213. wbfdm/models/esg/controversies.py +81 -0
  214. wbfdm/models/exchanges/__init__.py +1 -0
  215. wbfdm/models/exchanges/exchanges.py +223 -0
  216. wbfdm/models/fields.py +117 -0
  217. wbfdm/models/fk_fields.py +403 -0
  218. wbfdm/models/indicators.py +0 -0
  219. wbfdm/models/instruments/__init__.py +19 -0
  220. wbfdm/models/instruments/classifications.py +265 -0
  221. wbfdm/models/instruments/instrument_lists.py +120 -0
  222. wbfdm/models/instruments/instrument_prices.py +544 -0
  223. wbfdm/models/instruments/instrument_relationships.py +251 -0
  224. wbfdm/models/instruments/instrument_requests.py +196 -0
  225. wbfdm/models/instruments/instruments.py +991 -0
  226. wbfdm/models/instruments/llm/__init__.py +1 -0
  227. wbfdm/models/instruments/llm/create_instrument_news_relationships.py +78 -0
  228. wbfdm/models/instruments/mixin/__init__.py +0 -0
  229. wbfdm/models/instruments/mixin/financials_computed.py +804 -0
  230. wbfdm/models/instruments/mixin/financials_serializer_fields.py +1407 -0
  231. wbfdm/models/instruments/mixin/instruments.py +297 -0
  232. wbfdm/models/instruments/options.py +225 -0
  233. wbfdm/models/instruments/private_equities.py +59 -0
  234. wbfdm/models/instruments/querysets.py +73 -0
  235. wbfdm/models/instruments/utils.py +41 -0
  236. wbfdm/preferences.py +21 -0
  237. wbfdm/serializers/__init__.py +4 -0
  238. wbfdm/serializers/esg.py +36 -0
  239. wbfdm/serializers/exchanges.py +39 -0
  240. wbfdm/serializers/instruments/__init__.py +37 -0
  241. wbfdm/serializers/instruments/classifications.py +139 -0
  242. wbfdm/serializers/instruments/instrument_lists.py +61 -0
  243. wbfdm/serializers/instruments/instrument_prices.py +73 -0
  244. wbfdm/serializers/instruments/instrument_relationships.py +170 -0
  245. wbfdm/serializers/instruments/instrument_requests.py +61 -0
  246. wbfdm/serializers/instruments/instruments.py +274 -0
  247. wbfdm/serializers/instruments/mixins.py +104 -0
  248. wbfdm/serializers/officers.py +20 -0
  249. wbfdm/signals.py +7 -0
  250. wbfdm/sync/__init__.py +0 -0
  251. wbfdm/sync/abstract.py +31 -0
  252. wbfdm/sync/runner.py +22 -0
  253. wbfdm/tasks.py +69 -0
  254. wbfdm/tests/__init__.py +0 -0
  255. wbfdm/tests/analysis/__init__.py +0 -0
  256. wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
  257. wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +392 -0
  258. wbfdm/tests/analysis/financial_analysis/test_utils.py +322 -0
  259. wbfdm/tests/analysis/test_esg.py +159 -0
  260. wbfdm/tests/conftest.py +92 -0
  261. wbfdm/tests/dataloaders/__init__.py +0 -0
  262. wbfdm/tests/dataloaders/test_cache.py +73 -0
  263. wbfdm/tests/models/__init__.py +0 -0
  264. wbfdm/tests/models/test_classifications.py +99 -0
  265. wbfdm/tests/models/test_exchanges.py +7 -0
  266. wbfdm/tests/models/test_instrument_list.py +117 -0
  267. wbfdm/tests/models/test_instrument_prices.py +306 -0
  268. wbfdm/tests/models/test_instruments.py +202 -0
  269. wbfdm/tests/models/test_merge.py +99 -0
  270. wbfdm/tests/models/test_options.py +69 -0
  271. wbfdm/tests/test_tasks.py +6 -0
  272. wbfdm/tests/tests.py +10 -0
  273. wbfdm/urls.py +222 -0
  274. wbfdm/utils.py +54 -0
  275. wbfdm/viewsets/__init__.py +10 -0
  276. wbfdm/viewsets/configs/__init__.py +5 -0
  277. wbfdm/viewsets/configs/buttons/__init__.py +8 -0
  278. wbfdm/viewsets/configs/buttons/classifications.py +23 -0
  279. wbfdm/viewsets/configs/buttons/exchanges.py +9 -0
  280. wbfdm/viewsets/configs/buttons/instrument_prices.py +49 -0
  281. wbfdm/viewsets/configs/buttons/instruments.py +283 -0
  282. wbfdm/viewsets/configs/display/__init__.py +22 -0
  283. wbfdm/viewsets/configs/display/classifications.py +138 -0
  284. wbfdm/viewsets/configs/display/esg.py +75 -0
  285. wbfdm/viewsets/configs/display/exchanges.py +42 -0
  286. wbfdm/viewsets/configs/display/instrument_lists.py +137 -0
  287. wbfdm/viewsets/configs/display/instrument_prices.py +199 -0
  288. wbfdm/viewsets/configs/display/instrument_requests.py +116 -0
  289. wbfdm/viewsets/configs/display/instruments.py +340 -0
  290. wbfdm/viewsets/configs/display/instruments_relationships.py +65 -0
  291. wbfdm/viewsets/configs/display/monthly_performances.py +72 -0
  292. wbfdm/viewsets/configs/display/officers.py +16 -0
  293. wbfdm/viewsets/configs/display/prices.py +21 -0
  294. wbfdm/viewsets/configs/display/statement_with_estimates.py +101 -0
  295. wbfdm/viewsets/configs/display/statements.py +48 -0
  296. wbfdm/viewsets/configs/endpoints/__init__.py +41 -0
  297. wbfdm/viewsets/configs/endpoints/classifications.py +87 -0
  298. wbfdm/viewsets/configs/endpoints/esg.py +20 -0
  299. wbfdm/viewsets/configs/endpoints/exchanges.py +6 -0
  300. wbfdm/viewsets/configs/endpoints/financials_analysis.py +65 -0
  301. wbfdm/viewsets/configs/endpoints/instrument_lists.py +38 -0
  302. wbfdm/viewsets/configs/endpoints/instrument_prices.py +51 -0
  303. wbfdm/viewsets/configs/endpoints/instrument_requests.py +20 -0
  304. wbfdm/viewsets/configs/endpoints/instruments.py +13 -0
  305. wbfdm/viewsets/configs/endpoints/instruments_relationships.py +31 -0
  306. wbfdm/viewsets/configs/endpoints/statements.py +6 -0
  307. wbfdm/viewsets/configs/menus/__init__.py +9 -0
  308. wbfdm/viewsets/configs/menus/classifications.py +19 -0
  309. wbfdm/viewsets/configs/menus/exchanges.py +10 -0
  310. wbfdm/viewsets/configs/menus/instrument_lists.py +10 -0
  311. wbfdm/viewsets/configs/menus/instruments.py +20 -0
  312. wbfdm/viewsets/configs/menus/instruments_relationships.py +33 -0
  313. wbfdm/viewsets/configs/titles/__init__.py +42 -0
  314. wbfdm/viewsets/configs/titles/classifications.py +79 -0
  315. wbfdm/viewsets/configs/titles/esg.py +11 -0
  316. wbfdm/viewsets/configs/titles/exchanges.py +12 -0
  317. wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +6 -0
  318. wbfdm/viewsets/configs/titles/financials_analysis.py +50 -0
  319. wbfdm/viewsets/configs/titles/instrument_prices.py +50 -0
  320. wbfdm/viewsets/configs/titles/instrument_requests.py +16 -0
  321. wbfdm/viewsets/configs/titles/instruments.py +31 -0
  322. wbfdm/viewsets/configs/titles/instruments_relationships.py +21 -0
  323. wbfdm/viewsets/configs/titles/market_data.py +13 -0
  324. wbfdm/viewsets/configs/titles/prices.py +15 -0
  325. wbfdm/viewsets/configs/titles/statement_with_estimates.py +10 -0
  326. wbfdm/viewsets/esg.py +72 -0
  327. wbfdm/viewsets/exchanges.py +63 -0
  328. wbfdm/viewsets/financial_analysis/__init__.py +3 -0
  329. wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +85 -0
  330. wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +85 -0
  331. wbfdm/viewsets/financial_analysis/statement_with_estimates.py +145 -0
  332. wbfdm/viewsets/instruments/__init__.py +80 -0
  333. wbfdm/viewsets/instruments/classifications.py +279 -0
  334. wbfdm/viewsets/instruments/financials_analysis.py +614 -0
  335. wbfdm/viewsets/instruments/instrument_lists.py +77 -0
  336. wbfdm/viewsets/instruments/instrument_prices.py +542 -0
  337. wbfdm/viewsets/instruments/instrument_requests.py +51 -0
  338. wbfdm/viewsets/instruments/instruments.py +106 -0
  339. wbfdm/viewsets/instruments/instruments_relationships.py +235 -0
  340. wbfdm/viewsets/instruments/utils.py +27 -0
  341. wbfdm/viewsets/market_data.py +172 -0
  342. wbfdm/viewsets/mixins.py +9 -0
  343. wbfdm/viewsets/officers.py +27 -0
  344. wbfdm/viewsets/prices.py +62 -0
  345. wbfdm/viewsets/statements/__init__.py +1 -0
  346. wbfdm/viewsets/statements/statements.py +100 -0
  347. wbfdm/viewsets/technical_analysis/__init__.py +1 -0
  348. wbfdm/viewsets/technical_analysis/monthly_performances.py +93 -0
  349. wbfdm-1.43.1.dist-info/METADATA +15 -0
  350. wbfdm-1.43.1.dist-info/RECORD +351 -0
  351. wbfdm-1.43.1.dist-info/WHEEL +5 -0
@@ -0,0 +1,41 @@
1
+ from .classifications import (
2
+ ClassificationClassificationGroupEndpointConfig,
3
+ ClassificationEndpointConfig,
4
+ ClassificationIcicleChartEndpointConfig,
5
+ ClassificationInstrumentRelatedInstrumentEndpointConfig,
6
+ ClassificationInstrumentThroughInstrumentModelEndpointConfig,
7
+ ClassificationParentClassificationEndpointConfig,
8
+ ClassificationTreeChartEndpointConfig,
9
+ InstrumentClassificationThroughEndpointConfig,
10
+ InstrumentClassificationThroughInstrumentModelEndpointConfig,
11
+ )
12
+ from .financials_analysis import (
13
+ CashFlowAnalysisInstrumentBarChartEndpointConfig,
14
+ CashFlowAnalysisInstrumentTableChartEndpointConfig,
15
+ EarningsInstrumentChartEndpointConfig,
16
+ FinancialsGraphInstrumentChartEndpointConfig,
17
+ NetDebtAndEbitdaInstrumentChartEndpointConfig,
18
+ ProfitabilityRatiosInstrumentChartEndpointConfig,
19
+ SummaryTableInstrumentChartEndpointConfig,
20
+ )
21
+ from .instrument_lists import (
22
+ InstrumentListThroughModelInstrumentListEndpointConfig,
23
+ InstrumentListThroughModelInstrumentEndpointConfig,
24
+ InstrumentListThroughModelEndpointConfig,
25
+ )
26
+ from .instrument_requests import InstrumentRequestEndpointConfig
27
+ from .instruments import InstrumentEndpointConfig
28
+ from .instrument_prices import (
29
+ InstrumentPriceInstrumentEndpointConfig,
30
+ InstrumentPriceStatisticsInstrumentEndpointConfig,
31
+ MonthlyPerformancesInstrumentEndpointConfig,
32
+ FinancialStatisticsInstrumentEndpointConfig,
33
+ InstrumentPriceInstrumentDistributionReturnsChartEndpointConfig,
34
+ BestAndWorstReturnsInstrumentEndpointConfig,
35
+ )
36
+ from .instruments_relationships import (
37
+ ClassifiedInstrumentEndpointConfig,
38
+ RelatedInstrumentThroughInstrumentEndpointConfig,
39
+ )
40
+ from .exchanges import ExchangeEndpointConfig
41
+ from .esg import InstrumentESGPAIEndpointViewConfig, InstrumentESGControversiesEndpointViewConfig
@@ -0,0 +1,87 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+
4
+
5
+ class ClassificationEndpointConfig(EndpointViewConfig):
6
+ pass
7
+
8
+
9
+ class ClassificationClassificationGroupEndpointConfig(ClassificationEndpointConfig):
10
+ def get_endpoint(self, **kwargs):
11
+ return reverse(
12
+ "wbfdm:classificationgroup-classification-list",
13
+ args=[self.view.kwargs["group_id"]],
14
+ request=self.request,
15
+ )
16
+
17
+
18
+ class ClassificationParentClassificationEndpointConfig(EndpointViewConfig):
19
+ def get_endpoint(self, **kwargs):
20
+ return reverse(
21
+ "wbfdm:classificationparent-classification-list",
22
+ args=[self.view.kwargs["parent_id"]],
23
+ request=self.request,
24
+ )
25
+
26
+
27
+ class ClassificationTreeChartEndpointConfig(EndpointViewConfig):
28
+ def get_endpoint(self, **kwargs):
29
+ return None
30
+
31
+ def get_list_endpoint(self, **kwargs):
32
+ return reverse(
33
+ "wbfdm:classificationgroup-treechart-list", args=[self.view.kwargs["group_id"]], request=self.request
34
+ )
35
+
36
+
37
+ class ClassificationIcicleChartEndpointConfig(EndpointViewConfig):
38
+ def get_endpoint(self, **kwargs):
39
+ return None
40
+
41
+ def get_list_endpoint(self, **kwargs):
42
+ return reverse(
43
+ "wbfdm:classificationgroup-iciclechart-list",
44
+ args=[self.view.kwargs["group_id"]],
45
+ request=self.request,
46
+ )
47
+
48
+
49
+ class InstrumentClassificationThroughEndpointConfig(EndpointViewConfig):
50
+ def get_endpoint(self, **kwargs):
51
+ return reverse(
52
+ "wbfdm:instrumentclassificationrelationship-list",
53
+ args=[],
54
+ request=self.request,
55
+ )
56
+
57
+ def get_update_endpoint(self, **kwargs):
58
+ if "pk" in self.view.kwargs:
59
+ return super().get_update_endpoint()
60
+ return None
61
+
62
+
63
+ class InstrumentClassificationThroughInstrumentModelEndpointConfig(InstrumentClassificationThroughEndpointConfig):
64
+ def get_endpoint(self, **kwargs):
65
+ return reverse(
66
+ "wbfdm:instrument-classification-list",
67
+ args=[self.view.instrument.get_root().id],
68
+ request=self.request,
69
+ )
70
+
71
+
72
+ class ClassificationInstrumentThroughInstrumentModelEndpointConfig(InstrumentClassificationThroughEndpointConfig):
73
+ def get_endpoint(self, **kwargs):
74
+ return reverse(
75
+ "wbfdm:classification-instrument-list",
76
+ args=[self.view.kwargs["classification_id"]],
77
+ request=self.request,
78
+ )
79
+
80
+
81
+ class ClassificationInstrumentRelatedInstrumentEndpointConfig(EndpointViewConfig):
82
+ def get_endpoint(self, **kwargs):
83
+ return reverse(
84
+ "wbfdm:related_instrument-list",
85
+ args=[self.view.kwargs["classified_instrument_id"]],
86
+ request=self.request,
87
+ )
@@ -0,0 +1,20 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+
4
+
5
+ class InstrumentESGPAIEndpointViewConfig(EndpointViewConfig):
6
+ def get_endpoint(self, **kwargs):
7
+ return reverse(
8
+ "wbfdm:pai-list",
9
+ args=[self.view.kwargs["instrument_id"]],
10
+ request=self.request,
11
+ )
12
+
13
+
14
+ class InstrumentESGControversiesEndpointViewConfig(EndpointViewConfig):
15
+ def get_endpoint(self, **kwargs):
16
+ return reverse(
17
+ "wbfdm:controversies-list",
18
+ args=[self.view.kwargs["instrument_id"]],
19
+ request=self.request,
20
+ )
@@ -0,0 +1,6 @@
1
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
2
+
3
+
4
+ class ExchangeEndpointConfig(EndpointViewConfig):
5
+ def get_endpoint(self, **kwargs):
6
+ return super().get_endpoint()
@@ -0,0 +1,65 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+
4
+
5
+ class SummaryTableInstrumentChartEndpointConfig(EndpointViewConfig):
6
+ def get_endpoint(self, **kwargs):
7
+ return reverse(
8
+ "wbfdm:instrument-summarytablechart-list",
9
+ args=[self.view.kwargs["instrument_id"]],
10
+ request=self.request,
11
+ )
12
+
13
+
14
+ class FinancialsGraphInstrumentChartEndpointConfig(EndpointViewConfig):
15
+ def get_endpoint(self, **kwargs):
16
+ return reverse(
17
+ "wbfdm:instrument-financialsgraphchart-list",
18
+ args=[self.view.kwargs["instrument_id"]],
19
+ request=self.request,
20
+ )
21
+
22
+
23
+ class ProfitabilityRatiosInstrumentChartEndpointConfig(EndpointViewConfig):
24
+ def get_endpoint(self, **kwargs):
25
+ return reverse(
26
+ "wbfdm:instrument-profitabilityratioschart-list",
27
+ args=[self.view.kwargs["instrument_id"]],
28
+ request=self.request,
29
+ )
30
+
31
+
32
+ class CashFlowAnalysisInstrumentTableChartEndpointConfig(EndpointViewConfig):
33
+ def get_endpoint(self, **kwargs):
34
+ return reverse(
35
+ "wbfdm:instrument-cashflowanalysistablechart-list",
36
+ args=[self.view.kwargs["instrument_id"]],
37
+ request=self.request,
38
+ )
39
+
40
+
41
+ class CashFlowAnalysisInstrumentBarChartEndpointConfig(EndpointViewConfig):
42
+ def get_endpoint(self, **kwargs):
43
+ return reverse(
44
+ "wbfdm:instrument-cashflowanalysisbarchart-list",
45
+ args=[self.view.kwargs["instrument_id"]],
46
+ request=self.request,
47
+ )
48
+
49
+
50
+ class NetDebtAndEbitdaInstrumentChartEndpointConfig(EndpointViewConfig):
51
+ def get_endpoint(self, **kwargs):
52
+ return reverse(
53
+ "wbfdm:instrument-netdebtandebitdachart-list",
54
+ args=[self.view.kwargs["instrument_id"]],
55
+ request=self.request,
56
+ )
57
+
58
+
59
+ class EarningsInstrumentChartEndpointConfig(EndpointViewConfig):
60
+ def get_endpoint(self, **kwargs):
61
+ return reverse(
62
+ "wbfdm:instrument-earningschart-list",
63
+ args=[self.view.kwargs["instrument_id"]],
64
+ request=self.request,
65
+ )
@@ -0,0 +1,38 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+
4
+
5
+ class InstrumentListThroughModelEndpointConfig(EndpointViewConfig):
6
+ def get_endpoint(self, **kwargs):
7
+ return reverse(
8
+ "wbfdm:instrumentlistthrough-list",
9
+ args=[],
10
+ request=self.request,
11
+ )
12
+
13
+
14
+ class InstrumentListThroughModelInstrumentListEndpointConfig(EndpointViewConfig):
15
+ def get_endpoint(self, **kwargs):
16
+ return reverse(
17
+ "wbfdm:instrumentlist-instrumentlistthrough-list",
18
+ args=[self.view.kwargs["instrument_list_id"]],
19
+ request=self.request,
20
+ )
21
+
22
+
23
+ class InstrumentListThroughModelInstrumentEndpointConfig(EndpointViewConfig):
24
+ PK_FIELD = "instrument_list" # we expect that users want to go directly to the Instrument List model
25
+
26
+ def get_endpoint(self, **kwargs):
27
+ return reverse(
28
+ "wbfdm:instrument-instrumentlistthrough-list",
29
+ args=[self.view.kwargs["instrument_id"]],
30
+ request=self.request,
31
+ )
32
+
33
+ def get_instance_endpoint(self, **kwargs):
34
+ return reverse(
35
+ "wbfdm:instrumentlist-list",
36
+ args=[],
37
+ request=self.request,
38
+ )
@@ -0,0 +1,51 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+
4
+
5
+ class InstrumentPriceInstrumentEndpointConfig(EndpointViewConfig):
6
+ def get_endpoint(self, **kwargs):
7
+ return None
8
+
9
+ def get_list_endpoint(self, **kwargs):
10
+ return reverse("wbfdm:instrument-price-list", [self.view.kwargs["instrument_id"]], request=self.request)
11
+
12
+
13
+ class InstrumentPriceStatisticsInstrumentEndpointConfig(EndpointViewConfig):
14
+ def get_endpoint(self, **kwargs):
15
+ return reverse(
16
+ "wbfdm:instrument-pricestatisticchart-list",
17
+ [self.view.kwargs["instrument_id"]],
18
+ request=self.request,
19
+ )
20
+
21
+
22
+ class MonthlyPerformancesInstrumentEndpointConfig(InstrumentPriceInstrumentEndpointConfig):
23
+ def get_list_endpoint(self, **kwargs):
24
+ return reverse("wbfdm:monthly_performances-list", [self.view.kwargs["instrument_id"]], request=self.request)
25
+
26
+
27
+ class FinancialStatisticsInstrumentEndpointConfig(InstrumentPriceInstrumentEndpointConfig):
28
+ def get_list_endpoint(self, **kwargs):
29
+ return reverse(
30
+ "wbfdm:instrument-financialstatistics-list",
31
+ [self.view.kwargs["instrument_id"]],
32
+ request=self.request,
33
+ )
34
+
35
+
36
+ class InstrumentPriceInstrumentDistributionReturnsChartEndpointConfig(EndpointViewConfig):
37
+ def get_list_endpoint(self, **kwargs):
38
+ return reverse(
39
+ "wbfdm:instrument-distributionreturnschart-list",
40
+ args=[self.view.kwargs["instrument_id"]],
41
+ request=self.request,
42
+ )
43
+
44
+
45
+ class BestAndWorstReturnsInstrumentEndpointConfig(EndpointViewConfig):
46
+ def get_list_endpoint(self, **kwargs):
47
+ return reverse(
48
+ "wbfdm:instrument-bestandworstreturns-list",
49
+ [self.view.kwargs["instrument_id"]],
50
+ request=self.request,
51
+ )
@@ -0,0 +1,20 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+ from wbfdm.models import InstrumentRequest
4
+
5
+
6
+ class InstrumentRequestEndpointConfig(EndpointViewConfig):
7
+ def get_endpoint(self, **kwargs):
8
+ return reverse("wbfdm:instrumentrequest-list", args=[], request=self.request)
9
+
10
+ def get_instance_endpoint(self, **kwargs):
11
+ try:
12
+ obj = self.view.get_object()
13
+ if not self.view.has_validation_permission and obj.status != InstrumentRequest.Status.DRAFT:
14
+ return None
15
+ except AssertionError:
16
+ pass
17
+ return self.get_endpoint(**kwargs)
18
+
19
+ def get_delete_endpoint(self, **kwargs):
20
+ return None
@@ -0,0 +1,13 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+
4
+
5
+ class InstrumentEndpointConfig(EndpointViewConfig):
6
+ def get_endpoint(self, **kwargs):
7
+ return reverse("wbfdm:instrument-list", args=[], request=self.request)
8
+
9
+ def get_delete_endpoint(self, **kwargs):
10
+ return None
11
+
12
+ def get_create_endpoint(self, **kwargs):
13
+ return reverse("wbfdm:instrumentrequest-list", args=[], request=self.request)
@@ -0,0 +1,31 @@
1
+ from rest_framework.reverse import reverse
2
+ from wbcore.metadata.configs.endpoints import EndpointViewConfig
3
+
4
+
5
+ class RelatedInstrumentThroughInstrumentEndpointConfig(EndpointViewConfig):
6
+ def get_endpoint(self, **kwargs):
7
+ return reverse(
8
+ "wbfdm:instrument-relatedinstrument-list",
9
+ args=[self.view.kwargs["instrument_id"]],
10
+ request=self.request,
11
+ )
12
+
13
+
14
+ class ClassifiedInstrumentEndpointConfig(EndpointViewConfig):
15
+ PK_FIELD = "instrument"
16
+
17
+ def get_endpoint(self, **kwargs):
18
+ return reverse("wbfdm:classifiedinstrument-list", args=[], request=self.request)
19
+
20
+ def get_instance_endpoint(self, **kwargs):
21
+ return reverse(
22
+ "wbfdm:instrument-list",
23
+ args=[],
24
+ request=self.request,
25
+ )
26
+
27
+ def get_create_endpoint(self, **kwargs):
28
+ return None
29
+
30
+ def get_delete_endpoint(self, **kwargs):
31
+ return None
@@ -0,0 +1,6 @@
1
+ from wbcore.metadata.configs import endpoints
2
+
3
+
4
+ class StatementsEndpointViewConfig(endpoints.EndpointViewConfig):
5
+ def get_endpoint(self, **kwargs):
6
+ return None
@@ -0,0 +1,9 @@
1
+ from .exchanges import ExchangeMenuItem
2
+ from .classifications import ClassificationMenuItem, ClassificationGroupMenuItem
3
+ from .instrument_lists import INSTRUMENT_LIST_MENUITEM
4
+ from .instruments import INSTRUMENT_MENUITEM, INVESTABLE_UNIVERSE_MENUITEM
5
+ from .instruments_relationships import (
6
+ INSTRUMENTFAVORITEGROUP_MENUITEM,
7
+ INSTRUMENT_REQUEST_MENUITEM,
8
+ CLASSIFIEDINSTRUMENTS_MENUITEM,
9
+ )
@@ -0,0 +1,19 @@
1
+ from wbcore.menus import ItemPermission, MenuItem
2
+ from wbcore.permissions.shortcuts import is_internal_user
3
+
4
+ ClassificationMenuItem = MenuItem(
5
+ label="Classification",
6
+ endpoint="wbfdm:classification-list",
7
+ permission=ItemPermission(
8
+ permissions=["wbfdm.view_classification"],
9
+ method=lambda request: is_internal_user(request.user),
10
+ ),
11
+ )
12
+ ClassificationGroupMenuItem = MenuItem(
13
+ label="Classification Group",
14
+ endpoint="wbfdm:classificationgroup-list",
15
+ permission=ItemPermission(
16
+ permissions=["wbfdm.view_classificationgroup"],
17
+ method=lambda request: is_internal_user(request.user),
18
+ ),
19
+ )
@@ -0,0 +1,10 @@
1
+ from wbcore.menus import ItemPermission, MenuItem
2
+ from wbcore.permissions.shortcuts import is_internal_user
3
+
4
+ ExchangeMenuItem = MenuItem(
5
+ label="Exchange",
6
+ endpoint="wbfdm:exchange-list",
7
+ permission=ItemPermission(
8
+ permissions=["wbfdm.view_exchange"], method=lambda request: is_internal_user(request.user)
9
+ ),
10
+ )
@@ -0,0 +1,10 @@
1
+ from wbcore.menus import ItemPermission, MenuItem
2
+ from wbcore.permissions.shortcuts import is_internal_user
3
+
4
+ INSTRUMENT_LIST_MENUITEM = MenuItem(
5
+ label="Instrument Lists",
6
+ endpoint="wbfdm:instrumentlist-list",
7
+ permission=ItemPermission(
8
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.view_instrumentlist"]
9
+ ),
10
+ )
@@ -0,0 +1,20 @@
1
+ from wbcore.menus import ItemPermission, MenuItem
2
+ from wbcore.permissions.shortcuts import is_internal_user
3
+
4
+ INSTRUMENT_MENUITEM = MenuItem(
5
+ label="Instrument",
6
+ endpoint="wbfdm:instrument-list",
7
+ endpoint_get_parameters={"parent__isnull": True},
8
+ permission=ItemPermission(
9
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.view_instrument"]
10
+ ),
11
+ )
12
+
13
+ INVESTABLE_UNIVERSE_MENUITEM = MenuItem(
14
+ label="Investable Universe",
15
+ endpoint="wbfdm:instrument-list",
16
+ endpoint_get_parameters={"is_investable_universe": True},
17
+ permission=ItemPermission(
18
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.view_instrument"]
19
+ ),
20
+ )
@@ -0,0 +1,33 @@
1
+ from wbcore.menus import ItemPermission, MenuItem
2
+ from wbcore.permissions.shortcuts import is_internal_user
3
+
4
+ INSTRUMENTFAVORITEGROUP_MENUITEM = MenuItem(
5
+ label="Favorite Group",
6
+ endpoint="wbfdm:favoritegroup-list",
7
+ permission=ItemPermission(
8
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.view_instrumentfavoritegroup"]
9
+ ),
10
+ )
11
+
12
+ CLASSIFIEDINSTRUMENTS_MENUITEM = MenuItem(
13
+ label="Classified Instruments",
14
+ endpoint="wbfdm:classifiedinstrument-list",
15
+ permission=ItemPermission(
16
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.view_instrument"]
17
+ ),
18
+ )
19
+
20
+ INSTRUMENT_REQUEST_MENUITEM = MenuItem(
21
+ label="Instrument Requests",
22
+ endpoint="wbfdm:instrumentrequest-list",
23
+ permission=ItemPermission(
24
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.view_instrumentrequest"]
25
+ ),
26
+ add=MenuItem(
27
+ label="Create Instrument Request",
28
+ endpoint="wbfdm:instrumentrequest-list",
29
+ permission=ItemPermission(
30
+ method=lambda request: is_internal_user(request.user), permissions=["wbfdm.add_instrumentrequest"]
31
+ ),
32
+ ),
33
+ )
@@ -0,0 +1,42 @@
1
+ from .classifications import (
2
+ ChildClassificationParentClassificationTitleConfig,
3
+ ClassificationClassificationGroupTitleConfig,
4
+ ClassificationGroupTitleConfig,
5
+ ClassificationIcicleChartTitleConfig,
6
+ ClassificationTitleConfig,
7
+ ClassificationTreeChartTitleConfig,
8
+ InstrumentClassificationThroughTitleConfig,
9
+ )
10
+ from .financials_analysis import (
11
+ CashFlowAnalysisInstrumentBarChartTitle,
12
+ CashFlowAnalysisInstrumentTableChartTitle,
13
+ EarningsInstrumentChartTitle,
14
+ FinancialsGraphInstrumentChartTitle,
15
+ NetDebtAndEbitdaInstrumentChartTitle,
16
+ ProfitabilityRatiosInstrumentChartTitle,
17
+ SummaryTableInstrumentChartTitle,
18
+ FinancialAnalysisGeneratorTitleConfig,
19
+ )
20
+ from .instrument_requests import InstrumentRequestTitleConfig
21
+ from .instruments import InstrumentTitleConfig
22
+ from .instruments_relationships import (
23
+ ClassifiedInstrumentTitleConfig,
24
+ InstrumentFavoriteGroupTitleConfig,
25
+ )
26
+ from .exchanges import ExchangeTitleConfig
27
+ from .instrument_prices import (
28
+ InstrumentPriceTitleConfig,
29
+ InstrumentPriceInstrumentTitleConfig,
30
+ InstrumentPriceStatisticsInstrumentTitleConfig,
31
+ MonthlyPerformancesInstrumentTitleConfig,
32
+ InstrumentTitleConfigMixin,
33
+ FinancialStatisticsInstrumentTitleConfig,
34
+ InstrumentPriceInstrumentDistributionReturnsChartTitleConfig,
35
+ BestAndWorstReturnsInstrumentTitleConfig,
36
+ )
37
+ from .market_data import (
38
+ PerformanceSummaryChartTitleConfig,
39
+ MarketDataChartTitleConfig,
40
+ )
41
+ from .financial_ratio_analysis import ValuationRatioChartTitleConfig
42
+ from .esg import InstrumentESGPAITitleViewConfig, InstrumentESGControversiesTitleViewConfig
@@ -0,0 +1,79 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+ from wbfdm.models import Classification, ClassificationGroup, Instrument
3
+
4
+
5
+ class ClassificationTitleConfig(TitleViewConfig):
6
+ def get_list_title(self):
7
+ return "Classifications"
8
+
9
+ def get_instance_title(self):
10
+ try:
11
+ obj = self.view.get_object()
12
+ return f"Classification: {str(obj)}"
13
+ except AssertionError:
14
+ return "Classification: {{name}}"
15
+
16
+ def get_create_title(self):
17
+ return "New Classification"
18
+
19
+
20
+ class ClassificationGroupTitleConfig(TitleViewConfig):
21
+ def get_list_title(self):
22
+ return "Classification Groups"
23
+
24
+ def get_instance_title(self):
25
+ return "Classification Group"
26
+
27
+ def get_create_title(self):
28
+ return "New Classification Group"
29
+
30
+
31
+ class ChildClassificationParentClassificationTitleConfig(ClassificationTitleConfig):
32
+ def get_list_title(self):
33
+ classification = Classification.objects.get(id=self.view.kwargs["parent_id"])
34
+ return f"Child Classifications of {classification.name}"
35
+
36
+ def get_create_title(self):
37
+ classification = Classification.objects.get(id=self.view.kwargs["parent_id"])
38
+ return f"New Child Classification {classification.name}"
39
+
40
+
41
+ class ClassificationClassificationGroupTitleConfig(ClassificationTitleConfig):
42
+ def get_list_title(self):
43
+ group = ClassificationGroup.objects.get(id=self.view.kwargs["group_id"])
44
+ return f"Entry Level Classifications for group {group.name}"
45
+
46
+ def get_create_title(self):
47
+ group = ClassificationGroup.objects.get(id=self.view.kwargs["group_id"])
48
+ return f"New Classification for group {group.name}"
49
+
50
+
51
+ class ClassificationTreeChartTitleConfig(TitleViewConfig):
52
+ def get_list_title(self):
53
+ group = ClassificationGroup.objects.get(id=self.view.kwargs["group_id"])
54
+ return f"Classification Tree for group {group.name}"
55
+
56
+
57
+ class ClassificationIcicleChartTitleConfig(TitleViewConfig):
58
+ def get_list_title(self):
59
+ group = ClassificationGroup.objects.get(id=self.view.kwargs["group_id"])
60
+ return f"Classification Icicle Chart for group {group.name}"
61
+
62
+
63
+ class InstrumentClassificationThroughTitleConfig(TitleViewConfig):
64
+ def get_create_title(self) -> str:
65
+ if instrument_id := self.view.kwargs.get("instrument_id", None):
66
+ return f"Classification for {Instrument.objects.get(id=instrument_id)}"
67
+ elif classification_id := self.view.kwargs.get("classification_id", None):
68
+ return f"Instrument for {Classification.objects.get(id=classification_id)}"
69
+ else:
70
+ return super().get_create_title()
71
+
72
+ def get_instance_title(self):
73
+ try:
74
+ obj = self.view.get_object()
75
+ if obj.classification and obj.instrument:
76
+ return f"Relationship: {str(obj.classification.name)} <-> {str(obj.instrument.name)}"
77
+ return str(obj)
78
+ except AssertionError:
79
+ return super().get_instance_title()
@@ -0,0 +1,11 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+
3
+
4
+ class InstrumentESGPAITitleViewConfig(TitleViewConfig):
5
+ def get_list_title(self):
6
+ return f"{self.view.instrument} - PAI"
7
+
8
+
9
+ class InstrumentESGControversiesTitleViewConfig(TitleViewConfig):
10
+ def get_list_title(self):
11
+ return f"{self.view.instrument} - Controversies"
@@ -0,0 +1,12 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+
3
+
4
+ class ExchangeTitleConfig(TitleViewConfig):
5
+ def get_list_title(self):
6
+ return "Exchanges"
7
+
8
+ def get_instance_title(self):
9
+ return "Exchange"
10
+
11
+ def get_create_title(self):
12
+ return "New Exchange"
@@ -0,0 +1,6 @@
1
+ from wbcore.metadata.configs.titles import TitleViewConfig
2
+
3
+
4
+ class ValuationRatioChartTitleConfig(TitleViewConfig):
5
+ def get_list_title(self):
6
+ return f"{str(self.view.instrument)} - Financial Statistics Chart"