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

1from datetime import datetime 

2from typing import Annotated, Literal, TypedDict 

3 

4from pydantic import UUID4, Discriminator, TypeAdapter 

5 

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 

40 

41from .customer import CustomerPortalCustomer 

42 

43 

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 

53 

54 

55class CustomerBenefitGrantDiscord(CustomerBenefitGrantBase): 

56 customer: CustomerPortalCustomer 

57 benefit: BenefitDiscordSubscriber 

58 properties: BenefitGrantDiscordProperties 

59 

60 

61class CustomerBenefitGrantGitHubRepository(CustomerBenefitGrantBase): 

62 customer: CustomerPortalCustomer 

63 benefit: BenefitGitHubRepositorySubscriber 

64 properties: BenefitGrantGitHubRepositoryProperties 

65 

66 

67class CustomerBenefitGrantDownloadables(CustomerBenefitGrantBase): 

68 customer: CustomerPortalCustomer 

69 benefit: BenefitDownloadablesSubscriber 

70 properties: BenefitGrantDownloadablesProperties 

71 

72 

73class CustomerBenefitGrantLicenseKeys(CustomerBenefitGrantBase): 

74 customer: CustomerPortalCustomer 

75 benefit: BenefitLicenseKeysSubscriber 

76 properties: BenefitGrantLicenseKeysProperties 

77 

78 

79class CustomerBenefitGrantCustom(CustomerBenefitGrantBase): 

80 customer: CustomerPortalCustomer 

81 benefit: BenefitCustomSubscriber 

82 properties: BenefitGrantCustomProperties 

83 

84 

85class CustomerBenefitGrantMeterCredit(CustomerBenefitGrantBase): 

86 customer: CustomerPortalCustomer 

87 benefit: BenefitMeterCreditSubscriber 

88 properties: BenefitGrantMeterCreditProperties 

89 

90 

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) 

105 

106 

107class CustomerBenefitGrantUpdateBase(Schema): 

108 benefit_type: BenefitType 

109 

110 

111class CustomerBenefitGrantDiscordPropertiesUpdate(TypedDict): 

112 account_id: str | None 

113 

114 

115class CustomerBenefitGrantDiscordUpdate(CustomerBenefitGrantUpdateBase): 

116 benefit_type: Literal[BenefitType.discord] 

117 properties: CustomerBenefitGrantDiscordPropertiesUpdate 

118 

119 def get_oauth_platform(self) -> Literal[CustomerOAuthPlatform.discord]: 

120 return CustomerOAuthPlatform.discord 

121 

122 

123class CustomerBenefitGrantGitHubRepositoryPropertiesUpdate(TypedDict): 

124 account_id: str | None 

125 

126 

127class CustomerBenefitGrantGitHubRepositoryUpdate(CustomerBenefitGrantUpdateBase): 

128 benefit_type: Literal[BenefitType.github_repository] 

129 properties: CustomerBenefitGrantGitHubRepositoryPropertiesUpdate 

130 

131 def get_oauth_platform(self) -> Literal[CustomerOAuthPlatform.github]: 

132 return CustomerOAuthPlatform.github 

133 

134 

135class CustomerBenefitGrantDownloadablesUpdate(CustomerBenefitGrantUpdateBase): 

136 benefit_type: Literal[BenefitType.downloadables] 

137 

138 

139class CustomerBenefitGrantLicenseKeysUpdate(CustomerBenefitGrantUpdateBase): 

140 benefit_type: Literal[BenefitType.license_keys] 

141 

142 

143class CustomerBenefitGrantCustomUpdate(CustomerBenefitGrantUpdateBase): 

144 benefit_type: Literal[BenefitType.custom] 

145 

146 

147class CustomerBenefitGrantMeterCreditUpdate(CustomerBenefitGrantUpdateBase): 

148 benefit_type: Literal[BenefitType.meter_credit] 

149 

150 

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]