wbfdm 2.2.1__py2.py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of wbfdm might be problematic. Click here for more details.

Files changed (337) 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 +271 -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/contrib/__init__.py +0 -0
  29. wbfdm/contrib/dsws/__init__.py +0 -0
  30. wbfdm/contrib/dsws/client.py +285 -0
  31. wbfdm/contrib/internal/__init__.py +0 -0
  32. wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
  33. wbfdm/contrib/internal/dataloaders/market_data.py +87 -0
  34. wbfdm/contrib/metric/__init__.py +0 -0
  35. wbfdm/contrib/metric/admin/__init__.py +2 -0
  36. wbfdm/contrib/metric/admin/instruments.py +12 -0
  37. wbfdm/contrib/metric/admin/metrics.py +43 -0
  38. wbfdm/contrib/metric/apps.py +10 -0
  39. wbfdm/contrib/metric/backends/__init__.py +2 -0
  40. wbfdm/contrib/metric/backends/base.py +159 -0
  41. wbfdm/contrib/metric/backends/performances.py +265 -0
  42. wbfdm/contrib/metric/backends/statistics.py +182 -0
  43. wbfdm/contrib/metric/decorators.py +14 -0
  44. wbfdm/contrib/metric/dispatch.py +23 -0
  45. wbfdm/contrib/metric/dto.py +88 -0
  46. wbfdm/contrib/metric/exceptions.py +6 -0
  47. wbfdm/contrib/metric/factories.py +33 -0
  48. wbfdm/contrib/metric/filters.py +28 -0
  49. wbfdm/contrib/metric/migrations/0001_initial.py +88 -0
  50. wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +26 -0
  51. wbfdm/contrib/metric/migrations/__init__.py +0 -0
  52. wbfdm/contrib/metric/models.py +180 -0
  53. wbfdm/contrib/metric/orchestrators.py +94 -0
  54. wbfdm/contrib/metric/registry.py +80 -0
  55. wbfdm/contrib/metric/serializers.py +44 -0
  56. wbfdm/contrib/metric/tasks.py +27 -0
  57. wbfdm/contrib/metric/tests/__init__.py +0 -0
  58. wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
  59. wbfdm/contrib/metric/tests/backends/test_performances.py +152 -0
  60. wbfdm/contrib/metric/tests/backends/test_statistics.py +48 -0
  61. wbfdm/contrib/metric/tests/conftest.py +92 -0
  62. wbfdm/contrib/metric/tests/test_dto.py +73 -0
  63. wbfdm/contrib/metric/tests/test_models.py +72 -0
  64. wbfdm/contrib/metric/tests/test_tasks.py +24 -0
  65. wbfdm/contrib/metric/tests/test_viewsets.py +79 -0
  66. wbfdm/contrib/metric/urls.py +19 -0
  67. wbfdm/contrib/metric/viewsets/__init__.py +1 -0
  68. wbfdm/contrib/metric/viewsets/configs/__init__.py +1 -0
  69. wbfdm/contrib/metric/viewsets/configs/display.py +92 -0
  70. wbfdm/contrib/metric/viewsets/configs/menus.py +11 -0
  71. wbfdm/contrib/metric/viewsets/configs/utils.py +137 -0
  72. wbfdm/contrib/metric/viewsets/mixins.py +245 -0
  73. wbfdm/contrib/metric/viewsets/viewsets.py +40 -0
  74. wbfdm/contrib/msci/__init__.py +0 -0
  75. wbfdm/contrib/msci/client.py +92 -0
  76. wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
  77. wbfdm/contrib/msci/dataloaders/esg.py +87 -0
  78. wbfdm/contrib/msci/dataloaders/esg_controversies.py +81 -0
  79. wbfdm/contrib/msci/sync.py +58 -0
  80. wbfdm/contrib/msci/tests/__init__.py +0 -0
  81. wbfdm/contrib/msci/tests/conftest.py +1 -0
  82. wbfdm/contrib/msci/tests/test_client.py +70 -0
  83. wbfdm/contrib/qa/__init__.py +0 -0
  84. wbfdm/contrib/qa/apps.py +22 -0
  85. wbfdm/contrib/qa/database_routers.py +25 -0
  86. wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
  87. wbfdm/contrib/qa/dataloaders/adjustments.py +56 -0
  88. wbfdm/contrib/qa/dataloaders/corporate_actions.py +59 -0
  89. wbfdm/contrib/qa/dataloaders/financials.py +83 -0
  90. wbfdm/contrib/qa/dataloaders/market_data.py +117 -0
  91. wbfdm/contrib/qa/dataloaders/officers.py +59 -0
  92. wbfdm/contrib/qa/dataloaders/reporting_dates.py +67 -0
  93. wbfdm/contrib/qa/dataloaders/statements.py +267 -0
  94. wbfdm/contrib/qa/tasks.py +0 -0
  95. wbfdm/dataloaders/__init__.py +0 -0
  96. wbfdm/dataloaders/cache.py +129 -0
  97. wbfdm/dataloaders/protocols.py +112 -0
  98. wbfdm/dataloaders/proxies.py +201 -0
  99. wbfdm/dataloaders/types.py +209 -0
  100. wbfdm/dynamic_preferences_registry.py +45 -0
  101. wbfdm/enums.py +657 -0
  102. wbfdm/factories/__init__.py +13 -0
  103. wbfdm/factories/classifications.py +56 -0
  104. wbfdm/factories/controversies.py +27 -0
  105. wbfdm/factories/exchanges.py +21 -0
  106. wbfdm/factories/instrument_list.py +22 -0
  107. wbfdm/factories/instrument_prices.py +79 -0
  108. wbfdm/factories/instruments.py +63 -0
  109. wbfdm/factories/instruments_relationships.py +31 -0
  110. wbfdm/factories/options.py +66 -0
  111. wbfdm/figures/__init__.py +1 -0
  112. wbfdm/figures/financials/__init__.py +1 -0
  113. wbfdm/figures/financials/financial_analysis_charts.py +469 -0
  114. wbfdm/figures/financials/financials_charts.py +711 -0
  115. wbfdm/filters/__init__.py +31 -0
  116. wbfdm/filters/classifications.py +100 -0
  117. wbfdm/filters/exchanges.py +22 -0
  118. wbfdm/filters/financials.py +95 -0
  119. wbfdm/filters/financials_analysis.py +119 -0
  120. wbfdm/filters/instrument_prices.py +112 -0
  121. wbfdm/filters/instruments.py +198 -0
  122. wbfdm/filters/utils.py +44 -0
  123. wbfdm/import_export/__init__.py +0 -0
  124. wbfdm/import_export/backends/__init__.py +0 -0
  125. wbfdm/import_export/backends/cbinsights/__init__.py +2 -0
  126. wbfdm/import_export/backends/cbinsights/deals.py +44 -0
  127. wbfdm/import_export/backends/cbinsights/equities.py +41 -0
  128. wbfdm/import_export/backends/cbinsights/mixin.py +15 -0
  129. wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
  130. wbfdm/import_export/backends/cbinsights/utils/classifications.py +4150 -0
  131. wbfdm/import_export/backends/cbinsights/utils/client.py +217 -0
  132. wbfdm/import_export/backends/refinitiv/__init__.py +5 -0
  133. wbfdm/import_export/backends/refinitiv/daily_fundamental.py +36 -0
  134. wbfdm/import_export/backends/refinitiv/fiscal_period.py +63 -0
  135. wbfdm/import_export/backends/refinitiv/forecast.py +178 -0
  136. wbfdm/import_export/backends/refinitiv/fundamental.py +103 -0
  137. wbfdm/import_export/backends/refinitiv/geographic_segment.py +32 -0
  138. wbfdm/import_export/backends/refinitiv/instrument.py +55 -0
  139. wbfdm/import_export/backends/refinitiv/instrument_price.py +77 -0
  140. wbfdm/import_export/backends/refinitiv/mixin.py +29 -0
  141. wbfdm/import_export/backends/refinitiv/utils/__init__.py +1 -0
  142. wbfdm/import_export/backends/refinitiv/utils/controller.py +182 -0
  143. wbfdm/import_export/handlers/__init__.py +0 -0
  144. wbfdm/import_export/handlers/instrument.py +253 -0
  145. wbfdm/import_export/handlers/instrument_list.py +101 -0
  146. wbfdm/import_export/handlers/instrument_price.py +71 -0
  147. wbfdm/import_export/handlers/option.py +54 -0
  148. wbfdm/import_export/handlers/private_equities.py +49 -0
  149. wbfdm/import_export/parsers/__init__.py +0 -0
  150. wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
  151. wbfdm/import_export/parsers/cbinsights/deals.py +39 -0
  152. wbfdm/import_export/parsers/cbinsights/equities.py +56 -0
  153. wbfdm/import_export/parsers/cbinsights/fundamentals.py +45 -0
  154. wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
  155. wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +7 -0
  156. wbfdm/import_export/parsers/refinitiv/forecast.py +7 -0
  157. wbfdm/import_export/parsers/refinitiv/fundamental.py +9 -0
  158. wbfdm/import_export/parsers/refinitiv/geographic_segment.py +7 -0
  159. wbfdm/import_export/parsers/refinitiv/instrument.py +75 -0
  160. wbfdm/import_export/parsers/refinitiv/instrument_price.py +26 -0
  161. wbfdm/import_export/parsers/refinitiv/utils.py +96 -0
  162. wbfdm/import_export/resources/__init__.py +0 -0
  163. wbfdm/import_export/resources/classification.py +23 -0
  164. wbfdm/import_export/resources/instrument_prices.py +33 -0
  165. wbfdm/import_export/resources/instruments.py +176 -0
  166. wbfdm/jinja2.py +7 -0
  167. wbfdm/management/__init__.py +30 -0
  168. wbfdm/menu.py +11 -0
  169. wbfdm/migrations/0001_initial.py +71 -0
  170. wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +144 -0
  171. wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +34 -0
  172. wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +86 -0
  173. wbfdm/migrations/0005_instrument_corporate_action_backend.py +29 -0
  174. wbfdm/migrations/0006_instrument_officer_backend.py +29 -0
  175. wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +117 -0
  176. wbfdm/migrations/0008_controversy.py +75 -0
  177. wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +85 -0
  178. wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +1299 -0
  179. wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +169 -0
  180. wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +564 -0
  181. wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +199 -0
  182. wbfdm/migrations/0014_alter_controversy_instrument.py +22 -0
  183. wbfdm/migrations/0015_instrument_instrument_investible_index.py +16 -0
  184. wbfdm/migrations/0016_instrumenttype_name_repr.py +18 -0
  185. wbfdm/migrations/0017_instrument_instrument_security_index.py +16 -0
  186. wbfdm/migrations/0018_instrument_instrument_level_index.py +20 -0
  187. wbfdm/migrations/0019_alter_controversy_source.py +17 -0
  188. wbfdm/migrations/0020_optionaggregate_option_and_more.py +249 -0
  189. wbfdm/migrations/0021_delete_instrumentdailystatistics.py +15 -0
  190. wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +91 -0
  191. wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +53 -0
  192. wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +36 -0
  193. wbfdm/migrations/0025_instrument_is_primary_and_more.py +29 -0
  194. wbfdm/migrations/0026_instrument_is_cash_equivalent.py +30 -0
  195. wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +100 -0
  196. wbfdm/migrations/__init__.py +0 -0
  197. wbfdm/models/__init__.py +4 -0
  198. wbfdm/models/esg/__init__.py +1 -0
  199. wbfdm/models/esg/controversies.py +81 -0
  200. wbfdm/models/exchanges/__init__.py +1 -0
  201. wbfdm/models/exchanges/exchanges.py +223 -0
  202. wbfdm/models/fields.py +117 -0
  203. wbfdm/models/fk_fields.py +403 -0
  204. wbfdm/models/indicators.py +0 -0
  205. wbfdm/models/instruments/__init__.py +19 -0
  206. wbfdm/models/instruments/classifications.py +265 -0
  207. wbfdm/models/instruments/instrument_lists.py +120 -0
  208. wbfdm/models/instruments/instrument_prices.py +540 -0
  209. wbfdm/models/instruments/instrument_relationships.py +251 -0
  210. wbfdm/models/instruments/instrument_requests.py +196 -0
  211. wbfdm/models/instruments/instruments.py +991 -0
  212. wbfdm/models/instruments/llm/__init__.py +1 -0
  213. wbfdm/models/instruments/llm/create_instrument_news_relationships.py +78 -0
  214. wbfdm/models/instruments/mixin/__init__.py +0 -0
  215. wbfdm/models/instruments/mixin/financials_computed.py +804 -0
  216. wbfdm/models/instruments/mixin/financials_serializer_fields.py +1407 -0
  217. wbfdm/models/instruments/mixin/instruments.py +294 -0
  218. wbfdm/models/instruments/options.py +225 -0
  219. wbfdm/models/instruments/private_equities.py +59 -0
  220. wbfdm/models/instruments/querysets.py +73 -0
  221. wbfdm/models/instruments/utils.py +41 -0
  222. wbfdm/preferences.py +21 -0
  223. wbfdm/serializers/__init__.py +4 -0
  224. wbfdm/serializers/esg.py +36 -0
  225. wbfdm/serializers/exchanges.py +39 -0
  226. wbfdm/serializers/instruments/__init__.py +37 -0
  227. wbfdm/serializers/instruments/classifications.py +139 -0
  228. wbfdm/serializers/instruments/instrument_lists.py +61 -0
  229. wbfdm/serializers/instruments/instrument_prices.py +73 -0
  230. wbfdm/serializers/instruments/instrument_relationships.py +170 -0
  231. wbfdm/serializers/instruments/instrument_requests.py +61 -0
  232. wbfdm/serializers/instruments/instruments.py +274 -0
  233. wbfdm/serializers/instruments/mixins.py +104 -0
  234. wbfdm/serializers/officers.py +20 -0
  235. wbfdm/signals.py +7 -0
  236. wbfdm/sync/__init__.py +0 -0
  237. wbfdm/sync/abstract.py +31 -0
  238. wbfdm/sync/runner.py +22 -0
  239. wbfdm/tasks.py +69 -0
  240. wbfdm/tests/__init__.py +0 -0
  241. wbfdm/tests/analysis/__init__.py +0 -0
  242. wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
  243. wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +392 -0
  244. wbfdm/tests/analysis/financial_analysis/test_utils.py +322 -0
  245. wbfdm/tests/analysis/test_esg.py +159 -0
  246. wbfdm/tests/conftest.py +92 -0
  247. wbfdm/tests/dataloaders/__init__.py +0 -0
  248. wbfdm/tests/dataloaders/test_cache.py +73 -0
  249. wbfdm/tests/models/__init__.py +0 -0
  250. wbfdm/tests/models/test_classifications.py +99 -0
  251. wbfdm/tests/models/test_exchanges.py +7 -0
  252. wbfdm/tests/models/test_instrument_list.py +117 -0
  253. wbfdm/tests/models/test_instrument_prices.py +306 -0
  254. wbfdm/tests/models/test_instruments.py +202 -0
  255. wbfdm/tests/models/test_merge.py +99 -0
  256. wbfdm/tests/models/test_options.py +69 -0
  257. wbfdm/tests/test_tasks.py +6 -0
  258. wbfdm/tests/tests.py +10 -0
  259. wbfdm/urls.py +222 -0
  260. wbfdm/utils.py +54 -0
  261. wbfdm/viewsets/__init__.py +10 -0
  262. wbfdm/viewsets/configs/__init__.py +5 -0
  263. wbfdm/viewsets/configs/buttons/__init__.py +8 -0
  264. wbfdm/viewsets/configs/buttons/classifications.py +23 -0
  265. wbfdm/viewsets/configs/buttons/exchanges.py +9 -0
  266. wbfdm/viewsets/configs/buttons/instrument_prices.py +49 -0
  267. wbfdm/viewsets/configs/buttons/instruments.py +283 -0
  268. wbfdm/viewsets/configs/display/__init__.py +22 -0
  269. wbfdm/viewsets/configs/display/classifications.py +138 -0
  270. wbfdm/viewsets/configs/display/esg.py +75 -0
  271. wbfdm/viewsets/configs/display/exchanges.py +42 -0
  272. wbfdm/viewsets/configs/display/instrument_lists.py +137 -0
  273. wbfdm/viewsets/configs/display/instrument_prices.py +199 -0
  274. wbfdm/viewsets/configs/display/instrument_requests.py +116 -0
  275. wbfdm/viewsets/configs/display/instruments.py +618 -0
  276. wbfdm/viewsets/configs/display/instruments_relationships.py +65 -0
  277. wbfdm/viewsets/configs/display/monthly_performances.py +72 -0
  278. wbfdm/viewsets/configs/display/officers.py +16 -0
  279. wbfdm/viewsets/configs/display/prices.py +21 -0
  280. wbfdm/viewsets/configs/display/statement_with_estimates.py +101 -0
  281. wbfdm/viewsets/configs/display/statements.py +48 -0
  282. wbfdm/viewsets/configs/endpoints/__init__.py +41 -0
  283. wbfdm/viewsets/configs/endpoints/classifications.py +87 -0
  284. wbfdm/viewsets/configs/endpoints/esg.py +20 -0
  285. wbfdm/viewsets/configs/endpoints/exchanges.py +6 -0
  286. wbfdm/viewsets/configs/endpoints/financials_analysis.py +65 -0
  287. wbfdm/viewsets/configs/endpoints/instrument_lists.py +38 -0
  288. wbfdm/viewsets/configs/endpoints/instrument_prices.py +51 -0
  289. wbfdm/viewsets/configs/endpoints/instrument_requests.py +20 -0
  290. wbfdm/viewsets/configs/endpoints/instruments.py +13 -0
  291. wbfdm/viewsets/configs/endpoints/instruments_relationships.py +31 -0
  292. wbfdm/viewsets/configs/endpoints/statements.py +6 -0
  293. wbfdm/viewsets/configs/menus/__init__.py +9 -0
  294. wbfdm/viewsets/configs/menus/classifications.py +19 -0
  295. wbfdm/viewsets/configs/menus/exchanges.py +10 -0
  296. wbfdm/viewsets/configs/menus/instrument_lists.py +10 -0
  297. wbfdm/viewsets/configs/menus/instruments.py +20 -0
  298. wbfdm/viewsets/configs/menus/instruments_relationships.py +33 -0
  299. wbfdm/viewsets/configs/titles/__init__.py +42 -0
  300. wbfdm/viewsets/configs/titles/classifications.py +79 -0
  301. wbfdm/viewsets/configs/titles/esg.py +11 -0
  302. wbfdm/viewsets/configs/titles/exchanges.py +12 -0
  303. wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +6 -0
  304. wbfdm/viewsets/configs/titles/financials_analysis.py +50 -0
  305. wbfdm/viewsets/configs/titles/instrument_prices.py +50 -0
  306. wbfdm/viewsets/configs/titles/instrument_requests.py +16 -0
  307. wbfdm/viewsets/configs/titles/instruments.py +31 -0
  308. wbfdm/viewsets/configs/titles/instruments_relationships.py +21 -0
  309. wbfdm/viewsets/configs/titles/market_data.py +13 -0
  310. wbfdm/viewsets/configs/titles/prices.py +15 -0
  311. wbfdm/viewsets/configs/titles/statement_with_estimates.py +10 -0
  312. wbfdm/viewsets/esg.py +72 -0
  313. wbfdm/viewsets/exchanges.py +63 -0
  314. wbfdm/viewsets/financial_analysis/__init__.py +3 -0
  315. wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +85 -0
  316. wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +85 -0
  317. wbfdm/viewsets/financial_analysis/statement_with_estimates.py +145 -0
  318. wbfdm/viewsets/instruments/__init__.py +80 -0
  319. wbfdm/viewsets/instruments/classifications.py +279 -0
  320. wbfdm/viewsets/instruments/financials_analysis.py +614 -0
  321. wbfdm/viewsets/instruments/instrument_lists.py +77 -0
  322. wbfdm/viewsets/instruments/instrument_prices.py +542 -0
  323. wbfdm/viewsets/instruments/instrument_requests.py +51 -0
  324. wbfdm/viewsets/instruments/instruments.py +106 -0
  325. wbfdm/viewsets/instruments/instruments_relationships.py +235 -0
  326. wbfdm/viewsets/instruments/utils.py +27 -0
  327. wbfdm/viewsets/market_data.py +172 -0
  328. wbfdm/viewsets/mixins.py +9 -0
  329. wbfdm/viewsets/officers.py +27 -0
  330. wbfdm/viewsets/prices.py +62 -0
  331. wbfdm/viewsets/statements/__init__.py +1 -0
  332. wbfdm/viewsets/statements/statements.py +100 -0
  333. wbfdm/viewsets/technical_analysis/__init__.py +1 -0
  334. wbfdm/viewsets/technical_analysis/monthly_performances.py +93 -0
  335. wbfdm-2.2.1.dist-info/METADATA +15 -0
  336. wbfdm-2.2.1.dist-info/RECORD +337 -0
  337. wbfdm-2.2.1.dist-info/WHEEL +5 -0
