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.
- wbfdm/__init__.py +2 -0
- wbfdm/admin/__init__.py +42 -0
- wbfdm/admin/classifications.py +39 -0
- wbfdm/admin/esg.py +23 -0
- wbfdm/admin/exchanges.py +53 -0
- wbfdm/admin/instrument_lists.py +23 -0
- wbfdm/admin/instrument_prices.py +62 -0
- wbfdm/admin/instrument_requests.py +33 -0
- wbfdm/admin/instruments.py +117 -0
- wbfdm/admin/instruments_relationships.py +25 -0
- wbfdm/admin/options.py +101 -0
- wbfdm/analysis/__init__.py +2 -0
- wbfdm/analysis/esg/__init__.py +0 -0
- wbfdm/analysis/esg/enums.py +82 -0
- wbfdm/analysis/esg/esg_analysis.py +217 -0
- wbfdm/analysis/esg/utils.py +13 -0
- wbfdm/analysis/financial_analysis/__init__.py +1 -0
- wbfdm/analysis/financial_analysis/financial_metric_analysis.py +88 -0
- wbfdm/analysis/financial_analysis/financial_ratio_analysis.py +125 -0
- wbfdm/analysis/financial_analysis/financial_statistics_analysis.py +271 -0
- wbfdm/analysis/financial_analysis/statement_with_estimates.py +558 -0
- wbfdm/analysis/financial_analysis/utils.py +316 -0
- wbfdm/analysis/technical_analysis/__init__.py +1 -0
- wbfdm/analysis/technical_analysis/technical_analysis.py +138 -0
- wbfdm/analysis/technical_analysis/traces.py +165 -0
- wbfdm/analysis/utils.py +32 -0
- wbfdm/apps.py +14 -0
- wbfdm/contrib/__init__.py +0 -0
- wbfdm/contrib/dsws/__init__.py +0 -0
- wbfdm/contrib/dsws/client.py +285 -0
- wbfdm/contrib/internal/__init__.py +0 -0
- wbfdm/contrib/internal/dataloaders/__init__.py +0 -0
- wbfdm/contrib/internal/dataloaders/market_data.py +87 -0
- wbfdm/contrib/metric/__init__.py +0 -0
- wbfdm/contrib/metric/admin/__init__.py +2 -0
- wbfdm/contrib/metric/admin/instruments.py +12 -0
- wbfdm/contrib/metric/admin/metrics.py +43 -0
- wbfdm/contrib/metric/apps.py +10 -0
- wbfdm/contrib/metric/backends/__init__.py +2 -0
- wbfdm/contrib/metric/backends/base.py +159 -0
- wbfdm/contrib/metric/backends/performances.py +265 -0
- wbfdm/contrib/metric/backends/statistics.py +182 -0
- wbfdm/contrib/metric/decorators.py +14 -0
- wbfdm/contrib/metric/dispatch.py +23 -0
- wbfdm/contrib/metric/dto.py +88 -0
- wbfdm/contrib/metric/exceptions.py +6 -0
- wbfdm/contrib/metric/factories.py +33 -0
- wbfdm/contrib/metric/filters.py +28 -0
- wbfdm/contrib/metric/migrations/0001_initial.py +88 -0
- wbfdm/contrib/metric/migrations/0002_remove_instrumentmetric_unique_instrument_metric_and_more.py +26 -0
- wbfdm/contrib/metric/migrations/__init__.py +0 -0
- wbfdm/contrib/metric/models.py +180 -0
- wbfdm/contrib/metric/orchestrators.py +94 -0
- wbfdm/contrib/metric/registry.py +80 -0
- wbfdm/contrib/metric/serializers.py +44 -0
- wbfdm/contrib/metric/tasks.py +27 -0
- wbfdm/contrib/metric/tests/__init__.py +0 -0
- wbfdm/contrib/metric/tests/backends/__init__.py +0 -0
- wbfdm/contrib/metric/tests/backends/test_performances.py +152 -0
- wbfdm/contrib/metric/tests/backends/test_statistics.py +48 -0
- wbfdm/contrib/metric/tests/conftest.py +92 -0
- wbfdm/contrib/metric/tests/test_dto.py +73 -0
- wbfdm/contrib/metric/tests/test_models.py +72 -0
- wbfdm/contrib/metric/tests/test_tasks.py +24 -0
- wbfdm/contrib/metric/tests/test_viewsets.py +79 -0
- wbfdm/contrib/metric/urls.py +19 -0
- wbfdm/contrib/metric/viewsets/__init__.py +1 -0
- wbfdm/contrib/metric/viewsets/configs/__init__.py +1 -0
- wbfdm/contrib/metric/viewsets/configs/display.py +92 -0
- wbfdm/contrib/metric/viewsets/configs/menus.py +11 -0
- wbfdm/contrib/metric/viewsets/configs/utils.py +137 -0
- wbfdm/contrib/metric/viewsets/mixins.py +245 -0
- wbfdm/contrib/metric/viewsets/viewsets.py +40 -0
- wbfdm/contrib/msci/__init__.py +0 -0
- wbfdm/contrib/msci/client.py +92 -0
- wbfdm/contrib/msci/dataloaders/__init__.py +0 -0
- wbfdm/contrib/msci/dataloaders/esg.py +87 -0
- wbfdm/contrib/msci/dataloaders/esg_controversies.py +81 -0
- wbfdm/contrib/msci/sync.py +58 -0
- wbfdm/contrib/msci/tests/__init__.py +0 -0
- wbfdm/contrib/msci/tests/conftest.py +1 -0
- wbfdm/contrib/msci/tests/test_client.py +70 -0
- wbfdm/contrib/qa/__init__.py +0 -0
- wbfdm/contrib/qa/apps.py +22 -0
- wbfdm/contrib/qa/database_routers.py +25 -0
- wbfdm/contrib/qa/dataloaders/__init__.py +0 -0
- wbfdm/contrib/qa/dataloaders/adjustments.py +56 -0
- wbfdm/contrib/qa/dataloaders/corporate_actions.py +59 -0
- wbfdm/contrib/qa/dataloaders/financials.py +83 -0
- wbfdm/contrib/qa/dataloaders/market_data.py +117 -0
- wbfdm/contrib/qa/dataloaders/officers.py +59 -0
- wbfdm/contrib/qa/dataloaders/reporting_dates.py +67 -0
- wbfdm/contrib/qa/dataloaders/statements.py +267 -0
- wbfdm/contrib/qa/tasks.py +0 -0
- wbfdm/dataloaders/__init__.py +0 -0
- wbfdm/dataloaders/cache.py +129 -0
- wbfdm/dataloaders/protocols.py +112 -0
- wbfdm/dataloaders/proxies.py +201 -0
- wbfdm/dataloaders/types.py +209 -0
- wbfdm/dynamic_preferences_registry.py +45 -0
- wbfdm/enums.py +657 -0
- wbfdm/factories/__init__.py +13 -0
- wbfdm/factories/classifications.py +56 -0
- wbfdm/factories/controversies.py +27 -0
- wbfdm/factories/exchanges.py +21 -0
- wbfdm/factories/instrument_list.py +22 -0
- wbfdm/factories/instrument_prices.py +79 -0
- wbfdm/factories/instruments.py +63 -0
- wbfdm/factories/instruments_relationships.py +31 -0
- wbfdm/factories/options.py +66 -0
- wbfdm/figures/__init__.py +1 -0
- wbfdm/figures/financials/__init__.py +1 -0
- wbfdm/figures/financials/financial_analysis_charts.py +469 -0
- wbfdm/figures/financials/financials_charts.py +711 -0
- wbfdm/filters/__init__.py +31 -0
- wbfdm/filters/classifications.py +100 -0
- wbfdm/filters/exchanges.py +22 -0
- wbfdm/filters/financials.py +95 -0
- wbfdm/filters/financials_analysis.py +119 -0
- wbfdm/filters/instrument_prices.py +112 -0
- wbfdm/filters/instruments.py +198 -0
- wbfdm/filters/utils.py +44 -0
- wbfdm/import_export/__init__.py +0 -0
- wbfdm/import_export/backends/__init__.py +0 -0
- wbfdm/import_export/backends/cbinsights/__init__.py +2 -0
- wbfdm/import_export/backends/cbinsights/deals.py +44 -0
- wbfdm/import_export/backends/cbinsights/equities.py +41 -0
- wbfdm/import_export/backends/cbinsights/mixin.py +15 -0
- wbfdm/import_export/backends/cbinsights/utils/__init__.py +0 -0
- wbfdm/import_export/backends/cbinsights/utils/classifications.py +4150 -0
- wbfdm/import_export/backends/cbinsights/utils/client.py +217 -0
- wbfdm/import_export/backends/refinitiv/__init__.py +5 -0
- wbfdm/import_export/backends/refinitiv/daily_fundamental.py +36 -0
- wbfdm/import_export/backends/refinitiv/fiscal_period.py +63 -0
- wbfdm/import_export/backends/refinitiv/forecast.py +178 -0
- wbfdm/import_export/backends/refinitiv/fundamental.py +103 -0
- wbfdm/import_export/backends/refinitiv/geographic_segment.py +32 -0
- wbfdm/import_export/backends/refinitiv/instrument.py +55 -0
- wbfdm/import_export/backends/refinitiv/instrument_price.py +77 -0
- wbfdm/import_export/backends/refinitiv/mixin.py +29 -0
- wbfdm/import_export/backends/refinitiv/utils/__init__.py +1 -0
- wbfdm/import_export/backends/refinitiv/utils/controller.py +182 -0
- wbfdm/import_export/handlers/__init__.py +0 -0
- wbfdm/import_export/handlers/instrument.py +253 -0
- wbfdm/import_export/handlers/instrument_list.py +101 -0
- wbfdm/import_export/handlers/instrument_price.py +71 -0
- wbfdm/import_export/handlers/option.py +54 -0
- wbfdm/import_export/handlers/private_equities.py +49 -0
- wbfdm/import_export/parsers/__init__.py +0 -0
- wbfdm/import_export/parsers/cbinsights/__init__.py +0 -0
- wbfdm/import_export/parsers/cbinsights/deals.py +39 -0
- wbfdm/import_export/parsers/cbinsights/equities.py +56 -0
- wbfdm/import_export/parsers/cbinsights/fundamentals.py +45 -0
- wbfdm/import_export/parsers/refinitiv/__init__.py +0 -0
- wbfdm/import_export/parsers/refinitiv/daily_fundamental.py +7 -0
- wbfdm/import_export/parsers/refinitiv/forecast.py +7 -0
- wbfdm/import_export/parsers/refinitiv/fundamental.py +9 -0
- wbfdm/import_export/parsers/refinitiv/geographic_segment.py +7 -0
- wbfdm/import_export/parsers/refinitiv/instrument.py +75 -0
- wbfdm/import_export/parsers/refinitiv/instrument_price.py +26 -0
- wbfdm/import_export/parsers/refinitiv/utils.py +96 -0
- wbfdm/import_export/resources/__init__.py +0 -0
- wbfdm/import_export/resources/classification.py +23 -0
- wbfdm/import_export/resources/instrument_prices.py +33 -0
- wbfdm/import_export/resources/instruments.py +176 -0
- wbfdm/jinja2.py +7 -0
- wbfdm/management/__init__.py +30 -0
- wbfdm/menu.py +11 -0
- wbfdm/migrations/0001_initial.py +71 -0
- wbfdm/migrations/0002_rename_statements_instrumentlookup_financials_and_more.py +144 -0
- wbfdm/migrations/0003_instrument_estimate_backend_and_more.py +34 -0
- wbfdm/migrations/0004_rename_financials_instrumentlookup_statements_and_more.py +86 -0
- wbfdm/migrations/0005_instrument_corporate_action_backend.py +29 -0
- wbfdm/migrations/0006_instrument_officer_backend.py +29 -0
- wbfdm/migrations/0007_instrument_country_instrument_currency_and_more.py +117 -0
- wbfdm/migrations/0008_controversy.py +75 -0
- wbfdm/migrations/0009_alter_controversy_flag_alter_controversy_initiated_and_more.py +85 -0
- wbfdm/migrations/0010_classification_classificationgroup_deal_exchange_and_more.py +1299 -0
- wbfdm/migrations/0011_delete_instrumentlookup_instrument_corporate_actions_and_more.py +169 -0
- wbfdm/migrations/0012_instrumentprice_created_instrumentprice_modified.py +564 -0
- wbfdm/migrations/0013_instrument_is_investable_universe_and_more.py +199 -0
- wbfdm/migrations/0014_alter_controversy_instrument.py +22 -0
- wbfdm/migrations/0015_instrument_instrument_investible_index.py +16 -0
- wbfdm/migrations/0016_instrumenttype_name_repr.py +18 -0
- wbfdm/migrations/0017_instrument_instrument_security_index.py +16 -0
- wbfdm/migrations/0018_instrument_instrument_level_index.py +20 -0
- wbfdm/migrations/0019_alter_controversy_source.py +17 -0
- wbfdm/migrations/0020_optionaggregate_option_and_more.py +249 -0
- wbfdm/migrations/0021_delete_instrumentdailystatistics.py +15 -0
- wbfdm/migrations/0022_instrument_cusip_option_open_interest_20d_and_more.py +91 -0
- wbfdm/migrations/0023_instrument_unique_ric_instrument_unique_rmc_and_more.py +53 -0
- wbfdm/migrations/0024_option_open_interest_10d_option_volume_10d_and_more.py +36 -0
- wbfdm/migrations/0025_instrument_is_primary_and_more.py +29 -0
- wbfdm/migrations/0026_instrument_is_cash_equivalent.py +30 -0
- wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py +100 -0
- wbfdm/migrations/__init__.py +0 -0
- wbfdm/models/__init__.py +4 -0
- wbfdm/models/esg/__init__.py +1 -0
- wbfdm/models/esg/controversies.py +81 -0
- wbfdm/models/exchanges/__init__.py +1 -0
- wbfdm/models/exchanges/exchanges.py +223 -0
- wbfdm/models/fields.py +117 -0
- wbfdm/models/fk_fields.py +403 -0
- wbfdm/models/indicators.py +0 -0
- wbfdm/models/instruments/__init__.py +19 -0
- wbfdm/models/instruments/classifications.py +265 -0
- wbfdm/models/instruments/instrument_lists.py +120 -0
- wbfdm/models/instruments/instrument_prices.py +540 -0
- wbfdm/models/instruments/instrument_relationships.py +251 -0
- wbfdm/models/instruments/instrument_requests.py +196 -0
- wbfdm/models/instruments/instruments.py +991 -0
- wbfdm/models/instruments/llm/__init__.py +1 -0
- wbfdm/models/instruments/llm/create_instrument_news_relationships.py +78 -0
- wbfdm/models/instruments/mixin/__init__.py +0 -0
- wbfdm/models/instruments/mixin/financials_computed.py +804 -0
- wbfdm/models/instruments/mixin/financials_serializer_fields.py +1407 -0
- wbfdm/models/instruments/mixin/instruments.py +294 -0
- wbfdm/models/instruments/options.py +225 -0
- wbfdm/models/instruments/private_equities.py +59 -0
- wbfdm/models/instruments/querysets.py +73 -0
- wbfdm/models/instruments/utils.py +41 -0
- wbfdm/preferences.py +21 -0
- wbfdm/serializers/__init__.py +4 -0
- wbfdm/serializers/esg.py +36 -0
- wbfdm/serializers/exchanges.py +39 -0
- wbfdm/serializers/instruments/__init__.py +37 -0
- wbfdm/serializers/instruments/classifications.py +139 -0
- wbfdm/serializers/instruments/instrument_lists.py +61 -0
- wbfdm/serializers/instruments/instrument_prices.py +73 -0
- wbfdm/serializers/instruments/instrument_relationships.py +170 -0
- wbfdm/serializers/instruments/instrument_requests.py +61 -0
- wbfdm/serializers/instruments/instruments.py +274 -0
- wbfdm/serializers/instruments/mixins.py +104 -0
- wbfdm/serializers/officers.py +20 -0
- wbfdm/signals.py +7 -0
- wbfdm/sync/__init__.py +0 -0
- wbfdm/sync/abstract.py +31 -0
- wbfdm/sync/runner.py +22 -0
- wbfdm/tasks.py +69 -0
- wbfdm/tests/__init__.py +0 -0
- wbfdm/tests/analysis/__init__.py +0 -0
- wbfdm/tests/analysis/financial_analysis/__init__.py +0 -0
- wbfdm/tests/analysis/financial_analysis/test_statement_with_estimates.py +392 -0
- wbfdm/tests/analysis/financial_analysis/test_utils.py +322 -0
- wbfdm/tests/analysis/test_esg.py +159 -0
- wbfdm/tests/conftest.py +92 -0
- wbfdm/tests/dataloaders/__init__.py +0 -0
- wbfdm/tests/dataloaders/test_cache.py +73 -0
- wbfdm/tests/models/__init__.py +0 -0
- wbfdm/tests/models/test_classifications.py +99 -0
- wbfdm/tests/models/test_exchanges.py +7 -0
- wbfdm/tests/models/test_instrument_list.py +117 -0
- wbfdm/tests/models/test_instrument_prices.py +306 -0
- wbfdm/tests/models/test_instruments.py +202 -0
- wbfdm/tests/models/test_merge.py +99 -0
- wbfdm/tests/models/test_options.py +69 -0
- wbfdm/tests/test_tasks.py +6 -0
- wbfdm/tests/tests.py +10 -0
- wbfdm/urls.py +222 -0
- wbfdm/utils.py +54 -0
- wbfdm/viewsets/__init__.py +10 -0
- wbfdm/viewsets/configs/__init__.py +5 -0
- wbfdm/viewsets/configs/buttons/__init__.py +8 -0
- wbfdm/viewsets/configs/buttons/classifications.py +23 -0
- wbfdm/viewsets/configs/buttons/exchanges.py +9 -0
- wbfdm/viewsets/configs/buttons/instrument_prices.py +49 -0
- wbfdm/viewsets/configs/buttons/instruments.py +283 -0
- wbfdm/viewsets/configs/display/__init__.py +22 -0
- wbfdm/viewsets/configs/display/classifications.py +138 -0
- wbfdm/viewsets/configs/display/esg.py +75 -0
- wbfdm/viewsets/configs/display/exchanges.py +42 -0
- wbfdm/viewsets/configs/display/instrument_lists.py +137 -0
- wbfdm/viewsets/configs/display/instrument_prices.py +199 -0
- wbfdm/viewsets/configs/display/instrument_requests.py +116 -0
- wbfdm/viewsets/configs/display/instruments.py +618 -0
- wbfdm/viewsets/configs/display/instruments_relationships.py +65 -0
- wbfdm/viewsets/configs/display/monthly_performances.py +72 -0
- wbfdm/viewsets/configs/display/officers.py +16 -0
- wbfdm/viewsets/configs/display/prices.py +21 -0
- wbfdm/viewsets/configs/display/statement_with_estimates.py +101 -0
- wbfdm/viewsets/configs/display/statements.py +48 -0
- wbfdm/viewsets/configs/endpoints/__init__.py +41 -0
- wbfdm/viewsets/configs/endpoints/classifications.py +87 -0
- wbfdm/viewsets/configs/endpoints/esg.py +20 -0
- wbfdm/viewsets/configs/endpoints/exchanges.py +6 -0
- wbfdm/viewsets/configs/endpoints/financials_analysis.py +65 -0
- wbfdm/viewsets/configs/endpoints/instrument_lists.py +38 -0
- wbfdm/viewsets/configs/endpoints/instrument_prices.py +51 -0
- wbfdm/viewsets/configs/endpoints/instrument_requests.py +20 -0
- wbfdm/viewsets/configs/endpoints/instruments.py +13 -0
- wbfdm/viewsets/configs/endpoints/instruments_relationships.py +31 -0
- wbfdm/viewsets/configs/endpoints/statements.py +6 -0
- wbfdm/viewsets/configs/menus/__init__.py +9 -0
- wbfdm/viewsets/configs/menus/classifications.py +19 -0
- wbfdm/viewsets/configs/menus/exchanges.py +10 -0
- wbfdm/viewsets/configs/menus/instrument_lists.py +10 -0
- wbfdm/viewsets/configs/menus/instruments.py +20 -0
- wbfdm/viewsets/configs/menus/instruments_relationships.py +33 -0
- wbfdm/viewsets/configs/titles/__init__.py +42 -0
- wbfdm/viewsets/configs/titles/classifications.py +79 -0
- wbfdm/viewsets/configs/titles/esg.py +11 -0
- wbfdm/viewsets/configs/titles/exchanges.py +12 -0
- wbfdm/viewsets/configs/titles/financial_ratio_analysis.py +6 -0
- wbfdm/viewsets/configs/titles/financials_analysis.py +50 -0
- wbfdm/viewsets/configs/titles/instrument_prices.py +50 -0
- wbfdm/viewsets/configs/titles/instrument_requests.py +16 -0
- wbfdm/viewsets/configs/titles/instruments.py +31 -0
- wbfdm/viewsets/configs/titles/instruments_relationships.py +21 -0
- wbfdm/viewsets/configs/titles/market_data.py +13 -0
- wbfdm/viewsets/configs/titles/prices.py +15 -0
- wbfdm/viewsets/configs/titles/statement_with_estimates.py +10 -0
- wbfdm/viewsets/esg.py +72 -0
- wbfdm/viewsets/exchanges.py +63 -0
- wbfdm/viewsets/financial_analysis/__init__.py +3 -0
- wbfdm/viewsets/financial_analysis/financial_metric_analysis.py +85 -0
- wbfdm/viewsets/financial_analysis/financial_ratio_analysis.py +85 -0
- wbfdm/viewsets/financial_analysis/statement_with_estimates.py +145 -0
- wbfdm/viewsets/instruments/__init__.py +80 -0
- wbfdm/viewsets/instruments/classifications.py +279 -0
- wbfdm/viewsets/instruments/financials_analysis.py +614 -0
- wbfdm/viewsets/instruments/instrument_lists.py +77 -0
- wbfdm/viewsets/instruments/instrument_prices.py +542 -0
- wbfdm/viewsets/instruments/instrument_requests.py +51 -0
- wbfdm/viewsets/instruments/instruments.py +106 -0
- wbfdm/viewsets/instruments/instruments_relationships.py +235 -0
- wbfdm/viewsets/instruments/utils.py +27 -0
- wbfdm/viewsets/market_data.py +172 -0
- wbfdm/viewsets/mixins.py +9 -0
- wbfdm/viewsets/officers.py +27 -0
- wbfdm/viewsets/prices.py +62 -0
- wbfdm/viewsets/statements/__init__.py +1 -0
- wbfdm/viewsets/statements/statements.py +100 -0
- wbfdm/viewsets/technical_analysis/__init__.py +1 -0
- wbfdm/viewsets/technical_analysis/monthly_performances.py +93 -0
- wbfdm-2.2.1.dist-info/METADATA +15 -0
- wbfdm-2.2.1.dist-info/RECORD +337 -0
- wbfdm-2.2.1.dist-info/WHEEL +5 -0
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
from .classifications import ClassificationButtonConfig, ClassificationGroupButtonConfig
|
|
2
|
+
from .instruments import InstrumentButtonViewConfig, ChildrenInstrumentModelViewConfig
|
|
3
|
+
from .instrument_prices import (
|
|
4
|
+
InstrumentPriceButtonConfig,
|
|
5
|
+
InstrumentPriceInstrumentButtonConfig,
|
|
6
|
+
FinancialStatisticsInstrumentButtonConfig,
|
|
7
|
+
)
|
|
8
|
+
from .exchanges import ExchangeButtonConfig
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from django.utils.translation import gettext_lazy as _
|
|
2
|
+
from wbcore.contrib.icons import WBIcon
|
|
3
|
+
from wbcore.metadata.configs import buttons as bt
|
|
4
|
+
from wbcore.metadata.configs.buttons.view_config import ButtonViewConfig
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class AbstractClassificationButtonConfig(ButtonViewConfig):
|
|
8
|
+
def get_custom_list_instance_buttons(self):
|
|
9
|
+
return {
|
|
10
|
+
bt.WidgetButton(key="treechart", label=_("Tree Chart"), icon=WBIcon.CHART_PIE.icon),
|
|
11
|
+
bt.WidgetButton(key="iciclechart", label=_("Icicle Chart"), icon=WBIcon.CHART_PYRAMID.icon),
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
def get_custom_instance_buttons(self):
|
|
15
|
+
return self.get_custom_list_instance_buttons()
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class ClassificationGroupButtonConfig(AbstractClassificationButtonConfig):
|
|
19
|
+
pass
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class ClassificationButtonConfig(AbstractClassificationButtonConfig):
|
|
23
|
+
pass
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
from rest_framework.reverse import reverse
|
|
2
|
+
from wbcore.contrib.icons import WBIcon
|
|
3
|
+
from wbcore.metadata.configs import buttons as bt
|
|
4
|
+
from wbcore.metadata.configs.buttons.view_config import ButtonViewConfig
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class InstrumentPriceButtonConfig(ButtonViewConfig):
|
|
8
|
+
def get_custom_list_instance_buttons(self):
|
|
9
|
+
return {
|
|
10
|
+
bt.HyperlinkButton(
|
|
11
|
+
key="import_source",
|
|
12
|
+
label="Import Source",
|
|
13
|
+
icon=WBIcon.SAVE.icon,
|
|
14
|
+
)
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class InstrumentPriceInstrumentButtonConfig(InstrumentPriceButtonConfig):
|
|
19
|
+
pass
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class FinancialStatisticsInstrumentButtonConfig(ButtonViewConfig):
|
|
23
|
+
def get_custom_buttons(self):
|
|
24
|
+
if instrument_id := self.view.kwargs.get("instrument_id", None):
|
|
25
|
+
return {
|
|
26
|
+
bt.DropDownButton(
|
|
27
|
+
label="Charts",
|
|
28
|
+
icon=WBIcon.UNFOLD.icon,
|
|
29
|
+
buttons=(
|
|
30
|
+
bt.WidgetButton(
|
|
31
|
+
endpoint=f'{reverse("wbfdm:market_data-list", args=[instrument_id], request=self.request)}?chart_type=ret',
|
|
32
|
+
label="Returns Chart",
|
|
33
|
+
icon=WBIcon.CHART_BARS_HORIZONTAL.icon,
|
|
34
|
+
),
|
|
35
|
+
bt.WidgetButton(
|
|
36
|
+
endpoint=f'{reverse("wbfdm:market_data-list", args=[instrument_id], request=self.request)}?chart_type=drawdown',
|
|
37
|
+
label="Drawdowns Chart",
|
|
38
|
+
icon=WBIcon.CHART_BARS_HORIZONTAL.icon,
|
|
39
|
+
),
|
|
40
|
+
),
|
|
41
|
+
),
|
|
42
|
+
bt.WidgetButton(
|
|
43
|
+
key="bestandworstreturns",
|
|
44
|
+
label="Best and Worst returns table",
|
|
45
|
+
icon=WBIcon.CHART_BARS_HORIZONTAL.icon,
|
|
46
|
+
),
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
return set()
|
|
@@ -0,0 +1,283 @@
|
|
|
1
|
+
from contextlib import suppress
|
|
2
|
+
|
|
3
|
+
from rest_framework.reverse import reverse
|
|
4
|
+
from wbcore.contrib.icons import WBIcon
|
|
5
|
+
from wbcore.metadata.configs import buttons as bt
|
|
6
|
+
from wbcore.metadata.configs.buttons import ButtonViewConfig
|
|
7
|
+
from wbfdm.models import Instrument
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ChildrenInstrumentModelViewConfig(ButtonViewConfig):
|
|
11
|
+
def get_custom_buttons(self) -> set:
|
|
12
|
+
with suppress(Instrument.DoesNotExist):
|
|
13
|
+
instrument = Instrument.objects.get(id=self.view.kwargs.get("instrument_id"))
|
|
14
|
+
if instrument.parent:
|
|
15
|
+
return {
|
|
16
|
+
bt.WidgetButton(
|
|
17
|
+
label="Parent",
|
|
18
|
+
endpoint=reverse("wbfdm:instrument-detail", args=[instrument.parent.id], request=self.request),
|
|
19
|
+
),
|
|
20
|
+
}
|
|
21
|
+
return set()
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
class InstrumentButtonViewConfig(ButtonViewConfig):
|
|
25
|
+
def get_custom_list_instance_buttons(self) -> set:
|
|
26
|
+
return {*super().get_custom_list_instance_buttons(), *self.get_custom_instance_buttons()}
|
|
27
|
+
|
|
28
|
+
def get_custom_instance_buttons(self):
|
|
29
|
+
return {
|
|
30
|
+
bt.DropDownButton(
|
|
31
|
+
label="Performance Analysis",
|
|
32
|
+
weight=1,
|
|
33
|
+
icon=WBIcon.UNFOLD.icon,
|
|
34
|
+
buttons=(
|
|
35
|
+
bt.WidgetButton(
|
|
36
|
+
weight=0,
|
|
37
|
+
label="Prices",
|
|
38
|
+
icon=WBIcon.DOLLAR.icon,
|
|
39
|
+
key="prices",
|
|
40
|
+
),
|
|
41
|
+
bt.WidgetButton(
|
|
42
|
+
weight=1,
|
|
43
|
+
key="bestandworstreturns",
|
|
44
|
+
label="Best and Worst Returns Table",
|
|
45
|
+
icon=WBIcon.INVERSE.icon,
|
|
46
|
+
),
|
|
47
|
+
bt.WidgetButton(
|
|
48
|
+
weight=2,
|
|
49
|
+
label="Monthly Performances",
|
|
50
|
+
icon=WBIcon.TABLE.icon,
|
|
51
|
+
key="monthly_performances",
|
|
52
|
+
),
|
|
53
|
+
bt.WidgetButton(
|
|
54
|
+
label="Financial Statistics",
|
|
55
|
+
weight=3,
|
|
56
|
+
icon=WBIcon.CHART_WATERFALL.icon,
|
|
57
|
+
key="financial-statistics",
|
|
58
|
+
),
|
|
59
|
+
bt.DropDownButton(
|
|
60
|
+
label="Valuations",
|
|
61
|
+
weight=4,
|
|
62
|
+
icon=WBIcon.UNFOLD.icon,
|
|
63
|
+
buttons=[
|
|
64
|
+
bt.WidgetButton(
|
|
65
|
+
key="instrumentprices", label="Price and Performance", icon=WBIcon.DOLLAR.icon
|
|
66
|
+
),
|
|
67
|
+
bt.WidgetButton(
|
|
68
|
+
key="instrumentpricestatisticchart",
|
|
69
|
+
label="Price Statistical Chart",
|
|
70
|
+
icon=WBIcon.CHART_MULTILINE.icon,
|
|
71
|
+
),
|
|
72
|
+
],
|
|
73
|
+
),
|
|
74
|
+
bt.DropDownButton(
|
|
75
|
+
label="Charts",
|
|
76
|
+
weight=1000,
|
|
77
|
+
icon=WBIcon.UNFOLD.icon,
|
|
78
|
+
buttons=(
|
|
79
|
+
bt.WidgetButton(
|
|
80
|
+
label="Market Data Chart",
|
|
81
|
+
weight=0,
|
|
82
|
+
icon=WBIcon.CHART_LINE.icon,
|
|
83
|
+
key="market_data",
|
|
84
|
+
),
|
|
85
|
+
bt.WidgetButton(
|
|
86
|
+
label="Drawdown Chart",
|
|
87
|
+
weight=1,
|
|
88
|
+
icon=WBIcon.CHART_AREA.icon,
|
|
89
|
+
key="drawdown",
|
|
90
|
+
),
|
|
91
|
+
bt.WidgetButton(
|
|
92
|
+
label="Performance Summary",
|
|
93
|
+
weight=2,
|
|
94
|
+
icon=WBIcon.CHART_BARS_VERTICAL.icon,
|
|
95
|
+
key="performance_summary",
|
|
96
|
+
),
|
|
97
|
+
bt.WidgetButton(
|
|
98
|
+
label="Cumulative Returns Chart",
|
|
99
|
+
weight=3,
|
|
100
|
+
icon=WBIcon.CHART_WATERFALL.icon,
|
|
101
|
+
key="cumulativereturn",
|
|
102
|
+
),
|
|
103
|
+
bt.WidgetButton(
|
|
104
|
+
key="distributionreturnschart",
|
|
105
|
+
label="Distribution Returns Chart",
|
|
106
|
+
weight=4,
|
|
107
|
+
icon=WBIcon.CHART_BARS_HORIZONTAL.icon,
|
|
108
|
+
),
|
|
109
|
+
bt.WidgetButton(
|
|
110
|
+
key="price_and_volume", label="Price And Volume", weight=5, icon=WBIcon.CHART_LINE.icon
|
|
111
|
+
),
|
|
112
|
+
),
|
|
113
|
+
),
|
|
114
|
+
),
|
|
115
|
+
),
|
|
116
|
+
bt.DropDownButton(
|
|
117
|
+
label="Financial Analysis",
|
|
118
|
+
icon=WBIcon.UNFOLD.icon,
|
|
119
|
+
weight=2,
|
|
120
|
+
buttons=[
|
|
121
|
+
bt.WidgetButton(
|
|
122
|
+
label="Income Statement",
|
|
123
|
+
weight=0,
|
|
124
|
+
icon=WBIcon.DOCUMENT_WITH_DOLLAR.icon,
|
|
125
|
+
key="income-statement",
|
|
126
|
+
),
|
|
127
|
+
bt.WidgetButton(
|
|
128
|
+
label="Balance Sheet",
|
|
129
|
+
weight=1,
|
|
130
|
+
icon=WBIcon.ACCOUNT_BALANCE.icon,
|
|
131
|
+
key="balance-sheet",
|
|
132
|
+
),
|
|
133
|
+
bt.WidgetButton(
|
|
134
|
+
label="Cash Flow Statement",
|
|
135
|
+
weight=2,
|
|
136
|
+
icon=WBIcon.CURRENCY_EXCHANGE.icon,
|
|
137
|
+
key="cash-flow-statement",
|
|
138
|
+
),
|
|
139
|
+
bt.DropDownButton(
|
|
140
|
+
label="IBES",
|
|
141
|
+
weight=3,
|
|
142
|
+
icon=WBIcon.UNFOLD.icon,
|
|
143
|
+
buttons=(
|
|
144
|
+
bt.WidgetButton(
|
|
145
|
+
label="Summary",
|
|
146
|
+
weight=0,
|
|
147
|
+
icon=WBIcon.DATA_EXPLORATION.icon,
|
|
148
|
+
key="swe-summary",
|
|
149
|
+
),
|
|
150
|
+
bt.WidgetButton(
|
|
151
|
+
label="Income Statement / Estimates",
|
|
152
|
+
weight=1,
|
|
153
|
+
icon=WBIcon.DOCUMENT_WITH_DOLLAR.icon,
|
|
154
|
+
key="swe-income-statement",
|
|
155
|
+
),
|
|
156
|
+
bt.WidgetButton(
|
|
157
|
+
label="Balance Sheet / Estimates",
|
|
158
|
+
weight=2,
|
|
159
|
+
icon=WBIcon.ACCOUNT_BALANCE.icon,
|
|
160
|
+
key="swe-balance-sheet",
|
|
161
|
+
),
|
|
162
|
+
bt.WidgetButton(
|
|
163
|
+
label="Cash Flow / Estimates",
|
|
164
|
+
weight=3,
|
|
165
|
+
icon=WBIcon.CURRENCY_EXCHANGE.icon,
|
|
166
|
+
key="swe-cashflow-statement",
|
|
167
|
+
),
|
|
168
|
+
bt.WidgetButton(
|
|
169
|
+
label="Ratios / Estimates",
|
|
170
|
+
weight=4,
|
|
171
|
+
icon=WBIcon.DATA_EXPLORATION.icon,
|
|
172
|
+
key="swe-ratios",
|
|
173
|
+
),
|
|
174
|
+
bt.WidgetButton(
|
|
175
|
+
label="Margins",
|
|
176
|
+
weight=5,
|
|
177
|
+
icon=WBIcon.DATA_EXPLORATION.icon,
|
|
178
|
+
key="swe-margins",
|
|
179
|
+
),
|
|
180
|
+
bt.WidgetButton(
|
|
181
|
+
label="Cashflow Ratios",
|
|
182
|
+
weight=6,
|
|
183
|
+
icon=WBIcon.DATA_EXPLORATION.icon,
|
|
184
|
+
key="swe-cashflow-ratios",
|
|
185
|
+
),
|
|
186
|
+
bt.WidgetButton(
|
|
187
|
+
label="Asset Turnover Ratios",
|
|
188
|
+
weight=7,
|
|
189
|
+
icon=WBIcon.DATA_EXPLORATION.icon,
|
|
190
|
+
key="swe-asset-turnover-ratios",
|
|
191
|
+
),
|
|
192
|
+
bt.WidgetButton(
|
|
193
|
+
label="Credit Ratios",
|
|
194
|
+
weight=8,
|
|
195
|
+
icon=WBIcon.DATA_EXPLORATION.icon,
|
|
196
|
+
key="swe-credit",
|
|
197
|
+
),
|
|
198
|
+
bt.WidgetButton(
|
|
199
|
+
label="Long-Term Solvency Ratios",
|
|
200
|
+
weight=9,
|
|
201
|
+
icon=WBIcon.DATA_EXPLORATION.icon,
|
|
202
|
+
key="swe-long-term-solvency",
|
|
203
|
+
),
|
|
204
|
+
bt.WidgetButton(
|
|
205
|
+
label="Short-Term Liquidity Ratios",
|
|
206
|
+
weight=10,
|
|
207
|
+
icon=WBIcon.DATA_EXPLORATION.icon,
|
|
208
|
+
key="swe-short-term-liquidity",
|
|
209
|
+
),
|
|
210
|
+
),
|
|
211
|
+
),
|
|
212
|
+
],
|
|
213
|
+
),
|
|
214
|
+
bt.WidgetButton(
|
|
215
|
+
label="Officers",
|
|
216
|
+
icon=WBIcon.PEOPLE.icon,
|
|
217
|
+
key="officers",
|
|
218
|
+
),
|
|
219
|
+
bt.DropDownButton(
|
|
220
|
+
label="ESG",
|
|
221
|
+
icon=WBIcon.UNFOLD.icon,
|
|
222
|
+
weight=3,
|
|
223
|
+
buttons=[
|
|
224
|
+
bt.WidgetButton(
|
|
225
|
+
label="Controversies",
|
|
226
|
+
icon=WBIcon.EVENT.icon,
|
|
227
|
+
key="controversies",
|
|
228
|
+
),
|
|
229
|
+
bt.WidgetButton(
|
|
230
|
+
label="PAI",
|
|
231
|
+
icon=WBIcon.CHART_SWITCHES.icon,
|
|
232
|
+
key="pai",
|
|
233
|
+
),
|
|
234
|
+
],
|
|
235
|
+
)
|
|
236
|
+
# bt.DropDownButton(
|
|
237
|
+
# label="Financial Analysis (Old)",
|
|
238
|
+
# weight=3,
|
|
239
|
+
# icon=WBIcon.UNFOLD.icon,
|
|
240
|
+
# buttons=(
|
|
241
|
+
# bt.WidgetButton(
|
|
242
|
+
# key="summary_table",
|
|
243
|
+
# label="Summary Table",
|
|
244
|
+
# icon=WBIcon.TABLE.icon,
|
|
245
|
+
# ),
|
|
246
|
+
# bt.WidgetButton(
|
|
247
|
+
# key="financials_graph",
|
|
248
|
+
# label="Financials Graph",
|
|
249
|
+
# icon=WBIcon.CHART_BARS_HORIZONTAL.icon,
|
|
250
|
+
# ),
|
|
251
|
+
# bt.WidgetButton(
|
|
252
|
+
# key="profitability_ratios",
|
|
253
|
+
# label="Profitability Ratios",
|
|
254
|
+
# icon=WBIcon.CHART_LINE.icon,
|
|
255
|
+
# ),
|
|
256
|
+
# bt.WidgetButton(
|
|
257
|
+
# key="cash_flow_analysis_table",
|
|
258
|
+
# label="Cash Flow Analysis Table",
|
|
259
|
+
# icon=WBIcon.TABLE.icon,
|
|
260
|
+
# ),
|
|
261
|
+
# bt.WidgetButton(
|
|
262
|
+
# key="cash_flow_analysis_chart",
|
|
263
|
+
# label="Cash Flow Analysis Chart",
|
|
264
|
+
# icon=WBIcon.CHART_BARS_HORIZONTAL.icon,
|
|
265
|
+
# ),
|
|
266
|
+
# bt.WidgetButton(
|
|
267
|
+
# key="net_debt_and_ebitda_chart",
|
|
268
|
+
# label="Net Debt And EBITDA Analysis Chart",
|
|
269
|
+
# icon=WBIcon.CHART_BARS_HORIZONTAL.icon,
|
|
270
|
+
# ),
|
|
271
|
+
# bt.WidgetButton(
|
|
272
|
+
# key="valuation_ratios-old",
|
|
273
|
+
# label="Valuation Ratios",
|
|
274
|
+
# icon=WBIcon.CHART_MULTILINE.icon,
|
|
275
|
+
# ),
|
|
276
|
+
# bt.WidgetButton(
|
|
277
|
+
# key="earnings_chart",
|
|
278
|
+
# label="Earnings Analysis",
|
|
279
|
+
# icon=WBIcon.CHART_LINE.icon,
|
|
280
|
+
# ),
|
|
281
|
+
# ),
|
|
282
|
+
# ),
|
|
283
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
from .classifications import (
|
|
2
|
+
ClassificationDisplayConfig,
|
|
3
|
+
ClassificationGroupDisplayConfig,
|
|
4
|
+
ClassificationInstrumentRelatedInstrumentDisplayConfig,
|
|
5
|
+
InstrumentClassificationThroughDisplayConfig,
|
|
6
|
+
)
|
|
7
|
+
from .instrument_lists import InstrumentListDisplayConfig
|
|
8
|
+
from .instrument_requests import InstrumentRequestDisplayConfig
|
|
9
|
+
from .instruments import InstrumentDisplayConfig
|
|
10
|
+
from .instrument_prices import (
|
|
11
|
+
InstrumentPriceDisplayConfig,
|
|
12
|
+
BestAndWorstReturnsInstrumentPandasDisplayConfig,
|
|
13
|
+
FinancialStatisticsInstrumentPandasDisplayConfig,
|
|
14
|
+
)
|
|
15
|
+
from .instruments_relationships import (
|
|
16
|
+
ClassifiedInstrumentDisplayConfig,
|
|
17
|
+
InstrumentFavoriteGroupDisplayConfig,
|
|
18
|
+
RelatedInstrumentThroughInstrumentDisplayConfig,
|
|
19
|
+
)
|
|
20
|
+
from .exchanges import ExchangeDisplayConfig
|
|
21
|
+
from .monthly_performances import MonthlyPerformancesInstrumentDisplayViewConfig
|
|
22
|
+
from .esg import InstrumentESGPAIDisplayViewConfig, InstrumentESGControversyDisplayViewConfig
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
from typing import Optional
|
|
2
|
+
|
|
3
|
+
from django.utils.translation import gettext_lazy as _
|
|
4
|
+
from wbcore.metadata.configs import display as dp
|
|
5
|
+
from wbcore.metadata.configs.display.instance_display.shortcuts import (
|
|
6
|
+
Display,
|
|
7
|
+
create_simple_display,
|
|
8
|
+
create_simple_section,
|
|
9
|
+
)
|
|
10
|
+
from wbcore.metadata.configs.display.instance_display.utils import repeat_field
|
|
11
|
+
from wbcore.metadata.configs.display.view_config import DisplayViewConfig
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ClassificationDisplayConfig(DisplayViewConfig):
|
|
15
|
+
def get_list_display(self) -> Optional[dp.ListDisplay]:
|
|
16
|
+
return dp.ListDisplay(
|
|
17
|
+
fields=[
|
|
18
|
+
dp.Field(key="name", label="Title"),
|
|
19
|
+
dp.Field(key="code_aggregated", label="Code"),
|
|
20
|
+
dp.Field(key="parent", label="Parent"),
|
|
21
|
+
dp.Field(key="group", label="Group"),
|
|
22
|
+
dp.Field(key="height", label="Height"),
|
|
23
|
+
dp.Field(key="level", label="Level"),
|
|
24
|
+
dp.Field(key="level_representation", label="Level Representation"),
|
|
25
|
+
]
|
|
26
|
+
)
|
|
27
|
+
|
|
28
|
+
def get_instance_display(self) -> Display:
|
|
29
|
+
return create_simple_display(
|
|
30
|
+
[
|
|
31
|
+
["name", "code_aggregated"],
|
|
32
|
+
["parent", "group"],
|
|
33
|
+
["height", "level_representation"],
|
|
34
|
+
[repeat_field(2, "description")],
|
|
35
|
+
[repeat_field(2, "childs_section")],
|
|
36
|
+
[repeat_field(2, "instruments_section")],
|
|
37
|
+
],
|
|
38
|
+
[
|
|
39
|
+
create_simple_section(
|
|
40
|
+
"childs_section", _("Child Classifications"), [["childs"]], "childs", collapsed=False
|
|
41
|
+
),
|
|
42
|
+
create_simple_section(
|
|
43
|
+
"instruments_section", _("Instruments"), [["instruments"]], "instruments", collapsed=True
|
|
44
|
+
),
|
|
45
|
+
],
|
|
46
|
+
)
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class ClassificationGroupDisplayConfig(DisplayViewConfig):
|
|
50
|
+
def get_list_display(self) -> Optional[dp.ListDisplay]:
|
|
51
|
+
return dp.ListDisplay(
|
|
52
|
+
fields=[
|
|
53
|
+
dp.Field(key="name", label="Title"),
|
|
54
|
+
dp.Field(key="is_primary", label="Primary"),
|
|
55
|
+
dp.Field(key="max_depth", label="Max Depth"),
|
|
56
|
+
]
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
def get_instance_display(self) -> Display:
|
|
60
|
+
return create_simple_display(
|
|
61
|
+
[
|
|
62
|
+
[repeat_field(2, "name")],
|
|
63
|
+
["is_primary", "max_depth"],
|
|
64
|
+
[repeat_field(2, "classifications_section")],
|
|
65
|
+
],
|
|
66
|
+
[
|
|
67
|
+
create_simple_section(
|
|
68
|
+
"classifications_section",
|
|
69
|
+
_("Classification"),
|
|
70
|
+
[["classifications"]],
|
|
71
|
+
"classifications",
|
|
72
|
+
collapsed=False,
|
|
73
|
+
)
|
|
74
|
+
],
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
class InstrumentClassificationThroughDisplayConfig(DisplayViewConfig):
|
|
79
|
+
def get_list_display(self) -> Optional[dp.ListDisplay]:
|
|
80
|
+
return dp.ListDisplay(
|
|
81
|
+
fields=[
|
|
82
|
+
dp.Field(key="instrument", label="Instrument") if "instrument_id" not in self.view.kwargs else None,
|
|
83
|
+
dp.Field(key="classification", label="Classification")
|
|
84
|
+
if "classification_id" not in self.view.kwargs
|
|
85
|
+
else None,
|
|
86
|
+
dp.Field(key="is_favorite", label="Favorite"),
|
|
87
|
+
dp.Field(key="pure_player", label="Pure Player"),
|
|
88
|
+
dp.Field(key="top_player", label="Top Player"),
|
|
89
|
+
dp.Field(key="reason", label="Reason"),
|
|
90
|
+
dp.Field(key="percent_of_revenue", label="% of revenue"),
|
|
91
|
+
dp.Field(key="tags", label="Tags"),
|
|
92
|
+
dp.Field(key="related_instruments", label="RelatedInstruments"),
|
|
93
|
+
]
|
|
94
|
+
)
|
|
95
|
+
|
|
96
|
+
def get_instance_display(self) -> Display:
|
|
97
|
+
return create_simple_display(
|
|
98
|
+
[
|
|
99
|
+
[
|
|
100
|
+
"instrument" if "instrument_id" not in self.view.kwargs else ".",
|
|
101
|
+
"classification" if "classification_id" not in self.view.kwargs else ".",
|
|
102
|
+
],
|
|
103
|
+
["is_favorite", "top_player"],
|
|
104
|
+
["pure_player", "percent_of_revenue"],
|
|
105
|
+
[repeat_field(2, "reason")],
|
|
106
|
+
[repeat_field(2, "tags")],
|
|
107
|
+
[repeat_field(2, "related_instruments_section")],
|
|
108
|
+
],
|
|
109
|
+
[
|
|
110
|
+
create_simple_section(
|
|
111
|
+
"related_instruments_section",
|
|
112
|
+
_("Related Instruments"),
|
|
113
|
+
[["related_instruments"]],
|
|
114
|
+
"related_instruments",
|
|
115
|
+
collapsed=False,
|
|
116
|
+
)
|
|
117
|
+
],
|
|
118
|
+
)
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
class ClassificationInstrumentRelatedInstrumentDisplayConfig(DisplayViewConfig):
|
|
122
|
+
def get_list_display(self):
|
|
123
|
+
return dp.ListDisplay(
|
|
124
|
+
fields=[
|
|
125
|
+
dp.Field(key="related_instrument", label="Related Instrument"),
|
|
126
|
+
dp.Field(key="related_instrument_type", label="Type"),
|
|
127
|
+
]
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
def get_instance_display(self) -> Display:
|
|
131
|
+
return create_simple_display(
|
|
132
|
+
[
|
|
133
|
+
[
|
|
134
|
+
"related_instrument",
|
|
135
|
+
"related_instrument_type",
|
|
136
|
+
]
|
|
137
|
+
]
|
|
138
|
+
)
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
from django.utils.translation import gettext as _
|
|
2
|
+
from wbcore.contrib.color.enums import WBColor
|
|
3
|
+
from wbcore.enums import Operator
|
|
4
|
+
from wbcore.metadata.configs import display as dp
|
|
5
|
+
from wbcore.metadata.configs.display import DisplayViewConfig
|
|
6
|
+
from wbfdm.enums import ESGControveryFlag
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class InstrumentESGControversyDisplayViewConfig(DisplayViewConfig):
|
|
10
|
+
def get_list_display(self) -> dp.ListDisplay:
|
|
11
|
+
return dp.ListDisplay(
|
|
12
|
+
fields=[
|
|
13
|
+
dp.Field(key="initiated", label=_("Initiated"), width=100),
|
|
14
|
+
dp.Field(key="review", label=_("Review"), width=100),
|
|
15
|
+
dp.Field(key="headline", label=_("Headline")),
|
|
16
|
+
dp.Field(key="narrative", label=_("Narrative")),
|
|
17
|
+
dp.Field(key="source", label=_("Source")),
|
|
18
|
+
dp.Field(key="status", label=_("Status")),
|
|
19
|
+
dp.Field(key="type", label=_("Type")),
|
|
20
|
+
dp.Field(key="assessment", label=_("Assessment")),
|
|
21
|
+
dp.Field(key="response", label=_("Response")),
|
|
22
|
+
],
|
|
23
|
+
formatting=[
|
|
24
|
+
dp.Formatting(
|
|
25
|
+
formatting_rules=[
|
|
26
|
+
dp.FormattingRule(
|
|
27
|
+
style={"background-color": WBColor.GREEN_LIGHT.value},
|
|
28
|
+
condition=dp.Condition(operator=Operator.EQUAL, value=ESGControveryFlag.GREEN.value),
|
|
29
|
+
),
|
|
30
|
+
dp.FormattingRule(
|
|
31
|
+
style={"background-color": WBColor.RED_LIGHT.value},
|
|
32
|
+
condition=dp.Condition(operator=Operator.EQUAL, value=ESGControveryFlag.RED.value),
|
|
33
|
+
),
|
|
34
|
+
dp.FormattingRule(
|
|
35
|
+
style={"background-color": WBColor.YELLOW_LIGHT.value},
|
|
36
|
+
condition=dp.Condition(operator=Operator.EQUAL, value=ESGControveryFlag.YELLOW.value),
|
|
37
|
+
),
|
|
38
|
+
dp.FormattingRule(
|
|
39
|
+
style={"background-color": WBColor.YELLOW_DARK.value},
|
|
40
|
+
condition=dp.Condition(operator=Operator.EQUAL, value=ESGControveryFlag.ORANGE.value),
|
|
41
|
+
),
|
|
42
|
+
dp.FormattingRule(
|
|
43
|
+
style={"background-color": WBColor.GREEN_LIGHT.value},
|
|
44
|
+
condition=dp.Condition(operator=Operator.EQUAL, value=ESGControveryFlag.UNKNOWN.value),
|
|
45
|
+
),
|
|
46
|
+
],
|
|
47
|
+
column="flag",
|
|
48
|
+
)
|
|
49
|
+
],
|
|
50
|
+
legends=[
|
|
51
|
+
dp.Legend(
|
|
52
|
+
label="Flag",
|
|
53
|
+
items=[
|
|
54
|
+
dp.LegendItem(icon="#99c140", label="Green"),
|
|
55
|
+
dp.LegendItem(icon="#fdfd96", label="Yellow"),
|
|
56
|
+
dp.LegendItem(icon="#db7b2b", label="Orange"),
|
|
57
|
+
dp.LegendItem(icon="#cc3232", label="Red"),
|
|
58
|
+
dp.LegendItem(icon="#d3d3d3", label="Unknown"),
|
|
59
|
+
],
|
|
60
|
+
)
|
|
61
|
+
],
|
|
62
|
+
)
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class InstrumentESGPAIDisplayViewConfig(DisplayViewConfig):
|
|
66
|
+
def get_list_display(self) -> dp.ListDisplay:
|
|
67
|
+
return dp.ListDisplay(
|
|
68
|
+
fields=[
|
|
69
|
+
dp.Field(key="section", label=_("Section"), width=90),
|
|
70
|
+
dp.Field(key="asi", label=_("Adverse sustainability indicator")),
|
|
71
|
+
dp.Field(key="metric", label=_("Metric")),
|
|
72
|
+
dp.Field(key="factor", label=_("Factor"), width=450),
|
|
73
|
+
dp.Field(key="value", label=_("Value"), width=120),
|
|
74
|
+
],
|
|
75
|
+
)
|
|
@@ -0,0 +1,42 @@
|
|
|
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 ExchangeDisplayConfig(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="mic_code", label="MIC"),
|
|
18
|
+
dp.Field(key="operating_mic_code", label="MIC (operating)"),
|
|
19
|
+
dp.Field(key="bbg_exchange_codes", label="BBG Exchange"),
|
|
20
|
+
dp.Field(key="bbg_composite_primary", label="BBG composite 1"),
|
|
21
|
+
dp.Field(key="bbg_composite", label="BBG composite 2"),
|
|
22
|
+
dp.Field(key="refinitiv_identifier_code", label="RIC"),
|
|
23
|
+
dp.Field(key="refinitiv_mnemonic", label="Mnemonic"),
|
|
24
|
+
dp.Field(key="country", label="Country"),
|
|
25
|
+
dp.Field(key="city", label="City"),
|
|
26
|
+
dp.Field(key="website", label="Website"),
|
|
27
|
+
dp.Field(key="comments", label="Comments"),
|
|
28
|
+
dp.Field(key="opening_time", label="Opening Time"),
|
|
29
|
+
dp.Field(key="closing_time", label="Closing Time"),
|
|
30
|
+
]
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
def get_instance_display(self) -> Display:
|
|
34
|
+
return create_simple_display(
|
|
35
|
+
[
|
|
36
|
+
["name", "mic_code", "operating_mic_code", "refinitiv_identifier_code"],
|
|
37
|
+
[".", "bbg_exchange_codes", "bbg_composite_primary", "bbg_composite"],
|
|
38
|
+
[repeat_field(2, "country"), "city", "website"],
|
|
39
|
+
[repeat_field(2, "opening_time"), repeat_field(2, "closing_time")],
|
|
40
|
+
[repeat_field(4, "comments")],
|
|
41
|
+
]
|
|
42
|
+
)
|