Implemented post method for hosting OrderDetailView
This commit is contained in:
parent
0fc0b0630c
commit
c8baf3d4c1
1 changed files with 88 additions and 28 deletions
116
hosting/views.py
116
hosting/views.py
|
@ -1,44 +1,41 @@
|
||||||
import uuid
|
import uuid
|
||||||
|
|
||||||
from django.core.files.base import ContentFile
|
from django.conf import settings
|
||||||
|
from django.contrib import messages
|
||||||
from oca.pool import WrongNameError, WrongIdError
|
|
||||||
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.contrib.auth.mixins import LoginRequiredMixin
|
||||||
|
from django.contrib.auth.tokens import default_token_generator
|
||||||
|
from django.core.files.base import ContentFile
|
||||||
|
from django.core.urlresolvers import reverse_lazy, reverse
|
||||||
|
from django.http import Http404
|
||||||
|
from django.http import HttpResponseRedirect
|
||||||
|
from django.shortcuts import redirect
|
||||||
|
from django.shortcuts import render
|
||||||
|
from django.utils.http import urlsafe_base64_decode
|
||||||
|
from django.utils.safestring import mark_safe
|
||||||
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.views.generic import View, CreateView, FormView, ListView, \
|
from django.views.generic import View, CreateView, FormView, ListView, \
|
||||||
DetailView, \
|
DetailView, \
|
||||||
DeleteView, TemplateView, UpdateView
|
DeleteView, TemplateView, UpdateView
|
||||||
from django.http import HttpResponseRedirect
|
|
||||||
from django.contrib import messages
|
|
||||||
from django.conf import settings
|
|
||||||
from django.shortcuts import redirect
|
|
||||||
from django.utils.http import urlsafe_base64_decode
|
|
||||||
from django.contrib.auth.tokens import default_token_generator
|
|
||||||
|
|
||||||
from guardian.mixins import PermissionRequiredMixin
|
from guardian.mixins import PermissionRequiredMixin
|
||||||
from stored_messages.settings import stored_messages_settings
|
from oca.pool import WrongNameError, WrongIdError
|
||||||
from stored_messages.models import Message
|
|
||||||
from stored_messages.api import mark_read
|
from stored_messages.api import mark_read
|
||||||
from django.utils.safestring import mark_safe
|
from stored_messages.models import Message
|
||||||
|
from stored_messages.settings import stored_messages_settings
|
||||||
|
|
||||||
|
from datacenterlight.tasks import create_vm_task
|
||||||
from membership.models import CustomUser, StripeCustomer
|
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.mailer import BaseEmail
|
|
||||||
from .models import HostingOrder, HostingBill, HostingPlan, UserHostingKey
|
|
||||||
from .forms import HostingUserSignupForm, HostingUserLoginForm, \
|
|
||||||
UserHostingKeyForm, generate_ssh_key_name
|
|
||||||
from .mixins import ProcessVMSelectionMixin
|
|
||||||
|
|
||||||
from opennebula_api.models import OpenNebulaManager
|
from opennebula_api.models import OpenNebulaManager
|
||||||
from opennebula_api.serializers import VirtualMachineSerializer, \
|
from opennebula_api.serializers import VirtualMachineSerializer, \
|
||||||
VirtualMachineTemplateSerializer
|
VirtualMachineTemplateSerializer
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from utils.forms import BillingAddressForm, PasswordResetRequestForm
|
||||||
|
from utils.mailer import BaseEmail
|
||||||
|
from utils.stripe_utils import StripeUtils
|
||||||
|
from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin, \
|
||||||
|
LoginViewMixin
|
||||||
|
from .forms import HostingUserSignupForm, HostingUserLoginForm, \
|
||||||
|
UserHostingKeyForm, generate_ssh_key_name
|
||||||
|
from .mixins import ProcessVMSelectionMixin
|
||||||
|
from .models import HostingOrder, HostingBill, HostingPlan, UserHostingKey
|
||||||
|
|
||||||
CONNECTION_ERROR = "Your VMs cannot be displayed at the moment due to a backend \
|
CONNECTION_ERROR = "Your VMs cannot be displayed at the moment due to a backend \
|
||||||
connection error. please try again in a few minutes."
|
connection error. please try again in a few minutes."
|
||||||
|
@ -638,6 +635,69 @@ class OrdersHostingDetailView(PermissionRequiredMixin, LoginRequiredMixin,
|
||||||
'cc_brand')
|
'cc_brand')
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
def post(self, request):
|
||||||
|
template = request.session.get('template')
|
||||||
|
specs = request.session.get('specs')
|
||||||
|
stripe_customer_id = request.session.get('customer')
|
||||||
|
customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
|
||||||
|
billing_address_data = request.session.get('billing_address_data')
|
||||||
|
billing_address_id = request.session.get('billing_address')
|
||||||
|
vm_template_id = template.get('id', 1)
|
||||||
|
|
||||||
|
# Make stripe charge to a customer
|
||||||
|
stripe_utils = StripeUtils()
|
||||||
|
card_details = stripe_utils.get_card_details(customer.stripe_id,
|
||||||
|
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('datacenterlight:payment') + '#payment_error')
|
||||||
|
card_details_dict = card_details.get('response_object')
|
||||||
|
cpu = specs.get('cpu')
|
||||||
|
memory = specs.get('memory')
|
||||||
|
disk_size = specs.get('disk_size')
|
||||||
|
amount_to_be_charged = (cpu * 5) + (memory * 2) + (disk_size * 0.6)
|
||||||
|
plan_name = "{cpu} Cores, {memory} GB RAM, {disk_size} GB SSD".format(
|
||||||
|
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 = stripe_utils.get_or_create_stripe_plan(
|
||||||
|
amount=amount_to_be_charged,
|
||||||
|
name=plan_name,
|
||||||
|
stripe_plan_id=stripe_plan_id)
|
||||||
|
subscription_result = stripe_utils.subscribe_customer_to_plan(
|
||||||
|
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')
|
||||||
|
messages.add_message(self.request, messages.ERROR, msg,
|
||||||
|
extra_tags='failed_payment')
|
||||||
|
return HttpResponseRedirect(
|
||||||
|
reverse('hosting:payment') + '#payment_error')
|
||||||
|
user = {
|
||||||
|
'name': self.request.user.name,
|
||||||
|
'email': self.request.user.email
|
||||||
|
}
|
||||||
|
create_vm_task.delay(vm_template_id, user, specs, template,
|
||||||
|
stripe_customer_id, billing_address_data,
|
||||||
|
billing_address_id,
|
||||||
|
stripe_subscription_obj, card_details_dict)
|
||||||
|
request.session['order_confirmation'] = True
|
||||||
|
return HttpResponseRedirect(reverse('hosting:my-virtual-machines'))
|
||||||
|
|
||||||
|
|
||||||
class OrdersHostingListView(LoginRequiredMixin, ListView):
|
class OrdersHostingListView(LoginRequiredMixin, ListView):
|
||||||
template_name = "hosting/orders.html"
|
template_name = "hosting/orders.html"
|
||||||
|
|
Loading…
Reference in a new issue