Coverage for polar/benefit/schemas.py: 100%
42 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-07 12:42 +0000
1from typing import Annotated
3from pydantic import UUID4, Discriminator
5from polar.benefit.strategies.custom.properties import BenefitGrantCustomProperties
6from polar.benefit.strategies.discord.properties import BenefitGrantDiscordProperties
7from polar.benefit.strategies.downloadables.properties import (
8 BenefitGrantDownloadablesProperties,
9)
10from polar.benefit.strategies.github_repository.properties import (
11 BenefitGrantGitHubRepositoryProperties,
12)
13from polar.benefit.strategies.license_keys.properties import (
14 BenefitGrantLicenseKeysProperties,
15)
16from polar.benefit.strategies.meter_credit.properties import (
17 BenefitGrantMeterCreditProperties,
18)
19from polar.customer.schemas.customer import Customer
20from polar.kit.schemas import (
21 ClassName,
22 MergeJSONSchema,
23 SelectorWidget,
24 SetSchemaReference,
25)
26from polar.models.benefit import BenefitType
28from .strategies import BenefitGrantProperties
29from .strategies.base.schemas import BenefitGrantBase, BenefitPublicBase
30from .strategies.custom.schemas import (
31 BenefitCustom,
32 BenefitCustomCreate,
33 BenefitCustomUpdate,
34)
35from .strategies.discord.schemas import (
36 BenefitDiscord,
37 BenefitDiscordCreate,
38 BenefitDiscordUpdate,
39)
40from .strategies.downloadables.schemas import (
41 BenefitDownloadables,
42 BenefitDownloadablesCreate,
43 BenefitDownloadablesUpdate,
44)
45from .strategies.github_repository.schemas import (
46 BenefitGitHubRepository,
47 BenefitGitHubRepositoryCreate,
48 BenefitGitHubRepositoryUpdate,
49)
50from .strategies.license_keys.schemas import (
51 BenefitLicenseKeys,
52 BenefitLicenseKeysCreate,
53 BenefitLicenseKeysUpdate,
54)
55from .strategies.meter_credit.schemas import (
56 BenefitMeterCredit,
57 BenefitMeterCreditCreate,
58 BenefitMeterCreditUpdate,
59)
61BENEFIT_DESCRIPTION_MIN_LENGTH = 3
62BENEFIT_DESCRIPTION_MAX_LENGTH = 42
64BenefitID = Annotated[
65 UUID4,
66 MergeJSONSchema({"description": "The benefit ID."}),
67 SelectorWidget("/v1/benefits", "Benefit", "description"),
68]
71BenefitCreate = Annotated[
72 BenefitCustomCreate
73 | BenefitDiscordCreate
74 | BenefitGitHubRepositoryCreate
75 | BenefitDownloadablesCreate
76 | BenefitLicenseKeysCreate
77 | BenefitMeterCreditCreate,
78 Discriminator("type"),
79 SetSchemaReference("BenefitCreate"),
80]
83BenefitUpdate = (
84 BenefitCustomUpdate
85 | BenefitDiscordUpdate
86 | BenefitGitHubRepositoryUpdate
87 | BenefitDownloadablesUpdate
88 | BenefitLicenseKeysUpdate
89 | BenefitMeterCreditUpdate
90)
93Benefit = Annotated[
94 BenefitCustom
95 | BenefitDiscord
96 | BenefitGitHubRepository
97 | BenefitDownloadables
98 | BenefitLicenseKeys
99 | BenefitMeterCredit,
100 SetSchemaReference("Benefit"),
101 MergeJSONSchema({"title": "Benefit"}),
102 ClassName("Benefit"),
103]
105benefit_schema_map: dict[BenefitType, type[Benefit]] = {
106 BenefitType.discord: BenefitDiscord,
107 BenefitType.custom: BenefitCustom,
108 BenefitType.github_repository: BenefitGitHubRepository,
109 BenefitType.downloadables: BenefitDownloadables,
110 BenefitType.license_keys: BenefitLicenseKeys,
111 BenefitType.meter_credit: BenefitMeterCredit,
112}
115class BenefitGrant(BenefitGrantBase):
116 customer: Customer
117 benefit: "Benefit"
118 properties: BenefitGrantProperties
121class BenefitGrantWebhookBase(BenefitGrantBase):
122 customer: Customer
125class BenefitGrantDiscordWebhook(BenefitGrantWebhookBase):
126 benefit: BenefitDiscord
127 properties: BenefitGrantDiscordProperties
128 previous_properties: BenefitGrantDiscordProperties | None = None
131class BenefitGrantCustomWebhook(BenefitGrantWebhookBase):
132 benefit: BenefitCustom
133 properties: BenefitGrantCustomProperties
134 previous_properties: BenefitGrantCustomProperties | None = None
137class BenefitGrantGitHubRepositoryWebhook(BenefitGrantWebhookBase):
138 benefit: BenefitGitHubRepository
139 properties: BenefitGrantGitHubRepositoryProperties
140 previous_properties: BenefitGrantGitHubRepositoryProperties | None = None
143class BenefitGrantDownloadablesWebhook(BenefitGrantWebhookBase):
144 benefit: BenefitDownloadables
145 properties: BenefitGrantDownloadablesProperties
146 previous_properties: BenefitGrantDownloadablesProperties | None = None
149class BenefitGrantLicenseKeysWebhook(BenefitGrantWebhookBase):
150 benefit: BenefitLicenseKeys
151 properties: BenefitGrantLicenseKeysProperties
152 previous_properties: BenefitGrantLicenseKeysProperties | None = None
155class BenefitGrantMeterCreditWebhook(BenefitGrantWebhookBase):
156 benefit: BenefitMeterCredit
157 properties: BenefitGrantMeterCreditProperties
158 previous_properties: BenefitGrantMeterCreditProperties | None = None
161BenefitGrantWebhook = Annotated[
162 BenefitGrantDiscordWebhook
163 | BenefitGrantCustomWebhook
164 | BenefitGrantGitHubRepositoryWebhook
165 | BenefitGrantDownloadablesWebhook
166 | BenefitGrantLicenseKeysWebhook
167 | BenefitGrantMeterCreditWebhook,
168 SetSchemaReference("BenefitGrantWebhook"),
169 MergeJSONSchema({"title": "BenefitGrantWebhook"}),
170 ClassName("BenefitGrantWebhook"),
171]
174# Properties that are public (when embedding products benefits in storefront and checkout)
175class BenefitPublic(BenefitPublicBase): ...