dub 0.29.3__py3-none-any.whl → 0.31.0__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/httpclient.py +0 -1
- dub/models/components/__init__.py +16 -4
- dub/models/components/commissioncreatedevent.py +4 -4
- dub/models/components/leadcreatedevent.py +122 -1
- dub/models/components/partnerenrolledevent.py +12 -63
- dub/models/components/salecreatedevent.py +122 -1
- dub/models/components/workspaceschema.py +8 -0
- dub/models/operations/createcustomer.py +10 -3
- dub/models/operations/createpartner.py +14 -65
- dub/models/operations/getcustomer.py +1 -1
- dub/models/operations/getcustomers.py +1 -1
- dub/models/operations/listcommissions.py +11 -2
- dub/models/operations/listevents.py +10 -0
- dub/models/operations/listpartners.py +32 -74
- dub/models/operations/retrieveanalytics.py +10 -0
- dub/models/operations/retrievelinks.py +5 -0
- dub/models/operations/updatecustomer.py +10 -3
- dub/partners.py +4 -4
- dub/sdk.py +2 -2
- dub/utils/annotations.py +32 -8
- {dub-0.29.3.dist-info → dub-0.31.0.dist-info}/METADATA +7 -3
- {dub-0.29.3.dist-info → dub-0.31.0.dist-info}/RECORD +25 -25
- {dub-0.29.3.dist-info → dub-0.31.0.dist-info}/WHEEL +1 -1
- {dub-0.29.3.dist-info → dub-0.31.0.dist-info/licenses}/LICENSE +0 -0
dub/_version.py
CHANGED
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
import importlib.metadata
|
|
4
4
|
|
|
5
5
|
__title__: str = "dub"
|
|
6
|
-
__version__: str = "0.
|
|
6
|
+
__version__: str = "0.31.0"
|
|
7
7
|
__openapi_doc_version__: str = "0.0.1"
|
|
8
|
-
__gen_version__: str = "2.
|
|
9
|
-
__user_agent__: str = "speakeasy-sdk/python 0.
|
|
8
|
+
__gen_version__: str = "2.722.2"
|
|
9
|
+
__user_agent__: str = "speakeasy-sdk/python 0.31.0 2.722.2 0.0.1 dub"
|
|
10
10
|
|
|
11
11
|
try:
|
|
12
12
|
if __package__ is not None:
|
dub/httpclient.py
CHANGED
|
@@ -58,11 +58,11 @@ if TYPE_CHECKING:
|
|
|
58
58
|
CommissionCreatedEventData,
|
|
59
59
|
CommissionCreatedEventDataTypedDict,
|
|
60
60
|
CommissionCreatedEventEvent,
|
|
61
|
+
CommissionCreatedEventPartner,
|
|
62
|
+
CommissionCreatedEventPartnerTypedDict,
|
|
61
63
|
CommissionCreatedEventStatus,
|
|
62
64
|
CommissionCreatedEventType,
|
|
63
65
|
CommissionCreatedEventTypedDict,
|
|
64
|
-
Partner,
|
|
65
|
-
PartnerTypedDict,
|
|
66
66
|
)
|
|
67
67
|
from .continentcode import ContinentCode
|
|
68
68
|
from .domainschema import (
|
|
@@ -86,6 +86,8 @@ if TYPE_CHECKING:
|
|
|
86
86
|
LeadCreatedEventTestVariants,
|
|
87
87
|
LeadCreatedEventTestVariantsTypedDict,
|
|
88
88
|
LeadCreatedEventTypedDict,
|
|
89
|
+
Partner,
|
|
90
|
+
PartnerTypedDict,
|
|
89
91
|
)
|
|
90
92
|
from .leadevent import (
|
|
91
93
|
Customer,
|
|
@@ -167,6 +169,8 @@ if TYPE_CHECKING:
|
|
|
167
169
|
SaleCreatedEventEvent,
|
|
168
170
|
SaleCreatedEventLink,
|
|
169
171
|
SaleCreatedEventLinkTypedDict,
|
|
172
|
+
SaleCreatedEventPartner,
|
|
173
|
+
SaleCreatedEventPartnerTypedDict,
|
|
170
174
|
SaleCreatedEventSale,
|
|
171
175
|
SaleCreatedEventSaleTypedDict,
|
|
172
176
|
SaleCreatedEventTestVariants,
|
|
@@ -250,6 +254,8 @@ __all__ = [
|
|
|
250
254
|
"CommissionCreatedEventData",
|
|
251
255
|
"CommissionCreatedEventDataTypedDict",
|
|
252
256
|
"CommissionCreatedEventEvent",
|
|
257
|
+
"CommissionCreatedEventPartner",
|
|
258
|
+
"CommissionCreatedEventPartnerTypedDict",
|
|
253
259
|
"CommissionCreatedEventStatus",
|
|
254
260
|
"CommissionCreatedEventType",
|
|
255
261
|
"CommissionCreatedEventTypedDict",
|
|
@@ -344,6 +350,8 @@ __all__ = [
|
|
|
344
350
|
"SaleCreatedEventEvent",
|
|
345
351
|
"SaleCreatedEventLink",
|
|
346
352
|
"SaleCreatedEventLinkTypedDict",
|
|
353
|
+
"SaleCreatedEventPartner",
|
|
354
|
+
"SaleCreatedEventPartnerTypedDict",
|
|
347
355
|
"SaleCreatedEventSale",
|
|
348
356
|
"SaleCreatedEventSaleTypedDict",
|
|
349
357
|
"SaleCreatedEventTestVariants",
|
|
@@ -429,11 +437,11 @@ _dynamic_imports: dict[str, str] = {
|
|
|
429
437
|
"CommissionCreatedEventData": ".commissioncreatedevent",
|
|
430
438
|
"CommissionCreatedEventDataTypedDict": ".commissioncreatedevent",
|
|
431
439
|
"CommissionCreatedEventEvent": ".commissioncreatedevent",
|
|
440
|
+
"CommissionCreatedEventPartner": ".commissioncreatedevent",
|
|
441
|
+
"CommissionCreatedEventPartnerTypedDict": ".commissioncreatedevent",
|
|
432
442
|
"CommissionCreatedEventStatus": ".commissioncreatedevent",
|
|
433
443
|
"CommissionCreatedEventType": ".commissioncreatedevent",
|
|
434
444
|
"CommissionCreatedEventTypedDict": ".commissioncreatedevent",
|
|
435
|
-
"Partner": ".commissioncreatedevent",
|
|
436
|
-
"PartnerTypedDict": ".commissioncreatedevent",
|
|
437
445
|
"ContinentCode": ".continentcode",
|
|
438
446
|
"DomainSchema": ".domainschema",
|
|
439
447
|
"DomainSchemaTypedDict": ".domainschema",
|
|
@@ -456,6 +464,8 @@ _dynamic_imports: dict[str, str] = {
|
|
|
456
464
|
"LeadCreatedEventTestVariants": ".leadcreatedevent",
|
|
457
465
|
"LeadCreatedEventTestVariantsTypedDict": ".leadcreatedevent",
|
|
458
466
|
"LeadCreatedEventTypedDict": ".leadcreatedevent",
|
|
467
|
+
"Partner": ".leadcreatedevent",
|
|
468
|
+
"PartnerTypedDict": ".leadcreatedevent",
|
|
459
469
|
"Customer": ".leadevent",
|
|
460
470
|
"CustomerTypedDict": ".leadevent",
|
|
461
471
|
"LeadEvent": ".leadevent",
|
|
@@ -521,6 +531,8 @@ _dynamic_imports: dict[str, str] = {
|
|
|
521
531
|
"SaleCreatedEventEvent": ".salecreatedevent",
|
|
522
532
|
"SaleCreatedEventLink": ".salecreatedevent",
|
|
523
533
|
"SaleCreatedEventLinkTypedDict": ".salecreatedevent",
|
|
534
|
+
"SaleCreatedEventPartner": ".salecreatedevent",
|
|
535
|
+
"SaleCreatedEventPartnerTypedDict": ".salecreatedevent",
|
|
524
536
|
"SaleCreatedEventSale": ".salecreatedevent",
|
|
525
537
|
"SaleCreatedEventSaleTypedDict": ".salecreatedevent",
|
|
526
538
|
"SaleCreatedEventTestVariants": ".salecreatedevent",
|
|
@@ -30,7 +30,7 @@ class CommissionCreatedEventStatus(str, Enum):
|
|
|
30
30
|
CANCELED = "canceled"
|
|
31
31
|
|
|
32
32
|
|
|
33
|
-
class
|
|
33
|
+
class CommissionCreatedEventPartnerTypedDict(TypedDict):
|
|
34
34
|
id: str
|
|
35
35
|
r"""The partner's unique ID on Dub."""
|
|
36
36
|
name: str
|
|
@@ -51,7 +51,7 @@ class PartnerTypedDict(TypedDict):
|
|
|
51
51
|
total_commissions: float
|
|
52
52
|
|
|
53
53
|
|
|
54
|
-
class
|
|
54
|
+
class CommissionCreatedEventPartner(BaseModel):
|
|
55
55
|
id: str
|
|
56
56
|
r"""The partner's unique ID on Dub."""
|
|
57
57
|
|
|
@@ -209,7 +209,7 @@ class CommissionCreatedEventDataTypedDict(TypedDict):
|
|
|
209
209
|
quantity: float
|
|
210
210
|
created_at: str
|
|
211
211
|
updated_at: str
|
|
212
|
-
partner:
|
|
212
|
+
partner: CommissionCreatedEventPartnerTypedDict
|
|
213
213
|
type: NotRequired[CommissionCreatedEventType]
|
|
214
214
|
user_id: NotRequired[Nullable[str]]
|
|
215
215
|
r"""The user who created the manual commission."""
|
|
@@ -238,7 +238,7 @@ class CommissionCreatedEventData(BaseModel):
|
|
|
238
238
|
|
|
239
239
|
updated_at: Annotated[str, pydantic.Field(alias="updatedAt")]
|
|
240
240
|
|
|
241
|
-
partner:
|
|
241
|
+
partner: CommissionCreatedEventPartner
|
|
242
242
|
|
|
243
243
|
type: Optional[CommissionCreatedEventType] = None
|
|
244
244
|
|
|
@@ -6,7 +6,7 @@ from dub.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTIN
|
|
|
6
6
|
from enum import Enum
|
|
7
7
|
import pydantic
|
|
8
8
|
from pydantic import model_serializer
|
|
9
|
-
from typing import Dict, List, Optional
|
|
9
|
+
from typing import Any, Dict, List, Optional
|
|
10
10
|
from typing_extensions import Annotated, NotRequired, TypedDict
|
|
11
11
|
|
|
12
12
|
|
|
@@ -491,11 +491,98 @@ class LeadCreatedEventLink(BaseModel):
|
|
|
491
491
|
return m
|
|
492
492
|
|
|
493
493
|
|
|
494
|
+
class PartnerTypedDict(TypedDict):
|
|
495
|
+
id: str
|
|
496
|
+
r"""The partner's unique ID on Dub."""
|
|
497
|
+
name: str
|
|
498
|
+
r"""The partner's full legal name."""
|
|
499
|
+
email: Nullable[str]
|
|
500
|
+
r"""The partner's email address. Should be a unique value across Dub."""
|
|
501
|
+
image: Nullable[str]
|
|
502
|
+
r"""The partner's avatar image."""
|
|
503
|
+
payouts_enabled_at: Nullable[str]
|
|
504
|
+
r"""The date when the partner enabled payouts."""
|
|
505
|
+
country: Nullable[str]
|
|
506
|
+
r"""The partner's country (required for tax purposes)."""
|
|
507
|
+
total_clicks: float
|
|
508
|
+
total_leads: float
|
|
509
|
+
total_conversions: float
|
|
510
|
+
total_sales: float
|
|
511
|
+
total_sale_amount: float
|
|
512
|
+
total_commissions: float
|
|
513
|
+
|
|
514
|
+
|
|
515
|
+
class Partner(BaseModel):
|
|
516
|
+
id: str
|
|
517
|
+
r"""The partner's unique ID on Dub."""
|
|
518
|
+
|
|
519
|
+
name: str
|
|
520
|
+
r"""The partner's full legal name."""
|
|
521
|
+
|
|
522
|
+
email: Nullable[str]
|
|
523
|
+
r"""The partner's email address. Should be a unique value across Dub."""
|
|
524
|
+
|
|
525
|
+
image: Nullable[str]
|
|
526
|
+
r"""The partner's avatar image."""
|
|
527
|
+
|
|
528
|
+
payouts_enabled_at: Annotated[
|
|
529
|
+
Nullable[str], pydantic.Field(alias="payoutsEnabledAt")
|
|
530
|
+
]
|
|
531
|
+
r"""The date when the partner enabled payouts."""
|
|
532
|
+
|
|
533
|
+
country: Nullable[str]
|
|
534
|
+
r"""The partner's country (required for tax purposes)."""
|
|
535
|
+
|
|
536
|
+
total_clicks: Annotated[float, pydantic.Field(alias="totalClicks")]
|
|
537
|
+
|
|
538
|
+
total_leads: Annotated[float, pydantic.Field(alias="totalLeads")]
|
|
539
|
+
|
|
540
|
+
total_conversions: Annotated[float, pydantic.Field(alias="totalConversions")]
|
|
541
|
+
|
|
542
|
+
total_sales: Annotated[float, pydantic.Field(alias="totalSales")]
|
|
543
|
+
|
|
544
|
+
total_sale_amount: Annotated[float, pydantic.Field(alias="totalSaleAmount")]
|
|
545
|
+
|
|
546
|
+
total_commissions: Annotated[float, pydantic.Field(alias="totalCommissions")]
|
|
547
|
+
|
|
548
|
+
@model_serializer(mode="wrap")
|
|
549
|
+
def serialize_model(self, handler):
|
|
550
|
+
optional_fields = []
|
|
551
|
+
nullable_fields = ["email", "image", "payoutsEnabledAt", "country"]
|
|
552
|
+
null_default_fields = []
|
|
553
|
+
|
|
554
|
+
serialized = handler(self)
|
|
555
|
+
|
|
556
|
+
m = {}
|
|
557
|
+
|
|
558
|
+
for n, f in type(self).model_fields.items():
|
|
559
|
+
k = f.alias or n
|
|
560
|
+
val = serialized.get(k)
|
|
561
|
+
serialized.pop(k, None)
|
|
562
|
+
|
|
563
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
|
564
|
+
is_set = (
|
|
565
|
+
self.__pydantic_fields_set__.intersection({n})
|
|
566
|
+
or k in null_default_fields
|
|
567
|
+
) # pylint: disable=no-member
|
|
568
|
+
|
|
569
|
+
if val is not None and val != UNSET_SENTINEL:
|
|
570
|
+
m[k] = val
|
|
571
|
+
elif val != UNSET_SENTINEL and (
|
|
572
|
+
not k in optional_fields or (optional_nullable and is_set)
|
|
573
|
+
):
|
|
574
|
+
m[k] = val
|
|
575
|
+
|
|
576
|
+
return m
|
|
577
|
+
|
|
578
|
+
|
|
494
579
|
class LeadCreatedEventDataTypedDict(TypedDict):
|
|
495
580
|
event_name: str
|
|
496
581
|
customer: LeadCreatedEventCustomerTypedDict
|
|
497
582
|
click: LeadCreatedEventClickTypedDict
|
|
498
583
|
link: LeadCreatedEventLinkTypedDict
|
|
584
|
+
metadata: Nullable[Dict[str, Any]]
|
|
585
|
+
partner: NotRequired[Nullable[PartnerTypedDict]]
|
|
499
586
|
|
|
500
587
|
|
|
501
588
|
class LeadCreatedEventData(BaseModel):
|
|
@@ -507,6 +594,40 @@ class LeadCreatedEventData(BaseModel):
|
|
|
507
594
|
|
|
508
595
|
link: LeadCreatedEventLink
|
|
509
596
|
|
|
597
|
+
metadata: Nullable[Dict[str, Any]]
|
|
598
|
+
|
|
599
|
+
partner: OptionalNullable[Partner] = UNSET
|
|
600
|
+
|
|
601
|
+
@model_serializer(mode="wrap")
|
|
602
|
+
def serialize_model(self, handler):
|
|
603
|
+
optional_fields = ["partner"]
|
|
604
|
+
nullable_fields = ["partner", "metadata"]
|
|
605
|
+
null_default_fields = []
|
|
606
|
+
|
|
607
|
+
serialized = handler(self)
|
|
608
|
+
|
|
609
|
+
m = {}
|
|
610
|
+
|
|
611
|
+
for n, f in type(self).model_fields.items():
|
|
612
|
+
k = f.alias or n
|
|
613
|
+
val = serialized.get(k)
|
|
614
|
+
serialized.pop(k, None)
|
|
615
|
+
|
|
616
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
|
617
|
+
is_set = (
|
|
618
|
+
self.__pydantic_fields_set__.intersection({n})
|
|
619
|
+
or k in null_default_fields
|
|
620
|
+
) # pylint: disable=no-member
|
|
621
|
+
|
|
622
|
+
if val is not None and val != UNSET_SENTINEL:
|
|
623
|
+
m[k] = val
|
|
624
|
+
elif val != UNSET_SENTINEL and (
|
|
625
|
+
not k in optional_fields or (optional_nullable and is_set)
|
|
626
|
+
):
|
|
627
|
+
m[k] = val
|
|
628
|
+
|
|
629
|
+
return m
|
|
630
|
+
|
|
510
631
|
|
|
511
632
|
class LeadCreatedEventTypedDict(TypedDict):
|
|
512
633
|
r"""Triggered when a lead is created."""
|
|
@@ -21,6 +21,7 @@ class Status(str, Enum):
|
|
|
21
21
|
REJECTED = "rejected"
|
|
22
22
|
INVITED = "invited"
|
|
23
23
|
DECLINED = "declined"
|
|
24
|
+
DEACTIVATED = "deactivated"
|
|
24
25
|
BANNED = "banned"
|
|
25
26
|
ARCHIVED = "archived"
|
|
26
27
|
|
|
@@ -40,6 +41,8 @@ class PartnerEnrolledEventLinkTypedDict(TypedDict):
|
|
|
40
41
|
r"""The number of clicks on the short link."""
|
|
41
42
|
leads: NotRequired[float]
|
|
42
43
|
r"""The number of leads the short link has generated."""
|
|
44
|
+
conversions: NotRequired[float]
|
|
45
|
+
r"""The number of leads that converted to paying customers."""
|
|
43
46
|
sales: NotRequired[float]
|
|
44
47
|
r"""The total number of sales (includes recurring sales) generated by the short link."""
|
|
45
48
|
sale_amount: NotRequired[float]
|
|
@@ -68,6 +71,9 @@ class PartnerEnrolledEventLink(BaseModel):
|
|
|
68
71
|
leads: Optional[float] = 0
|
|
69
72
|
r"""The number of leads the short link has generated."""
|
|
70
73
|
|
|
74
|
+
conversions: Optional[float] = 0
|
|
75
|
+
r"""The number of leads that converted to paying customers."""
|
|
76
|
+
|
|
71
77
|
sales: Optional[float] = 0
|
|
72
78
|
r"""The total number of sales (includes recurring sales) generated by the short link."""
|
|
73
79
|
|
|
@@ -91,6 +97,8 @@ class PartnerEnrolledEventDataTypedDict(TypedDict):
|
|
|
91
97
|
r"""The partner's unique ID on Dub."""
|
|
92
98
|
name: str
|
|
93
99
|
r"""The partner's full legal name."""
|
|
100
|
+
company_name: Nullable[str]
|
|
101
|
+
r"""If the partner profile type is a company, this is the partner's legal company name."""
|
|
94
102
|
email: Nullable[str]
|
|
95
103
|
r"""The partner's email address. Should be a unique value across Dub."""
|
|
96
104
|
image: Nullable[str]
|
|
@@ -144,25 +152,16 @@ class PartnerEnrolledEventDataTypedDict(TypedDict):
|
|
|
144
152
|
r"""The total net revenue generated by the partner. Defaults to 0 if `includeExpandedFields` is false."""
|
|
145
153
|
website: NotRequired[Nullable[str]]
|
|
146
154
|
r"""The partner's website URL (including the https protocol)."""
|
|
147
|
-
website_txt_record: NotRequired[Nullable[str]]
|
|
148
|
-
website_verified_at: NotRequired[Nullable[str]]
|
|
149
155
|
youtube: NotRequired[Nullable[str]]
|
|
150
156
|
r"""The partner's YouTube channel username (e.g. `johndoe`)."""
|
|
151
|
-
youtube_verified_at: NotRequired[Nullable[str]]
|
|
152
|
-
youtube_subscriber_count: NotRequired[Nullable[float]]
|
|
153
|
-
youtube_view_count: NotRequired[Nullable[float]]
|
|
154
157
|
twitter: NotRequired[Nullable[str]]
|
|
155
158
|
r"""The partner's Twitter username (e.g. `johndoe`)."""
|
|
156
|
-
twitter_verified_at: NotRequired[Nullable[str]]
|
|
157
159
|
linkedin: NotRequired[Nullable[str]]
|
|
158
160
|
r"""The partner's LinkedIn username (e.g. `johndoe`)."""
|
|
159
|
-
linkedin_verified_at: NotRequired[Nullable[str]]
|
|
160
161
|
instagram: NotRequired[Nullable[str]]
|
|
161
162
|
r"""The partner's Instagram username (e.g. `johndoe`)."""
|
|
162
|
-
instagram_verified_at: NotRequired[Nullable[str]]
|
|
163
163
|
tiktok: NotRequired[Nullable[str]]
|
|
164
164
|
r"""The partner's TikTok username (e.g. `johndoe`)."""
|
|
165
|
-
tiktok_verified_at: NotRequired[Nullable[str]]
|
|
166
165
|
|
|
167
166
|
|
|
168
167
|
class PartnerEnrolledEventData(BaseModel):
|
|
@@ -172,6 +171,9 @@ class PartnerEnrolledEventData(BaseModel):
|
|
|
172
171
|
name: str
|
|
173
172
|
r"""The partner's full legal name."""
|
|
174
173
|
|
|
174
|
+
company_name: Annotated[Nullable[str], pydantic.Field(alias="companyName")]
|
|
175
|
+
r"""If the partner profile type is a company, this is the partner's legal company name."""
|
|
176
|
+
|
|
175
177
|
email: Nullable[str]
|
|
176
178
|
r"""The partner's email address. Should be a unique value across Dub."""
|
|
177
179
|
|
|
@@ -272,57 +274,21 @@ class PartnerEnrolledEventData(BaseModel):
|
|
|
272
274
|
website: OptionalNullable[str] = UNSET
|
|
273
275
|
r"""The partner's website URL (including the https protocol)."""
|
|
274
276
|
|
|
275
|
-
website_txt_record: Annotated[
|
|
276
|
-
OptionalNullable[str], pydantic.Field(alias="websiteTxtRecord")
|
|
277
|
-
] = UNSET
|
|
278
|
-
|
|
279
|
-
website_verified_at: Annotated[
|
|
280
|
-
OptionalNullable[str], pydantic.Field(alias="websiteVerifiedAt")
|
|
281
|
-
] = UNSET
|
|
282
|
-
|
|
283
277
|
youtube: OptionalNullable[str] = UNSET
|
|
284
278
|
r"""The partner's YouTube channel username (e.g. `johndoe`)."""
|
|
285
279
|
|
|
286
|
-
youtube_verified_at: Annotated[
|
|
287
|
-
OptionalNullable[str], pydantic.Field(alias="youtubeVerifiedAt")
|
|
288
|
-
] = UNSET
|
|
289
|
-
|
|
290
|
-
youtube_subscriber_count: Annotated[
|
|
291
|
-
OptionalNullable[float], pydantic.Field(alias="youtubeSubscriberCount")
|
|
292
|
-
] = UNSET
|
|
293
|
-
|
|
294
|
-
youtube_view_count: Annotated[
|
|
295
|
-
OptionalNullable[float], pydantic.Field(alias="youtubeViewCount")
|
|
296
|
-
] = UNSET
|
|
297
|
-
|
|
298
280
|
twitter: OptionalNullable[str] = UNSET
|
|
299
281
|
r"""The partner's Twitter username (e.g. `johndoe`)."""
|
|
300
282
|
|
|
301
|
-
twitter_verified_at: Annotated[
|
|
302
|
-
OptionalNullable[str], pydantic.Field(alias="twitterVerifiedAt")
|
|
303
|
-
] = UNSET
|
|
304
|
-
|
|
305
283
|
linkedin: OptionalNullable[str] = UNSET
|
|
306
284
|
r"""The partner's LinkedIn username (e.g. `johndoe`)."""
|
|
307
285
|
|
|
308
|
-
linkedin_verified_at: Annotated[
|
|
309
|
-
OptionalNullable[str], pydantic.Field(alias="linkedinVerifiedAt")
|
|
310
|
-
] = UNSET
|
|
311
|
-
|
|
312
286
|
instagram: OptionalNullable[str] = UNSET
|
|
313
287
|
r"""The partner's Instagram username (e.g. `johndoe`)."""
|
|
314
288
|
|
|
315
|
-
instagram_verified_at: Annotated[
|
|
316
|
-
OptionalNullable[str], pydantic.Field(alias="instagramVerifiedAt")
|
|
317
|
-
] = UNSET
|
|
318
|
-
|
|
319
289
|
tiktok: OptionalNullable[str] = UNSET
|
|
320
290
|
r"""The partner's TikTok username (e.g. `johndoe`)."""
|
|
321
291
|
|
|
322
|
-
tiktok_verified_at: Annotated[
|
|
323
|
-
OptionalNullable[str], pydantic.Field(alias="tiktokVerifiedAt")
|
|
324
|
-
] = UNSET
|
|
325
|
-
|
|
326
292
|
@model_serializer(mode="wrap")
|
|
327
293
|
def serialize_model(self, handler):
|
|
328
294
|
optional_fields = [
|
|
@@ -343,22 +309,14 @@ class PartnerEnrolledEventData(BaseModel):
|
|
|
343
309
|
"saleAmount",
|
|
344
310
|
"netRevenue",
|
|
345
311
|
"website",
|
|
346
|
-
"websiteTxtRecord",
|
|
347
|
-
"websiteVerifiedAt",
|
|
348
312
|
"youtube",
|
|
349
|
-
"youtubeVerifiedAt",
|
|
350
|
-
"youtubeSubscriberCount",
|
|
351
|
-
"youtubeViewCount",
|
|
352
313
|
"twitter",
|
|
353
|
-
"twitterVerifiedAt",
|
|
354
314
|
"linkedin",
|
|
355
|
-
"linkedinVerifiedAt",
|
|
356
315
|
"instagram",
|
|
357
|
-
"instagramVerifiedAt",
|
|
358
316
|
"tiktok",
|
|
359
|
-
"tiktokVerifiedAt",
|
|
360
317
|
]
|
|
361
318
|
nullable_fields = [
|
|
319
|
+
"companyName",
|
|
362
320
|
"email",
|
|
363
321
|
"image",
|
|
364
322
|
"description",
|
|
@@ -377,20 +335,11 @@ class PartnerEnrolledEventData(BaseModel):
|
|
|
377
335
|
"bannedAt",
|
|
378
336
|
"bannedReason",
|
|
379
337
|
"website",
|
|
380
|
-
"websiteTxtRecord",
|
|
381
|
-
"websiteVerifiedAt",
|
|
382
338
|
"youtube",
|
|
383
|
-
"youtubeVerifiedAt",
|
|
384
|
-
"youtubeSubscriberCount",
|
|
385
|
-
"youtubeViewCount",
|
|
386
339
|
"twitter",
|
|
387
|
-
"twitterVerifiedAt",
|
|
388
340
|
"linkedin",
|
|
389
|
-
"linkedinVerifiedAt",
|
|
390
341
|
"instagram",
|
|
391
|
-
"instagramVerifiedAt",
|
|
392
342
|
"tiktok",
|
|
393
|
-
"tiktokVerifiedAt",
|
|
394
343
|
]
|
|
395
344
|
null_default_fields = []
|
|
396
345
|
|
|
@@ -6,7 +6,7 @@ from dub.types import BaseModel, Nullable, OptionalNullable, UNSET, UNSET_SENTIN
|
|
|
6
6
|
from enum import Enum
|
|
7
7
|
import pydantic
|
|
8
8
|
from pydantic import model_serializer
|
|
9
|
-
from typing import Dict, List, Optional
|
|
9
|
+
from typing import Any, Dict, List, Optional
|
|
10
10
|
from typing_extensions import Annotated, NotRequired, TypedDict
|
|
11
11
|
|
|
12
12
|
|
|
@@ -538,12 +538,99 @@ class SaleCreatedEventSale(BaseModel):
|
|
|
538
538
|
return m
|
|
539
539
|
|
|
540
540
|
|
|
541
|
+
class SaleCreatedEventPartnerTypedDict(TypedDict):
|
|
542
|
+
id: str
|
|
543
|
+
r"""The partner's unique ID on Dub."""
|
|
544
|
+
name: str
|
|
545
|
+
r"""The partner's full legal name."""
|
|
546
|
+
email: Nullable[str]
|
|
547
|
+
r"""The partner's email address. Should be a unique value across Dub."""
|
|
548
|
+
image: Nullable[str]
|
|
549
|
+
r"""The partner's avatar image."""
|
|
550
|
+
payouts_enabled_at: Nullable[str]
|
|
551
|
+
r"""The date when the partner enabled payouts."""
|
|
552
|
+
country: Nullable[str]
|
|
553
|
+
r"""The partner's country (required for tax purposes)."""
|
|
554
|
+
total_clicks: float
|
|
555
|
+
total_leads: float
|
|
556
|
+
total_conversions: float
|
|
557
|
+
total_sales: float
|
|
558
|
+
total_sale_amount: float
|
|
559
|
+
total_commissions: float
|
|
560
|
+
|
|
561
|
+
|
|
562
|
+
class SaleCreatedEventPartner(BaseModel):
|
|
563
|
+
id: str
|
|
564
|
+
r"""The partner's unique ID on Dub."""
|
|
565
|
+
|
|
566
|
+
name: str
|
|
567
|
+
r"""The partner's full legal name."""
|
|
568
|
+
|
|
569
|
+
email: Nullable[str]
|
|
570
|
+
r"""The partner's email address. Should be a unique value across Dub."""
|
|
571
|
+
|
|
572
|
+
image: Nullable[str]
|
|
573
|
+
r"""The partner's avatar image."""
|
|
574
|
+
|
|
575
|
+
payouts_enabled_at: Annotated[
|
|
576
|
+
Nullable[str], pydantic.Field(alias="payoutsEnabledAt")
|
|
577
|
+
]
|
|
578
|
+
r"""The date when the partner enabled payouts."""
|
|
579
|
+
|
|
580
|
+
country: Nullable[str]
|
|
581
|
+
r"""The partner's country (required for tax purposes)."""
|
|
582
|
+
|
|
583
|
+
total_clicks: Annotated[float, pydantic.Field(alias="totalClicks")]
|
|
584
|
+
|
|
585
|
+
total_leads: Annotated[float, pydantic.Field(alias="totalLeads")]
|
|
586
|
+
|
|
587
|
+
total_conversions: Annotated[float, pydantic.Field(alias="totalConversions")]
|
|
588
|
+
|
|
589
|
+
total_sales: Annotated[float, pydantic.Field(alias="totalSales")]
|
|
590
|
+
|
|
591
|
+
total_sale_amount: Annotated[float, pydantic.Field(alias="totalSaleAmount")]
|
|
592
|
+
|
|
593
|
+
total_commissions: Annotated[float, pydantic.Field(alias="totalCommissions")]
|
|
594
|
+
|
|
595
|
+
@model_serializer(mode="wrap")
|
|
596
|
+
def serialize_model(self, handler):
|
|
597
|
+
optional_fields = []
|
|
598
|
+
nullable_fields = ["email", "image", "payoutsEnabledAt", "country"]
|
|
599
|
+
null_default_fields = []
|
|
600
|
+
|
|
601
|
+
serialized = handler(self)
|
|
602
|
+
|
|
603
|
+
m = {}
|
|
604
|
+
|
|
605
|
+
for n, f in type(self).model_fields.items():
|
|
606
|
+
k = f.alias or n
|
|
607
|
+
val = serialized.get(k)
|
|
608
|
+
serialized.pop(k, None)
|
|
609
|
+
|
|
610
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
|
611
|
+
is_set = (
|
|
612
|
+
self.__pydantic_fields_set__.intersection({n})
|
|
613
|
+
or k in null_default_fields
|
|
614
|
+
) # pylint: disable=no-member
|
|
615
|
+
|
|
616
|
+
if val is not None and val != UNSET_SENTINEL:
|
|
617
|
+
m[k] = val
|
|
618
|
+
elif val != UNSET_SENTINEL and (
|
|
619
|
+
not k in optional_fields or (optional_nullable and is_set)
|
|
620
|
+
):
|
|
621
|
+
m[k] = val
|
|
622
|
+
|
|
623
|
+
return m
|
|
624
|
+
|
|
625
|
+
|
|
541
626
|
class SaleCreatedEventDataTypedDict(TypedDict):
|
|
542
627
|
event_name: str
|
|
543
628
|
customer: SaleCreatedEventCustomerTypedDict
|
|
544
629
|
click: SaleCreatedEventClickTypedDict
|
|
545
630
|
link: SaleCreatedEventLinkTypedDict
|
|
546
631
|
sale: SaleCreatedEventSaleTypedDict
|
|
632
|
+
metadata: Nullable[Dict[str, Any]]
|
|
633
|
+
partner: NotRequired[Nullable[SaleCreatedEventPartnerTypedDict]]
|
|
547
634
|
|
|
548
635
|
|
|
549
636
|
class SaleCreatedEventData(BaseModel):
|
|
@@ -557,6 +644,40 @@ class SaleCreatedEventData(BaseModel):
|
|
|
557
644
|
|
|
558
645
|
sale: SaleCreatedEventSale
|
|
559
646
|
|
|
647
|
+
metadata: Nullable[Dict[str, Any]]
|
|
648
|
+
|
|
649
|
+
partner: OptionalNullable[SaleCreatedEventPartner] = UNSET
|
|
650
|
+
|
|
651
|
+
@model_serializer(mode="wrap")
|
|
652
|
+
def serialize_model(self, handler):
|
|
653
|
+
optional_fields = ["partner"]
|
|
654
|
+
nullable_fields = ["partner", "metadata"]
|
|
655
|
+
null_default_fields = []
|
|
656
|
+
|
|
657
|
+
serialized = handler(self)
|
|
658
|
+
|
|
659
|
+
m = {}
|
|
660
|
+
|
|
661
|
+
for n, f in type(self).model_fields.items():
|
|
662
|
+
k = f.alias or n
|
|
663
|
+
val = serialized.get(k)
|
|
664
|
+
serialized.pop(k, None)
|
|
665
|
+
|
|
666
|
+
optional_nullable = k in optional_fields and k in nullable_fields
|
|
667
|
+
is_set = (
|
|
668
|
+
self.__pydantic_fields_set__.intersection({n})
|
|
669
|
+
or k in null_default_fields
|
|
670
|
+
) # pylint: disable=no-member
|
|
671
|
+
|
|
672
|
+
if val is not None and val != UNSET_SENTINEL:
|
|
673
|
+
m[k] = val
|
|
674
|
+
elif val != UNSET_SENTINEL and (
|
|
675
|
+
not k in optional_fields or (optional_nullable and is_set)
|
|
676
|
+
):
|
|
677
|
+
m[k] = val
|
|
678
|
+
|
|
679
|
+
return m
|
|
680
|
+
|
|
560
681
|
|
|
561
682
|
class SaleCreatedEventTypedDict(TypedDict):
|
|
562
683
|
r"""Triggered when a sale is created."""
|
|
@@ -159,6 +159,8 @@ class WorkspaceSchemaTypedDict(TypedDict):
|
|
|
159
159
|
r"""The miscellaneous key-value store of the workspace."""
|
|
160
160
|
allowed_hostnames: Nullable[List[str]]
|
|
161
161
|
r"""Specifies hostnames permitted for client-side click tracking."""
|
|
162
|
+
sso_email_domain: Nullable[str]
|
|
163
|
+
sso_enforced_at: Nullable[str]
|
|
162
164
|
logo: NotRequired[Nullable[str]]
|
|
163
165
|
r"""The logo of the workspace."""
|
|
164
166
|
flags: NotRequired[Dict[str, bool]]
|
|
@@ -264,6 +266,10 @@ class WorkspaceSchema(BaseModel):
|
|
|
264
266
|
]
|
|
265
267
|
r"""Specifies hostnames permitted for client-side click tracking."""
|
|
266
268
|
|
|
269
|
+
sso_email_domain: Annotated[Nullable[str], pydantic.Field(alias="ssoEmailDomain")]
|
|
270
|
+
|
|
271
|
+
sso_enforced_at: Annotated[Nullable[str], pydantic.Field(alias="ssoEnforcedAt")]
|
|
272
|
+
|
|
267
273
|
logo: OptionalNullable[str] = None
|
|
268
274
|
r"""The logo of the workspace."""
|
|
269
275
|
|
|
@@ -281,6 +287,8 @@ class WorkspaceSchema(BaseModel):
|
|
|
281
287
|
"stripeConnectId",
|
|
282
288
|
"store",
|
|
283
289
|
"allowedHostnames",
|
|
290
|
+
"ssoEmailDomain",
|
|
291
|
+
"ssoEnforcedAt",
|
|
284
292
|
]
|
|
285
293
|
null_default_fields = ["logo"]
|
|
286
294
|
|
|
@@ -17,6 +17,8 @@ class CreateCustomerRequestBodyTypedDict(TypedDict):
|
|
|
17
17
|
r"""Name of the customer in the client's app. If not provided, a random name will be generated."""
|
|
18
18
|
avatar: NotRequired[Nullable[str]]
|
|
19
19
|
r"""Avatar URL of the customer in the client's app."""
|
|
20
|
+
stripe_customer_id: NotRequired[Nullable[str]]
|
|
21
|
+
r"""The customer's Stripe customer ID. Useful for attribution recurring sale events to the partner who referred the customer."""
|
|
20
22
|
|
|
21
23
|
|
|
22
24
|
class CreateCustomerRequestBody(BaseModel):
|
|
@@ -32,10 +34,15 @@ class CreateCustomerRequestBody(BaseModel):
|
|
|
32
34
|
avatar: OptionalNullable[str] = UNSET
|
|
33
35
|
r"""Avatar URL of the customer in the client's app."""
|
|
34
36
|
|
|
37
|
+
stripe_customer_id: Annotated[
|
|
38
|
+
OptionalNullable[str], pydantic.Field(alias="stripeCustomerId")
|
|
39
|
+
] = UNSET
|
|
40
|
+
r"""The customer's Stripe customer ID. Useful for attribution recurring sale events to the partner who referred the customer."""
|
|
41
|
+
|
|
35
42
|
@model_serializer(mode="wrap")
|
|
36
43
|
def serialize_model(self, handler):
|
|
37
|
-
optional_fields = ["email", "name", "avatar"]
|
|
38
|
-
nullable_fields = ["email", "name", "avatar"]
|
|
44
|
+
optional_fields = ["email", "name", "avatar", "stripeCustomerId"]
|
|
45
|
+
nullable_fields = ["email", "name", "avatar", "stripeCustomerId"]
|
|
39
46
|
null_default_fields = []
|
|
40
47
|
|
|
41
48
|
serialized = handler(self)
|
|
@@ -223,9 +230,9 @@ class CreateCustomerDiscount(BaseModel):
|
|
|
223
230
|
optional_fields = ["description", "partnersCount"]
|
|
224
231
|
nullable_fields = [
|
|
225
232
|
"maxDuration",
|
|
226
|
-
"description",
|
|
227
233
|
"couponId",
|
|
228
234
|
"couponTestId",
|
|
235
|
+
"description",
|
|
229
236
|
"partnersCount",
|
|
230
237
|
]
|
|
231
238
|
null_default_fields = []
|