def on_email_changed(request, user, from_email_address, to_email_address, **kwargs): from djstripe.models import Customer customer = Customer.objects.filter(subscriber=user).first() if not customer: # Don't bother creating a customer for this user, it'll happen later. return stripe_obj = customer.api_retrieve() stripe_obj.email = to_email_address.email Customer.sync_from_stripe_data(stripe_obj.save())
def test_customer_sync_default_source_string(self): Customer.objects.all().delete() customer_fake = deepcopy(FAKE_CUSTOMER) customer_fake["default_source"] = customer_fake["sources"]["data"][0]["id"] = "card_sync_source_string" customer = Customer.sync_from_stripe_data(customer_fake) self.assertEqual(customer.default_source.stripe_id, customer_fake["default_source"]) self.assertEqual(customer.sources.count(), 2)
def test_customer_sync_default_source_string(self): Customer.objects.all().delete() customer_fake = deepcopy(FAKE_CUSTOMER) customer_fake["default_source"] = customer_fake["sources"]["data"][0]["id"] = "card_sync_source_string" customer = Customer.sync_from_stripe_data(customer_fake) self.assertEqual(customer.default_source.stripe_id, customer_fake["default_source"]) self.assertEqual(customer.sources.count(), 2)
def test_customer_sync_has_bad_subscriber_metadata(self): fake_customer = deepcopy(FAKE_CUSTOMER) fake_customer["metadata"] = {"djstripe_subscriber": "does_not_exist"} customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(customer.subscriber, None) self.assertEqual(customer.metadata, {"djstripe_subscriber": "does_not_exist"})
def create_for_user(self, user): from djstripe.models import Customer stripe_customer = Customer.sync_from_stripe_data(self) stripe_customer.subscriber = user stripe_customer.save() return stripe_customer
def test_customer_sync_has_bad_subscriber_metadata(self): fake_customer = deepcopy(FAKE_CUSTOMER) fake_customer["metadata"] = {"djstripe_subscriber": "does_not_exist"} customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(customer.subscriber, None) self.assertEqual(customer.metadata, {"djstripe_subscriber": "does_not_exist"})
def create_for_user(self, user): from djstripe.models import Customer stripe_customer = Customer.sync_from_stripe_data(self) stripe_customer.subscriber = user stripe_customer.save() return stripe_customer
def test_customer_sync_no_sources(self, customer_mock): self.customer.sources.all().delete() fake_customer = deepcopy(FAKE_CUSTOMER) fake_customer["default_source"] = None customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(customer.sources.count(), 0) self.assertEqual(customer.default_source, None)
def test_sync_customer_delete_discount(self): test_coupon = Coupon.sync_from_stripe_data(FAKE_COUPON) self.customer.coupon = test_coupon self.customer.save() self.assertEqual(self.customer.coupon.stripe_id, FAKE_COUPON["id"]) customer = Customer.sync_from_stripe_data(FAKE_CUSTOMER) self.assertEqual(customer.coupon, None)
def test_sync_customer_with_discount(self, coupon_retrieve_mock): self.assertIsNone(self.customer.coupon) fake_customer = deepcopy(FAKE_CUSTOMER) fake_customer["discount"] = deepcopy(FAKE_DISCOUNT_CUSTOMER) customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(customer.coupon.id, FAKE_COUPON["id"]) self.assertIsNotNone(customer.coupon_start) self.assertIsNone(customer.coupon_end)
def test_sync_customer_delete_discount(self): test_coupon = Coupon.sync_from_stripe_data(FAKE_COUPON) self.customer.coupon = test_coupon self.customer.save() self.assertEqual(self.customer.coupon.id, FAKE_COUPON["id"]) customer = Customer.sync_from_stripe_data(FAKE_CUSTOMER) self.assertEqual(customer.coupon, None)
def test_sync_customer_with_discount(self, coupon_retrieve_mock): self.assertIsNone(self.customer.coupon) fake_customer = deepcopy(FAKE_CUSTOMER) fake_customer["discount"] = deepcopy(FAKE_DISCOUNT_CUSTOMER) customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(customer.coupon.stripe_id, FAKE_COUPON["id"]) self.assertIsNotNone(customer.coupon_start) self.assertIsNone(customer.coupon_end)
def test_customer_sync_has_subscriber_metadata(self): user = get_user_model().objects.create(username="******", id=12345) fake_customer = deepcopy(FAKE_CUSTOMER) fake_customer["metadata"] = {"djstripe_subscriber": "12345"} customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(customer.subscriber, user) self.assertEqual(customer.metadata, {"djstripe_subscriber": "12345"})
def test_customer_sync_has_subscriber_metadata(self): user = get_user_model().objects.create(username="******", id=12345) fake_customer = deepcopy(FAKE_CUSTOMER) fake_customer["metadata"] = {"djstripe_subscriber": "12345"} customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(customer.subscriber, user) self.assertEqual(customer.metadata, {"djstripe_subscriber": "12345"})
def setUp(self): self.settings(ROOT_URLCONF=self.urlconf) self.factory = RequestFactory() self.user = get_user_model().objects.create_user(username="******", email="*****@*****.**") self.customer = Customer.sync_from_stripe_data(FAKE_CUSTOMER) self.customer.subscriber = self.user self.customer.save() self.subscription = Subscription.sync_from_stripe_data(FAKE_SUBSCRIPTION) self.middleware = SubscriptionPaymentMiddleware()
def test_customer_sync_default_source_string(self): Customer.objects.all().delete() Card.objects.all().delete() customer_fake = deepcopy(FAKE_CUSTOMER) customer_fake["default_source"] = customer_fake["sources"]["data"][0]["id"] = "card_sync_source_string" customer = Customer.sync_from_stripe_data(customer_fake) self.assertEqual(customer.default_source.id, customer_fake["default_source"]) self.assertEqual(customer.legacy_cards.count(), 2) self.assertEqual(len(list(customer.payment_methods)), 2)
def setUp(self): self.plan = Plan.sync_from_stripe_data(deepcopy(FAKE_PLAN)) self.url = reverse("djstripe:cancel_subscription") self.user = get_user_model().objects.create_user( username="******", email="*****@*****.**", password="******") self.assertTrue( self.client.login(username="******", password="******")) stripe_customer = Customer.sync_from_stripe_data(FAKE_CUSTOMER) stripe_customer.subscriber = self.user stripe_customer.save()
def test_customer_sync_non_local_card(self, card_retrieve_mock): fake_customer = deepcopy(FAKE_CUSTOMER_II) user = get_user_model().objects.create_user(username="******", email="*****@*****.**") Customer.objects.create(subscriber=user, stripe_id=FAKE_CUSTOMER_II["id"], livemode=False) customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(FAKE_CUSTOMER_II["default_source"]["id"], customer.default_source.stripe_id) self.assertEqual(1, customer.sources.count())
def test_customer_sync_has_subscriber_metadata_disabled(self): user = get_user_model().objects.create(username="******", id=98765) fake_customer = deepcopy(FAKE_CUSTOMER) fake_customer["id"] = "cus_test_metadata_disabled" fake_customer["metadata"] = {"djstripe_subscriber": "98765"} with patch("djstripe.settings.SUBSCRIBER_CUSTOMER_KEY", return_value=""): customer = Customer.sync_from_stripe_data(fake_customer) self.assertNotEqual(customer.subscriber, user) self.assertNotEqual(customer.subscriber_id, 98765)
def setUp(self): self.settings(ROOT_URLCONF=self.urlconf) self.factory = RequestFactory() self.user = get_user_model().objects.create_user( username="******", email="*****@*****.**") self.customer = Customer.sync_from_stripe_data(FAKE_CUSTOMER) self.customer.subscriber = self.user self.customer.save() self.subscription = Subscription.sync_from_stripe_data( FAKE_SUBSCRIPTION) self.middleware = SubscriptionPaymentMiddleware()
def test_sync_customer_discount_already_present(self, coupon_retrieve_mock): fake_customer = deepcopy(FAKE_CUSTOMER) fake_customer["discount"] = deepcopy(FAKE_DISCOUNT_CUSTOMER) # Set the customer's coupon to be what we'll sync customer = Customer.objects.get(stripe_id=FAKE_CUSTOMER["id"]) customer.coupon = Coupon.sync_from_stripe_data(FAKE_COUPON) customer.save() customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(customer.coupon.stripe_id, FAKE_COUPON["id"])
def test_customer_sync_unsupported_source(self): fake_customer = deepcopy(FAKE_CUSTOMER_II) fake_customer["default_source"]["object"] = "fish" user = get_user_model().objects.create_user(username="******", email="*****@*****.**") Customer.objects.create(subscriber=user, stripe_id=FAKE_CUSTOMER_II["id"], livemode=False) customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(None, customer.default_source) self.assertEqual(0, customer.sources.count())
def test_sync_customer_discount_already_present(self, coupon_retrieve_mock): fake_customer = deepcopy(FAKE_CUSTOMER) fake_customer["discount"] = deepcopy(FAKE_DISCOUNT_CUSTOMER) # Set the customer's coupon to be what we'll sync customer = Customer.objects.get(id=FAKE_CUSTOMER["id"]) customer.coupon = Coupon.sync_from_stripe_data(FAKE_COUPON) customer.save() customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(customer.coupon.id, FAKE_COUPON["id"])
def sync_customers(apps, schema_editor): # This is okay, since we're only doing a forward migration. from djstripe.models import Customer from djstripe.context_managers import stripe_temporary_api_version with stripe_temporary_api_version("2016-03-07"): if Customer.objects.count(): print("syncing customers. This may take a while.") for customer in tqdm(Customer.objects.all(), desc="Sync", unit=" customers"): try: Customer.sync_from_stripe_data(customer.api_retrieve()) except InvalidRequestError: tqdm.write("There was an error while syncing customer \ ({customer_id}).".format(customer_id=customer.stripe_id)) except IntegrityError: print(customer.api_retrieve()) six.reraise(*sys.exc_info()) print("Customer sync complete.")
def setUp(self): self.plan = Plan.sync_from_stripe_data(deepcopy(FAKE_PLAN)) self.url = reverse("djstripe:cancel_subscription") self.user = get_user_model().objects.create_user( username="******", email="*****@*****.**", password="******" ) self.assertTrue(self.client.login(username="******", password="******")) stripe_customer = Customer.sync_from_stripe_data(FAKE_CUSTOMER) stripe_customer.subscriber = self.user stripe_customer.save()
def test_customer_sync_has_bad_subscriber_metadata(self): fake_customer = deepcopy(FAKE_CUSTOMER) fake_customer["id"] = "cus_sync_has_bad_subscriber_metadata" fake_customer["metadata"] = {"djstripe_subscriber": "does_not_exist"} customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(customer.subscriber, None) self.assertEqual(customer.metadata, {"djstripe_subscriber": "does_not_exist"}) self.assert_fks( customer, expected_blank_fks={"djstripe.Customer.coupon", "djstripe.Customer.subscriber"}, )
def create_stripe_customer(self, user, advertiser): """Setup a Stripe customer for this user.""" if not settings.STRIPE_ENABLED: return None # Create the new stripe customer customer = stripe.Customer.create( name=user.name, email=user.email, description=f"Advertising @ {advertiser.name}", ) # Force sync this customer from stripe # Then return the Django model instance return Customer.sync_from_stripe_data(customer)
def test_customer_sync_default_source_string(self): Customer.objects.all().delete() Card.objects.all().delete() customer_fake = deepcopy(FAKE_CUSTOMER) customer_fake["default_source"] = customer_fake["sources"]["data"][0][ "id" ] = "card_sync_source_string" customer = Customer.sync_from_stripe_data(customer_fake) self.assertEqual(customer.default_source.id, customer_fake["default_source"]) self.assertEqual(customer.legacy_cards.count(), 2) self.assertEqual(len(list(customer.payment_methods)), 2) self.assert_fks( customer, expected_blank_fks={"djstripe.Customer.coupon", "djstripe.Customer.subscriber"}, )
def test_customer_sync_has_bad_subscriber_metadata(self): fake_customer = deepcopy(FAKE_CUSTOMER) fake_customer["id"] = "cus_sync_has_bad_subscriber_metadata" fake_customer["metadata"] = {"djstripe_subscriber": "does_not_exist"} customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(customer.subscriber, None) self.assertEqual(customer.metadata, {"djstripe_subscriber": "does_not_exist"}) self.assert_fks( customer, expected_blank_fks={ "djstripe.Customer.coupon", "djstripe.Customer.subscriber" }, )
def setUp(self): self.settings(ROOT_URLCONF=self.urlconf) self.factory = RequestFactory() self.user = get_user_model().objects.create_user( username="******", email="*****@*****.**" ) self.customer = Customer.sync_from_stripe_data(FAKE_CUSTOMER) self.customer.subscriber = self.user self.customer.save() with patch( "stripe.Product.retrieve", return_value=deepcopy(FAKE_PRODUCT), autospec=True ): self.subscription = Subscription.sync_from_stripe_data(FAKE_SUBSCRIPTION) self.middleware = SubscriptionPaymentMiddleware()
def setUp(self): self.settings(ROOT_URLCONF=self.urlconf) self.factory = RequestFactory() self.user = get_user_model().objects.create_user( username="******", email="*****@*****.**") self.customer = Customer.sync_from_stripe_data(FAKE_CUSTOMER) self.customer.subscriber = self.user self.customer.save() with patch("stripe.Product.retrieve", return_value=deepcopy(FAKE_PRODUCT), autospec=True): self.subscription = Subscription.sync_from_stripe_data( FAKE_SUBSCRIPTION) self.middleware = SubscriptionPaymentMiddleware()
def test_customer_sync_has_subscriber_metadata_disabled(self): user = get_user_model().objects.create(username="******", id=98765) fake_customer = deepcopy(FAKE_CUSTOMER) fake_customer["id"] = "cus_test_metadata_disabled" fake_customer["metadata"] = {"djstripe_subscriber": "98765"} with patch( "djstripe.settings.SUBSCRIBER_CUSTOMER_KEY", return_value="", autospec=True ): customer = Customer.sync_from_stripe_data(fake_customer) self.assertNotEqual(customer.subscriber, user) self.assertNotEqual(customer.subscriber_id, 98765) self.assert_fks( customer, expected_blank_fks={"djstripe.Customer.coupon", "djstripe.Customer.subscriber"}, )
def new_customer(request): body = json.loads(request.body) # Retrieve payment method from Stripe data payment_method = stripe.PaymentMethod.retrieve(body['payment_method']) PaymentMethod.sync_from_stripe_data(payment_method) user = NewUser.objects.get(username=body['user']) if not getattr(user, 'owner'): # If customer doesn't exist, create new Customer object customer = stripe.Customer.create( email=getattr(user, 'email'), payment_method=payment_method, invoice_settings={"default_payment_method": payment_method}, ) else: # Attach new payment method to customer customer = stripe.Customer.retrieve(getattr(user, 'owner').id) stripe.PaymentMethod.attach(payment_method, customer=customer.id) stripe.Customer.modify( customer.id, invoice_settings={"default_payment_method": payment_method}, ) # Create new Subscription and attach to customer subscription = stripe.Subscription.create( customer=customer.id, items=[{ 'price': body['price_id'] }], expand=['latest_invoice.payment_intent'], trial_period_days=7) # Save in Django DB django_customer = Customer.sync_from_stripe_data(customer) user.owner = django_customer django_subscription = Subscription.sync_from_stripe_data(subscription) user.subscription = django_subscription user.save() return JsonResponse(data={ 'customer': customer, 'subscription': subscription })
def create_cust_subscription(request): customer = stripe.Customer.create( email=request.user.email, name=request.user.first_name + ' ' + request.user.last_name, source=request.POST['stripeToken'], ) djstripe_customer = Customer.sync_from_stripe_data(customer) subscription = stripe.Subscription.create( customer=customer, items=[ {'plan': 'price_1H7QitFuwTkoJXtMe5otaHpo'} ], collection_method='charge_automatically', trial_period_days=7, ) djstripe_subscription = Subscription.sync_from_stripe_data(subscription) # Here we save the customer id and subscription id in our database. stripesubscriptionsdetails = SubscriberSubscriptionDetails() user = User.objects.get(email=request.user.email) stripesubscriptionsdetails.user = user stripesubscriptionsdetails.customer = djstripe_customer stripesubscriptionsdetails.subscription = djstripe_subscription stripesubscriptionsdetails.save()
def test_customer_sync_default_source_string(self, customer_mock): fake_customer = deepcopy(FAKE_CUSTOMER_DEFAULT_SOURCE_STRING) customer = Customer.sync_from_stripe_data(fake_customer) self.assertEqual(customer.default_source.stripe_id, FAKE_CARD["id"]) self.assertEqual(customer.sources.count(), 1)