def handle(self, *args, **options): try: stripe_utils = StripeUtils() for user in CustomUser.objects.all(): if hasattr(user, 'stripecustomer'): if user.stripecustomer: card_details_resp = stripe_utils.get_card_details( user.stripecustomer.stripe_id) card_details = card_details_resp['response_object'] if card_details: ucd = UserCardDetail.get_or_create_user_card_detail( stripe_customer=user.stripecustomer, card_details=card_details) UserCardDetail.save_default_card_local( user.stripecustomer.stripe_id, ucd.card_id) print("Saved user card details for {}".format( user.email)) else: print(" --- Could not get card details for " "{}".format(user.email)) print(" --- Error: {}".format( card_details_resp['error'])) else: print( " === {} does not have a StripeCustomer object".format( user.email)) except Exception as e: print(" *** Error occurred. Details {}".format(str(e)))
def get(self, request, *args, **kwargs): if 'specs' not in request.session or 'user' not in request.session: return HttpResponseRedirect(reverse('datacenterlight:index')) if 'token' not in request.session: return HttpResponseRedirect(reverse('datacenterlight:payment')) stripe_customer_id = request.session.get('customer') customer = StripeCustomer.objects.filter(id=stripe_customer_id).first() stripe_utils = StripeUtils() card_details = stripe_utils.get_card_details( customer.stripe_id, request.session.get('token')) context = { 'site_url': reverse('datacenterlight:index'), 'cc_last4': card_details.get('response_object').get('last4'), 'cc_brand': card_details.get('response_object').get('brand') } return render(request, self.template_name, context)
class CeleryTaskTestCase(TestCase): @override_settings( task_eager_propagates=True, task_always_eager=True, ) def setUp(self): self.customer_password = '******' self.customer_email = '*****@*****.**' self.customer_name = "Monty Python" self.user = {'email': self.customer_email, 'name': self.customer_name} self.customer = mommy.make('membership.CustomUser') self.customer.set_password(self.customer_password) self.customer.email = self.customer_email self.customer.save() self.stripe_utils = StripeUtils() stripe.api_key = settings.STRIPE_API_PRIVATE_KEY_TEST self.token = stripe.Token.create(card={ "number": '4111111111111111', "exp_month": 12, "exp_year": 2022, "cvc": '123' }, ) # Run fetchvmtemplates so that we have the VM templates from # OpenNebula call_command('fetchvmtemplates') @skipIf( settings.OPENNEBULA_DOMAIN is None or settings.OPENNEBULA_DOMAIN is "test_domain", """OpenNebula details unavailable, so skipping test_create_vm_task""") def test_create_vm_task(self): """Tests the create vm task for monthly subscription This test is supposed to validate the proper execution of celery create_vm_task on production, as we have no other way to do this. """ # We create a VM from the first template available to DCL vm_template = VMTemplate.objects.all().first() template_data = VMTemplateSerializer(vm_template).data # The specs of VM that we want to create specs = {'cpu': 1, 'memory': 2, 'disk_size': 10, 'price': 15} stripe_customer = StripeCustomer.get_or_create( email=self.customer_email, token=self.token) card_details = self.stripe_utils.get_card_details( stripe_customer.stripe_id) card_details_dict = card_details.get('error') self.assertEquals(card_details_dict, None) billing_address_data = { 'cardholder_name': self.customer_name, 'postal_code': '1231', 'country': 'CH', 'token': self.token, 'street_address': 'Monty\'s Street', 'city': 'Hollywood' } vm_template_id = template_data.get('id', 1) cpu = specs.get('cpu') memory = specs.get('memory') disk_size = specs.get('disk_size') amount_to_be_charged = get_vm_price(cpu=cpu, memory=memory, disk_size=disk_size) plan_name = StripeUtils.get_stripe_plan_name(cpu=cpu, memory=memory, disk_size=disk_size) stripe_plan_id = StripeUtils.get_stripe_plan_id(cpu=cpu, ram=memory, ssd=disk_size, version=1, app='dcl') stripe_plan = self.stripe_utils.get_or_create_stripe_plan( amount=amount_to_be_charged, name=plan_name, stripe_plan_id=stripe_plan_id) subscription_result = self.stripe_utils.subscribe_customer_to_plan( stripe_customer.stripe_id, [{ "plan": stripe_plan.get('response_object').stripe_plan_id }]) stripe_subscription_obj = subscription_result.get('response_object') # Check if the subscription was approved and is active if stripe_subscription_obj is None \ or stripe_subscription_obj.status != 'active': msg = subscription_result.get('error') raise Exception("Creating subscription failed: {}".format(msg)) billing_address = BillingAddress( cardholder_name=billing_address_data['cardholder_name'], street_address=billing_address_data['street_address'], city=billing_address_data['city'], postal_code=billing_address_data['postal_code'], country=billing_address_data['country']) billing_address.save() order = HostingOrder.create(price=specs['price'], vm_id=0, customer=stripe_customer, billing_address=billing_address) async_task = create_vm_task.delay(vm_template_id, self.user, specs, template_data, order.id) new_vm_id = 0 res = None for i in range(0, 10): sleep(5) res = AsyncResult(async_task.task_id) if res.result is not None and res.result > 0: new_vm_id = res.result break # We expect a VM to be created within 50 seconds self.assertGreater( new_vm_id, 0, "VM could not be created. res._get_task_meta() = {}".format( res._get_task_meta()))