wbportfolio 1.51.0__py2.py3-none-any.whl → 1.51.2rc1__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 wbportfolio might be problematic. Click here for more details.

Files changed (31) hide show
  1. wbportfolio/analysis/claims.py +9 -13
  2. wbportfolio/factories/portfolio_cash_targets.py +1 -1
  3. wbportfolio/factories/portfolio_swing_pricings.py +1 -1
  4. wbportfolio/locale/de/LC_MESSAGES/django.mo +0 -0
  5. wbportfolio/locale/de/LC_MESSAGES/django.po +51 -52
  6. wbportfolio/locale/en/LC_MESSAGES/django.mo +0 -0
  7. wbportfolio/locale/en/LC_MESSAGES/django.po +195 -0
  8. wbportfolio/locale/fr/LC_MESSAGES/django.mo +0 -0
  9. wbportfolio/locale/fr/LC_MESSAGES/django.po +52 -53
  10. wbportfolio/serializers/products.py +5 -1
  11. wbportfolio/serializers/signals.py +1 -1
  12. wbportfolio/viewsets/adjustments.py +2 -0
  13. wbportfolio/viewsets/configs/buttons/products.py +15 -4
  14. wbportfolio/viewsets/configs/endpoints/__init__.py +1 -1
  15. wbportfolio/viewsets/configs/endpoints/adjustments.py +7 -7
  16. wbportfolio/viewsets/configs/endpoints/assets.py +6 -60
  17. wbportfolio/viewsets/configs/endpoints/claim.py +0 -9
  18. wbportfolio/viewsets/configs/endpoints/esg.py +0 -8
  19. wbportfolio/viewsets/configs/endpoints/fees.py +2 -14
  20. wbportfolio/viewsets/configs/endpoints/portfolio_relationship.py +0 -7
  21. wbportfolio/viewsets/configs/endpoints/portfolios.py +7 -20
  22. wbportfolio/viewsets/configs/endpoints/positions.py +0 -7
  23. wbportfolio/viewsets/configs/endpoints/product_performance.py +1 -8
  24. wbportfolio/viewsets/configs/endpoints/products.py +0 -6
  25. wbportfolio/viewsets/configs/endpoints/trades.py +5 -6
  26. wbportfolio/viewsets/configs/endpoints/transactions.py +1 -10
  27. wbportfolio/viewsets/configs/menu/trades.py +0 -1
  28. {wbportfolio-1.51.0.dist-info → wbportfolio-1.51.2rc1.dist-info}/METADATA +1 -1
  29. {wbportfolio-1.51.0.dist-info → wbportfolio-1.51.2rc1.dist-info}/RECORD +31 -27
  30. {wbportfolio-1.51.0.dist-info → wbportfolio-1.51.2rc1.dist-info}/WHEEL +0 -0
  31. {wbportfolio-1.51.0.dist-info → wbportfolio-1.51.2rc1.dist-info}/licenses/LICENSE +0 -0
@@ -57,15 +57,15 @@ class ConsolidatedTradeSummary:
57
57
  self.pivot = pivot
58
58
  self.pivot_label = pivot_label
59
59
  self.queryset = self.queryset.annotate(
60
- net_value=InstrumentPrice.subquery_closest_value(
61
- "net_value", date_name="date", instrument_pk_name="product__pk", date_lookup="exact"
62
- ),
63
- fx_rate=CurrencyFXRates.get_fx_rates_subquery("date", lookup_expr="exact"),
64
- aum=ExpressionWrapper(F("fx_rate") * F("net_value") * F("shares"), output_field=DecimalField()),
65
60
  internal_trade=F("trade__marked_as_internal"),
66
61
  date_considered=ExpressionWrapper(
67
62
  Greatest("trade__transaction_date", "date") + 1, output_field=DateField()
68
63
  ),
64
+ net_value=InstrumentPrice.subquery_closest_value(
65
+ "net_value", date_name="date_considered", instrument_pk_name="product__pk", date_lookup="exact"
66
+ ),
67
+ fx_rate=CurrencyFXRates.get_fx_rates_subquery("date_considered", lookup_expr="exact"),
68
+ aum=ExpressionWrapper(F("fx_rate") * F("net_value") * F("shares"), output_field=DecimalField()),
69
69
  )
70
70
  self.queryset = Account.annotate_root_account_info(self.queryset)
71
71
 
@@ -154,7 +154,7 @@ class ConsolidatedTradeSummary:
154
154
  def get_aum_df(self) -> pd.DataFrame:
