import stripe from config.settings import STRIPE_SECRET_KEY from django.core.cache import cache from django.db.models.signals import post_migrate, post_save from django.dispatch import receiver from .models import StripePrice, SubscriptionPlan, UserSubscription stripe.api_key = STRIPE_SECRET_KEY # Template for running actions after user have paid for a subscription @receiver(post_save, sender=SubscriptionPlan) def clear_cache_after_plan_updates(sender, instance, **kwargs): # Clear cache cache.delete("subscriptionplans") @receiver(post_save, sender=UserSubscription) def scan_after_payment(sender, instance, **kwargs): # If the updated/created subscription is valid if instance.valid and instance.user: # TODO: Add any Celery task actions here for regular subscription payees pass @receiver(post_migrate) def create_subscriptions(sender, **kwargs): if sender.name == "subscriptions": print("Importing data from Stripe") created_prices = 0 created_plans = 0 skipped_prices = 0 skipped_plans = 0 products = stripe.Product.list(active=True) prices = stripe.Price.list(expand=["data.tiers"], active=True) # Create the StripePrice for price in prices["data"]: annual = ( (price["recurring"]["interval"] == "year") if price["recurring"] else False ) STRIPE_PRICE, CREATED = StripePrice.objects.get_or_create( stripe_price_id=price["id"], price=price["unit_amount"] / 100, annual=annual, lookup_key=price["lookup_key"], prorated=price["recurring"]["usage_type"] == "metered", currency=price["currency"], ) if CREATED: created_prices += 1 else: skipped_prices += 1 # Create the SubscriptionPlan for product in products["data"]: ANNUAL_PRICE = None MONTHLY_PRICE = None for price in prices["data"]: if price["product"] == product["id"]: STRIPE_PRICE = StripePrice.objects.get( stripe_price_id=price["id"], ) if STRIPE_PRICE.annual: ANNUAL_PRICE = STRIPE_PRICE else: MONTHLY_PRICE = STRIPE_PRICE if ANNUAL_PRICE or MONTHLY_PRICE: SUBSCRIPTION_PLAN, CREATED = SubscriptionPlan.objects.get_or_create( name=product["name"], description=product["description"], stripe_product_id=product["id"], annual_price=ANNUAL_PRICE, monthly_price=MONTHLY_PRICE, group_exclusive=product["metadata"]["group_exclusive"] == "True", ) if CREATED: created_plans += 1 else: skipped_plans += 1 # Skip over plans with missing pricing rates else: print("Skipping plan" + product["name"] + "with missing pricing data") # Assign the StripePrice to the SubscriptionPlan SUBSCRIPTION_PLAN.save() print("Created", created_plans, "new plans") print("Skipped", skipped_plans, "existing plans") print("Created", created_prices, "new prices") print("Skipped", skipped_prices, "existing prices")