@@ -0,0 +1,65 @@
1
+ from typing import Optional
2
+
3
+ from wbcore.metadata.configs import display as dp
4
+ from wbcore.metadata.configs.display.instance_display.shortcuts import (
5
+ Display,
6
+ create_simple_display,
7
+ )
8
+ from wbcore.metadata.configs.display.instance_display.utils import repeat_field
9
+ from wbcore.metadata.configs.display.view_config import DisplayViewConfig
10
+
11
+
12
+ class InstrumentFavoriteGroupDisplayConfig(DisplayViewConfig):
13
+ def get_list_display(self) -> Optional[dp.ListDisplay]:
14
+ return dp.ListDisplay(
15
+ fields=[
16
+ dp.Field(key="name", label="Name"),
17
+ dp.Field(key="owner", label="Owner"),
18
+ dp.Field(key="instruments", label="Instruments"),
19
+ dp.Field(key="public", label="Public"),
20
+ ]
21
+ )
22
+
23
+ def get_instance_display(self) -> Display:
24
+ return create_simple_display(
25
+ [
26
+ [repeat_field(2, "name")],
27
+ ["public", "primary"],
28
+ [repeat_field(2, "instruments")],
29
+ ]
30
+ )
31
+
32
+
33
+ class RelatedInstrumentThroughInstrumentDisplayConfig(DisplayViewConfig):
34
+ def get_list_display(self) -> Optional[dp.ListDisplay]:
35
+ fields = [
36
+ dp.Field(key="related_instrument", label="Related Instrument", width=500),
37
+ dp.Field(key="related_type", label="Type"),
38
+ dp.Field(key="is_primary", label="Is Primary"),
39
+ ]
40
+
41
+ if self.tooltip:
42
+ fields = fields[:1]
43
+
44
+ return dp.ListDisplay(fields=[*fields])
45
+
46
+ def get_instance_display(self) -> Display:
47
+ return create_simple_display([["related_instrument", "related_type", "is_primary"]])
48
+
49
+
50
+ class ClassifiedInstrumentDisplayConfig(DisplayViewConfig):
51
+ def get_list_display(self) -> Optional[dp.ListDisplay]:
52
+ if group := self.view.classification_group:
53
+ fields = [dp.Field(key="instrument", label="Instrument")]
54
+ level_representations = group.get_levels_representation()
55
+ for key, label in zip(reversed(group.get_fields_names(sep="_")), reversed(level_representations[1:])):
56
+ fields.append(
57
+ dp.Field(key=f"classification_{key}", label=label),
58
+ )
59
+ fields.extend(
60
+ [
61
+ dp.Field(key="classification", label=level_representations[0]),
62
+ dp.Field(key="tags", label="Tags"),
63
+ ]
64
+ )
65
+ return dp.ListDisplay(fields=fields, editable=True)
@@ -0,0 +1,72 @@
1
+ from typing import Optional
2
+
3
+ from wbcore.contrib.color.enums import WBColor
4
+ from wbcore.enums import Unit
5
+ from wbcore.metadata.configs import display as dp
6
+ from wbcore.metadata.configs.display import DisplayViewConfig
7
+
8
+ perf_formatting_rules = [
9
+ dp.FormattingRule(
10
+ style={
11
+ "color": WBColor.RED_DARK.value,
12
+ },
13
+ condition=("<", 0),
14
+ ),
15
+ dp.FormattingRule(
16
+ style={
17
+ "color": WBColor.GREEN_DARK.value,
18
+ },
19
+ condition=(">", 0),
20
+ ),
21
+ ]
22
+ perf_formatting_rules_bold = [
23
+ dp.FormattingRule(
24
+ style={
25
+ "color": WBColor.RED_DARK.value,
26
+ "fontWeight": "bold",
27
+ },
28
+ condition=("<", 0),
29
+ ),
30
+ dp.FormattingRule(
31
+ style={
32
+ "color": WBColor.GREEN_DARK.value,
33
+ "fontWeight": "bold",
34
+ },
35
+ condition=(">", 0),
36
+ ),
37
+ ]
38
+
39
+
40
+ class MonthlyPerformancesInstrumentDisplayViewConfig(DisplayViewConfig):
41
+ def get_list_display(self) -> Optional[dp.ListDisplay]:
42
+ return dp.ListDisplay(
43
+ fields=[
44
+ dp.Field(
45
+ key="year",
46
+ label="Year",
47
+ width=Unit.PIXEL(75),
48
+ formatting_rules=[
49
+ dp.FormattingRule(
50
+ style={
51
+ "fontWeight": "bold",
52
+ },
53
+ ),
54
+ ],
55
+ ),
56
+ dp.Field(key="1", label="Jan", width=Unit.PIXEL(75), formatting_rules=perf_formatting_rules),
57
+ dp.Field(key="2", label="Feb", width=Unit.PIXEL(75), formatting_rules=perf_formatting_rules),
58
+ dp.Field(key="3", label="Mar", width=Unit.PIXEL(75), formatting_rules=perf_formatting_rules),
59
+ dp.Field(key="4", label="Apr", width=Unit.PIXEL(75), formatting_rules=perf_formatting_rules),
60
+ dp.Field(key="5", label="May", width=Unit.PIXEL(75), formatting_rules=perf_formatting_rules),
61
+ dp.Field(key="6", label="Jun", width=Unit.PIXEL(75), formatting_rules=perf_formatting_rules),
62
+ dp.Field(key="7", label="Jul", width=Unit.PIXEL(75), formatting_rules=perf_formatting_rules),
63
+ dp.Field(key="8", label="Aug", width=Unit.PIXEL(75), formatting_rules=perf_formatting_rules),
64
+ dp.Field(key="9", label="Sep", width=Unit.PIXEL(75), formatting_rules=perf_formatting_rules),
65
+ dp.Field(key="10", label="Oct", width=Unit.PIXEL(75), formatting_rules=perf_formatting_rules),
66
+ dp.Field(key="11", label="Nov", width=Unit.PIXEL(75), formatting_rules=perf_formatting_rules),
67
+ dp.Field(key="12", label="Dec", width=Unit.PIXEL(75), formatting_rules=perf_formatting_rules),
68
+ dp.Field(
69
+ key="annual", label="Yearly", width=Unit.PIXEL(75), formatting_rules=perf_formatting_rules_bold
70
+ ),
71
+ ]
72
+ )
@@ -0,0 +1,16 @@
1
+ from django.utils.translation import gettext as _
2
+ from wbcore.metadata.configs import display as dp
3
+ from wbcore.metadata.configs.display import DisplayViewConfig
4
+
5
+
6
+ class OfficerDisplayViewConfig(DisplayViewConfig):
7
+ def get_list_display(self) -> dp.ListDisplay:
8
+ return dp.ListDisplay(
9
+ fields=[
10
+ dp.Field(key="position", label=_("Position")),
11
+ dp.Field(key="name", label=_("Name")),
12
+ dp.Field(key="age", label=_("Age"), width=70),
13
+ dp.Field(key="sex", label=_("Sex"), width=70),
14
+ dp.Field(key="start", label=_("Start"), width=100),
15
+ ],
16
+ )
@@ -0,0 +1,21 @@
1
+ from typing import Optional
2
+
3
+ from django.utils.translation import gettext as _
4
+ from wbcore.metadata.configs import display as dp
5
+ from wbcore.metadata.configs.display import DisplayViewConfig
6
+
7
+
8
+ class InstrumentPriceDisplayConfig(DisplayViewConfig):
9
+ def get_list_display(self) -> Optional[dp.ListDisplay]:
10
+ return dp.ListDisplay(
11
+ fields=[
12
+ dp.Field(key="valuation_date", label=_("Date")),
13
+ dp.Field(key="open", label=_("Open")),
14
+ dp.Field(key="high", label=_("High")),
15
+ dp.Field(key="low", label=_("Low")),
16
+ dp.Field(key="close", label=_("Close")),
17
+ dp.Field(key="volume", label=_("Volume")),
18
+ dp.Field(key="outstanding_shares", label=_("Oustanding Shares")),
19
+ dp.Field(key="market_capitalization", label=_("Market Cap.")),
20
+ ],
21
+ )
@@ -0,0 +1,101 @@
1
+ import typing
2
+
3
+ from rest_framework.reverse import reverse
4
+ from wbcore.contrib.color.enums import WBColor
5
+ from wbcore.metadata.configs import display as dp
6
+ from wbcore.metadata.configs.display import DisplayViewConfig
7
+
8
+ if typing.TYPE_CHECKING:
9
+ from wbfdm.viewsets import StatementWithEstimatesPandasViewSet
10
+
11
+
12
+ class StatementWithEstimatesDisplayViewConfig(DisplayViewConfig):
13
+ view: "StatementWithEstimatesPandasViewSet"
14
+
15
+ ESTIMATE_COLOR = "#D2E5F6"
16
+ DEFAULT_COL_WIDTH = 100
17
+
18
+ def get_list_display(self) -> dp.ListDisplay:
19
+ def generate_formatting_rules(col_key: str) -> typing.Iterator[dp.FormattingRule]:
20
+ yield dp.FormattingRule(
21
+ style={"color": WBColor.RED_DARK.value, "fontWeight": "bold"},
22
+ condition=[("<", 0), ("!=", "Net Debt", "financial"), ("!=", "Net Debt/Shares", "financial")],
23
+ )
24
+ yield dp.FormattingRule(
25
+ condition=[("<", 0), ("==", "Net Debt", "financial")],
26
+ style={"color": WBColor.GREEN_DARK.value, "fontWeight": "bold"},
27
+ )
28
+ yield dp.FormattingRule(
29
+ condition=[("<", 0), ("==", "Net Debt/Shares", "financial")],
30
+ style={"color": WBColor.GREEN_DARK.value, "fontWeight": "bold"},
31
+ )
32
+ yield dp.FormattingRule(
33
+ condition=[(">", 0), ("==", "Net Debt", "financial")],
34
+ style={"color": WBColor.RED_DARK.value, "fontWeight": "bold"},
35
+ )
36
+ yield dp.FormattingRule(
37
+ condition=[(">", 0), ("==", "Net Debt/Shares", "financial")],
38
+ style={"color": WBColor.RED_DARK.value, "fontWeight": "bold"},
39
+ )
40
+ if self.view.estimate_mapping[col_key] is True:
41
+ yield dp.FormattingRule(style={"background-color": self.ESTIMATE_COLOR})
42
+
43
+ def generate_year_field(year_col) -> dp.Field:
44
+ year = year_col[:-2]
45
+ year_column = dp.Field(
46
+ key=year,
47
+ label=year,
48
+ open_by_default=year_col in self.view.year_columns and bool(self.view.df[year_col].isna().all()),
49
+ children=[
50
+ *map(
51
+ lambda interim_col: dp.Field(
52
+ key=interim_col,
53
+ label=interim_col[5:],
54
+ show="open",
55
+ formatting_rules=generate_formatting_rules(interim_col),
56
+ width=self.DEFAULT_COL_WIDTH,
57
+ ),
58
+ filter(lambda col: year in col, self.view.interim_columns),
59
+ ),
60
+ dp.Field(
61
+ key=year_col,
62
+ label="Y",
63
+ formatting_rules=generate_formatting_rules((year_col)),
64
+ width=self.DEFAULT_COL_WIDTH,
65
+ ),
66
+ ],
67
+ )
68
+
69
+ return year_column
70
+
71
+ return dp.ListDisplay(
72
+ fields=[
73
+ dp.Field(key="progress", label="Yearly Trend", pinned="left"),
74
+ *map(generate_year_field, self.view.year_columns),
75
+ ],
76
+ legends=[dp.Legend(items=[dp.LegendItem(label="Estimated", icon=self.ESTIMATE_COLOR)])],
77
+ # formatting=[
78
+ # dp.Formatting(
79
+ # column="financial",
80
+ # formatting_rules=[
81
+ # dp.FormattingRule(
82
+ # condition=("==", "Net Debt/Shares"),
83
+ # style={"color": "red"},
84
+ # )
85
+ # ]
86
+ # )
87
+ # ],
88
+ tree=True,
89
+ tree_group_field="financial",
90
+ tree_group_label="Financial",
91
+ tree_group_pinned="left",
92
+ tree_group_level_options=[
93
+ dp.TreeGroupLevelOption(
94
+ list_endpoint=reverse(
95
+ "wbfdm:financial_metric_analysis-list",
96
+ args=[self.view.kwargs.get("instrument_id")],
97
+ request=self.request,
98
+ ),
99
+ )
100
+ ],
101
+ )
@@ -0,0 +1,48 @@
1
+ import typing
2
+
3
+ from wbcore.metadata.configs import display as dp
4
+ from wbcore.metadata.configs.display import DisplayViewConfig
5
+
6
+ if typing.TYPE_CHECKING:
7
+ from wbfdm.viewsets import StatementPandasViewSet
8
+
9
+
10
+ class StatementDisplayViewConfig(DisplayViewConfig):
11
+ view: "StatementPandasViewSet"
12
+ DEFAULT_COL_WIDTH = 100
13
+
14
+ def get_list_display(self) -> dp.ListDisplay:
15
+ def generate_year_field(year: str) -> dp.Field:
16
+ year_col = f"{year}-Y"
17
+ year_column = dp.Field(
18
+ key=year,
19
+ label=year,
20
+ open_by_default=False,
21
+ children=[
22
+ *map(
23
+ lambda interim_col: dp.Field(
24
+ key=interim_col,
25
+ label=interim_col[5:],
26
+ show="open",
27
+ width=self.DEFAULT_COL_WIDTH,
28
+ ),
29
+ filter(lambda col: year in col, self.view.interim_columns),
30
+ ),
31
+ dp.Field(
32
+ key=year_col,
33
+ label="Y",
34
+ width=self.DEFAULT_COL_WIDTH,
35
+ ),
36
+ ],
37
+ )
38
+
39
+ return year_column
40
+
41
+ return dp.ListDisplay(
42
+ fields=[
43
+ dp.Field(key="external_code", label="Code", pinned="left", width=self.DEFAULT_COL_WIDTH),
44
+ dp.Field(key="external_description", label="Description", pinned="left"),
45
+ dp.Field(key="progress", label="Yearly Trend", pinned="left"),
46
+ *map(lambda x: generate_year_field(str(x)), self.view.year_columns),
47
+ ],
48
+ )
@@ -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)