wbfdm 1.52.5__py2.py3-none-any.whl → 1.53.0__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/admin/exchanges.py CHANGED
@@ -43,7 +43,7 @@ class ExchangeModelAdmin(admin.ModelAdmin):
43
43
  ("operating_mic_code", "operating_mic_name"),
44
44
  ("bbg_exchange_codes", "bbg_composite_primary", "bbg_composite"),
45
45
  ("refinitiv_identifier_code", "refinitiv_mnemonic"),
46
- ("country", "website"),
46
+ ("country", "website", "apply_round_lot_size"),
47
47
  ("comments",),
48
48
  )
49
49
  },
@@ -50,8 +50,8 @@ class InstrumentModelAdmin(admin.ModelAdmin):
50
50
  {
51
51
  "fields": (
52
52
  ("name", "name_repr", "computed_str"),
53
- ("parent", "instrument_type"),
54
- ("is_cash", "is_security", "is_managed", "is_investable_universe", "is_primary"),
53
+ ("parent", "instrument_type", "is_primary"),
54
+ ("is_cash", "is_security", "is_managed", "is_cash_equivalent", "is_investable_universe"),
55
55
  ("inception_date", "delisted_date"),
56
56
  ("primary_url", "additional_urls"),
57
57
  (
@@ -69,6 +69,7 @@ class InstrumentModelAdmin(admin.ModelAdmin):
69
69
  ("currency", "country", "headquarter_city", "headquarter_address"),
70
70
  (
71
71
  "exchange",
72
+ "round_lot_size",
72
73
  "import_source",
73
74
  "base_color",
74
75
  ),
@@ -55,8 +55,10 @@ class InstrumentLookup:
55
55
  instrument = None
56
56
 
57
57
  # We need to lookup ticker because some provider gives us ticker with or without space in it
58
+ exchange_lookup = {}
58
59
  if only_investable_universe:
59
60
  instruments = self.model.objects.filter(is_investable_universe=True)
61
+ exchange_lookup = {"exchange": exchange} if exchange else {"is_primary": True}
60
62
  else:
61
63
  instruments = self.model.objects.filter(is_security=True)
62
64
 
@@ -76,8 +78,14 @@ class InstrumentLookup:
76
78
  identifier_key != "refinitiv_identifier_code"
77
79
  ): # RIC cannot be uppercased because its symbology implies meaning for lowercase characters
78
80
  identifier = identifier.upper()
79
- instrument = instruments.get(**{identifier_key: identifier})
80
- break
81
+ # we try to lookup the instrument with the unique identifier
82
+ try:
83
+ instrument = instruments.get(**{identifier_key: identifier})
84
+ break
85
+ # if this return a multiple object exception, we assume there is at least one with the exchange provided or primary
86
+ except MultipleObjectsReturned:
87
+ instrument = instruments.get(**{identifier_key: identifier}, **exchange_lookup)
88
+ break
81
89
  if not instrument and not exact_lookup:
82
90
  if instrument_type:
83
91
  if isinstance(instrument_type, str): # in case we receive a key as instrument type
@@ -109,7 +117,6 @@ class InstrumentLookup:
109
117
  instruments_tmp = instruments.filter(exchange=exchange)
110
118
  if instruments_tmp.exists():
111
119
  instruments = instruments_tmp
112
-
113
120
  # last chance
114
121
  if name and instruments.count() > 1:
115
122
  instruments = instruments.annotate(similarity_score=TrigramSimilarity("name", name))
@@ -0,0 +1,23 @@
1
+ # Generated by Django 5.0.14 on 2025-07-02 07:50
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('wbfdm', '0030_alter_relatedinstrumentthroughmodel_related_type'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='exchange',
15
+ name='apply_round_lot_size',
16
+ field=models.BooleanField(default=True, help_text='If False, the quotes linked to this instrument will ignore their round lot size (will be considered 1).', verbose_name='Apply Round Lot Size'),
17
+ ),
18
+ migrations.AddField(
19
+ model_name='instrument',
20
+ name='round_lot_size',
21
+ field=models.IntegerField(default=1, help_text='A round lot (or board lot) is the normal unit of trading of a security.', verbose_name='Round Lot Size'),
22
+ ),
23
+ ]
@@ -152,7 +152,11 @@ class Exchange(WBModel):
152
152
  verbose_name="Comments",
153
153
  help_text="Any comments for this exchange",
154
154
  )
