Ejemplo n.º 1
0
 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)))
Ejemplo n.º 2
0
 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)
Ejemplo n.º 3
0
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()))