From e493a9f3d10cff5bcf064e1f3b5cde763a96f6f7 Mon Sep 17 00:00:00 2001 From: PCoder Date: Fri, 15 Nov 2019 19:47:11 +0530 Subject: [PATCH] Allow creating yearly/monthly Stripe plans --- datacenterlight/views.py | 13 +++++++++++-- utils/stripe_utils.py | 10 ++++++++-- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/datacenterlight/views.py b/datacenterlight/views.py index 6f7da18e..af6627ec 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -437,7 +437,9 @@ class PaymentOrderView(FormView): 'description' ), "product_id": product.id, - "product_slug": product.product_slug + "product_slug": product.product_slug, + "recurring_interval": + product.product_subscription_interval } request.session["generic_payment_details"] = ( gp_details @@ -756,6 +758,7 @@ class OrderConfirmationView(DetailView, FormView): if ('generic_payment_type' not in request.session or (request.session['generic_payment_details']['recurring'])): + recurring_interval = 'month' if 'generic_payment_details' in request.session: amount_to_be_charged = ( round( @@ -768,6 +771,10 @@ class OrderConfirmationView(DetailView, FormView): amount_to_be_charged ) stripe_plan_id = plan_name + recurring_interval = request.session['generic_payment_details']['recurring_interval'] + if recurring_interval == "year": + plan_name = "{}-yearly".format(plan_name) + stripe_plan_id = plan_name else: template = request.session.get('template') specs = request.session.get('specs') @@ -794,7 +801,9 @@ class OrderConfirmationView(DetailView, FormView): stripe_plan = stripe_utils.get_or_create_stripe_plan( amount=amount_to_be_charged, name=plan_name, - stripe_plan_id=stripe_plan_id) + stripe_plan_id=stripe_plan_id, + interval=recurring_interval + ) subscription_result = stripe_utils.subscribe_customer_to_plan( stripe_api_cus_id, [{"plan": stripe_plan.get( diff --git a/utils/stripe_utils.py b/utils/stripe_utils.py index 4334d6cf..e2bdb983 100644 --- a/utils/stripe_utils.py +++ b/utils/stripe_utils.py @@ -226,7 +226,8 @@ class StripeUtils(object): return charge @handleStripeError - def get_or_create_stripe_plan(self, amount, name, stripe_plan_id): + def get_or_create_stripe_plan(self, amount, name, stripe_plan_id, + interval=""): """ This function checks if a StripePlan with the given stripe_plan_id already exists. If it exists then the function @@ -238,6 +239,10 @@ class StripeUtils(object): :param stripe_plan_id: The id of the Stripe plan to be created. Use get_stripe_plan_id_string function to obtain the name of the plan to be created + :param interval: str representing the interval of the Plan + Specifies billing frequency. Either day, week, month or year. + Ref: https://stripe.com/docs/api/plans/create#create_plan-interval + The default is month :return: The StripePlan object if it exists else creates a Plan object in Stripe and a local StripePlan and returns it. Returns None in case of Stripe error @@ -245,6 +250,7 @@ class StripeUtils(object): _amount = float(amount) amount = int(_amount * 100) # stripe amount unit, in cents stripe_plan_db_obj = None + plan_interval = interval if interval is not "" else self.INTERVAL try: stripe_plan_db_obj = StripePlan.objects.get( stripe_plan_id=stripe_plan_id) @@ -252,7 +258,7 @@ class StripeUtils(object): try: self.stripe.Plan.create( amount=amount, - interval=self.INTERVAL, + interval=plan_interval, name=name, currency=self.CURRENCY, id=stripe_plan_id)