155
-
155
+ apply_round_lot_size = models.BooleanField(
156
+ default=True,
157
+ verbose_name="Apply Round Lot Size",
158
+ help_text="If False, the quotes linked to this instrument will ignore their round lot size (will be considered 1).",
159
+ )
156
160
  last_updated = models.DateTimeField(auto_now=True)
157
161
 
158
162
  objects = ExchangeManager()
@@ -312,6 +312,11 @@ class Instrument(ComplexToStringMixin, TagModelMixin, ImportMixin, InstrumentPMS
312
312
  exchange = models.ForeignKey(
313
313
  to="wbfdm.Exchange", null=True, blank=True, on_delete=models.PROTECT, related_name="instruments"
314
314
  )
315
+ round_lot_size = models.IntegerField(
316
+ default=1,
317
+ verbose_name="Round Lot Size",
318
+ help_text="A round lot (or board lot) is the normal unit of trading of a security.",
319
+ )
315
320
 
316
321
  source_id = models.CharField(max_length=64, null=True, blank=True)
317
322
  source = models.CharField(max_length=64, null=True, blank=True)
@@ -37,4 +37,5 @@ class ExchangeModelSerializer(wb_serializers.ModelSerializer):
37
37
  "_city",
38
38
  "city",
39
39
  "comments",
40
+ "apply_round_lot_size",
40
41
  )
@@ -35,7 +35,7 @@ class ExchangeDisplayConfig(DisplayViewConfig):
35
35
  [
36
36
  ["name", "mic_code", "operating_mic_code", "refinitiv_identifier_code"],
37
37
  [".", "bbg_exchange_codes", "bbg_composite_primary", "bbg_composite"],
38
- [repeat_field(2, "country"), "city", "website"],
38
+ ["country", "city", "website", "apply_round_lot_size"],
39
39
  [repeat_field(2, "opening_time"), repeat_field(2, "closing_time")],
40
40
  [repeat_field(4, "comments")],
41
41
  ]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: wbfdm
3
- Version: 1.52.5
3
+ Version: 1.53.0
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.*
@@ -11,11 +11,11 @@ wbfdm/utils.py,sha256=4cWrCpqXxHIjtSlt4DDPFvmtaqXw_H0nqhM6sGuXx0o,1938
11
11
  wbfdm/admin/__init__.py,sha256=Z1VtH_gjD71K79KcD-2Q2Lu_p_7j0akMZj7gNxdz1CQ,1398
12
12
  wbfdm/admin/classifications.py,sha256=g3z7v891I2km4T1DnY9HOlJhkI37UxevzwDsB4ufzqc,1141
13
13
  wbfdm/admin/esg.py,sha256=955cnYDPxYNTkhS5uiFTrf4EaxtpWrKbB1hBmcNMcvI,482
14
- wbfdm/admin/exchanges.py,sha256=a7XCxwN5lhlIo11SPZcasT6d_Ueqvu2vy5KZwWS5XqU,1418
14
+ wbfdm/admin/exchanges.py,sha256=ZrAfs8nuFqhLlg0pZMGKhKbVM_Nfv_AFen1EteZeyUU,1442
15
15
  wbfdm/admin/instrument_lists.py,sha256=GhdMhvclyXdpvlTaHxzsGaUjO9X2CQGk_N3pgJd2NCo,719
16
16
  wbfdm/admin/instrument_prices.py,sha256=dCiCALJAVOfIlM6KitytLJzq_9L-PYch-pu1fj7oftE,1894