155
155
  df = self.df.copy().drop(columns=["internal_trade"])
156
156
  df.loc[df.date <= self.start_date, "sum_shares_start"] = df.shares
157
- df.loc[df.date <= self.end_date, "sum_shares_end"] = df.shares
157
+ df.loc[df.date < self.end_date, "sum_shares_end"] = df.shares
158
158
  df = df.fillna(0)
159
159
  # Prepare dataframe
160
160
  df["sum_aum_start"] = df.sum_shares_start * df.price_start
@@ -190,7 +190,7 @@ class ConsolidatedTradeSummary:
190
190
  df.loc[df["aum"] < 0, "aum"] = 0
191
191
  elif only_negative:
192
192
  df.loc[df["aum"] > 0, "aum"] = 0
193
- df = df[(df["date"] < self.end_date) & (df["date"] >= self.start_date)]
193
+ df = df[((df["date"] > self.start_date) & (df["date"] <= self.end_date))]
194
194
  df["date"] = pd.to_datetime(df["date"])
195
195
  df["period"] = "sum_nnm_" + df.date.dt.year.astype(str) + "-" + df.date.dt.month.map("{:02}".format)
196
196
  df = df[["id", "period", "aum"]].groupby(["id", "period"]).sum().reset_index()
@@ -228,12 +228,8 @@ class ConsolidatedTradeSummary:
228
228
  ),
229
229
  fill_value=0,
230
230
  )
231
- df = df.reset_index().dropna()[["id", "date", "aum_sparkline"]]
232
- return (
233
- df.groupby("id")
234
- .apply(lambda o: list(zip(o["date"].dt.strftime("%Y-%m-%d"), o["aum_sparkline"])))
235
- .rename("aum_sparkline")
236
- )
231
+ df = df.reset_index(level=1)[["date", "aum_sparkline"]].apply(tuple, axis=1).rename("aum_sparkline")
232
+ return df.groupby("id").apply(list)
237
233
  return pd.DataFrame()
238
234
 
239
235
  def get_initial_investment_date_df(self) -> pd.DataFrame:
@@ -8,7 +8,7 @@ class PortfolioCashTargetFactory(factory.django.DjangoModelFactory):
8
8
  class Meta:
9
9
  model = PortfolioCashTarget
10
10
 
11
- valid_date = factory.Faker("date")
11
+ valid_date = factory.Faker("date_object")
12
12
  portfolio = factory.SubFactory(PortfolioFactory)
13
13
  min_target = factory.Faker("pydecimal", left_digits=0, right_digits=4, max_value=0.01)
14
14
  target = factory.Faker("pydecimal", left_digits=0, right_digits=4, max_value=0.01)
@@ -8,7 +8,7 @@ class PortfolioSwingPricingFactory(factory.django.DjangoModelFactory):
8
8
  class Meta:
9
9
  model = PortfolioSwingPricing
10
10
 
11
- valid_date = factory.Faker("date")
11
+ valid_date = factory.Faker("date_object")
12
12
  portfolio = factory.SubFactory(PortfolioFactory)
13
13
  negative_threshold = factory.Faker("pydecimal", left_digits=0, right_digits=4, min_value=-0.99, max_value=-0.01)
14
14
  negative_swing_factor = factory.Faker("pydecimal", left_digits=0, right_digits=4, min_value=-0.99, max_value=-0.01)
@@ -8,190 +8,189 @@ msgid ""
8
8
  msgstr ""
9
9
  "Project-Id-Version: PACKAGE VERSION\n"
10
10
  "Report-Msgid-Bugs-To: \n"
11
- "POT-Creation-Date: 2025-05-20 09:31+0200\n"
12
- "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
13
- "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
14
- "Language-Team: LANGUAGE <LL@li.org>\n"
15
- "Language: \n"
11
+ "POT-Creation-Date: 2025-05-30 11:37+0200\n"
12
+ "PO-Revision-Date: 2025-05-30 09:40+0000\n"
13
+ "Language-Team: German (https://app.transifex.com/stainly/teams/171242/de/)\n"
16
14
  "MIME-Version: 1.0\n"
17
15
  "Content-Type: text/plain; charset=UTF-8\n"
18
16
  "Content-Transfer-Encoding: 8bit\n"
17
+ "Language: de\n"
19
18
  "Plural-Forms: nplurals=2; plural=(n != 1);\n"
