hosting: Updated OrdersHostingDetailView for stripe charging in this view
This commit is contained in:
parent
67ab4ef0a1
commit
0fc0b0630c
1 changed files with 67 additions and 42 deletions
|
@ -7,7 +7,8 @@ from django.shortcuts import render
|
|||
from django.http import Http404
|
||||
from django.core.urlresolvers import reverse_lazy, reverse
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin
|
||||
from django.views.generic import View, CreateView, FormView, ListView, DetailView, \
|
||||
from django.views.generic import View, CreateView, FormView, ListView, \
|
||||
DetailView, \
|
||||
DeleteView, TemplateView, UpdateView
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.contrib import messages
|
||||
|
@ -24,11 +25,14 @@ from django.utils.safestring import mark_safe
|
|||
|
||||
from membership.models import CustomUser, StripeCustomer
|
||||
from utils.stripe_utils import StripeUtils
|
||||
from utils.forms import BillingAddressForm, PasswordResetRequestForm, UserBillingAddressForm
|
||||
from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin
|
||||
from utils.forms import BillingAddressForm, PasswordResetRequestForm, \
|
||||
UserBillingAddressForm
|
||||
from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin, \
|
||||
LoginViewMixin
|
||||
from utils.mailer import BaseEmail
|
||||
from .models import HostingOrder, HostingBill, HostingPlan, UserHostingKey
|
||||
from .forms import HostingUserSignupForm, HostingUserLoginForm, UserHostingKeyForm, generate_ssh_key_name
|
||||
from .forms import HostingUserSignupForm, HostingUserLoginForm, \
|
||||
UserHostingKeyForm, generate_ssh_key_name
|
||||
from .mixins import ProcessVMSelectionMixin
|
||||
|
||||
from opennebula_api.models import OpenNebulaManager
|
||||
|
@ -296,7 +300,8 @@ class PasswordResetConfirmView(PasswordResetConfirmViewMixin):
|
|||
|
||||
form = self.form_class(request.POST)
|
||||
|
||||
if user is not None and default_token_generator.check_token(user, token):
|
||||
if user is not None and default_token_generator.check_token(user,
|
||||
token):
|
||||
if form.is_valid():
|
||||
new_password = form.cleaned_data['new_password2']
|
||||
user.set_password(new_password)
|
||||
|
@ -397,7 +402,8 @@ class SSHKeyListView(LoginRequiredMixin, ListView):
|
|||
def render_to_response(self, context, **response_kwargs):
|
||||
if not self.queryset:
|
||||
return HttpResponseRedirect(reverse('hosting:choice_ssh_keys'))
|
||||
return super(SSHKeyListView, self).render_to_response(context, **response_kwargs)
|
||||
return super(SSHKeyListView, self).render_to_response(context,
|
||||
**response_kwargs)
|
||||
|
||||
|
||||
class SSHKeyChoiceView(LoginRequiredMixin, View):
|
||||
|
@ -548,23 +554,10 @@ class PaymentVMView(LoginRequiredMixin, FormView):
|
|||
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')
|
||||
|
||||
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=owner.email,
|
||||
token=token)
|
||||
|
@ -579,12 +572,13 @@ class PaymentVMView(LoginRequiredMixin, FormView):
|
|||
request.session['billing_address'] = billing_address.id
|
||||
request.session['token'] = token
|
||||
request.session['customer'] = customer.id
|
||||
return HttpResponseRedirect(reverse('hosting:orders'))
|
||||
return HttpResponseRedirect(reverse('hosting:order-confirmation'))
|
||||
else:
|
||||
return self.form_invalid(form)
|
||||
|
||||
|
||||
class OrdersHostingDetailView(PermissionRequiredMixin, LoginRequiredMixin, DetailView):
|
||||
class OrdersHostingDetailView(PermissionRequiredMixin, LoginRequiredMixin,
|
||||
DetailView):
|
||||
template_name = "hosting/order_detail.html"
|
||||
context_object_name = "order"
|
||||
login_url = reverse_lazy('hosting:login')
|
||||
|
@ -596,13 +590,33 @@ class OrdersHostingDetailView(PermissionRequiredMixin, LoginRequiredMixin, Detai
|
|||
context = super(DetailView, self).get_context_data(**kwargs)
|
||||
obj = self.get_object()
|
||||
owner = self.request.user
|
||||
manager = OpenNebulaManager(email=owner.email,
|
||||
password=owner.password)
|
||||
if 'specs' not in self.request.session or 'user' not in self.request.session:
|
||||
return HttpResponseRedirect(
|
||||
reverse('hosting:create_virtual_machine'))
|
||||
if 'token' not in self.request.session:
|
||||
return HttpResponseRedirect(reverse('hosting:payment'))
|
||||
stripe_customer_id = self.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,
|
||||
self.request.session.get(
|
||||
'token'))
|
||||
if not card_details.get('response_object'):
|
||||
msg = card_details.get('error')
|
||||
messages.add_message(self.request, messages.ERROR, msg,
|
||||
extra_tags='failed_payment')
|
||||
return HttpResponseRedirect(
|
||||
reverse('hosting:payment') + '#payment_error')
|
||||
|
||||
if self.request.GET.get('page', '') == 'payment':
|
||||
context['page_header_text'] = _('Confirm Order')
|
||||
else:
|
||||
context['page_header_text'] = _('Invoice')
|
||||
|
||||
if obj.vm_id:
|
||||
try:
|
||||
manager = OpenNebulaManager(email=owner.email,
|
||||
password=owner.password)
|
||||
vm = manager.get_vm(obj.vm_id)
|
||||
context['vm'] = VirtualMachineSerializer(vm).data
|
||||
except WrongIdError:
|
||||
|
@ -616,6 +630,12 @@ class OrdersHostingDetailView(PermissionRequiredMixin, LoginRequiredMixin, Detai
|
|||
messages.error(self.request,
|
||||
'In order to create a VM, you need to create/upload your SSH KEY first.'
|
||||
)
|
||||
else:
|
||||
context['site_url'] = reverse('hosting:create_virtual_machine')
|
||||
context['cc_last4'] = card_details.get('response_object').get(
|
||||
'last4')
|
||||
context['cc_brand'] = card_details.get('response_object').get(
|
||||
'cc_brand')
|
||||
return context
|
||||
|
||||
|
||||
|
@ -692,7 +712,8 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
|
|||
configuration_options = HostingPlan.get_serialized_configs()
|
||||
|
||||
context = {
|
||||
'templates': VirtualMachineTemplateSerializer(templates, many=True).data,
|
||||
'templates': VirtualMachineTemplateSerializer(templates,
|
||||
many=True).data,
|
||||
'configuration_options': configuration_options,
|
||||
}
|
||||
except:
|
||||
|
@ -763,7 +784,8 @@ class VirtualMachineView(LoginRequiredMixin, View):
|
|||
serializer = VirtualMachineSerializer(vm)
|
||||
context = {
|
||||
'virtual_machine': serializer.data,
|
||||
'order': HostingOrder.objects.get(vm_id=serializer.data['vm_id'])
|
||||
'order': HostingOrder.objects.get(
|
||||
vm_id=serializer.data['vm_id'])
|
||||
}
|
||||
except:
|
||||
pass
|
||||
|
@ -794,7 +816,8 @@ class VirtualMachineView(LoginRequiredMixin, View):
|
|||
|
||||
context = {
|
||||
'vm': vm,
|
||||
'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 = {
|
||||
'subject': 'Virtual machine plan canceled',
|
||||
|
@ -814,7 +837,8 @@ class VirtualMachineView(LoginRequiredMixin, View):
|
|||
return HttpResponseRedirect(self.get_success_url())
|
||||
|
||||
|
||||
class HostingBillListView(PermissionRequiredMixin, LoginRequiredMixin, ListView):
|
||||
class HostingBillListView(PermissionRequiredMixin, LoginRequiredMixin,
|
||||
ListView):
|
||||
template_name = "hosting/bills.html"
|
||||
login_url = reverse_lazy('hosting:login')
|
||||
permission_required = ['view_hostingview']
|
||||
|
@ -824,7 +848,8 @@ class HostingBillListView(PermissionRequiredMixin, LoginRequiredMixin, ListView)
|
|||
ordering = '-id'
|
||||
|
||||
|
||||
class HostingBillDetailView(PermissionRequiredMixin, LoginRequiredMixin, DetailView):
|
||||
class HostingBillDetailView(PermissionRequiredMixin, LoginRequiredMixin,
|
||||
DetailView):
|
||||
template_name = "hosting/bill_detail.html"
|
||||
login_url = reverse_lazy('hosting:login')
|
||||
permission_required = ['view_hostingview']
|
||||
|
|
Loading…
Reference in a new issue