From c62dbcacf818af9b8b756d620b076eb2daad20bb Mon Sep 17 00:00:00 2001 From: Nathan Chapman Date: Sat, 20 Aug 2022 13:51:50 -0600 Subject: [PATCH] Adding stripe integration --- ...11_product_stripe_price_id_subscription.py | 29 +++++++++++++++++++ src/core/models.py | 1 + src/core/signals.py | 20 +++++++++++-- 3 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 src/core/migrations/0011_product_stripe_price_id_subscription.py diff --git a/src/core/migrations/0011_product_stripe_price_id_subscription.py b/src/core/migrations/0011_product_stripe_price_id_subscription.py new file mode 100644 index 0000000..f05f090 --- /dev/null +++ b/src/core/migrations/0011_product_stripe_price_id_subscription.py @@ -0,0 +1,29 @@ +# Generated by Django 4.0.2 on 2022-08-07 19:40 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ('core', '0010_product_stripe_id'), + ] + + operations = [ + migrations.AddField( + model_name='product', + name='stripe_price_id', + field=models.CharField(blank=True, max_length=255), + ), + migrations.CreateModel( + name='Subscription', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('stripe_id', models.CharField(blank=True, max_length=255)), + ('customer', models.OneToOneField(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='subscription', to=settings.AUTH_USER_MODEL)), + ], + ), + ] diff --git a/src/core/models.py b/src/core/models.py index c286179..2e01a09 100644 --- a/src/core/models.py +++ b/src/core/models.py @@ -53,6 +53,7 @@ class Product(models.Model): blank=True, null=True, ) + stripe_price_id = models.CharField(max_length=255, blank=True) weight = MeasurementField( measurement=Weight, unit_choices=WeightUnits.CHOICES, diff --git a/src/core/signals.py b/src/core/signals.py index 99bec53..9786091 100644 --- a/src/core/signals.py +++ b/src/core/signals.py @@ -22,12 +22,28 @@ def product_saved(sender, instance, created, **kwargs): logger.info('Product was saved') if created or not instance.stripe_id: stripe.api_key = settings.STRIPE_API_KEY - response = stripe.Product.create( + prod_response = stripe.Product.create( name=instance.name, description=instance.description ) - instance.stripe_id = response['id'] + price_response = stripe.Price.create( + unit_amount=int(instance.price * 100), + currency=settings.DEFAULT_CURRENCY, + product=prod_response['id'] + ) + instance.stripe_id = prod_response['id'] + instance.stripe_price_id = price_response['id'] instance.save() + else: + stripe.Product.modify( + instance.stripe_id, + name=instance.name, + description=instance.description + ) + stripe.Price.modify( + instance.stripe_price_id, + unit_amount=int(instance.price * 100) + ) @receiver(post_save, sender=Order, dispatch_uid="order_created")