20
- #: wbportfolio/contrib/company_portfolio/configs/display.py:25
21
- #: wbportfolio/contrib/company_portfolio/configs/display.py:29
19
+
20
+ #: contrib/company_portfolio/configs/display.py:25
21
+ #: contrib/company_portfolio/configs/display.py:29
22
22
  msgid "AUM By Product"
23
23
  msgstr ""
24
24
 
25
- #: wbportfolio/contrib/company_portfolio/configs/display.py:44
26
- #: wbportfolio/contrib/company_portfolio/configs/display.py:48
25
+ #: contrib/company_portfolio/configs/display.py:44
26
+ #: contrib/company_portfolio/configs/display.py:48
27
27
  msgid "AUM"
28
28
  msgstr ""
29
29
 
30
- #: wbportfolio/contrib/company_portfolio/configs/display.py:84
31
- #: wbportfolio/contrib/company_portfolio/configs/display.py:88
30
+ #: contrib/company_portfolio/configs/display.py:84
31
+ #: contrib/company_portfolio/configs/display.py:88
32
32
  msgid "Asset Allocation"
33
33
  msgstr ""
34
34
 
35
- #: wbportfolio/contrib/company_portfolio/configs/display.py:103
36
- #: wbportfolio/contrib/company_portfolio/configs/display.py:107
35
+ #: contrib/company_portfolio/configs/display.py:103
36
+ #: contrib/company_portfolio/configs/display.py:107
37
37
  msgid "Geographic Focus"
38
38
  msgstr ""
39
39
 
40
- #: wbportfolio/contrib/company_portfolio/configs/display.py:124
40
+ #: contrib/company_portfolio/configs/display.py:124
41
41
  msgid "Customer Information"
42
42
  msgstr ""
43
43
 
44
- #: wbportfolio/models/reconciliations/account_reconciliation_lines.py:118
44
+ #: models/reconciliations/account_reconciliation_lines.py:118
45
45
  msgid "The last share price of the product"
46
46
  msgstr ""
47
47
 
48
- #: wbportfolio/models/reconciliations/account_reconciliation_lines.py:127
48
+ #: models/reconciliations/account_reconciliation_lines.py:127
49
49
  msgid "The number of shares computed through the Workbench"
50
50
  msgstr ""
51
51
 
52
- #: wbportfolio/models/reconciliations/account_reconciliation_lines.py:133
52
+ #: models/reconciliations/account_reconciliation_lines.py:133
53
53
  msgid "The nominal value computed through the Workbench"
54
54
  msgstr ""
55
55
 
56
- #: wbportfolio/models/reconciliations/account_reconciliation_lines.py:140
56
+ #: models/reconciliations/account_reconciliation_lines.py:140
57
57
  msgid ""
58
58
  "The number of shares externally provided through the Account holder. "
59
59
  "Initially set to the number of shares computed through the Workbench"
60
60
  msgstr ""
61
61
 
62
- #: wbportfolio/models/reconciliations/account_reconciliation_lines.py:148
62
+ #: models/reconciliations/account_reconciliation_lines.py:148
63
63
  msgid ""
64
64
  "The nominal value externally provided through the Account holder. Initially "
65
65
  "set to the number of shares computed through the Workbench"
66
66
  msgstr ""
67
67
 
68
- #: wbportfolio/models/reconciliations/account_reconciliation_lines.py:155
68
+ #: models/reconciliations/account_reconciliation_lines.py:155
69
69
  msgid "Account Reconciliation (Product)"
70
70
  msgstr ""
71
71
 
72
- #: wbportfolio/models/reconciliations/account_reconciliation_lines.py:156
72
+ #: models/reconciliations/account_reconciliation_lines.py:156
73
73
  msgid "Account Reconciliation (Products)"
74
74
  msgstr ""
75
75
 
76
- #: wbportfolio/models/reconciliations/reconciliations.py:19
76
+ #: models/reconciliations/reconciliations.py:19
77
77
  msgid "Approved By"
78
78
  msgstr ""
79
79
 
80
- #: wbportfolio/models/reconciliations/reconciliations.py:22
80
+ #: models/reconciliations/reconciliations.py:22
81
81
  msgid "Approved Timestamp"
82
82
  msgstr ""
83
83
 
84
- #: wbportfolio/models/transactions/claim.py:338
85
- #: wbportfolio/models/transactions/claim.py:341
86
- #: wbportfolio/models/transactions/claim.py:344
84
+ #: models/transactions/claim.py:338 models/transactions/claim.py:341
85
+ #: models/transactions/claim.py:344
87
86
  msgid "With this status, this has to be provided."
88
87
  msgstr ""
89
88
 
