Merge pull request #460 from pcoder/add_test_create_vm_celery_task
Added test for create vm celery task
This commit is contained in:
		
				commit
				
					
						a77b7b0ab5
					
				
			
		
					 5 changed files with 194 additions and 39 deletions
				
			
		| 
						 | 
					@ -41,13 +41,15 @@ def retry_task(task, exception=None):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@app.task(bind=True, max_retries=settings.CELERY_MAX_RETRIES)
 | 
					@app.task(bind=True, max_retries=settings.CELERY_MAX_RETRIES)
 | 
				
			||||||
def create_vm_task(self, vm_template_id, user, specs, template, stripe_customer_id, billing_address_data,
 | 
					def create_vm_task(self, vm_template_id, user, specs, template,
 | 
				
			||||||
 | 
					                   stripe_customer_id, billing_address_data,
 | 
				
			||||||
                   billing_address_id,
 | 
					                   billing_address_id,
 | 
				
			||||||
                   charge):
 | 
					                   charge):
 | 
				
			||||||
    vm_id = None
 | 
					    vm_id = None
 | 
				
			||||||
    try:
 | 
					    try:
 | 
				
			||||||
        final_price = specs.get('price')
 | 
					        final_price = specs.get('price')
 | 
				
			||||||
        billing_address = BillingAddress.objects.filter(id=billing_address_id).first()
 | 
					        billing_address = BillingAddress.objects.filter(
 | 
				
			||||||
 | 
					            id=billing_address_id).first()
 | 
				
			||||||
        customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
 | 
					        customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
 | 
				
			||||||
        # Create OpenNebulaManager
 | 
					        # Create OpenNebulaManager
 | 
				
			||||||
        manager = OpenNebulaManager(email=settings.OPENNEBULA_USERNAME,
 | 
					        manager = OpenNebulaManager(email=settings.OPENNEBULA_USERNAME,
 | 
				
			||||||
| 
						 | 
					@ -114,7 +116,8 @@ def create_vm_task(self, vm_template_id, user, specs, template, stripe_customer_
 | 
				
			||||||
            'subject': settings.DCL_TEXT + " Order from %s" % context['email'],
 | 
					            'subject': settings.DCL_TEXT + " Order from %s" % context['email'],
 | 
				
			||||||
            'from_email': settings.DCL_SUPPORT_FROM_ADDRESS,
 | 
					            'from_email': settings.DCL_SUPPORT_FROM_ADDRESS,
 | 
				
			||||||
            'to': ['info@ungleich.ch'],
 | 
					            'to': ['info@ungleich.ch'],
 | 
				
			||||||
            'body': "\n".join(["%s=%s" % (k, v) for (k, v) in context.items()]),
 | 
					            'body': "\n".join(
 | 
				
			||||||
 | 
					                ["%s=%s" % (k, v) for (k, v) in context.items()]),
 | 
				
			||||||
            'reply_to': [context['email']],
 | 
					            'reply_to': [context['email']],
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        email = EmailMessage(**email_data)
 | 
					        email = EmailMessage(**email_data)
 | 
				
			||||||
| 
						 | 
					@ -124,11 +127,13 @@ def create_vm_task(self, vm_template_id, user, specs, template, stripe_customer_
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            retry_task(self)
 | 
					            retry_task(self)
 | 
				
			||||||
        except MaxRetriesExceededError:
 | 
					        except MaxRetriesExceededError:
 | 
				
			||||||
            msg_text = 'Finished {} retries for create_vm_task'.format(self.request.retries)
 | 
					            msg_text = 'Finished {} retries for create_vm_task'.format(
 | 
				
			||||||
 | 
					                self.request.retries)
 | 
				
			||||||
            logger.error(msg_text)
 | 
					            logger.error(msg_text)
 | 
				
			||||||
            # Try sending email and stop
 | 
					            # Try sending email and stop
 | 
				
			||||||
            email_data = {
 | 
					            email_data = {
 | 
				
			||||||
                'subject': '{} CELERY TASK ERROR: {}'.format(settings.DCL_TEXT, msg_text),
 | 
					                'subject': '{} CELERY TASK ERROR: {}'.format(settings.DCL_TEXT,
 | 
				
			||||||
 | 
					                                                             msg_text),
 | 
				
			||||||
                'from_email': settings.DCL_SUPPORT_FROM_ADDRESS,
 | 
					                'from_email': settings.DCL_SUPPORT_FROM_ADDRESS,
 | 
				
			||||||
                'to': ['info@ungleich.ch'],
 | 
					                'to': ['info@ungleich.ch'],
 | 
				
			||||||
                'body': ',\n'.join(str(i) for i in self.request.args)
 | 
					                'body': ',\n'.join(str(i) for i in self.request.args)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,3 +1,120 @@
 | 
				
			||||||
# from django.test import TestCase
 | 
					# from django.test import TestCase
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from time import sleep
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import stripe
 | 
				
			||||||
 | 
					from celery.result import AsyncResult
 | 
				
			||||||
 | 
					from django.conf import settings
 | 
				
			||||||
 | 
					from django.core.management import call_command
 | 
				
			||||||
# Create your tests here.
 | 
					# Create your tests here.
 | 
				
			||||||
 | 
					from django.test import TestCase, override_settings
 | 
				
			||||||
 | 
					from model_mommy import mommy
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					from datacenterlight.models import VMTemplate
 | 
				
			||||||
 | 
					from datacenterlight.tasks import create_vm_task
 | 
				
			||||||
 | 
					from membership.models import StripeCustomer
 | 
				
			||||||
 | 
					from opennebula_api.serializers import VMTemplateSerializer
 | 
				
			||||||
 | 
					from utils.models import BillingAddress
 | 
				
			||||||
 | 
					from utils.stripe_utils import StripeUtils
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CeleryTaskTestCase(TestCase):
 | 
				
			||||||
 | 
					    @override_settings(
 | 
				
			||||||
 | 
					        task_eager_propagates=True,
 | 
				
			||||||
 | 
					        task_always_eager=True,
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    def setUp(self):
 | 
				
			||||||
 | 
					        self.customer_password = 'test_password'
 | 
				
			||||||
 | 
					        self.customer_email = 'celery-createvm-task-test@ungleich.ch'
 | 
				
			||||||
 | 
					        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')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    def test_create_vm_task(self):
 | 
				
			||||||
 | 
					        """Tests the create vm task."""
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # 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)
 | 
				
			||||||
 | 
					        billing_address = BillingAddress(
 | 
				
			||||||
 | 
					            cardholder_name=self.customer_name,
 | 
				
			||||||
 | 
					            postal_code='1232',
 | 
				
			||||||
 | 
					            country='CH',
 | 
				
			||||||
 | 
					            street_address='Monty\'s Street',
 | 
				
			||||||
 | 
					            city='Hollywood')
 | 
				
			||||||
 | 
					        billing_address.save()
 | 
				
			||||||
 | 
					        billing_address_data = {'cardholder_name': self.customer_name,
 | 
				
			||||||
 | 
					                                'postal_code': '1231',
 | 
				
			||||||
 | 
					                                'country': 'CH',
 | 
				
			||||||
 | 
					                                'token': self.token,
 | 
				
			||||||
 | 
					                                'street_address': 'Monty\'s Street',
 | 
				
			||||||
 | 
					                                'city': 'Hollywood'}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        billing_address_id = billing_address.id
 | 
				
			||||||
 | 
					        vm_template_id = template_data.get('id', 1)
 | 
				
			||||||
 | 
					        final_price = specs.get('price')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Make stripe charge to a customer
 | 
				
			||||||
 | 
					        stripe_utils = StripeUtils()
 | 
				
			||||||
 | 
					        charge_response = stripe_utils.make_charge(
 | 
				
			||||||
 | 
					            amount=final_price,
 | 
				
			||||||
 | 
					            customer=stripe_customer.stripe_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        # Check if the payment was approved
 | 
				
			||||||
 | 
					        if not charge_response.get(
 | 
				
			||||||
 | 
					                'response_object'):
 | 
				
			||||||
 | 
					            msg = charge_response.get('error')
 | 
				
			||||||
 | 
					            raise Exception("make_charge failed: {}".format(msg))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        charge = charge_response.get('response_object')
 | 
				
			||||||
 | 
					        async_task = create_vm_task.delay(vm_template_id, self.user,
 | 
				
			||||||
 | 
					                                          specs,
 | 
				
			||||||
 | 
					                                          template_data,
 | 
				
			||||||
 | 
					                                          stripe_customer.id,
 | 
				
			||||||
 | 
					                                          billing_address_data,
 | 
				
			||||||
 | 
					                                          billing_address_id,
 | 
				
			||||||
 | 
					                                          charge)
 | 
				
			||||||
 | 
					        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()))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,8 @@ from hosting.models import HostingOrder
 | 
				
			||||||
from utils.stripe_utils import StripeUtils
 | 
					from utils.stripe_utils import StripeUtils
 | 
				
			||||||
from membership.models import CustomUser, StripeCustomer
 | 
					from membership.models import CustomUser, StripeCustomer
 | 
				
			||||||
from opennebula_api.models import OpenNebulaManager
 | 
					from opennebula_api.models import OpenNebulaManager
 | 
				
			||||||
from opennebula_api.serializers import VirtualMachineTemplateSerializer, VMTemplateSerializer
 | 
					from opennebula_api.serializers import VirtualMachineTemplateSerializer, \
 | 
				
			||||||
 | 
					    VMTemplateSerializer
 | 
				
			||||||
from datacenterlight.tasks import create_vm_task
 | 
					from datacenterlight.tasks import create_vm_task
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -35,9 +36,11 @@ class SuccessView(TemplateView):
 | 
				
			||||||
        elif 'token' not in request.session:
 | 
					        elif 'token' not in request.session:
 | 
				
			||||||
            return HttpResponseRedirect(reverse('datacenterlight:payment'))
 | 
					            return HttpResponseRedirect(reverse('datacenterlight:payment'))
 | 
				
			||||||
        elif 'order_confirmation' not in request.session:
 | 
					        elif 'order_confirmation' not in request.session:
 | 
				
			||||||
            return HttpResponseRedirect(reverse('datacenterlight:order_confirmation'))
 | 
					            return HttpResponseRedirect(
 | 
				
			||||||
 | 
					                reverse('datacenterlight:order_confirmation'))
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            for session_var in ['specs', 'user', 'template', 'billing_address', 'billing_address_data',
 | 
					            for session_var in ['specs', 'user', 'template', 'billing_address',
 | 
				
			||||||
 | 
					                                'billing_address_data',
 | 
				
			||||||
                                'token', 'customer']:
 | 
					                                'token', 'customer']:
 | 
				
			||||||
                if session_var in request.session:
 | 
					                if session_var in request.session:
 | 
				
			||||||
                    del request.session[session_var]
 | 
					                    del request.session[session_var]
 | 
				
			||||||
| 
						 | 
					@ -53,7 +56,8 @@ class PricingView(TemplateView):
 | 
				
			||||||
            templates = manager.get_templates()
 | 
					            templates = manager.get_templates()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            context = {
 | 
					            context = {
 | 
				
			||||||
                'templates': VirtualMachineTemplateSerializer(templates, many=True).data,
 | 
					                'templates': VirtualMachineTemplateSerializer(templates,
 | 
				
			||||||
 | 
					                                                              many=True).data,
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        except:
 | 
					        except:
 | 
				
			||||||
            messages.error(request,
 | 
					            messages.error(request,
 | 
				
			||||||
| 
						 | 
					@ -77,7 +81,8 @@ class PricingView(TemplateView):
 | 
				
			||||||
        manager = OpenNebulaManager()
 | 
					        manager = OpenNebulaManager()
 | 
				
			||||||
        template = manager.get_template(template_id)
 | 
					        template = manager.get_template(template_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        request.session['template'] = VirtualMachineTemplateSerializer(template).data
 | 
					        request.session['template'] = VirtualMachineTemplateSerializer(
 | 
				
			||||||
 | 
					            template).data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        if not request.user.is_authenticated():
 | 
					        if not request.user.is_authenticated():
 | 
				
			||||||
            request.session['next'] = reverse('hosting:payment')
 | 
					            request.session['next'] = reverse('hosting:payment')
 | 
				
			||||||
| 
						 | 
					@ -99,7 +104,8 @@ class BetaAccessView(FormView):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def form_valid(self, form):
 | 
					    def form_valid(self, form):
 | 
				
			||||||
        context = {
 | 
					        context = {
 | 
				
			||||||
            'base_url': "{0}://{1}".format(self.request.scheme, self.request.get_host())
 | 
					            'base_url': "{0}://{1}".format(self.request.scheme,
 | 
				
			||||||
 | 
					                                           self.request.get_host())
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        email_data = {
 | 
					        email_data = {
 | 
				
			||||||
| 
						 | 
					@ -129,7 +135,8 @@ class BetaAccessView(FormView):
 | 
				
			||||||
        email = BaseEmail(**email_data)
 | 
					        email = BaseEmail(**email_data)
 | 
				
			||||||
        email.send()
 | 
					        email.send()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        messages.add_message(self.request, messages.SUCCESS, self.success_message)
 | 
					        messages.add_message(self.request, messages.SUCCESS,
 | 
				
			||||||
 | 
					                             self.success_message)
 | 
				
			||||||
        return render(self.request, 'datacenterlight/beta_success.html', {})
 | 
					        return render(self.request, 'datacenterlight/beta_success.html', {})
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -154,7 +161,8 @@ class BetaProgramView(CreateView):
 | 
				
			||||||
        # data = VirtualMachineTemplateSerializer(templates, many=True).data
 | 
					        # data = VirtualMachineTemplateSerializer(templates, many=True).data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        context.update({
 | 
					        context.update({
 | 
				
			||||||
            'base_url': "{0}://{1}".format(self.request.scheme, self.request.get_host()),
 | 
					            'base_url': "{0}://{1}".format(self.request.scheme,
 | 
				
			||||||
 | 
					                                           self.request.get_host()),
 | 
				
			||||||
            'vms': vms
 | 
					            'vms': vms
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
        return context
 | 
					        return context
 | 
				
			||||||
| 
						 | 
					@ -164,7 +172,8 @@ class BetaProgramView(CreateView):
 | 
				
			||||||
        vms = BetaAccessVM.create(data)
 | 
					        vms = BetaAccessVM.create(data)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        context = {
 | 
					        context = {
 | 
				
			||||||
            'base_url': "{0}://{1}".format(self.request.scheme, self.request.get_host()),
 | 
					            'base_url': "{0}://{1}".format(self.request.scheme,
 | 
				
			||||||
 | 
					                                           self.request.get_host()),
 | 
				
			||||||
            'email': data.get('email'),
 | 
					            'email': data.get('email'),
 | 
				
			||||||
            'name': data.get('name'),
 | 
					            'name': data.get('name'),
 | 
				
			||||||
            'vms': vms
 | 
					            'vms': vms
 | 
				
			||||||
| 
						 | 
					@ -181,7 +190,8 @@ class BetaProgramView(CreateView):
 | 
				
			||||||
        email = BaseEmail(**email_data)
 | 
					        email = BaseEmail(**email_data)
 | 
				
			||||||
        email.send()
 | 
					        email.send()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        messages.add_message(self.request, messages.SUCCESS, self.success_message)
 | 
					        messages.add_message(self.request, messages.SUCCESS,
 | 
				
			||||||
 | 
					                             self.success_message)
 | 
				
			||||||
        return HttpResponseRedirect(self.get_success_url())
 | 
					        return HttpResponseRedirect(self.get_success_url())
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -225,7 +235,8 @@ class IndexView(CreateView):
 | 
				
			||||||
        storage_field = forms.IntegerField(validators=[self.validate_storage])
 | 
					        storage_field = forms.IntegerField(validators=[self.validate_storage])
 | 
				
			||||||
        price = request.POST.get('total')
 | 
					        price = request.POST.get('total')
 | 
				
			||||||
        template_id = int(request.POST.get('config'))
 | 
					        template_id = int(request.POST.get('config'))
 | 
				
			||||||
        template = VMTemplate.objects.filter(opennebula_vm_template_id=template_id).first()
 | 
					        template = VMTemplate.objects.filter(
 | 
				
			||||||
 | 
					            opennebula_vm_template_id=template_id).first()
 | 
				
			||||||
        template_data = VMTemplateSerializer(template).data
 | 
					        template_data = VMTemplateSerializer(template).data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        name = request.POST.get('name')
 | 
					        name = request.POST.get('name')
 | 
				
			||||||
| 
						 | 
					@ -237,36 +248,46 @@ class IndexView(CreateView):
 | 
				
			||||||
            cores = cores_field.clean(cores)
 | 
					            cores = cores_field.clean(cores)
 | 
				
			||||||
        except ValidationError as err:
 | 
					        except ValidationError as err:
 | 
				
			||||||
            msg = '{} : {}.'.format(cores, str(err))
 | 
					            msg = '{} : {}.'.format(cores, str(err))
 | 
				
			||||||
            messages.add_message(self.request, messages.ERROR, msg, extra_tags='cores')
 | 
					            messages.add_message(self.request, messages.ERROR, msg,
 | 
				
			||||||
            return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
 | 
					                                 extra_tags='cores')
 | 
				
			||||||
 | 
					            return HttpResponseRedirect(
 | 
				
			||||||
 | 
					                reverse('datacenterlight:index') + "#order_form")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            memory = memory_field.clean(memory)
 | 
					            memory = memory_field.clean(memory)
 | 
				
			||||||
        except ValidationError as err:
 | 
					        except ValidationError as err:
 | 
				
			||||||
            msg = '{} : {}.'.format(memory, str(err))
 | 
					            msg = '{} : {}.'.format(memory, str(err))
 | 
				
			||||||
            messages.add_message(self.request, messages.ERROR, msg, extra_tags='memory')
 | 
					            messages.add_message(self.request, messages.ERROR, msg,
 | 
				
			||||||
            return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
 | 
					                                 extra_tags='memory')
 | 
				
			||||||
 | 
					            return HttpResponseRedirect(
 | 
				
			||||||
 | 
					                reverse('datacenterlight:index') + "#order_form")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            storage = storage_field.clean(storage)
 | 
					            storage = storage_field.clean(storage)
 | 
				
			||||||
        except ValidationError as err:
 | 
					        except ValidationError as err:
 | 
				
			||||||
            msg = '{} : {}.'.format(storage, str(err))
 | 
					            msg = '{} : {}.'.format(storage, str(err))
 | 
				
			||||||
            messages.add_message(self.request, messages.ERROR, msg, extra_tags='storage')
 | 
					            messages.add_message(self.request, messages.ERROR, msg,
 | 
				
			||||||
            return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
 | 
					                                 extra_tags='storage')
 | 
				
			||||||
 | 
					            return HttpResponseRedirect(
 | 
				
			||||||
 | 
					                reverse('datacenterlight:index') + "#order_form")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            name = name_field.clean(name)
 | 
					            name = name_field.clean(name)
 | 
				
			||||||
        except ValidationError as err:
 | 
					        except ValidationError as err:
 | 
				
			||||||
            msg = '{} {}.'.format(name, _('is not a proper name'))
 | 
					            msg = '{} {}.'.format(name, _('is not a proper name'))
 | 
				
			||||||
            messages.add_message(self.request, messages.ERROR, msg, extra_tags='name')
 | 
					            messages.add_message(self.request, messages.ERROR, msg,
 | 
				
			||||||
            return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
 | 
					                                 extra_tags='name')
 | 
				
			||||||
 | 
					            return HttpResponseRedirect(
 | 
				
			||||||
 | 
					                reverse('datacenterlight:index') + "#order_form")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            email = email_field.clean(email)
 | 
					            email = email_field.clean(email)
 | 
				
			||||||
        except ValidationError as err:
 | 
					        except ValidationError as err:
 | 
				
			||||||
            msg = '{} {}.'.format(email, _('is not a proper email'))
 | 
					            msg = '{} {}.'.format(email, _('is not a proper email'))
 | 
				
			||||||
            messages.add_message(self.request, messages.ERROR, msg, extra_tags='email')
 | 
					            messages.add_message(self.request, messages.ERROR, msg,
 | 
				
			||||||
            return HttpResponseRedirect(reverse('datacenterlight:index') + "#order_form")
 | 
					                                 extra_tags='email')
 | 
				
			||||||
 | 
					            return HttpResponseRedirect(
 | 
				
			||||||
 | 
					                reverse('datacenterlight:index') + "#order_form")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        specs = {
 | 
					        specs = {
 | 
				
			||||||
            'cpu': cores,
 | 
					            'cpu': cores,
 | 
				
			||||||
| 
						 | 
					@ -293,14 +314,16 @@ class IndexView(CreateView):
 | 
				
			||||||
    def get_context_data(self, **kwargs):
 | 
					    def get_context_data(self, **kwargs):
 | 
				
			||||||
        context = super(IndexView, self).get_context_data(**kwargs)
 | 
					        context = super(IndexView, self).get_context_data(**kwargs)
 | 
				
			||||||
        context.update({
 | 
					        context.update({
 | 
				
			||||||
            'base_url': "{0}://{1}".format(self.request.scheme, self.request.get_host())
 | 
					            'base_url': "{0}://{1}".format(self.request.scheme,
 | 
				
			||||||
 | 
					                                           self.request.get_host())
 | 
				
			||||||
        })
 | 
					        })
 | 
				
			||||||
        return context
 | 
					        return context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def form_valid(self, form):
 | 
					    def form_valid(self, form):
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        context = {
 | 
					        context = {
 | 
				
			||||||
            'base_url': "{0}://{1}".format(self.request.scheme, self.request.get_host())
 | 
					            'base_url': "{0}://{1}".format(self.request.scheme,
 | 
				
			||||||
 | 
					                                           self.request.get_host())
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        email_data = {
 | 
					        email_data = {
 | 
				
			||||||
| 
						 | 
					@ -330,7 +353,8 @@ class IndexView(CreateView):
 | 
				
			||||||
        email = BaseEmail(**email_data)
 | 
					        email = BaseEmail(**email_data)
 | 
				
			||||||
        email.send()
 | 
					        email.send()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        messages.add_message(self.request, messages.SUCCESS, self.success_message)
 | 
					        messages.add_message(self.request, messages.SUCCESS,
 | 
				
			||||||
 | 
					                             self.success_message)
 | 
				
			||||||
        return super(IndexView, self).form_valid(form)
 | 
					        return super(IndexView, self).form_valid(form)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -403,7 +427,8 @@ class PaymentOrderView(FormView):
 | 
				
			||||||
            request.session['billing_address'] = billing_address.id
 | 
					            request.session['billing_address'] = billing_address.id
 | 
				
			||||||
            request.session['token'] = token
 | 
					            request.session['token'] = token
 | 
				
			||||||
            request.session['customer'] = customer.id
 | 
					            request.session['customer'] = customer.id
 | 
				
			||||||
            return HttpResponseRedirect(reverse('datacenterlight:order_confirmation'))
 | 
					            return HttpResponseRedirect(
 | 
				
			||||||
 | 
					                reverse('datacenterlight:order_confirmation'))
 | 
				
			||||||
        else:
 | 
					        else:
 | 
				
			||||||
            return self.form_invalid(form)
 | 
					            return self.form_invalid(form)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -423,11 +448,15 @@ class OrderConfirmationView(DetailView):
 | 
				
			||||||
        stripe_customer_id = request.session.get('customer')
 | 
					        stripe_customer_id = request.session.get('customer')
 | 
				
			||||||
        customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
 | 
					        customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
 | 
				
			||||||
        stripe_utils = StripeUtils()
 | 
					        stripe_utils = StripeUtils()
 | 
				
			||||||
        card_details = stripe_utils.get_card_details(customer.stripe_id, request.session.get('token'))
 | 
					        card_details = stripe_utils.get_card_details(customer.stripe_id,
 | 
				
			||||||
        if not card_details.get('response_object') and not card_details.get('paid'):
 | 
					                                                     request.session.get(
 | 
				
			||||||
 | 
					                                                         'token'))
 | 
				
			||||||
 | 
					        if not card_details.get('response_object'):
 | 
				
			||||||
            msg = card_details.get('error')
 | 
					            msg = card_details.get('error')
 | 
				
			||||||
            messages.add_message(self.request, messages.ERROR, msg, extra_tags='failed_payment')
 | 
					            messages.add_message(self.request, messages.ERROR, msg,
 | 
				
			||||||
            return HttpResponseRedirect(reverse('datacenterlight:payment') + '#payment_error')
 | 
					                                 extra_tags='failed_payment')
 | 
				
			||||||
 | 
					            return HttpResponseRedirect(
 | 
				
			||||||
 | 
					                reverse('datacenterlight:payment') + '#payment_error')
 | 
				
			||||||
        context = {
 | 
					        context = {
 | 
				
			||||||
            'site_url': reverse('datacenterlight:index'),
 | 
					            'site_url': reverse('datacenterlight:index'),
 | 
				
			||||||
            'cc_last4': card_details.get('response_object').get('last4'),
 | 
					            'cc_last4': card_details.get('response_object').get('last4'),
 | 
				
			||||||
| 
						 | 
					@ -452,13 +481,16 @@ class OrderConfirmationView(DetailView):
 | 
				
			||||||
                                                   customer=customer.stripe_id)
 | 
					                                                   customer=customer.stripe_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        # Check if the payment was approved
 | 
					        # Check if the payment was approved
 | 
				
			||||||
        if not charge_response.get('response_object') and not charge_response.get('paid'):
 | 
					        if not charge_response.get('response_object'):
 | 
				
			||||||
            msg = charge_response.get('error')
 | 
					            msg = charge_response.get('error')
 | 
				
			||||||
            messages.add_message(self.request, messages.ERROR, msg, extra_tags='make_charge_error')
 | 
					            messages.add_message(self.request, messages.ERROR, msg,
 | 
				
			||||||
            return HttpResponseRedirect(reverse('datacenterlight:payment') + '#payment_error')
 | 
					                                 extra_tags='make_charge_error')
 | 
				
			||||||
 | 
					            return HttpResponseRedirect(
 | 
				
			||||||
 | 
					                reverse('datacenterlight:payment') + '#payment_error')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        charge = charge_response.get('response_object')
 | 
					        charge = charge_response.get('response_object')
 | 
				
			||||||
        create_vm_task.delay(vm_template_id, user, specs, template, stripe_customer_id, billing_address_data,
 | 
					        create_vm_task.delay(vm_template_id, user, specs, template,
 | 
				
			||||||
 | 
					                             stripe_customer_id, billing_address_data,
 | 
				
			||||||
                             billing_address_id,
 | 
					                             billing_address_id,
 | 
				
			||||||
                             charge)
 | 
					                             charge)
 | 
				
			||||||
        request.session['order_confirmation'] = True
 | 
					        request.session['order_confirmation'] = True
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -493,6 +493,7 @@ REGISTRATION_MESSAGE = {'subject': "Validation mail",
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
STRIPE_API_PRIVATE_KEY = env('STRIPE_API_PRIVATE_KEY')
 | 
					STRIPE_API_PRIVATE_KEY = env('STRIPE_API_PRIVATE_KEY')
 | 
				
			||||||
STRIPE_API_PUBLIC_KEY = env('STRIPE_API_PUBLIC_KEY')
 | 
					STRIPE_API_PUBLIC_KEY = env('STRIPE_API_PUBLIC_KEY')
 | 
				
			||||||
 | 
					STRIPE_API_PRIVATE_KEY_TEST = env('STRIPE_API_PRIVATE_KEY_TEST')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
ANONYMOUS_USER_NAME = 'anonymous@ungleich.ch'
 | 
					ANONYMOUS_USER_NAME = 'anonymous@ungleich.ch'
 | 
				
			||||||
GUARDIAN_GET_INIT_ANONYMOUS_USER = 'membership.models.get_anonymous_user_instance'
 | 
					GUARDIAN_GET_INIT_ANONYMOUS_USER = 'membership.models.get_anonymous_user_instance'
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -570,7 +570,7 @@ class PaymentVMView(LoginRequiredMixin, FormView):
 | 
				
			||||||
                                                       customer=customer.stripe_id)
 | 
					                                                       customer=customer.stripe_id)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            # Check if the payment was approved
 | 
					            # Check if the payment was approved
 | 
				
			||||||
            if not charge_response.get('response_object') and not charge_response.get('paid'):
 | 
					            if not charge_response.get('response_object'):
 | 
				
			||||||
                msg = charge_response.get('error')
 | 
					                msg = charge_response.get('error')
 | 
				
			||||||
                messages.add_message(self.request, messages.ERROR, msg, extra_tags='make_charge_error')
 | 
					                messages.add_message(self.request, messages.ERROR, msg, extra_tags='make_charge_error')
 | 
				
			||||||
                return HttpResponseRedirect(reverse('hosting:payment') + '#payment_error')
 | 
					                return HttpResponseRedirect(reverse('hosting:payment') + '#payment_error')
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue