diff --git a/datacenterlight/views.py b/datacenterlight/views.py index 2b304606..19100aba 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -11,9 +11,15 @@ from django.shortcuts import redirect from django import forms from django.core.exceptions import ValidationError from django.views.decorators.cache import cache_control +from django.conf import settings +from utils.forms import BillingAddressForm, UserBillingAddressForm +from membership.models import StripeCustomer +from hosting.models import HostingOrder, HostingBill +from utils.stripe_utils import StripeUtils +from datetime import datetime from opennebula_api.models import OpenNebulaManager -from opennebula_api.serializers import VirtualMachineTemplateSerializer +from opennebula_api.serializers import VirtualMachineTemplateSerializer, VirtualMachineSerializer class LandingProgramView(TemplateView): template_name = "datacenterlight/landing.html" @@ -21,6 +27,14 @@ class LandingProgramView(TemplateView): class SuccessView(TemplateView): template_name = "datacenterlight/success.html" + def get(self, request, *args, **kwargs): + if 'specs' not in request.session or 'user' not in request.session: + return HttpResponseRedirect(reverse('datacenterlight:index')) + else : + del request.session['specs'] + del request.session['user'] + return render(request, self.template_name) + class PricingView(TemplateView): template_name = "datacenterlight/pricing.html" @@ -171,8 +185,12 @@ class IndexView(CreateView): success_url = "/datacenterlight#requestform" success_message = "Thank you, we will contact you as soon as possible" - @cache_control(no_cache=True, must_revalidate=True, no_store=True) + @cache_control(no_cache=True, must_revalidate=True, no_store=True) def get(self, request, *args, **kwargs): + if 'specs' in request.session : + del request.session['specs'] + if 'user' in request.session : + del request.session['user'] try: manager = OpenNebulaManager() templates = manager.get_templates() @@ -215,26 +233,22 @@ class IndexView(CreateView): messages.add_message(self.request, messages.ERROR, '%(value) is not a proper email.'.format(email)) return HttpResponseRedirect(reverse('datacenterlight:index')) - context = { - 'name': name, - 'email': email, - 'cores': cores, + specs = { + 'cpu': cores, 'memory': memory, - 'storage': storage, - 'price': price, - 'template': template_data['name'], + 'disk_size': storage, + 'price': price } - email_data = { - 'subject': "Data Center Light Order from %s" % context['email'], - 'from_email': '(datacenterlight) datacenterlight Support ', - 'to': ['info@ungleich.ch'], - 'body': "\n".join(["%s=%s" % (k, v) for (k, v) in context.items()]), - 'reply_to': [context['email']], + + this_user = { + 'name': name, + 'email': email } - email = EmailMessage(**email_data) - email.send() - - return HttpResponseRedirect(reverse('datacenterlight:order_success')) + + request.session['specs'] = specs + request.session['template'] = template_data + request.session['user'] = this_user + return HttpResponseRedirect(reverse('datacenterlight:payment')) def get_success_url(self): success_url = reverse('datacenterlight:index') @@ -283,3 +297,130 @@ class IndexView(CreateView): messages.add_message(self.request, messages.SUCCESS, self.success_message) return super(IndexView, self).form_valid(form) + + +class PaymentOrderView(FormView): + template_name = 'hosting/payment.html' + form_class = BillingAddressForm + + def get_context_data(self, **kwargs): + context = super(PaymentOrderView, self).get_context_data(**kwargs) + context.update({ + 'stripe_key': settings.STRIPE_API_PUBLIC_KEY + }) + return context + + @cache_control(no_cache=True, must_revalidate=True, no_store=True) + def get(self, request, *args, **kwargs): + if 'specs' not in request.session or 'user' not in request.session: + return HttpResponseRedirect(reverse('datacenterlight:index')) + return self.render_to_response(self.get_context_data()) + + def post(self, request, *args, **kwargs): + form = self.get_form() + if form.is_valid(): + # Get billing address data + billing_address_data = form.cleaned_data + context = self.get_context_data() + template = request.session.get('template') + specs = request.session.get('specs') + user = request.session.get('user') + vm_template_id = template.get('id', 1) + final_price = specs.get('price') + token = form.cleaned_data.get('token') + owner = self.request.user + + # Get or create stripe customer + customer = StripeCustomer.get_or_create(email=user.get('email'), + token=token) + if not customer: + form.add_error("__all__", "Invalid credit card") + return self.render_to_response(self.get_context_data(form=form)) + + # Create Billing Address + billing_address = form.save() + + # Make stripe charge to a customer + stripe_utils = StripeUtils() + charge_response = stripe_utils.make_charge(amount=final_price, + customer=customer.stripe_id) + charge = charge_response.get('response_object') + + # Check if the payment was approved + if not charge: + context.update({ + 'paymentError': charge_response.get('error'), + 'form': form + }) + return render(request, self.template_name, context) + + charge = charge_response.get('response_object') + + # Create OpenNebulaManager + manager = OpenNebulaManager(email=settings.OPENNEBULA_USERNAME, + password=settings.OPENNEBULA_PASSWORD) + + # Create a vm using logged user + vm_id = manager.create_vm( + template_id=vm_template_id, + specs=specs, + name="{email}-{template_name}-{date}".format( + email=user.get('email'), + template_name=template.get('name'), + date=int(datetime.now().strftime("%s"))) + ) + + # Create a Hosting Order + #order = HostingOrder.create( + # price=final_price, + # vm_id=vm_id, + # customer=customer, + # billing_address=billing_address + #) + + ## Create a Hosting Bill + #bill = HostingBill.create( + # customer=customer, billing_address=billing_address) + # + ## Create Billing Address for User if he does not have one + #if not customer.user.billing_addresses.count(): + # billing_address_data.update({ + # 'user': customer.user.id + # }) + # billing_address_user_form = UserBillingAddressForm( + # billing_address_data) + # billing_address_user_form.is_valid() + # billing_address_user_form.save() + # + ## Associate an order with a stripe payment + #order.set_stripe_charge(charge) + + # If the Stripe payment was successed, set order status approved + #order.set_approved() + + vm = VirtualMachineSerializer(manager.get_vm(vm_id)).data + + context = { + 'name': user.get('name'), + 'email': user.get('email'), + 'cores': specs.get('cpu'), + 'memory': specs.get('memory'), + 'storage': specs.get('disk_size'), + 'price': specs.get('price'), + 'template': template.get('name'), + 'vm.name': vm['name'], + 'vm.id': vm['vm_id'], + 'order id': order.id + } + email_data = { + 'subject': "Data Center Light Order from %s" % context['email'], + 'from_email': '(Data Center Light) Data Center Light Support ', + 'to': ['info@ungleich.ch'], + 'body': "\n".join(["%s=%s" % (k, v) for (k, v) in context.items()]), + 'reply_to': [context['email']], + } + email = EmailMessage(**email_data) + email.send() + return HttpResponseRedirect(reverse('datacenterlight:order_success')) + else: + return self.form_invalid(form)