17
17
  wbfdm/admin/instrument_requests.py,sha256=uOi6g2MwDVodwlJH5yGrLXxRMQ235007CvHFTMH4Flg,846
18
- wbfdm/admin/instruments.py,sha256=wVJUKV5sjQiX2xjkoQYrcs9or5G8VcYYbWVCxVlQWsg,3887
18
+ wbfdm/admin/instruments.py,sha256=eXMRPGeVkjvn_5UdwalTCIKFVbD4p5c8UDXwUQm5fpU,3951
19
19
  wbfdm/admin/instruments_relationships.py,sha256=i-F2y_w28R8mh4-Aex9mIh7K6qbjFNfg0VqwjQ-Mk9A,815
20
20
  wbfdm/admin/options.py,sha256=fWj3sFddVlpNshUWV6LDatZoyg6i5AqPFpuLJcs3lKA,2838
21
21
  wbfdm/analysis/__init__.py,sha256=ouAO2P5Y8i80tl0z3kUf2oyeO2-LsDwZUQ3SQ9evI5U,68
@@ -163,7 +163,7 @@ wbfdm/import_export/backends/refinitiv/mixin.py,sha256=DlNHOWOO71PgY0umaZd0Nbbjs
163
163
  wbfdm/import_export/backends/refinitiv/utils/__init__.py,sha256=Rz38xsLAHEyEwIuJksejYExEznlPJb9tRzwJ7JG9L1s,35
164
164
  wbfdm/import_export/backends/refinitiv/utils/controller.py,sha256=yG8V4C2TGhJdKwTeuMfaG1lzJ3MjNaV632KTe0nuym8,7348
165
165
  wbfdm/import_export/handlers/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
166
- wbfdm/import_export/handlers/instrument.py,sha256=4ElF54ke7eBlzZIXqGCEZQR563SkBbooxrEUsLOukdA,11516
166
+ wbfdm/import_export/handlers/instrument.py,sha256=ZtXwqoCh--_Bgn7mB_A7U2w1S6HfMr9MqFCc4VMw7ls,12071
167
167
  wbfdm/import_export/handlers/instrument_list.py,sha256=mZRfpJFi6BhhrjH2qaFEPqqCK2ybg-DQm43Uck7G9_w,4864
168
168
  wbfdm/import_export/handlers/instrument_price.py,sha256=RbNTo78zZuttzlVFKxJrHcW7DRfcsta7QDEI8OiiDrA,3498
169
169
  wbfdm/import_export/handlers/option.py,sha256=DtqqdOMEA-u3jWVjmxRPKJ8miENj_t1k2DzAZEoOtXU,2384
@@ -222,6 +222,7 @@ wbfdm/migrations/0027_remove_instrument_unique_ric_and_more.py,sha256=xO8pftdONz
222
222
  wbfdm/migrations/0028_instrumentprice_annualized_daily_volatility.py,sha256=pO5MKIH9sIduCj44n_13yy_OgwutTuCIiNzXwKrvqQ4,477
223
223
  wbfdm/migrations/0029_alter_instrumentprice_volume.py,sha256=0UFUwEaBcqiWjKw6un1gf8sluKCRRh9snDM4z4THDw8,510
224
224
  wbfdm/migrations/0030_alter_relatedinstrumentthroughmodel_related_type.py,sha256=10-89NB7-T7t3xFPpd4fYQkKejNR36UewIhe5_20QCo,565
225
+ wbfdm/migrations/0031_exchange_apply_round_lot_size_and_more.py,sha256=MqcHxgJIt67BEuEYK8vnJHhx_cGFw9Ca9Az2EvsDy1o,863
225
226
  wbfdm/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
226
227
  wbfdm/models/__init__.py,sha256=PWsLtlKJFDYycCohPbjsRLeWi1xaxEkZbaoUKo0yOBU,96
227
228
  wbfdm/models/fields.py,sha256=eQ_6EnDBMy0U7WzE2DsdXIXOJH5dFiIN2VbO2Svw4R0,3942
