dub 0.23.1__py3-none-any.whl → 0.24.1__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.
- dub/_version.py +3 -3
- dub/commissions.py +600 -0
- dub/httpclient.py +7 -37
- dub/models/components/partnerenrolledevent.py +78 -0
- dub/models/operations/__init__.py +44 -14
- dub/models/operations/createcustomer.py +8 -0
- dub/models/operations/createpartner.py +81 -3
- dub/models/operations/getcustomer.py +8 -0
- dub/models/operations/getcustomers.py +8 -0
- dub/models/operations/listcommissions.py +252 -0
- dub/models/operations/updatecommission.py +150 -0
- dub/models/operations/updatecustomer.py +8 -0
- dub/partners.py +0 -310
- dub/sdk.py +3 -0
- {dub-0.23.1.dist-info → dub-0.24.1.dist-info}/METADATA +7 -4
- {dub-0.23.1.dist-info → dub-0.24.1.dist-info}/RECORD +18 -16
- dub/models/operations/updatepartnersale.py +0 -121
- {dub-0.23.1.dist-info → dub-0.24.1.dist-info}/LICENSE +0 -0
- {dub-0.23.1.dist-info → dub-0.24.1.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from dub.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
|
|
5
|
+
from dub.utils import FieldMetadata, QueryParamMetadata
|
|
6
|
+
from enum import Enum
|
|
7
|
+
import pydantic
|
|
8
|
+
from pydantic import model_serializer
|
|
9
|
+
from typing import Optional
|
|
10
|
+
from typing_extensions import Annotated, NotRequired, TypedDict
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Type(str, Enum):
|
|
14
|
+
CLICK = "click"
|
|
15
|
+
LEAD = "lead"
|
|
16
|
+
SALE = "sale"
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
class QueryParamStatus(str, Enum):
|
|
20
|
+
r"""Filter the list of commissions by their corresponding status."""
|
|
21
|
+
|
|
22
|
+
PENDING = "pending"
|
|
23
|
+
PROCESSED = "processed"
|
|
24
|
+
PAID = "paid"
|
|
25
|
+
REFUNDED = "refunded"
|
|
26
|
+
DUPLICATE = "duplicate"
|
|
27
|
+
FRAUD = "fraud"
|
|
28
|
+
CANCELED = "canceled"
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class ListCommissionsQueryParamSortBy(str, Enum):
|
|
32
|
+
r"""The field to sort the list of commissions by."""
|
|
33
|
+
|
|
34
|
+
CREATED_AT = "createdAt"
|
|
35
|
+
AMOUNT = "amount"
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
class ListCommissionsQueryParamSortOrder(str, Enum):
|
|
39
|
+
r"""The sort order for the list of commissions."""
|
|
40
|
+
|
|
41
|
+
ASC = "asc"
|
|
42
|
+
DESC = "desc"
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
class ListCommissionsQueryParamInterval(str, Enum):
|
|
46
|
+
r"""The interval to retrieve commissions for."""
|
|
47
|
+
|
|
48
|
+
TWENTY_FOURH = "24h"
|
|
49
|
+
SEVEND = "7d"
|
|
50
|
+
THIRTYD = "30d"
|
|
51
|
+
NINETYD = "90d"
|
|
52
|
+
ONEY = "1y"
|
|
53
|
+
MTD = "mtd"
|
|
54
|
+
QTD = "qtd"
|
|
55
|
+
YTD = "ytd"
|
|
56
|
+
ALL = "all"
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
class ListCommissionsRequestTypedDict(TypedDict):
|
|
60
|
+
type: NotRequired[Type]
|
|
61
|
+
customer_id: NotRequired[str]
|
|
62
|
+
r"""Filter the list of commissions by the associated customer."""
|
|
63
|
+
payout_id: NotRequired[str]
|
|
64
|
+
r"""Filter the list of commissions by the associated payout."""
|
|
65
|
+
partner_id: NotRequired[str]
|
|
66
|
+
r"""Filter the list of commissions by the associated partner."""
|
|
67
|
+
invoice_id: NotRequired[str]
|
|
68
|
+
r"""Filter the list of commissions by the associated invoice. Since invoiceId is unique on a per-program basis, this will only return one commission per invoice."""
|
|
69
|
+
status: NotRequired[QueryParamStatus]
|
|
70
|
+
r"""Filter the list of commissions by their corresponding status."""
|
|
71
|
+
sort_by: NotRequired[ListCommissionsQueryParamSortBy]
|
|
72
|
+
r"""The field to sort the list of commissions by."""
|
|
73
|
+
sort_order: NotRequired[ListCommissionsQueryParamSortOrder]
|
|
74
|
+
r"""The sort order for the list of commissions."""
|
|
75
|
+
interval: NotRequired[ListCommissionsQueryParamInterval]
|
|
76
|
+
r"""The interval to retrieve commissions for."""
|
|
77
|
+
start: NotRequired[str]
|
|
78
|
+
r"""The start date of the date range to filter the commissions by."""
|
|
79
|
+
end: NotRequired[str]
|
|
80
|
+
r"""The end date of the date range to filter the commissions by."""
|
|
81
|
+
page: NotRequired[float]
|
|
82
|
+
r"""The page number for pagination."""
|
|
83
|
+
page_size: NotRequired[float]
|
|
84
|
+
r"""The number of items per page."""
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
class ListCommissionsRequest(BaseModel):
|
|
88
|
+
type: Annotated[
|
|
89
|
+
Optional[Type],
|
|
90
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
91
|
+
] = None
|
|
92
|
+
|
|
93
|
+
customer_id: Annotated[
|
|
94
|
+
Optional[str],
|
|
95
|
+
pydantic.Field(alias="customerId"),
|
|
96
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
97
|
+
] = None
|
|
98
|
+
r"""Filter the list of commissions by the associated customer."""
|
|
99
|
+
|
|
100
|
+
payout_id: Annotated[
|
|
101
|
+
Optional[str],
|
|
102
|
+
pydantic.Field(alias="payoutId"),
|
|
103
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
104
|
+
] = None
|
|
105
|
+
r"""Filter the list of commissions by the associated payout."""
|
|
106
|
+
|
|
107
|
+
partner_id: Annotated[
|
|
108
|
+
Optional[str],
|
|
109
|
+
pydantic.Field(alias="partnerId"),
|
|
110
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
111
|
+
] = None
|
|
112
|
+
r"""Filter the list of commissions by the associated partner."""
|
|
113
|
+
|
|
114
|
+
invoice_id: Annotated[
|
|
115
|
+
Optional[str],
|
|
116
|
+
pydantic.Field(alias="invoiceId"),
|
|
117
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
118
|
+
] = None
|
|
119
|
+
r"""Filter the list of commissions by the associated invoice. Since invoiceId is unique on a per-program basis, this will only return one commission per invoice."""
|
|
120
|
+
|
|
121
|
+
status: Annotated[
|
|
122
|
+
Optional[QueryParamStatus],
|
|
123
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
124
|
+
] = None
|
|
125
|
+
r"""Filter the list of commissions by their corresponding status."""
|
|
126
|
+
|
|
127
|
+
sort_by: Annotated[
|
|
128
|
+
Optional[ListCommissionsQueryParamSortBy],
|
|
129
|
+
pydantic.Field(alias="sortBy"),
|
|
130
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
131
|
+
] = ListCommissionsQueryParamSortBy.CREATED_AT
|
|
132
|
+
r"""The field to sort the list of commissions by."""
|
|
133
|
+
|
|
134
|
+
sort_order: Annotated[
|
|
135
|
+
Optional[ListCommissionsQueryParamSortOrder],
|
|
136
|
+
pydantic.Field(alias="sortOrder"),
|
|
137
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
138
|
+
] = ListCommissionsQueryParamSortOrder.DESC
|
|
139
|
+
r"""The sort order for the list of commissions."""
|
|
140
|
+
|
|
141
|
+
interval: Annotated[
|
|
142
|
+
Optional[ListCommissionsQueryParamInterval],
|
|
143
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
144
|
+
] = ListCommissionsQueryParamInterval.ALL
|
|
145
|
+
r"""The interval to retrieve commissions for."""
|
|
146
|
+
|
|
147
|
+
start: Annotated[
|
|
148
|
+
Optional[str],
|
|
149
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
150
|
+
] = None
|
|
151
|
+
r"""The start date of the date range to filter the commissions by."""
|
|
152
|
+
|
|
153
|
+
end: Annotated[
|
|
154
|
+
Optional[str],
|
|
155
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
156
|
+
] = None
|
|
157
|
+
r"""The end date of the date range to filter the commissions by."""
|
|
158
|
+
|
|
159
|
+
page: Annotated[
|
|
160
|
+
Optional[float],
|
|
161
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
162
|
+
] = 1
|
|
163
|
+
r"""The page number for pagination."""
|
|
164
|
+
|
|
165
|
+
page_size: Annotated[
|
|
166
|
+
Optional[float],
|
|
167
|
+
pydantic.Field(alias="pageSize"),
|
|
168
|
+
FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
|
|
169
|
+
] = 100
|
|
170
|
+
r"""The number of items per page."""
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class ListCommissionsType(str, Enum):
|
|
174
|
+
CLICK = "click"
|
|
175
|
+
LEAD = "lead"
|
|
176
|
+
SALE = "sale"
|
|
177
|
+
|
|
178
|
+
|
|
179
|
+
class ListCommissionsStatus(str, Enum):
|
|
180
|
+
PENDING = "pending"
|
|
181
|
+
PROCESSED = "processed"
|
|
182
|
+
PAID = "paid"
|
|
183
|
+
REFUNDED = "refunded"
|
|
184
|
+
DUPLICATE = "duplicate"
|
|
185
|
+
FRAUD = "fraud"
|
|
186
|
+
CANCELED = "canceled"
|
|
187
|
+
|
|
188
|
+
|
|
189
|
+
class ListCommissionsResponseBodyTypedDict(TypedDict):
|
|
190
|
+
id: str
|
|
191
|
+
r"""The commission's unique ID on Dub."""
|
|
192
|
+
amount: float
|
|
193
|
+
earnings: float
|
|
194
|
+
currency: str
|
|
195
|
+
status: ListCommissionsStatus
|
|
196
|
+
created_at: str
|
|
197
|
+
updated_at: str
|
|
198
|
+
type: NotRequired[ListCommissionsType]
|
|
199
|
+
invoice_id: NotRequired[Nullable[str]]
|
|
200
|
+
|
|
201
|
+
|
|
202
|
+
class ListCommissionsResponseBody(BaseModel):
|
|
203
|
+
id: str
|
|
204
|
+
r"""The commission's unique ID on Dub."""
|
|
205
|
+
|
|
206
|
+
amount: float
|
|
207
|
+
|
|
208
|
+
earnings: float
|
|
209
|
+
|
|
210
|
+
currency: str
|
|
211
|
+
|
|
212
|
+
status: ListCommissionsStatus
|
|
213
|
+
|
|
214
|
+
created_at: Annotated[str, pydantic.Field(alias="createdAt")]
|
|
215
|
+
|
|
216
|
+
updated_at: Annotated[str, pydantic.Field(alias="updatedAt")]
|
|
217
|
+
|
|
218
|
+
type: Optional[ListCommissionsType] = None
|
|
219
|
+
|
|
220
|
+
invoice_id: Annotated[OptionalNullable[str], pydantic.Field(alias="invoiceId")] = (
|
|
221
|
+
UNSET
|
|
222
|
+
)
|
|
223
|
+
|
|
224
|
+
@model_serializer(mode="wrap")
|
|
225
|
+
def serialize_model(self, handler):
|
|
226
|
+
optional_fields = ["type", "invoiceId"]
|
|
227
|
+
nullable_fields = ["invoiceId"]
|
|
228
|
+
null_default_fields = []
|
|
229
|
+
|
|
230
|
+
serialized = handler(self)
|
|
231
|
+
|
|
232
|
+
m = {}
|
|
233
|
+
|
|
234
|
+
for n, f in type(self).model_fields.items():
|
|
235
|
+
k = f.alias or n
|
|
236
|
+
val = serialized.get(k)
|
|
237
|
+
serialized.pop(k, None)
|
|
238
|
+
|
|
239
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
|
240
|
+
is_set = (
|
|
241
|
+
self.__pydantic_fields_set__.intersection({n})
|
|
242
|
+
or k in null_default_fields
|
|
243
|
+
) # pylint: disable=no-member
|
|
244
|
+
|
|
245
|
+
if val is not None and val != UNSET_SENTINEL:
|
|
246
|
+
m[k] = val
|
|
247
|
+
elif val != UNSET_SENTINEL and (
|
|
248
|
+
not k in optional_fields or (optional_nullable and is_set)
|
|
249
|
+
):
|
|
250
|
+
m[k] = val
|
|
251
|
+
|
|
252
|
+
return m
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
|
|
2
|
+
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
from dub.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTINEL
|
|
5
|
+
from dub.utils import FieldMetadata, PathParamMetadata, RequestMetadata
|
|
6
|
+
from enum import Enum
|
|
7
|
+
import pydantic
|
|
8
|
+
from pydantic import model_serializer
|
|
9
|
+
from typing import Optional
|
|
10
|
+
from typing_extensions import Annotated, NotRequired, TypedDict
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class Status(str, Enum):
|
|
14
|
+
r"""Useful for marking a commission as refunded, duplicate, canceled, or fraudulent. Takes precedence over `amount` and `modifyAmount`. When a commission is marked as refunded, duplicate, canceled, or fraudulent, it will be omitted from the payout, and the payout amount will be recalculated accordingly. Paid commissions cannot be updated."""
|
|
15
|
+
|
|
16
|
+
REFUNDED = "refunded"
|
|
17
|
+
DUPLICATE = "duplicate"
|
|
18
|
+
CANCELED = "canceled"
|
|
19
|
+
FRAUD = "fraud"
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
class UpdateCommissionRequestBodyTypedDict(TypedDict):
|
|
23
|
+
amount: NotRequired[float]
|
|
24
|
+
r"""The new absolute amount for the sale. Paid commissions cannot be updated."""
|
|
25
|
+
modify_amount: NotRequired[float]
|
|
26
|
+
r"""Modify the current sale amount: use positive values to increase the amount, negative values to decrease it. Takes precedence over `amount`. Paid commissions cannot be updated."""
|
|
27
|
+
currency: NotRequired[str]
|
|
28
|
+
r"""The currency of the sale amount to update. Accepts ISO 4217 currency codes."""
|
|
29
|
+
status: NotRequired[Status]
|
|
30
|
+
r"""Useful for marking a commission as refunded, duplicate, canceled, or fraudulent. Takes precedence over `amount` and `modifyAmount`. When a commission is marked as refunded, duplicate, canceled, or fraudulent, it will be omitted from the payout, and the payout amount will be recalculated accordingly. Paid commissions cannot be updated."""
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
class UpdateCommissionRequestBody(BaseModel):
|
|
34
|
+
amount: Optional[float] = None
|
|
35
|
+
r"""The new absolute amount for the sale. Paid commissions cannot be updated."""
|
|
36
|
+
|
|
37
|
+
modify_amount: Annotated[Optional[float], pydantic.Field(alias="modifyAmount")] = (
|
|
38
|
+
None
|
|
39
|
+
)
|
|
40
|
+
r"""Modify the current sale amount: use positive values to increase the amount, negative values to decrease it. Takes precedence over `amount`. Paid commissions cannot be updated."""
|
|
41
|
+
|
|
42
|
+
currency: Optional[str] = "usd"
|
|
43
|
+
r"""The currency of the sale amount to update. Accepts ISO 4217 currency codes."""
|
|
44
|
+
|
|
45
|
+
status: Optional[Status] = None
|
|
46
|
+
r"""Useful for marking a commission as refunded, duplicate, canceled, or fraudulent. Takes precedence over `amount` and `modifyAmount`. When a commission is marked as refunded, duplicate, canceled, or fraudulent, it will be omitted from the payout, and the payout amount will be recalculated accordingly. Paid commissions cannot be updated."""
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
class UpdateCommissionRequestTypedDict(TypedDict):
|
|
50
|
+
id: str
|
|
51
|
+
r"""The commission's unique ID on Dub."""
|
|
52
|
+
request_body: NotRequired[UpdateCommissionRequestBodyTypedDict]
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
class UpdateCommissionRequest(BaseModel):
|
|
56
|
+
id: Annotated[
|
|
57
|
+
str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False))
|
|
58
|
+
]
|
|
59
|
+
r"""The commission's unique ID on Dub."""
|
|
60
|
+
|
|
61
|
+
request_body: Annotated[
|
|
62
|
+
Optional[UpdateCommissionRequestBody],
|
|
63
|
+
FieldMetadata(request=RequestMetadata(media_type="application/json")),
|
|
64
|
+
] = None
|
|
65
|
+
|
|
66
|
+
|
|
67
|
+
class UpdateCommissionType(str, Enum):
|
|
68
|
+
CLICK = "click"
|
|
69
|
+
LEAD = "lead"
|
|
70
|
+
SALE = "sale"
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
class UpdateCommissionStatus(str, Enum):
|
|
74
|
+
PENDING = "pending"
|
|
75
|
+
PROCESSED = "processed"
|
|
76
|
+
PAID = "paid"
|
|
77
|
+
REFUNDED = "refunded"
|
|
78
|
+
DUPLICATE = "duplicate"
|
|
79
|
+
FRAUD = "fraud"
|
|
80
|
+
CANCELED = "canceled"
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class UpdateCommissionResponseBodyTypedDict(TypedDict):
|
|
84
|
+
r"""The updated commission."""
|
|
85
|
+
|
|
86
|
+
id: str
|
|
87
|
+
r"""The commission's unique ID on Dub."""
|
|
88
|
+
amount: float
|
|
89
|
+
earnings: float
|
|
90
|
+
currency: str
|
|
91
|
+
status: UpdateCommissionStatus
|
|
92
|
+
created_at: str
|
|
93
|
+
updated_at: str
|
|
94
|
+
type: NotRequired[UpdateCommissionType]
|
|
95
|
+
invoice_id: NotRequired[Nullable[str]]
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
class UpdateCommissionResponseBody(BaseModel):
|
|
99
|
+
r"""The updated commission."""
|
|
100
|
+
|
|
101
|
+
id: str
|
|
102
|
+
r"""The commission's unique ID on Dub."""
|
|
103
|
+
|
|
104
|
+
amount: float
|
|
105
|
+
|
|
106
|
+
earnings: float
|
|
107
|
+
|
|
108
|
+
currency: str
|
|
109
|
+
|
|
110
|
+
status: UpdateCommissionStatus
|
|
111
|
+
|
|
112
|
+
created_at: Annotated[str, pydantic.Field(alias="createdAt")]
|
|
113
|
+
|
|
114
|
+
updated_at: Annotated[str, pydantic.Field(alias="updatedAt")]
|
|
115
|
+
|
|
116
|
+
type: Optional[UpdateCommissionType] = None
|
|
117
|
+
|
|
118
|
+
invoice_id: Annotated[OptionalNullable[str], pydantic.Field(alias="invoiceId")] = (
|
|
119
|
+
UNSET
|
|
120
|
+
)
|
|
121
|
+
|
|
122
|
+
@model_serializer(mode="wrap")
|
|
123
|
+
def serialize_model(self, handler):
|
|
124
|
+
optional_fields = ["type", "invoiceId"]
|
|
125
|
+
nullable_fields = ["invoiceId"]
|
|
126
|
+
null_default_fields = []
|
|
127
|
+
|
|
128
|
+
serialized = handler(self)
|
|
129
|
+
|
|
130
|
+
m = {}
|
|
131
|
+
|
|
132
|
+
for n, f in type(self).model_fields.items():
|
|
133
|
+
k = f.alias or n
|
|
134
|
+
val = serialized.get(k)
|
|
135
|
+
serialized.pop(k, None)
|
|
136
|
+
|
|
137
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
|
138
|
+
is_set = (
|
|
139
|
+
self.__pydantic_fields_set__.intersection({n})
|
|
140
|
+
or k in null_default_fields
|
|
141
|
+
) # pylint: disable=no-member
|
|
142
|
+
|
|
143
|
+
if val is not None and val != UNSET_SENTINEL:
|
|
144
|
+
m[k] = val
|
|
145
|
+
elif val != UNSET_SENTINEL and (
|
|
146
|
+
not k in optional_fields or (optional_nullable and is_set)
|
|
147
|
+
):
|
|
148
|
+
m[k] = val
|
|
149
|
+
|
|
150
|
+
return m
|
|
@@ -164,19 +164,27 @@ class UpdateCustomerLink(BaseModel):
|
|
|
164
164
|
|
|
165
165
|
class UpdateCustomerPartnerTypedDict(TypedDict):
|
|
166
166
|
id: str
|
|
167
|
+
r"""The partner's unique ID on Dub."""
|
|
167
168
|
name: str
|
|
169
|
+
r"""The partner's full legal name."""
|
|
168
170
|
email: Nullable[str]
|
|
171
|
+
r"""The partner's email address. Should be a unique value across Dub."""
|
|
169
172
|
image: Nullable[str]
|
|
173
|
+
r"""The partner's avatar image."""
|
|
170
174
|
|
|
171
175
|
|
|
172
176
|
class UpdateCustomerPartner(BaseModel):
|
|
173
177
|
id: str
|
|
178
|
+
r"""The partner's unique ID on Dub."""
|
|
174
179
|
|
|
175
180
|
name: str
|
|
181
|
+
r"""The partner's full legal name."""
|
|
176
182
|
|
|
177
183
|
email: Nullable[str]
|
|
184
|
+
r"""The partner's email address. Should be a unique value across Dub."""
|
|
178
185
|
|
|
179
186
|
image: Nullable[str]
|
|
187
|
+
r"""The partner's avatar image."""
|
|
180
188
|
|
|
181
189
|
@model_serializer(mode="wrap")
|
|
182
190
|
def serialize_model(self, handler):
|