Skip to content
This repository was archived by the owner on May 5, 2025. It is now read-only.

Commit 33b9af9

Browse files
authored
ref: Remove plan constants in shared, create properties on model instead of dataclass/DTO (#509)
* init test * fix tests * add is_trial_plan * update plan service to reflect new props
1 parent 1f0a5e6 commit 33b9af9

File tree

5 files changed

+81
-437
lines changed

5 files changed

+81
-437
lines changed

shared/django_apps/codecov_auth/models.py

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from shared.django_apps.codecov_auth.managers import OwnerManager
3030
from shared.django_apps.core.managers import RepositoryManager
3131
from shared.django_apps.core.models import DateTimeWithoutTZField, Repository
32-
from shared.plan.constants import PlanName, TrialDaysAmount
32+
from shared.plan.constants import PlanName, TierName, TrialDaysAmount
3333

3434
# Added to avoid 'doesn't declare an explicit app_label and isn't in an application in INSTALLED_APPS' error\
3535
# Needs to be called the same as the API app
@@ -1045,6 +1045,33 @@ class Meta:
10451045
def __str__(self):
10461046
return self.name
10471047

1048+
@property
1049+
def is_free_plan(self):
1050+
return not self.paid_plan
1051+
1052+
@property
1053+
def is_pro_plan(self):
1054+
return (
1055+
self.tier.tier_name == TierName.PRO.value
1056+
or self.tier.tier_name == TierName.SENTRY.value
1057+
)
1058+
1059+
@property
1060+
def is_team_plan(self):
1061+
return self.tier.tier_name == TierName.TEAM.value
1062+
1063+
@property
1064+
def is_enterprise_plan(self):
1065+
return self.tier.tier_name == TierName.ENTERPRISE.value
1066+
1067+
@property
1068+
def is_sentry_plan(self):
1069+
return self.tier.tier_name == TierName.SENTRY.value
1070+
1071+
@property
1072+
def is_trial_plan(self):
1073+
return self.tier.tier_name == TierName.TRIAL.value
1074+
10481075

10491076
class Tier(BaseModel):
10501077
tier_name = models.CharField(max_length=255, unique=True)

shared/plan/constants.py

Lines changed: 0 additions & 340 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
11
import enum
2-
from dataclasses import dataclass
3-
from typing import List, Optional
42

53
from shared.django_apps.utils.config import RUN_ENV
64

@@ -83,343 +81,5 @@ class TierName(enum.Enum):
8381
TRIAL = "trial"
8482

8583

86-
def convert_to_DTO(plan) -> dict:
87-
return {
88-
"marketing_name": plan.marketing_name,
89-
"value": plan.name,
90-
"billing_rate": plan.billing_rate,
91-
"base_unit_price": plan.base_unit_price,
92-
"benefits": plan.benefits,
93-
"tier_name": plan.tier.tier_name,
94-
"monthly_uploads_limit": plan.monthly_uploads_limit,
95-
"is_free_plan": not plan.paid_plan,
96-
"is_pro_plan": plan.tier.tier_name == TierName.PRO.value,
97-
"is_team_plan": plan.tier.tier_name == TierName.TEAM.value,
98-
"is_enterprise_plan": plan.tier.tier_name == TierName.ENTERPRISE.value,
99-
"is_trial_plan": plan.tier.tier_name == TierName.TRIAL.value,
100-
"is_sentry_plan": plan.tier.tier_name == TierName.SENTRY.value,
101-
}
102-
103-
104-
@dataclass(repr=False)
105-
class PlanData:
106-
"""
107-
Dataclass that represents plan related information
108-
"""
109-
110-
marketing_name: PlanMarketingName
111-
value: PlanName
112-
billing_rate: Optional[PlanBillingRate]
113-
base_unit_price: PlanPrice
114-
benefits: List[str]
115-
tier_name: TierName
116-
monthly_uploads_limit: Optional[MonthlyUploadLimits]
117-
trial_days: Optional[TrialDaysAmount]
118-
119-
def convert_to_DTO(self) -> dict:
120-
return {
121-
"marketing_name": self.marketing_name,
122-
"value": self.value,
123-
"billing_rate": self.billing_rate,
124-
"base_unit_price": self.base_unit_price,
125-
"benefits": self.benefits,
126-
"tier_name": self.tier_name,
127-
"monthly_uploads_limit": self.monthly_uploads_limit,
128-
"is_free_plan": self.tier_name == TierName.BASIC.value,
129-
"is_pro_plan": self.tier_name == TierName.PRO.value,
130-
"is_team_plan": self.tier_name == TierName.TEAM.value,
131-
"is_enterprise_plan": self.tier_name == TierName.ENTERPRISE.value,
132-
"is_trial_plan": self.value == PlanName.TRIAL_PLAN_NAME.value,
133-
"is_sentry_plan": self.value in SENTRY_PAID_USER_PLAN_REPRESENTATIONS,
134-
}
135-
136-
137-
NON_PR_AUTHOR_PAID_USER_PLAN_REPRESENTATIONS = {
138-
PlanName.CODECOV_PRO_MONTHLY_LEGACY.value: PlanData(
139-
marketing_name=PlanMarketingName.CODECOV_PRO.value,
140-
value=PlanName.CODECOV_PRO_MONTHLY_LEGACY.value,
141-
billing_rate=PlanBillingRate.MONTHLY.value,
142-
base_unit_price=PlanPrice.MONTHLY.value,
143-
benefits=[
144-
"Configurable # of users",
145-
"Unlimited public repositories",
146-
"Unlimited private repositories",
147-
"Priority Support",
148-
],
149-
tier_name=TierName.PRO.value,
150-
monthly_uploads_limit=None,
151-
trial_days=None,
152-
),
153-
PlanName.CODECOV_PRO_YEARLY_LEGACY.value: PlanData(
154-
marketing_name=PlanMarketingName.CODECOV_PRO.value,
155-
value=PlanName.CODECOV_PRO_YEARLY_LEGACY.value,
156-
billing_rate=PlanBillingRate.YEARLY.value,
157-
base_unit_price=PlanPrice.YEARLY.value,
158-
benefits=[
159-
"Configurable # of users",
160-
"Unlimited public repositories",
161-
"Unlimited private repositories",
162-
"Priority Support",
163-
],
164-
tier_name=TierName.PRO.value,
165-
monthly_uploads_limit=None,
166-
trial_days=None,
167-
),
168-
}
169-
170-
171-
PR_AUTHOR_PAID_USER_PLAN_REPRESENTATIONS = {
172-
PlanName.CODECOV_PRO_MONTHLY.value: PlanData(
173-
marketing_name=PlanMarketingName.CODECOV_PRO.value,
174-
value=PlanName.CODECOV_PRO_MONTHLY.value,
175-
billing_rate=PlanBillingRate.MONTHLY.value,
176-
base_unit_price=PlanPrice.MONTHLY.value,
177-
benefits=[
178-
"Configurable # of users",
179-
"Unlimited public repositories",
180-
"Unlimited private repositories",
181-
"Priority Support",
182-
],
183-
tier_name=TierName.PRO.value,
184-
monthly_uploads_limit=None,
185-
trial_days=None,
186-
),
187-
PlanName.CODECOV_PRO_YEARLY.value: PlanData(
188-
marketing_name=PlanMarketingName.CODECOV_PRO.value,
189-
value=PlanName.CODECOV_PRO_YEARLY.value,
190-
billing_rate=PlanBillingRate.YEARLY.value,
191-
base_unit_price=PlanPrice.YEARLY.value,
192-
benefits=[
193-
"Configurable # of users",
194-
"Unlimited public repositories",
195-
"Unlimited private repositories",
196-
"Priority Support",
197-
],
198-
tier_name=TierName.PRO.value,
199-
monthly_uploads_limit=None,
200-
trial_days=None,
201-
),
202-
}
203-
204-
SENTRY_PAID_USER_PLAN_REPRESENTATIONS = {
205-
PlanName.SENTRY_MONTHLY.value: PlanData(
206-
marketing_name=PlanMarketingName.SENTRY_PRO.value,
207-
value=PlanName.SENTRY_MONTHLY.value,
208-
billing_rate=PlanBillingRate.MONTHLY.value,
209-
base_unit_price=PlanPrice.MONTHLY.value,
210-
benefits=[
211-
"Includes 5 seats",
212-
"$12 per additional seat",
213-
"Unlimited public repositories",
214-
"Unlimited private repositories",
215-
"Priority Support",
216-
],
217-
tier_name=TierName.SENTRY.value,
218-
trial_days=TrialDaysAmount.CODECOV_SENTRY.value,
219-
monthly_uploads_limit=None,
220-
),
221-
PlanName.SENTRY_YEARLY.value: PlanData(
222-
marketing_name=PlanMarketingName.SENTRY_PRO.value,
223-
value=PlanName.SENTRY_YEARLY.value,
224-
billing_rate=PlanBillingRate.YEARLY.value,
225-
base_unit_price=PlanPrice.YEARLY.value,
226-
benefits=[
227-
"Includes 5 seats",
228-
"$10 per additional seat",
229-
"Unlimited public repositories",
230-
"Unlimited private repositories",
231-
"Priority Support",
232-
],
233-
tier_name=TierName.SENTRY.value,
234-
trial_days=TrialDaysAmount.CODECOV_SENTRY.value,
235-
monthly_uploads_limit=None,
236-
),
237-
}
238-
239-
# TODO: Update these values
240-
ENTERPRISE_CLOUD_USER_PLAN_REPRESENTATIONS = {
241-
PlanName.ENTERPRISE_CLOUD_MONTHLY.value: PlanData(
242-
marketing_name=PlanMarketingName.ENTERPRISE_CLOUD.value,
243-
value=PlanName.ENTERPRISE_CLOUD_MONTHLY.value,
244-
billing_rate=PlanBillingRate.MONTHLY.value,
245-
base_unit_price=PlanPrice.MONTHLY.value,
246-
benefits=[
247-
"Configurable # of users",
248-
"Unlimited public repositories",
249-
"Unlimited private repositories",
250-
"Priority Support",
251-
],
252-
tier_name=TierName.ENTERPRISE.value,
253-
trial_days=None,
254-
monthly_uploads_limit=None,
255-
),
256-
PlanName.ENTERPRISE_CLOUD_YEARLY.value: PlanData(
257-
marketing_name=PlanMarketingName.ENTERPRISE_CLOUD.value,
258-
value=PlanName.ENTERPRISE_CLOUD_YEARLY.value,
259-
billing_rate=PlanBillingRate.YEARLY.value,
260-
base_unit_price=PlanPrice.YEARLY.value,
261-
benefits=[
262-
"Configurable # of users",
263-
"Unlimited public repositories",
264-
"Unlimited private repositories",
265-
"Priority Support",
266-
],
267-
tier_name=TierName.ENTERPRISE.value,
268-
trial_days=None,
269-
monthly_uploads_limit=None,
270-
),
271-
}
272-
273-
GHM_PLAN_REPRESENTATION = {
274-
PlanName.GHM_PLAN_NAME.value: PlanData(
275-
marketing_name=PlanMarketingName.GITHUB_MARKETPLACE.value,
276-
value=PlanName.GHM_PLAN_NAME.value,
277-
billing_rate=None,
278-
base_unit_price=PlanPrice.GHM_PRICE.value,
279-
benefits=[
280-
"Configurable # of users",
281-
"Unlimited public repositories",
282-
"Unlimited private repositories",
283-
],
284-
tier_name=TierName.PRO.value,
285-
trial_days=None,
286-
monthly_uploads_limit=None,
287-
)
288-
}
289-
290-
BASIC_PLAN = PlanData(
291-
marketing_name=PlanMarketingName.BASIC.value,
292-
value=PlanName.BASIC_PLAN_NAME.value,
293-
billing_rate=None,
294-
base_unit_price=PlanPrice.CODECOV_BASIC.value,
295-
benefits=[
296-
"Up to 1 user",
297-
"Unlimited public repositories",
298-
"Unlimited private repositories",
299-
],
300-
tier_name=TierName.BASIC.value,
301-
monthly_uploads_limit=MonthlyUploadLimits.CODECOV_FREE_PLAN.value,
302-
trial_days=None,
303-
)
304-
305-
FREE_PLAN = PlanData(
306-
marketing_name=PlanMarketingName.FREE.value,
307-
value=PlanName.FREE_PLAN_NAME.value,
308-
billing_rate=None,
309-
base_unit_price=PlanPrice.CODECOV_FREE.value,
310-
benefits=[
311-
"Up to 1 user",
312-
"Unlimited public repositories",
313-
"Unlimited private repositories",
314-
],
315-
tier_name=TierName.BASIC.value,
316-
trial_days=None,
317-
monthly_uploads_limit=None,
318-
)
319-
320-
DEVELOPER_PLAN = PlanData(
321-
marketing_name=PlanMarketingName.FREE.value,
322-
value=DEFAULT_FREE_PLAN,
323-
billing_rate=None,
324-
base_unit_price=PlanPrice.CODECOV_FREE.value,
325-
benefits=[
326-
"Up to 1 user",
327-
"Unlimited public repositories",
328-
"Unlimited private repositories",
329-
],
330-
tier_name=TierName.TEAM.value,
331-
trial_days=None,
332-
monthly_uploads_limit=250,
333-
)
334-
335-
FREE_PLAN_REPRESENTATIONS = {
336-
PlanName.FREE_PLAN_NAME.value: FREE_PLAN,
337-
PlanName.BASIC_PLAN_NAME.value: BASIC_PLAN,
338-
DEFAULT_FREE_PLAN: DEVELOPER_PLAN,
339-
}
340-
341-
TEAM_PLAN_REPRESENTATIONS = {
342-
PlanName.TEAM_MONTHLY.value: PlanData(
343-
marketing_name=PlanMarketingName.TEAM.value,
344-
value=PlanName.TEAM_MONTHLY.value,
345-
billing_rate=PlanBillingRate.MONTHLY.value,
346-
base_unit_price=PlanPrice.TEAM_MONTHLY.value,
347-
benefits=[
348-
"Up to 10 users",
349-
"Unlimited repositories",
350-
"2500 private repo uploads",
351-
"Patch coverage analysis",
352-
],
353-
tier_name=TierName.TEAM.value,
354-
trial_days=None,
355-
monthly_uploads_limit=MonthlyUploadLimits.CODECOV_TEAM_PLAN.value,
356-
),
357-
PlanName.TEAM_YEARLY.value: PlanData(
358-
marketing_name=PlanMarketingName.TEAM.value,
359-
value=PlanName.TEAM_YEARLY.value,
360-
billing_rate=PlanBillingRate.YEARLY.value,
361-
base_unit_price=PlanPrice.TEAM_YEARLY.value,
362-
benefits=[
363-
"Up to 10 users",
364-
"Unlimited repositories",
365-
"2500 private repo uploads",
366-
"Patch coverage analysis",
367-
],
368-
tier_name=TierName.TEAM.value,
369-
trial_days=None,
370-
monthly_uploads_limit=MonthlyUploadLimits.CODECOV_TEAM_PLAN.value,
371-
),
372-
}
373-
374-
TRIAL_PLAN_REPRESENTATION = {
375-
PlanName.TRIAL_PLAN_NAME.value: PlanData(
376-
marketing_name=PlanMarketingName.TRIAL.value,
377-
value=PlanName.TRIAL_PLAN_NAME.value,
378-
billing_rate=None,
379-
base_unit_price=PlanPrice.CODECOV_TRIAL.value,
380-
benefits=[
381-
"Configurable # of users",
382-
"Unlimited public repositories",
383-
"Unlimited private repositories",
384-
"Priority Support",
385-
],
386-
tier_name=TierName.TRIAL.value,
387-
trial_days=None,
388-
monthly_uploads_limit=None,
389-
),
390-
}
391-
392-
PAID_PLANS = {
393-
**PR_AUTHOR_PAID_USER_PLAN_REPRESENTATIONS,
394-
**SENTRY_PAID_USER_PLAN_REPRESENTATIONS,
395-
**ENTERPRISE_CLOUD_USER_PLAN_REPRESENTATIONS,
396-
**TEAM_PLAN_REPRESENTATIONS,
397-
}
398-
399-
TRIAL_PLANS = {**TRIAL_PLAN_REPRESENTATION}
400-
401-
TEAM_PLANS = {**TEAM_PLAN_REPRESENTATIONS}
402-
403-
404-
USER_PLAN_REPRESENTATIONS = {
405-
**FREE_PLAN_REPRESENTATIONS,
406-
**NON_PR_AUTHOR_PAID_USER_PLAN_REPRESENTATIONS,
407-
**GHM_PLAN_REPRESENTATION,
408-
**PAID_PLANS,
409-
**TRIAL_PLANS,
410-
**TEAM_PLANS,
411-
}
412-
413-
PLANS_THAT_CAN_TRIAL = [
414-
DEFAULT_FREE_PLAN,
415-
PlanName.FREE_PLAN_NAME.value,
416-
PlanName.BASIC_PLAN_NAME.value,
417-
PlanName.CODECOV_PRO_MONTHLY.value,
418-
PlanName.CODECOV_PRO_YEARLY.value,
419-
PlanName.SENTRY_MONTHLY.value,
420-
PlanName.SENTRY_YEARLY.value,
421-
PlanName.TRIAL_PLAN_NAME.value,
422-
]
423-
42484
TRIAL_PLAN_SEATS = 1000
42585
TEAM_PLAN_MAX_USERS = 10

0 commit comments

Comments
 (0)