@@ -230,14 +231,14 @@ wbfdm/models/indicators.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
230
231
  wbfdm/models/esg/__init__.py,sha256=FEYbRFSdfoWRsfKVxM-h6TLobj5P8bYQlZPG1iD9RMQ,29
231
232
  wbfdm/models/esg/controversies.py,sha256=OnswX0ZXdO37h-AWpr5aTJXhyT3MTwAOwt5ZV25t5BY,2950
232
233
  wbfdm/models/exchanges/__init__.py,sha256=sScz2KX9fxhhmi4CEUssC8HCL4ENvrIqSSwk0_J7v-g,32
233
- wbfdm/models/exchanges/exchanges.py,sha256=FSxjEh3k2KLDJyJfzZg7iGUFZIxzQt__FYaDyPA66D0,7257
234
+ wbfdm/models/exchanges/exchanges.py,sha256=RmM5shyyuxEGN2Y3JmeSWyU-SbpVARrvVFW72HtHwfg,7502
234
235
  wbfdm/models/instruments/__init__.py,sha256=OvEkECJaCubBQC7B9yUrx15V982labvegeGXyEASVno,636
235
236
  wbfdm/models/instruments/classifications.py,sha256=EeZ_P8f1F1NfjUmLf9fDMF0iPM73qxQoArUfvjuCwHg,10906
236
237
  wbfdm/models/instruments/instrument_lists.py,sha256=GxfFyfYxEcJS36LAarHja49TOM8ffhIivpZX2-tPtZg,4234
237
238
  wbfdm/models/instruments/instrument_prices.py,sha256=4xDZ2ulwQ1grVuznchz3m3920LTmHkxWfiSLy-c2u0g,22306
238
239
  wbfdm/models/instruments/instrument_relationships.py,sha256=zpCZCnt5CqIg5bd6le_6TyirsSwGV2NaqTVKw3bd5vM,10660
239
240
  wbfdm/models/instruments/instrument_requests.py,sha256=XbpofRS8WHadHlTFjvXJyd0o7K9r2pzJtnpjVQZOLdI,7832
240
- wbfdm/models/instruments/instruments.py,sha256=fdzkikx8RN7syB54BAb_wIu2nvpLbmVk7GpWU-TAKCE,43836
241
+ wbfdm/models/instruments/instruments.py,sha256=3I7s5hHcIQcBKjVjF4go9SSTw3Kr1RX9vImYYctjszQ,44035
241
242
  wbfdm/models/instruments/options.py,sha256=hFprq7B5t4ctz8nVqzFsBEzftq_KDUSsSXl1zJyh7tE,7094
242
243
  wbfdm/models/instruments/private_equities.py,sha256=uzwZi8IkmCKAHVTxnuFya9tehx7kh57sTlTEi1ieDaM,2198
243
244
  wbfdm/models/instruments/querysets.py,sha256=zBY3lX_l0_gqIGjX4vkfn7DQ5QyF_okmIYZ6SV1Y6I4,7729
@@ -250,7 +251,7 @@ wbfdm/models/instruments/mixin/financials_serializer_fields.py,sha256=-OkpcUt1rZ
250
251
  wbfdm/models/instruments/mixin/instruments.py,sha256=W9v29cjST-5MAMMuXVnlH4ItdRTdoA_vMCkLUhQgW2s,9888
251
252
  wbfdm/serializers/__init__.py,sha256=AXb03RKHo6B0ts_IQOvx89n9wKG8pxiumYv9cr4EhvA,197
252
253
  wbfdm/serializers/esg.py,sha256=epoX8cjkPuVv45aW-Jf85-rSO_ZrSnXcTxMcadKdC-I,1086
