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

1from typing import Annotated 

2 

3from pydantic import UUID4, Discriminator 

4 

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 

27 

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) 

60 

61BENEFIT_DESCRIPTION_MIN_LENGTH = 3 

62BENEFIT_DESCRIPTION_MAX_LENGTH = 42 

63 

64BenefitID = Annotated[ 

65 UUID4, 

66 MergeJSONSchema({"description": "The benefit ID."}), 

67 SelectorWidget("/v1/benefits", "Benefit", "description"), 

68] 

69 

70 

71BenefitCreate = Annotated[ 

72 BenefitCustomCreate 

73 | BenefitDiscordCreate 

74 | BenefitGitHubRepositoryCreate 

75 | BenefitDownloadablesCreate 

76 | BenefitLicenseKeysCreate 

77 | BenefitMeterCreditCreate, 

78 Discriminator("type"), 

79 SetSchemaReference("BenefitCreate"), 

80] 

81 

82 

83BenefitUpdate = ( 

84 BenefitCustomUpdate 

85 | BenefitDiscordUpdate 

86 | BenefitGitHubRepositoryUpdate 

87 | BenefitDownloadablesUpdate 

88 | BenefitLicenseKeysUpdate 

89 | BenefitMeterCreditUpdate 

90) 

91 

92 

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] 

104 

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} 

113 

114 

115class BenefitGrant(BenefitGrantBase): 

116 customer: Customer 

117 benefit: "Benefit" 

118 properties: BenefitGrantProperties 

119 

120 

121class BenefitGrantWebhookBase(BenefitGrantBase): 

122 customer: Customer 

123 

124 

125class BenefitGrantDiscordWebhook(BenefitGrantWebhookBase): 

126 benefit: BenefitDiscord 

127 properties: BenefitGrantDiscordProperties 

128 previous_properties: BenefitGrantDiscordProperties | None = None 

129 

130 

131class BenefitGrantCustomWebhook(BenefitGrantWebhookBase): 

132 benefit: BenefitCustom 

133 properties: BenefitGrantCustomProperties 

134 previous_properties: BenefitGrantCustomProperties | None = None 

135 

136 

137class BenefitGrantGitHubRepositoryWebhook(BenefitGrantWebhookBase): 

138 benefit: BenefitGitHubRepository 

139 properties: BenefitGrantGitHubRepositoryProperties 

140 previous_properties: BenefitGrantGitHubRepositoryProperties | None = None 

141 

142 

143class BenefitGrantDownloadablesWebhook(BenefitGrantWebhookBase): 

144 benefit: BenefitDownloadables 

145 properties: BenefitGrantDownloadablesProperties 

146 previous_properties: BenefitGrantDownloadablesProperties | None = None 

147 

148 

149class BenefitGrantLicenseKeysWebhook(BenefitGrantWebhookBase): 

150 benefit: BenefitLicenseKeys 

151 properties: BenefitGrantLicenseKeysProperties 

152 previous_properties: BenefitGrantLicenseKeysProperties | None = None 

153 

154 

155class BenefitGrantMeterCreditWebhook(BenefitGrantWebhookBase): 

156 benefit: BenefitMeterCredit 

157 properties: BenefitGrantMeterCreditProperties 

158 previous_properties: BenefitGrantMeterCreditProperties | None = None 

159 

160 

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] 

172 

173 

174# Properties that are public (when embedding products benefits in storefront and checkout) 

175class BenefitPublic(BenefitPublicBase): ...