90
- #: wbportfolio/models/transactions/rebalancing.py:81
89
+ #: models/transactions/rebalancing.py:81
91
90
  msgid "Evaluation Frequency"
92
91
  msgstr ""
93
92
 
94
- #: wbportfolio/models/transactions/rebalancing.py:82
93
+ #: models/transactions/rebalancing.py:82
95
94
  msgid "The Evaluation Frequency in RRULE format"
96
95
  msgstr ""
97
96
 
98
- #: wbportfolio/models/transactions/trade_proposals.py:473
97
+ #: models/transactions/trade_proposals.py:480
99
98
  msgid "All trades need to be draft before submitting"
100
99
  msgstr ""
101
100
 
102
- #: wbportfolio/models/transactions/trade_proposals.py:482
101
+ #: models/transactions/trade_proposals.py:489
103
102
  msgid "There is no valid trade on this proposal"
104
103
  msgstr ""
105
104
 
106
- #: wbportfolio/models/transactions/trade_proposals.py:550
105
+ #: models/transactions/trade_proposals.py:557
107
106
  msgid "The portfolio does not allow manual rebalanced"
108
107
  msgstr ""
109
108
 
110
- #: wbportfolio/models/transactions/trade_proposals.py:553
109
+ #: models/transactions/trade_proposals.py:560
111
110
  msgid ""
112
111
  "At least one trade needs to be submitted to be able to approve this proposal"
113
112
  msgstr ""
114
113
 
115
- #: wbportfolio/models/transactions/trade_proposals.py:557
114
+ #: models/transactions/trade_proposals.py:564
116
115
  msgid ""
117
116
  "The portfolio needs to be a model portfolio in order to approve this trade "
118
117
  "proposal manually"
119
118
  msgstr ""
120
119
 
121
- #: wbportfolio/models/transactions/trade_proposals.py:560
120
+ #: models/transactions/trade_proposals.py:567
122
121
  msgid "The pre trades rules did not passed successfully"
123
122
  msgstr ""
124
123
 
125
- #: wbportfolio/models/transactions/trade_proposals.py:592
124
+ #: models/transactions/trade_proposals.py:599
126
125
  msgid ""
127
126
  "At least one trade needs to be submitted to be able to deny this proposal"
128
127
  msgstr ""
129
128
 
130
- #: wbportfolio/models/transactions/trade_proposals.py:671
129
+ #: models/transactions/trade_proposals.py:668
131
130
  msgid ""
132
131
  "The portfolio needs to be a model portfolio in order to revert this trade "
133
132
  "proposal manually"
134
133
  msgstr ""
135
134
 
136
- #: wbportfolio/models/transactions/trades.py:324
135
+ #: models/transactions/trades.py:324
137
136
  msgid "Cannot execute a trade without a valid quote price"
138
137
  msgstr ""
139
138
 
140
- #: wbportfolio/models/transactions/trades.py:327
139
+ #: models/transactions/trades.py:327
141
140
  msgid ""
142
141
  "The portfolio needs to be a model portfolio in order to execute this trade "
143
142
  "manually"
144
143
  msgstr ""
145
144
 
146
- #: wbportfolio/viewsets/configs/display/portfolios.py:105
145
+ #: viewsets/configs/display/portfolios.py:105
147
146
  msgid "Linked Instruments"
148
147
  msgstr ""
149
148
 
150
- #: wbportfolio/viewsets/configs/display/portfolios.py:112
149
+ #: viewsets/configs/display/portfolios.py:112
151
150
  msgid "Dependency Portfolios"
152
151
  msgstr ""
153
152
 
154
- #: wbportfolio/viewsets/configs/display/portfolios.py:119
153
+ #: viewsets/configs/display/portfolios.py:119
155
154
  msgid "Preferred Classification"
156
155
  msgstr ""
157
156
 
158
- #: wbportfolio/viewsets/configs/display/products.py:26
159
- #: wbportfolio/viewsets/configs/display/products.py:156
157
+ #: viewsets/configs/display/products.py:26
158
+ #: viewsets/configs/display/products.py:156
160
159
  msgid "Information"
161
160
  msgstr ""
162
161
 
163
- #: wbportfolio/viewsets/configs/display/products.py:62
162
+ #: viewsets/configs/display/products.py:62
164
163
  msgid "Performance"
165
164
  msgstr ""
166
165
 
167
- #: wbportfolio/viewsets/configs/display/products.py:144
166
+ #: viewsets/configs/display/products.py:144
168
167
  msgid "Classifications"
169
168
  msgstr ""