253
- wbfdm/serializers/exchanges.py,sha256=vi5kFadYRQo-6CV2b56nrABpt80LPtjZumJVaBE4bcc,1175
254
+ wbfdm/serializers/exchanges.py,sha256=wYvy0XBS9tRFHqin23gABQ_pj3Rmsx1B075SZ5GqwDo,1211
254
255
  wbfdm/serializers/officers.py,sha256=yrBJqnwxS5Eq0aGcRKe0FbEYEvDFpZlb8gzgfU9pRyk,473
255
256
  wbfdm/serializers/instruments/__init__.py,sha256=bLgyuwpGN5Vq2PO5ueErXWHDInPy_191kieaV0_MAI4,1699
256
257
  wbfdm/serializers/instruments/classifications.py,sha256=DsrKkF0lFBTtNrVs0vhjkjjlK8mDSbGfvQODarYPbDA,5669
@@ -298,7 +299,7 @@ wbfdm/viewsets/configs/buttons/instruments.py,sha256=EhNxOu4WNMLwGGnThUjgu8uQa-o
298
299
  wbfdm/viewsets/configs/display/__init__.py,sha256=9ogNTPHvsuxPf53snrEGFhEPFqcO1sth5PkPBrqAfng,1024
299
300
  wbfdm/viewsets/configs/display/classifications.py,sha256=xolaLg6WDG7Dtwd3gQXWElmyH10GgaT03tL3a3PhKfE,5206
300
301
  wbfdm/viewsets/configs/display/esg.py,sha256=NcBZDxkIsGd-APYt4yJRNJjfmbmkC0O-H1q7fg_bBcU,3640
301
- wbfdm/viewsets/configs/display/exchanges.py,sha256=uo-rh_20FjreGmqAiPbU0zTZ-I2CoV0bBC4uxX4hQbs,1946
302
+ wbfdm/viewsets/configs/display/exchanges.py,sha256=ZzUxIjItwsp6K66XlGbPcqLtij8ebqmjwAFR-rsF-0I,1953
302
303
  wbfdm/viewsets/configs/display/financial_summary.py,sha256=K8CPV9uy0wsK-yLQIDTqMAXTb-W1-pUp6OCMwii7jYo,4738
303
304
  wbfdm/viewsets/configs/display/instrument_lists.py,sha256=UF_M41sBDDxGLDlKxLdAHqo8S1iHJfvIwZbLuoeaGuA,5239
304
305
  wbfdm/viewsets/configs/display/instrument_prices.py,sha256=CdZg-Fwd__DP0Ym8TBsupbVZzhoMbNfOJQKCmgKvwCc,4908
@@ -358,6 +359,6 @@ wbfdm/viewsets/statements/__init__.py,sha256=odxtFYUDICPmz8WCE3nx93EvKZLSPBEI4d7
358
359
  wbfdm/viewsets/statements/statements.py,sha256=gA6RCI8-B__JwjEb6OZxpn8Y-9aF-YQ3HIQ7e1vfJMw,4304
359
360
  wbfdm/viewsets/technical_analysis/__init__.py,sha256=qtCIBg0uSiZeJq_1tEQFilnorMBkMe6uCMfqar6-cLE,77
360
361
  wbfdm/viewsets/technical_analysis/monthly_performances.py,sha256=O1j8CGfOranL74LqVvcf7jERaDIboEJZiBf_AbbVDQ8,3974
361
- wbfdm-1.52.5.dist-info/METADATA,sha256=7sJCHj8jb4wQSh4DcU5qE1PwtkDNAzv_2omeYa4LsFA,768
362
- wbfdm-1.52.5.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
363
- wbfdm-1.52.5.dist-info/RECORD,,
362
+ wbfdm-1.53.0.dist-info/METADATA,sha256=bAcTLsii-aqrW8Ld2i86YX_H6CpaywPEX2vVt9K720Y,768
363
+ wbfdm-1.53.0.dist-info/WHEEL,sha256=tkmg4JIqwd9H8mL30xA7crRmoStyCtGp0VWshokd1Jc,105
364
+ wbfdm-1.53.0.dist-info/RECORD,,
File without changes