Coverage for polar/customer_portal/schemas/benefit_grant.py: 95%
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 datetime import datetime
2from typing import Annotated, Literal, TypedDict
4from pydantic import UUID4, Discriminator, TypeAdapter
6from polar.benefit.strategies.custom.properties import BenefitGrantCustomProperties
7from polar.benefit.strategies.custom.schemas import BenefitCustomSubscriber
8from polar.benefit.strategies.discord.properties import BenefitGrantDiscordProperties
9from polar.benefit.strategies.discord.schemas import BenefitDiscordSubscriber
10from polar.benefit.strategies.downloadables.properties import (
11 BenefitGrantDownloadablesProperties,
12)
13from polar.benefit.strategies.downloadables.schemas import (
14 BenefitDownloadablesSubscriber,
15)
16from polar.benefit.strategies.github_repository.properties import (
17 BenefitGrantGitHubRepositoryProperties,
18)
19from polar.benefit.strategies.github_repository.schemas import (
20 BenefitGitHubRepositorySubscriber,
21)
22from polar.benefit.strategies.license_keys.properties import (
23 BenefitGrantLicenseKeysProperties,
24)
25from polar.benefit.strategies.license_keys.schemas import BenefitLicenseKeysSubscriber
26from polar.benefit.strategies.meter_credit.properties import (
27 BenefitGrantMeterCreditProperties,
28)
29from polar.benefit.strategies.meter_credit.schemas import BenefitMeterCreditSubscriber
30from polar.kit.schemas import (
31 ClassName,
32 IDSchema,
33 MergeJSONSchema,
34 Schema,
35 SetSchemaReference,
36 TimestampedSchema,
37)
38from polar.models.benefit import BenefitType
39from polar.models.customer import CustomerOAuthPlatform
41from .customer import CustomerPortalCustomer
44class CustomerBenefitGrantBase(IDSchema, TimestampedSchema):
45 granted_at: datetime | None
46 revoked_at: datetime | None
47 customer_id: UUID4
48 benefit_id: UUID4
49 subscription_id: UUID4 | None
50 order_id: UUID4 | None
51 is_granted: bool
52 is_revoked: bool
55class CustomerBenefitGrantDiscord(CustomerBenefitGrantBase):
56 customer: CustomerPortalCustomer
57 benefit: BenefitDiscordSubscriber
58 properties: BenefitGrantDiscordProperties
61class CustomerBenefitGrantGitHubRepository(CustomerBenefitGrantBase):
62 customer: CustomerPortalCustomer
63 benefit: BenefitGitHubRepositorySubscriber
64 properties: BenefitGrantGitHubRepositoryProperties
67class CustomerBenefitGrantDownloadables(CustomerBenefitGrantBase):
68 customer: CustomerPortalCustomer
69 benefit: BenefitDownloadablesSubscriber
70 properties: BenefitGrantDownloadablesProperties
73class CustomerBenefitGrantLicenseKeys(CustomerBenefitGrantBase):
74 customer: CustomerPortalCustomer
75 benefit: BenefitLicenseKeysSubscriber
76 properties: BenefitGrantLicenseKeysProperties
79class CustomerBenefitGrantCustom(CustomerBenefitGrantBase):
80 customer: CustomerPortalCustomer
81 benefit: BenefitCustomSubscriber
82 properties: BenefitGrantCustomProperties
85class CustomerBenefitGrantMeterCredit(CustomerBenefitGrantBase):
86 customer: CustomerPortalCustomer
87 benefit: BenefitMeterCreditSubscriber
88 properties: BenefitGrantMeterCreditProperties
91CustomerBenefitGrant = Annotated[
92 CustomerBenefitGrantDiscord
93 | CustomerBenefitGrantGitHubRepository
94 | CustomerBenefitGrantDownloadables
95 | CustomerBenefitGrantLicenseKeys
96 | CustomerBenefitGrantCustom
97 | CustomerBenefitGrantMeterCredit,
98 SetSchemaReference("CustomerBenefitGrant"),
99 MergeJSONSchema({"title": "CustomerBenefitGrant"}),
100 ClassName("CustomerBenefitGrant"),
101]
102CustomerBenefitGrantAdapter: TypeAdapter[CustomerBenefitGrant] = TypeAdapter(
103 CustomerBenefitGrant
104)
107class CustomerBenefitGrantUpdateBase(Schema):
108 benefit_type: BenefitType
111class CustomerBenefitGrantDiscordPropertiesUpdate(TypedDict):
112 account_id: str | None
115class CustomerBenefitGrantDiscordUpdate(CustomerBenefitGrantUpdateBase):
116 benefit_type: Literal[BenefitType.discord]
117 properties: CustomerBenefitGrantDiscordPropertiesUpdate
119 def get_oauth_platform(self) -> Literal[CustomerOAuthPlatform.discord]:
120 return CustomerOAuthPlatform.discord
123class CustomerBenefitGrantGitHubRepositoryPropertiesUpdate(TypedDict):
124 account_id: str | None
127class CustomerBenefitGrantGitHubRepositoryUpdate(CustomerBenefitGrantUpdateBase):
128 benefit_type: Literal[BenefitType.github_repository]
129 properties: CustomerBenefitGrantGitHubRepositoryPropertiesUpdate
131 def get_oauth_platform(self) -> Literal[CustomerOAuthPlatform.github]:
132 return CustomerOAuthPlatform.github
135class CustomerBenefitGrantDownloadablesUpdate(CustomerBenefitGrantUpdateBase):
136 benefit_type: Literal[BenefitType.downloadables]
139class CustomerBenefitGrantLicenseKeysUpdate(CustomerBenefitGrantUpdateBase):
140 benefit_type: Literal[BenefitType.license_keys]
143class CustomerBenefitGrantCustomUpdate(CustomerBenefitGrantUpdateBase):
144 benefit_type: Literal[BenefitType.custom]
147class CustomerBenefitGrantMeterCreditUpdate(CustomerBenefitGrantUpdateBase):
148 benefit_type: Literal[BenefitType.meter_credit]
151CustomerBenefitGrantUpdate = Annotated[
152 CustomerBenefitGrantDiscordUpdate
153 | CustomerBenefitGrantGitHubRepositoryUpdate
154 | CustomerBenefitGrantDownloadablesUpdate
155 | CustomerBenefitGrantLicenseKeysUpdate
156 | CustomerBenefitGrantCustomUpdate
157 | CustomerBenefitGrantMeterCreditUpdate,
158 SetSchemaReference("CustomerBenefitGrantUpdate"),
159 MergeJSONSchema({"title": "CustomerBenefitGrantUpdate"}),
160 Discriminator("benefit_type"),
161]