170
169
 
171
- #: wbportfolio/viewsets/configs/display/products.py:148
170
+ #: viewsets/configs/display/products.py:148
172
171
  msgid "Fees"
173
172
  msgstr ""
174
173
 
175
- #: wbportfolio/viewsets/configs/display/products.py:166
174
+ #: viewsets/configs/display/products.py:166
176
175
  msgid "White Label Customers"
177
176
  msgstr ""
178
177
 
179
- #: wbportfolio/viewsets/configs/display/products.py:170
178
+ #: viewsets/configs/display/products.py:170
180
179
  msgid "Portfolios"
181
180
  msgstr ""
182
181
 
183
- #: wbportfolio/viewsets/configs/display/products.py:173
182
+ #: viewsets/configs/display/products.py:173
184
183
  msgid "Related Instruments"
185
184
  msgstr ""
186
185
 
187
- #: wbportfolio/viewsets/configs/display/products.py:178
186
+ #: viewsets/configs/display/products.py:178
188
187
  msgid "Index"
189
188
  msgstr ""
190
189
 
191
- #: wbportfolio/viewsets/configs/display/products.py:180
190
+ #: viewsets/configs/display/products.py:180
192
191
  msgid "Roles"
193
192
  msgstr ""
194
193
 
195
- #: wbportfolio/viewsets/configs/display/products.py:183
194
+ #: viewsets/configs/display/products.py:183
196
195
  msgid "Preferred Classification per Instrument"
197
196
  msgstr ""
