wbfdm 1.49.1__py2.py3-none-any.whl → 1.49.3__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.

@@ -75,6 +75,8 @@ class DSWSMarketDataDataloader(MarketDataProtocol, Dataloader):
75
75
  parameters["end"] = to_date.strftime("%Y-%m-%d")
76
76
  for chunked_identifiers in client.get_chunked_list(identifiers, len(fields)):
77
77
  df = client.get_timeserie_df(chunked_identifiers, fields, **parameters)
78
+ if exact_date:
79
+ df = df[df["Dates"] == exact_date]
78
80
  for row in df.to_dict("records"):
79
81
  jsondate = row["Dates"].date()
80
82
  external_id = row["Instrument"]
@@ -118,7 +118,7 @@ class DatastreamMarketDataDataloader(MarketDataProtocol, Dataloader):
118
118
 
119
119
  # if market cap or shares outstanding are required we need to join with an additional table
120
120
  if MarketData.MARKET_CAPITALIZATION in values or MarketData.SHARES_OUTSTANDING in values:
121
- query = query.join(market_val).on(
121
+ query = query.left_join(market_val).on(
122
122
  (pricing.InfoCode == market_val.InfoCode) & (pricing.MarketDate == market_val.MarketDate)
123
123
  )
124
124
 
@@ -130,6 +130,9 @@ class InstrumentManager(TreeManager):
130
130
  def annotate_all(self):
131
131
  return self.get_queryset().annotate_all()
132
132
 
133
+ def filter_active_at_date(self, val_date: date):
134
+ return self.get_queryset().filter_active_at_date(val_date)
135
+
133
136
 
134
137
  class SecurityInstrumentManager(InstrumentManager):
135
138
  def get_queryset(self) -> InstrumentQuerySet:
@@ -142,19 +145,8 @@ class ClassifiableInstrumentManager(InstrumentManager):
142
145
 
143
146
 
144
147
  class ActiveInstrumentManager(InstrumentManager):
145
- def get_queryset_at_date(self, val_date: date):
146
- return (
147
- super()
148
- .get_queryset()
149
- .filter(
150
- (models.Q(delisted_date__isnull=True) | models.Q(delisted_date__gte=val_date))
151
- & models.Q(inception_date__isnull=False)
152
- & models.Q(inception_date__lte=val_date)
153
- )
154
- )
155
-
156
148
  def get_queryset(self):
157
- return self.get_queryset_at_date(date.today())
149
+ return super().get_queryset().filter_active_at_date(date.today())
158
150
 
159
151
 
160
152
  class InvestableUniverseManager(InstrumentManager):
@@ -579,6 +571,18 @@ class Instrument(ComplexToStringMixin, TagModelMixin, ImportMixin, InstrumentPMS
579
571
  if favorite_classification := self.classifications.filter(group=get_default_classification_group()).first():
580
572
  return favorite_classification
581
573
 
574
+ def get_primary_quote(self):
575
+ if self.children.exists():
576
+ # we try the primary children first, then the first children within the investable universe and we fallback to the first children otherwise
577
+ try:
578
+ instrument = self.children.get(is_primary=True)
579
+ except Instrument.DoesNotExist:
580
+ instrument = self.children.filter(is_investable_universe=True).first()
581
+ if not instrument:
582
+ instrument = self.children.first()
583
+ return instrument.get_primary_quote()
584
+ return self
585
+
582
586
  @property
583
587
  def active(self) -> bool:
584
588
  today = date.today()
@@ -10,6 +10,7 @@ from django.db.models import (
10
10
  ExpressionWrapper,
11
11
  F,
12
12
  OuterRef,
13
+ Q,
13
14
  QuerySet,
14
15
  Subquery,
15
16
  )
@@ -20,6 +21,12 @@ from wbfdm.enums import MarketData
20
21
 
21
22
 
22
23
  class InstrumentQuerySet(QuerySet):
24
+ def filter_active_at_date(self, val_date: date):
25
+ return self.filter(
26
+ (Q(delisted_date__isnull=True) | Q(delisted_date__gte=val_date))
27
+ & (Q(inception_date__isnull=True) | Q(inception_date__lte=val_date))
28
+ )
29
+
23
30
  def annotate_classification_for_group(
24
31
  self, classification_group, classification_height: int = 0, **kwargs
25
32
  ) -> QuerySet:
@@ -2,7 +2,7 @@ from typing import Optional
2
2
 
3
3
  from django.utils.translation import gettext as _
4
4
  from wbcore.contrib.color.enums import WBColor
5
- from wbcore.enums import Operator
5
+ from wbcore.enums import Operator, Unit
6
6
  from wbcore.metadata.configs import display as dp
7
7
  from wbcore.metadata.configs.display.instance_display import (
8
8
  Display,
@@ -82,16 +82,17 @@ class InstrumentListThroughModelDisplayConfig(dp.DisplayViewConfig):
82
82
  def get_list_display(self) -> Optional[dp.ListDisplay]:
83
83
  fields = []
84
84
  if self.view.kwargs.get("instrument_id", None):
85
- fields = [dp.Field(key="instrument_list", label="Instrument List")]
86
- if self.view.kwargs.get("instrument_list_id", None):
87
- fields = [dp.Field(key="instrument", label="Instrument")]
85
+ fields = [dp.Field(key="instrument_list", label="Instrument List", width=Unit.PIXEL(250))]
86
+ elif self.view.kwargs.get("instrument_list_id", None):
87
+ fields = [
88
+ dp.Field(key="instrument", label="Instrument", width=Unit.PIXEL(300)),
89
+ dp.Field(key="instrument_str", label="Instrument Scraped", width=Unit.PIXEL(300)),
90
+ ]
88
91
  fields.extend(
89
92
  [
90
- dp.Field(key="instrument_str", label="Instrument Scraped"),
91
- dp.Field(key="from_date", label="From Date"),
92
- dp.Field(key="to_date", label="To Date"),
93
- dp.Field(key="comment", label="Comment"),
94
- dp.Field(key="validated", label="Validated"),
93
+ dp.Field(key="from_date", label="From Date", width=Unit.PIXEL(125)),
94
+ dp.Field(key="to_date", label="To Date", width=Unit.PIXEL(125)),
95
+ dp.Field(key="comment", label="Comment", width=Unit.PIXEL(350)),
95
96
  ]
96
97
  )
97
98
  return dp.ListDisplay(
@@ -219,7 +219,7 @@ class InstrumentDisplayConfig(DisplayViewConfig):
219
219
  ),
220
220
  ),
221
221
  Page(
222
- title="Additional Informations",
222
+ title="Classifications & Lists",
223
223
  layouts={
224
224
  default(): Layout(
225
225
  grid_template_areas=[
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbfdm
3
- Version: 1.49.1
3
+ Version: 1.49.3
4
4
  Summary: The workbench module ensures rapid access to diverse financial data (market, fundamental, forecasts, ESG), with features for storing instruments, classifying them, and conducting financial analysis.
5
5
  Author-email: Christopher Wittlinger <c.wittlinger@stainly.com>
6
6
  Requires-Dist: roman==4.*
@@ -38,7 +38,7 @@ wbfdm/backends/dto.py,sha256=5IdeGVsrk8trEi9rqtq-zisqiEDE_VLBP8RxlfZZnjk,596
38
38
  wbfdm/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
39
39
  wbfdm/contrib/dsws/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
40
40
  wbfdm/contrib/dsws/client.py,sha256=C598w5P85kvX7_gR0Yf-WHRLj77HqztUhofBMl3JWAE,14508
41
- wbfdm/contrib/dsws/dataloaders/market_data.py,sha256=TVL0Vzmg8hDzjbqBWx1342dvT_qC5gVp8E4i3hVcivA,6003
41
+ wbfdm/contrib/dsws/dataloaders/market_data.py,sha256=7Vj64nLqJAA3BiNeJPr3uLnnZ5kFOY2XGyAAJRL7vOk,6097
42
42
  wbfdm/contrib/internal/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
43
  wbfdm/contrib/internal/dataloaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
44
44
  wbfdm/contrib/internal/dataloaders/market_data.py,sha256=aoWSMamtnMbejYZrHzr37dQCG40nuA3fNBQNOyqhceQ,3260
@@ -100,7 +100,7 @@ wbfdm/contrib/qa/dataloaders/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NM
100
100
  wbfdm/contrib/qa/dataloaders/adjustments.py,sha256=DQEexOLA7WyBB1dZJHQd-6zbzyEIURgSSgS7bJRvXzQ,2980
101
101
  wbfdm/contrib/qa/dataloaders/corporate_actions.py,sha256=lWT6klrTXKqxiko2HGrxHH8E2C00FJS-AOX3IhglRrI,2912
102
102
  wbfdm/contrib/qa/dataloaders/financials.py,sha256=xUHpvhUkvmdPL_RyWCrs7XgChgTklX5qemmaXMedgkY,3475
103
- wbfdm/contrib/qa/dataloaders/market_data.py,sha256=M8l5Eadibe0BbABifcGW-T5S0fOE7O2E_7M8EvhYTso,6508
103
+ wbfdm/contrib/qa/dataloaders/market_data.py,sha256=FSQ50viiaiwlZ6pudXZN4eLJuKBDDW_My3x1XjFrkZs,6513
104
104
  wbfdm/contrib/qa/dataloaders/officers.py,sha256=vytlQJJxmn4Y5HfNh5mHJAvuIrrsQSkNO-sONyhxftY,2940
105
105
  wbfdm/contrib/qa/dataloaders/reporting_dates.py,sha256=q25ccB0pbGfLJLV1A1_AY1XYWJ_Fa10egY09L1J-C5A,2628
106
106
  wbfdm/contrib/qa/dataloaders/statements.py,sha256=hC6YErJcvBTmaAmzscgeC4sBK3lYE2U5eIKRIE9b_cs,10094
@@ -231,10 +231,10 @@ wbfdm/models/instruments/instrument_lists.py,sha256=GxfFyfYxEcJS36LAarHja49TOM8f
231
231
  wbfdm/models/instruments/instrument_prices.py,sha256=WCaFMZ9sF7xeGTp9jkq7TA8RfYHrwvTjujzqgCKj9SI,22070
232
232
  wbfdm/models/instruments/instrument_relationships.py,sha256=zpCZCnt5CqIg5bd6le_6TyirsSwGV2NaqTVKw3bd5vM,10660
233
233
  wbfdm/models/instruments/instrument_requests.py,sha256=XbpofRS8WHadHlTFjvXJyd0o7K9r2pzJtnpjVQZOLdI,7832
234
- wbfdm/models/instruments/instruments.py,sha256=jbk3rsTIddstWi6DfFPt_UHtthQb0BUtOZUwA2gocJA,39573
234
+ wbfdm/models/instruments/instruments.py,sha256=T0Ey5tMbUnA8DMroY1c959hOL9bI-CwTZnq5XhxCmi4,39934
235
235
  wbfdm/models/instruments/options.py,sha256=hFprq7B5t4ctz8nVqzFsBEzftq_KDUSsSXl1zJyh7tE,7094
236
236
  wbfdm/models/instruments/private_equities.py,sha256=uzwZi8IkmCKAHVTxnuFya9tehx7kh57sTlTEi1ieDaM,2198
237
- wbfdm/models/instruments/querysets.py,sha256=c5Op5VxR0A0uRPGHmnLJ6b7d2X5Kb5IX5bnk7MUfTjA,6475
237
+ wbfdm/models/instruments/querysets.py,sha256=gL-uC5MfsX58RInK64Pok49tqeZhZY7xKPvPiwmraSQ,6732
238
238
  wbfdm/models/instruments/utils.py,sha256=88jnWINSSC0OwH-mCEOPLZXuhBCtEsxBpSaZ38GteaE,1365
239
239
  wbfdm/models/instruments/llm/__init__.py,sha256=dSmxRmEWb0A4O_lUoWuRKt2mBtUuLCTPVVJqGyi_n40,52
240
240
  wbfdm/models/instruments/llm/create_instrument_news_relationships.py,sha256=Eza39rlkNJxpURroIsJLImKC6F-KtTmkdjHn1kv4F3Q,3439
@@ -294,10 +294,10 @@ wbfdm/viewsets/configs/display/classifications.py,sha256=xolaLg6WDG7Dtwd3gQXWElm
294
294
  wbfdm/viewsets/configs/display/esg.py,sha256=NcBZDxkIsGd-APYt4yJRNJjfmbmkC0O-H1q7fg_bBcU,3640
295
295
  wbfdm/viewsets/configs/display/exchanges.py,sha256=uo-rh_20FjreGmqAiPbU0zTZ-I2CoV0bBC4uxX4hQbs,1946
296
296
  wbfdm/viewsets/configs/display/financial_summary.py,sha256=K8CPV9uy0wsK-yLQIDTqMAXTb-W1-pUp6OCMwii7jYo,4738
297
- wbfdm/viewsets/configs/display/instrument_lists.py,sha256=b0dq6py5Cn-_lONc1KXLoZydJ-LgOGpkB23QbLeQYBI,5124
297
+ wbfdm/viewsets/configs/display/instrument_lists.py,sha256=UF_M41sBDDxGLDlKxLdAHqo8S1iHJfvIwZbLuoeaGuA,5239
298
298
  wbfdm/viewsets/configs/display/instrument_prices.py,sha256=QWDIPxWfgJjqHNB0cEShw1jH7zRkIYhJK9jhTE983EA,6940
299
299
  wbfdm/viewsets/configs/display/instrument_requests.py,sha256=CarX1MGe64roHZETm2N4HsEMssHVI5mWw2xTUBjgi-k,5129
300
- wbfdm/viewsets/configs/display/instruments.py,sha256=RxW7fsfnmVdJqrqENflTIcOLuXABAYUbbedzTI7Jkdg,17418
300
+ wbfdm/viewsets/configs/display/instruments.py,sha256=6mypy-px8dl5b9-_vabsY-r3SLuGqwDAEW_N8n8aC9A,17418
301
301
  wbfdm/viewsets/configs/display/instruments_relationships.py,sha256=BLAl2ZciWR5Waf3qPd1QQwdiupgIf_wGK6rmYe9byuY,2480
302
302
  wbfdm/viewsets/configs/display/monthly_performances.py,sha256=ESsGTLhPmmXz3YjEWNjwaOjA1RNzVDKtJt3JILL2MMc,2973
303
303
  wbfdm/viewsets/configs/display/officers.py,sha256=qUwN9HPSSlT85aUSFNY-30550P35j3RZCYqRPj_rFAs,654
@@ -352,6 +352,6 @@ wbfdm/viewsets/statements/__init__.py,sha256=odxtFYUDICPmz8WCE3nx93EvKZLSPBEI4d7
352
352
  wbfdm/viewsets/statements/statements.py,sha256=kmtM0uZ3f7eJJe5gVmd-iVra9dHwTB9x12p7f5qTEx8,4084
353
353
  wbfdm/viewsets/technical_analysis/__init__.py,sha256=qtCIBg0uSiZeJq_1tEQFilnorMBkMe6uCMfqar6-cLE,77
354
354
  wbfdm/viewsets/technical_analysis/monthly_performances.py,sha256=O1j8CGfOranL74LqVvcf7jERaDIboEJZiBf_AbbVDQ8,3974
355
- wbfdm-1.49.1.dist-info/METADATA,sha256=CRBxSPPraUiOZsZ1eDYMa8pc5-A3n0uj-DoPAC8_bKk,737
356
- wbfdm-1.49.1.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
357
- wbfdm-1.49.1.dist-info/RECORD,,
355
+ wbfdm-1.49.3.dist-info/METADATA,sha256=2YCn-n0JG3nzg5cQU8_k_mjDX0IZPLwPOgi4E3cD5h4,737
356
+ wbfdm-1.49.3.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
357
+ wbfdm-1.49.3.dist-info/RECORD,,
File without changes