@@ -0,0 +1,195 @@
1
+ # SOME DESCRIPTIVE TITLE.
2
+ # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
3
+ # This file is distributed under the same license as the PACKAGE package.
4
+ # FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
5
+ #
6
+ msgid ""
7
+ msgstr ""
8
+ "Project-Id-Version: PACKAGE VERSION\n"
9
+ "Report-Msgid-Bugs-To: \n"
10
+ "POT-Creation-Date: 2025-05-30 11:37+0200\n"
11
+ "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
12
+ "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
13
+ "Language-Team: LANGUAGE <LL@li.org>\n"
14
+ "Language: \n"
15
+ "MIME-Version: 1.0\n"
16
+ "Content-Type: text/plain; charset=UTF-8\n"
17
+ "Content-Transfer-Encoding: 8bit\n"
18
+
19
+ #: contrib/company_portfolio/configs/display.py:25
20
+ #: contrib/company_portfolio/configs/display.py:29
21
+ msgid "AUM By Product"
22
+ msgstr ""
23
+
24
+ #: contrib/company_portfolio/configs/display.py:44
25
+ #: contrib/company_portfolio/configs/display.py:48
26
+ msgid "AUM"
27
+ msgstr ""
28
+
29
+ #: contrib/company_portfolio/configs/display.py:84
30
+ #: contrib/company_portfolio/configs/display.py:88
31
+ msgid "Asset Allocation"
32
+ msgstr ""
33
+
34
+ #: contrib/company_portfolio/configs/display.py:103
35
+ #: contrib/company_portfolio/configs/display.py:107
36
+ msgid "Geographic Focus"
37
+ msgstr ""
38
+
39
+ #: contrib/company_portfolio/configs/display.py:124
40
+ msgid "Customer Information"
41
+ msgstr ""
42
+
43
+ #: models/reconciliations/account_reconciliation_lines.py:118
44
+ msgid "The last share price of the product"
45
+ msgstr ""
46
+
47
+ #: models/reconciliations/account_reconciliation_lines.py:127
48
+ msgid "The number of shares computed through the Workbench"
49
+ msgstr ""
50
+
51
+ #: models/reconciliations/account_reconciliation_lines.py:133
52
+ msgid "The nominal value computed through the Workbench"
53
+ msgstr ""
54
+
55
+ #: models/reconciliations/account_reconciliation_lines.py:140
56
+ msgid ""
57
+ "The number of shares externally provided through the Account holder. "
58
+ "Initially set to the number of shares computed through the Workbench"
59
+ msgstr ""
60
+
61
+ #: models/reconciliations/account_reconciliation_lines.py:148
62
+ msgid ""
63
+ "The nominal value externally provided through the Account holder. Initially "
64
+ "set to the number of shares computed through the Workbench"
65
+ msgstr ""
66
+
67
+ #: models/reconciliations/account_reconciliation_lines.py:155
68
+ msgid "Account Reconciliation (Product)"
69
+ msgstr ""
70
+
71
+ #: models/reconciliations/account_reconciliation_lines.py:156
72
+ msgid "Account Reconciliation (Products)"
73
+ msgstr ""
74
+
75
+ #: models/reconciliations/reconciliations.py:19
76
+ msgid "Approved By"
77
+ msgstr ""
78
+
79
+ #: models/reconciliations/reconciliations.py:22
80
+ msgid "Approved Timestamp"
81
+ msgstr ""
82
+
83
+ #: models/transactions/claim.py:338 models/transactions/claim.py:341
84
+ #: models/transactions/claim.py:344
85
+ msgid "With this status, this has to be provided."
86
+ msgstr ""
87
+
88
+ #: models/transactions/rebalancing.py:81
89
+ msgid "Evaluation Frequency"
90
+ msgstr ""
91
+
92
+ #: models/transactions/rebalancing.py:82
93
+ msgid "The Evaluation Frequency in RRULE format"
94
+ msgstr ""
95
+
96
+ #: models/transactions/trade_proposals.py:480
97
+ msgid "All trades need to be draft before submitting"
98
+ msgstr ""
99
+
100
+ #: models/transactions/trade_proposals.py:489
101
+ msgid "There is no valid trade on this proposal"
102
+ msgstr ""
103
+
104
+ #: models/transactions/trade_proposals.py:557
105
+ msgid "The portfolio does not allow manual rebalanced"
106
+ msgstr ""
107
+
108
+ #: models/transactions/trade_proposals.py:560
109
+ msgid ""
110
+ "At least one trade needs to be submitted to be able to approve this proposal"
111
+ msgstr ""
112
+
113
+ #: models/transactions/trade_proposals.py:564
114
+ msgid ""
115
+ "The portfolio needs to be a model portfolio in order to approve this trade "
116
+ "proposal manually"
117
+ msgstr ""
118
+
119
+ #: models/transactions/trade_proposals.py:567
120
+ msgid "The pre trades rules did not passed successfully"
121
+ msgstr ""
122
+
123
+ #: models/transactions/trade_proposals.py:599
124
+ msgid ""
125
+ "At least one trade needs to be submitted to be able to deny this proposal"
126
+ msgstr ""
127
+
128
+ #: models/transactions/trade_proposals.py:668
129
+ msgid ""
130
+ "The portfolio needs to be a model portfolio in order to revert this trade "
131
+ "proposal manually"
132
+ msgstr ""
133
+
134
+ #: models/transactions/trades.py:324
135
+ msgid "Cannot execute a trade without a valid quote price"
136
+ msgstr ""
137
+
138
+ #: models/transactions/trades.py:327
139
+ msgid ""
140
+ "The portfolio needs to be a model portfolio in order to execute this trade "
141
+ "manually"
142
+ msgstr ""
143
+
144
+ #: viewsets/configs/display/portfolios.py:105
145
+ msgid "Linked Instruments"
146
+ msgstr ""
147
+
148
+ #: viewsets/configs/display/portfolios.py:112
149
+ msgid "Dependency Portfolios"
150
+ msgstr ""
151
+
152
+ #: viewsets/configs/display/portfolios.py:119
153
+ msgid "Preferred Classification"
154
+ msgstr ""
155
+
156
+ #: viewsets/configs/display/products.py:26
157
+ #: viewsets/configs/display/products.py:156
158
+ msgid "Information"
159
+ msgstr ""
160
+
161
+ #: viewsets/configs/display/products.py:62
162
+ msgid "Performance"
163
+ msgstr ""
164
+
165
+ #: viewsets/configs/display/products.py:144
166
+ msgid "Classifications"
167
+ msgstr ""
168
+
169
+ #: viewsets/configs/display/products.py:148
170
+ msgid "Fees"
171
+ msgstr ""
172
+
173
+ #: viewsets/configs/display/products.py:166
174
+ msgid "White Label Customers"
175
+ msgstr ""
176
+
177
+ #: viewsets/configs/display/products.py:170
178
+ msgid "Portfolios"
179
+ msgstr ""
180
+
181
+ #: viewsets/configs/display/products.py:173
182
+ msgid "Related Instruments"
183
+ msgstr ""
184
+
185
+ #: viewsets/configs/display/products.py:178
186
+ msgid "Index"
187
+ msgstr ""
188
+
189
+ #: viewsets/configs/display/products.py:180
190
+ msgid "Roles"
191
+ msgstr ""
192
+
193
+ #: viewsets/configs/display/products.py:183
194
+ msgid "Preferred Classification per Instrument"
195
+ msgstr ""