2017-04-29 17:39:55 +00:00
|
|
|
from collections import namedtuple
|
2015-05-27 10:21:30 +00:00
|
|
|
|
Created signup view. Added login after signup.Added signup url to nosystem app urls.py. Added logout view, Added logout button on nabber, Added password reset form, Added password view , Added password reset html, Added password reset email for nosystemd app. Added confirm_reset_password.html, Added confirm_ reset password view, Added confirm reset password form, Fixed reset password token generation, Started donation view, Added donation view, Added donation.html, Added donation form, Adding donation.js lib in order to capture stripe payments for nosystem app.
2016-07-22 06:24:32 +00:00
|
|
|
from django.shortcuts import render
|
2016-04-20 06:03:32 +00:00
|
|
|
from django.core.urlresolvers import reverse_lazy, reverse
|
2016-04-29 06:53:24 +00:00
|
|
|
from django.contrib.auth.mixins import LoginRequiredMixin
|
2016-05-29 18:37:43 +00:00
|
|
|
from django.views.generic import View, CreateView, FormView, ListView, DetailView,\
|
|
|
|
DeleteView, TemplateView, UpdateView
|
|
|
|
from django.http import HttpResponseRedirect
|
2016-04-20 06:03:32 +00:00
|
|
|
from django.contrib.auth import authenticate, login
|
2017-05-06 13:28:18 +00:00
|
|
|
from django.contrib import messages
|
2016-04-22 13:36:38 +00:00
|
|
|
from django.conf import settings
|
2017-05-04 04:19:32 +00:00
|
|
|
from django.shortcuts import redirect
|
|
|
|
|
2016-05-29 18:37:43 +00:00
|
|
|
|
2016-07-11 03:08:51 +00:00
|
|
|
from guardian.mixins import PermissionRequiredMixin
|
2016-05-29 18:37:43 +00:00
|
|
|
from stored_messages.settings import stored_messages_settings
|
|
|
|
from stored_messages.models import Message
|
|
|
|
from stored_messages.api import mark_read
|
|
|
|
|
2016-04-19 06:04:15 +00:00
|
|
|
|
2017-05-04 04:19:32 +00:00
|
|
|
|
2016-04-26 06:16:03 +00:00
|
|
|
from membership.models import CustomUser, StripeCustomer
|
|
|
|
from utils.stripe_utils import StripeUtils
|
Created signup view. Added login after signup.Added signup url to nosystem app urls.py. Added logout view, Added logout button on nabber, Added password reset form, Added password view , Added password reset html, Added password reset email for nosystemd app. Added confirm_reset_password.html, Added confirm_ reset password view, Added confirm reset password form, Fixed reset password token generation, Started donation view, Added donation view, Added donation.html, Added donation form, Adding donation.js lib in order to capture stripe payments for nosystem app.
2016-07-22 06:24:32 +00:00
|
|
|
from utils.forms import BillingAddressForm, PasswordResetRequestForm
|
2016-08-20 05:57:35 +00:00
|
|
|
from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin
|
2016-05-25 06:23:32 +00:00
|
|
|
from utils.mailer import BaseEmail
|
2017-05-07 04:29:29 +00:00
|
|
|
from .models import VirtualMachineType, VirtualMachinePlan, HostingOrder, HostingBill, UserHostingKey
|
2017-05-04 04:19:32 +00:00
|
|
|
from .forms import HostingUserSignupForm, HostingUserLoginForm, UserHostingKeyForm
|
2016-04-22 13:36:38 +00:00
|
|
|
from .mixins import ProcessVMSelectionMixin
|
2017-04-29 17:39:55 +00:00
|
|
|
from .opennebula_functions import HostingManageVMAdmin
|
2016-04-19 06:04:15 +00:00
|
|
|
|
2017-05-06 13:28:18 +00:00
|
|
|
from oca.exceptions import OpenNebulaException
|
|
|
|
from oca.pool import WrongNameError
|
|
|
|
|
2016-04-19 06:04:15 +00:00
|
|
|
|
2016-04-22 13:36:38 +00:00
|
|
|
class DjangoHostingView(ProcessVMSelectionMixin, View):
|
2016-04-19 06:04:15 +00:00
|
|
|
template_name = "hosting/django.html"
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
2016-06-07 05:29:22 +00:00
|
|
|
HOSTING = 'django'
|
|
|
|
configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
|
2016-04-22 13:36:38 +00:00
|
|
|
context = {
|
2016-06-07 05:29:22 +00:00
|
|
|
'hosting': HOSTING,
|
2016-04-22 13:36:38 +00:00
|
|
|
'hosting_long': "Django",
|
2016-06-07 05:29:22 +00:00
|
|
|
'configuration_detail': configuration_detail,
|
2016-04-22 13:36:38 +00:00
|
|
|
'domain': "django-hosting.ch",
|
|
|
|
'google_analytics': "UA-62285904-6",
|
|
|
|
'email': "info@django-hosting.ch",
|
|
|
|
'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
2017-05-04 04:19:32 +00:00
|
|
|
'configuration_options': dict(VirtualMachinePlan.VM_CONFIGURATION)
|
2016-04-22 13:36:38 +00:00
|
|
|
}
|
2016-05-19 06:17:16 +00:00
|
|
|
|
2016-04-19 06:04:15 +00:00
|
|
|
return context
|
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
2016-05-19 06:17:16 +00:00
|
|
|
request.session['hosting_url'] = reverse('hosting:djangohosting')
|
2016-04-19 06:04:15 +00:00
|
|
|
context = self.get_context_data()
|
2016-04-23 07:22:44 +00:00
|
|
|
|
2016-04-19 06:04:15 +00:00
|
|
|
return render(request, self.template_name, context)
|
2015-07-30 17:07:29 +00:00
|
|
|
|
2015-05-27 10:21:30 +00:00
|
|
|
|
2016-04-22 13:36:38 +00:00
|
|
|
class RailsHostingView(ProcessVMSelectionMixin, View):
|
2016-04-20 06:03:32 +00:00
|
|
|
template_name = "hosting/rails.html"
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
2016-06-07 05:29:22 +00:00
|
|
|
HOSTING = 'rails'
|
|
|
|
configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
|
2016-04-22 13:36:38 +00:00
|
|
|
context = {
|
2016-06-07 05:29:22 +00:00
|
|
|
'hosting': HOSTING,
|
|
|
|
'configuration_detail': configuration_detail,
|
2016-04-22 13:36:38 +00:00
|
|
|
'hosting_long': "Ruby On Rails",
|
|
|
|
'domain': "rails-hosting.ch",
|
|
|
|
'google_analytics': "UA-62285904-5",
|
|
|
|
'email': "info@rails-hosting.ch",
|
|
|
|
'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
|
|
|
}
|
2016-04-20 06:03:32 +00:00
|
|
|
return context
|
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
2016-05-19 06:17:16 +00:00
|
|
|
request.session['hosting_url'] = reverse('hosting:railshosting')
|
2016-04-20 06:03:32 +00:00
|
|
|
context = self.get_context_data()
|
|
|
|
return render(request, self.template_name, context)
|
|
|
|
|
|
|
|
|
2016-04-22 13:36:38 +00:00
|
|
|
class NodeJSHostingView(ProcessVMSelectionMixin, View):
|
2016-04-20 06:03:32 +00:00
|
|
|
template_name = "hosting/nodejs.html"
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
2016-06-07 05:29:22 +00:00
|
|
|
HOSTING = 'nodejs'
|
|
|
|
configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
|
2016-04-22 13:36:38 +00:00
|
|
|
context = {
|
|
|
|
'hosting': "nodejs",
|
|
|
|
'hosting_long': "NodeJS",
|
2016-06-07 05:29:22 +00:00
|
|
|
'configuration_detail': configuration_detail,
|
2016-04-22 13:36:38 +00:00
|
|
|
'domain': "node-hosting.ch",
|
|
|
|
'google_analytics': "UA-62285904-7",
|
|
|
|
'email': "info@node-hosting.ch",
|
|
|
|
'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
|
|
|
}
|
2016-04-20 06:03:32 +00:00
|
|
|
return context
|
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
2016-05-19 06:17:16 +00:00
|
|
|
request.session['hosting_url'] = reverse('hosting:nodejshosting')
|
2016-04-20 06:03:32 +00:00
|
|
|
context = self.get_context_data()
|
2016-04-23 07:22:44 +00:00
|
|
|
|
2016-04-20 06:03:32 +00:00
|
|
|
return render(request, self.template_name, context)
|
2016-06-30 06:23:14 +00:00
|
|
|
|
|
|
|
|
|
|
|
class HostingPricingView(ProcessVMSelectionMixin, View):
|
|
|
|
template_name = "hosting/hosting_pricing.html"
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
|
|
|
configuration_options = dict(VirtualMachinePlan.VM_CONFIGURATION)
|
|
|
|
context = {
|
|
|
|
'configuration_options': configuration_options,
|
|
|
|
'email': "info@django-hosting.ch",
|
|
|
|
'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
|
|
|
}
|
|
|
|
|
|
|
|
return context
|
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
|
|
request.session['hosting_url'] = reverse('hosting:djangohosting')
|
|
|
|
context = self.get_context_data()
|
|
|
|
|
|
|
|
return render(request, self.template_name, context)
|
2016-04-20 06:03:32 +00:00
|
|
|
|
|
|
|
|
|
|
|
class IndexView(View):
|
|
|
|
template_name = "hosting/index.html"
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
2016-04-22 13:36:38 +00:00
|
|
|
context = {
|
|
|
|
'hosting': "nodejs",
|
|
|
|
'hosting_long': "NodeJS",
|
|
|
|
'domain': "node-hosting.ch",
|
|
|
|
'google_analytics': "UA-62285904-7",
|
|
|
|
'email': "info@node-hosting.ch",
|
|
|
|
'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
|
|
|
}
|
2016-04-20 06:03:32 +00:00
|
|
|
return context
|
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
2016-04-23 07:22:44 +00:00
|
|
|
|
2016-04-20 06:03:32 +00:00
|
|
|
context = self.get_context_data()
|
2016-04-23 07:22:44 +00:00
|
|
|
|
2016-04-20 06:03:32 +00:00
|
|
|
return render(request, self.template_name, context)
|
|
|
|
|
|
|
|
|
2016-08-20 05:57:35 +00:00
|
|
|
class LoginView(LoginViewMixin):
|
|
|
|
template_name = "hosting/login.html"
|
2016-04-20 06:03:32 +00:00
|
|
|
form_class = HostingUserLoginForm
|
2016-08-20 05:57:35 +00:00
|
|
|
success_url = reverse_lazy('hosting:orders')
|
2016-06-04 07:59:37 +00:00
|
|
|
|
2015-07-30 17:07:29 +00:00
|
|
|
|
2016-04-20 06:03:32 +00:00
|
|
|
class SignupView(CreateView):
|
|
|
|
template_name = 'hosting/signup.html'
|
|
|
|
form_class = HostingUserSignupForm
|
2016-05-18 22:58:28 +00:00
|
|
|
model = CustomUser
|
2015-07-30 17:07:29 +00:00
|
|
|
|
2016-04-20 06:03:32 +00:00
|
|
|
def get_success_url(self):
|
2016-04-30 18:55:55 +00:00
|
|
|
next_url = self.request.session.get('next', reverse_lazy('hosting:signup'))
|
|
|
|
return next_url
|
2015-07-30 17:07:29 +00:00
|
|
|
|
2016-04-20 06:03:32 +00:00
|
|
|
def form_valid(self, form):
|
|
|
|
name = form.cleaned_data.get('name')
|
|
|
|
email = form.cleaned_data.get('email')
|
|
|
|
password = form.cleaned_data.get('password')
|
2015-07-28 19:22:06 +00:00
|
|
|
|
2016-04-20 06:03:32 +00:00
|
|
|
CustomUser.register(name, password, email)
|
|
|
|
auth_user = authenticate(email=email, password=password)
|
|
|
|
login(self.request, auth_user)
|
2015-08-09 20:13:38 +00:00
|
|
|
|
2016-04-20 06:03:32 +00:00
|
|
|
return HttpResponseRedirect(self.get_success_url())
|
2015-07-30 17:07:29 +00:00
|
|
|
|
|
|
|
|
Created signup view. Added login after signup.Added signup url to nosystem app urls.py. Added logout view, Added logout button on nabber, Added password reset form, Added password view , Added password reset html, Added password reset email for nosystemd app. Added confirm_reset_password.html, Added confirm_ reset password view, Added confirm reset password form, Fixed reset password token generation, Started donation view, Added donation view, Added donation.html, Added donation form, Adding donation.js lib in order to capture stripe payments for nosystem app.
2016-07-22 06:24:32 +00:00
|
|
|
class PasswordResetView(PasswordResetViewMixin):
|
2016-06-21 05:10:38 +00:00
|
|
|
template_name = 'hosting/reset_password.html'
|
|
|
|
form_class = PasswordResetRequestForm
|
|
|
|
success_url = reverse_lazy('hosting:login')
|
Created signup view. Added login after signup.Added signup url to nosystem app urls.py. Added logout view, Added logout button on nabber, Added password reset form, Added password view , Added password reset html, Added password reset email for nosystemd app. Added confirm_reset_password.html, Added confirm_ reset password view, Added confirm reset password form, Fixed reset password token generation, Started donation view, Added donation view, Added donation.html, Added donation form, Adding donation.js lib in order to capture stripe payments for nosystem app.
2016-07-22 06:24:32 +00:00
|
|
|
template_email_path = 'hosting/emails/'
|
2016-06-21 05:10:38 +00:00
|
|
|
|
|
|
|
|
Created signup view. Added login after signup.Added signup url to nosystem app urls.py. Added logout view, Added logout button on nabber, Added password reset form, Added password view , Added password reset html, Added password reset email for nosystemd app. Added confirm_reset_password.html, Added confirm_ reset password view, Added confirm reset password form, Fixed reset password token generation, Started donation view, Added donation view, Added donation.html, Added donation form, Adding donation.js lib in order to capture stripe payments for nosystem app.
2016-07-22 06:24:32 +00:00
|
|
|
class PasswordResetConfirmView(PasswordResetConfirmViewMixin):
|
2016-06-21 05:10:38 +00:00
|
|
|
template_name = 'hosting/confirm_reset_password.html'
|
|
|
|
success_url = reverse_lazy('hosting:login')
|
|
|
|
|
|
|
|
|
2016-07-05 04:44:15 +00:00
|
|
|
class NotificationsView(LoginRequiredMixin, TemplateView):
|
2016-05-29 18:37:43 +00:00
|
|
|
template_name = 'hosting/notifications.html'
|
2016-07-05 04:44:15 +00:00
|
|
|
login_url = reverse_lazy('hosting:login')
|
2016-05-29 18:37:43 +00:00
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
|
|
|
context = super(NotificationsView, self).get_context_data(**kwargs)
|
|
|
|
backend = stored_messages_settings.STORAGE_BACKEND()
|
|
|
|
unread_notifications = backend.inbox_list(self.request.user)
|
|
|
|
read_notifications = backend.archive_list(self.request.user)
|
|
|
|
context.update({
|
|
|
|
'unread_notifications': unread_notifications,
|
|
|
|
'all_notifications': read_notifications + unread_notifications
|
|
|
|
})
|
|
|
|
return context
|
|
|
|
|
|
|
|
|
|
|
|
class MarkAsReadNotificationView(LoginRequiredMixin, UpdateView):
|
|
|
|
model = Message
|
|
|
|
success_url = reverse_lazy('hosting:notifications')
|
2016-07-05 04:44:15 +00:00
|
|
|
login_url = reverse_lazy('hosting:login')
|
2016-05-29 18:37:43 +00:00
|
|
|
fields = '__all__'
|
|
|
|
|
|
|
|
def post(self, *args, **kwargs):
|
|
|
|
message = self.get_object()
|
|
|
|
backend = stored_messages_settings.STORAGE_BACKEND()
|
|
|
|
backend.archive_store([self.request.user], message)
|
|
|
|
mark_read(self.request.user, message)
|
|
|
|
return HttpResponseRedirect(reverse('hosting:notifications'))
|
|
|
|
|
|
|
|
|
2017-05-04 04:19:32 +00:00
|
|
|
class GenerateVMSSHKeysView(LoginRequiredMixin, FormView):
|
|
|
|
form_class = UserHostingKeyForm
|
|
|
|
model = UserHostingKey
|
2016-05-20 21:11:42 +00:00
|
|
|
template_name = 'hosting/virtual_machine_key.html'
|
|
|
|
success_url = reverse_lazy('hosting:orders')
|
2016-07-05 04:44:15 +00:00
|
|
|
login_url = reverse_lazy('hosting:login')
|
2016-05-24 06:19:49 +00:00
|
|
|
context_object_name = "virtual_machine"
|
2016-05-20 21:11:42 +00:00
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
2017-05-04 04:19:32 +00:00
|
|
|
try:
|
|
|
|
user_key = UserHostingKey.objects.get(
|
|
|
|
user=self.request.user
|
|
|
|
)
|
|
|
|
except UserHostingKey.DoesNotExist:
|
|
|
|
user_key = None
|
|
|
|
|
|
|
|
context = super(
|
|
|
|
GenerateVMSSHKeysView,
|
|
|
|
self
|
|
|
|
).get_context_data(**kwargs)
|
2016-05-20 21:11:42 +00:00
|
|
|
|
2017-05-04 04:19:32 +00:00
|
|
|
context.update({
|
|
|
|
'user_key': user_key
|
|
|
|
})
|
|
|
|
|
|
|
|
return context
|
|
|
|
|
|
|
|
def get_form_kwargs(self):
|
|
|
|
kwargs = super(GenerateVMSSHKeysView, self).get_form_kwargs()
|
|
|
|
kwargs.update({'request': self.request})
|
|
|
|
return kwargs
|
2016-05-20 21:11:42 +00:00
|
|
|
|
2017-05-04 04:19:32 +00:00
|
|
|
def form_valid(self, form):
|
|
|
|
form.save()
|
|
|
|
context = self.get_context_data()
|
|
|
|
|
|
|
|
if form.cleaned_data.get('private_key'):
|
2016-05-24 06:19:49 +00:00
|
|
|
context.update({
|
2017-05-04 04:19:32 +00:00
|
|
|
'private_key': form.cleaned_data.get('private_key'),
|
|
|
|
'key_name': form.cleaned_data.get('name')
|
2016-05-24 06:19:49 +00:00
|
|
|
})
|
2017-05-04 04:19:32 +00:00
|
|
|
|
|
|
|
# print("form", form.cleaned_data)
|
|
|
|
|
|
|
|
return render(self.request, self.template_name, context)
|
2016-05-20 21:11:42 +00:00
|
|
|
|
2016-05-20 21:13:17 +00:00
|
|
|
|
2016-05-12 06:57:34 +00:00
|
|
|
class PaymentVMView(LoginRequiredMixin, FormView):
|
2016-04-22 13:36:38 +00:00
|
|
|
template_name = 'hosting/payment.html'
|
2016-05-12 06:57:34 +00:00
|
|
|
login_url = reverse_lazy('hosting:login')
|
2016-04-23 07:22:44 +00:00
|
|
|
form_class = BillingAddressForm
|
2016-04-22 13:36:38 +00:00
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
|
|
|
context = super(PaymentVMView, self).get_context_data(**kwargs)
|
|
|
|
context.update({
|
|
|
|
'stripe_key': settings.STRIPE_API_PUBLIC_KEY
|
|
|
|
})
|
2016-05-25 06:23:32 +00:00
|
|
|
|
2016-04-22 13:36:38 +00:00
|
|
|
return context
|
|
|
|
|
2016-04-23 07:22:44 +00:00
|
|
|
def post(self, request, *args, **kwargs):
|
|
|
|
form = self.get_form()
|
2015-07-29 22:11:17 +00:00
|
|
|
|
2016-04-23 07:22:44 +00:00
|
|
|
if form.is_valid():
|
2016-04-27 06:54:15 +00:00
|
|
|
context = self.get_context_data()
|
2016-04-23 07:22:44 +00:00
|
|
|
specifications = request.session.get('vm_specs')
|
2017-04-29 17:39:55 +00:00
|
|
|
|
|
|
|
vm_template = specifications.get('vm_template', 1)
|
|
|
|
|
2017-05-04 04:19:32 +00:00
|
|
|
vm_type = VirtualMachineType.objects.get(id=vm_template)
|
2017-04-29 17:39:55 +00:00
|
|
|
|
2017-05-04 04:19:32 +00:00
|
|
|
specs = vm_type.get_specs()
|
2017-04-29 17:39:55 +00:00
|
|
|
|
2017-05-04 04:19:32 +00:00
|
|
|
final_price = vm_type.calculate_price()
|
2015-07-28 19:22:06 +00:00
|
|
|
|
2016-04-23 07:22:44 +00:00
|
|
|
plan_data = {
|
2017-04-29 17:39:55 +00:00
|
|
|
'vm_type': vm_type,
|
|
|
|
'configuration': specifications.get(
|
|
|
|
'configuration',
|
|
|
|
'django'
|
|
|
|
),
|
2016-04-26 06:16:03 +00:00
|
|
|
'price': final_price
|
2016-04-23 07:22:44 +00:00
|
|
|
}
|
2017-04-29 17:39:55 +00:00
|
|
|
|
|
|
|
plan_data.update(specs)
|
|
|
|
|
2016-04-26 06:16:03 +00:00
|
|
|
token = form.cleaned_data.get('token')
|
2015-08-09 20:13:38 +00:00
|
|
|
|
2016-04-26 06:16:03 +00:00
|
|
|
# Get or create stripe customer
|
|
|
|
customer = StripeCustomer.get_or_create(email=self.request.user.email,
|
|
|
|
token=token)
|
2016-05-20 22:03:17 +00:00
|
|
|
if not customer:
|
2016-05-25 06:23:32 +00:00
|
|
|
form.add_error("__all__", "Invalid credit card")
|
2016-05-20 22:03:17 +00:00
|
|
|
return self.render_to_response(self.get_context_data(form=form))
|
|
|
|
|
2016-04-26 06:16:03 +00:00
|
|
|
# Create Virtual Machine Plan
|
|
|
|
plan = VirtualMachinePlan.create(plan_data, request.user)
|
2015-08-09 20:13:38 +00:00
|
|
|
|
2016-04-26 06:16:03 +00:00
|
|
|
# Create Billing Address
|
|
|
|
billing_address = form.save()
|
|
|
|
|
|
|
|
# Create a Hosting Order
|
2016-05-12 06:57:34 +00:00
|
|
|
order = HostingOrder.create(vm_plan=plan, customer=customer,
|
2016-04-26 06:16:03 +00:00
|
|
|
billing_address=billing_address)
|
|
|
|
|
|
|
|
# Make stripe charge to a customer
|
|
|
|
stripe_utils = StripeUtils()
|
2016-04-27 06:54:15 +00:00
|
|
|
charge_response = stripe_utils.make_charge(amount=final_price,
|
2016-04-30 18:55:55 +00:00
|
|
|
customer=customer.stripe_id)
|
2016-04-27 06:54:15 +00:00
|
|
|
charge = charge_response.get('response_object')
|
2015-09-22 11:37:22 +00:00
|
|
|
|
2016-04-30 18:55:55 +00:00
|
|
|
# Check if the payment was approved
|
2016-04-27 06:54:15 +00:00
|
|
|
if not charge:
|
|
|
|
context.update({
|
|
|
|
'paymentError': charge_response.get('error'),
|
2016-04-30 18:55:55 +00:00
|
|
|
'form': form
|
2016-04-27 06:54:15 +00:00
|
|
|
})
|
|
|
|
return render(request, self.template_name, context)
|
2016-04-26 06:16:03 +00:00
|
|
|
|
2016-04-27 06:54:15 +00:00
|
|
|
charge = charge_response.get('response_object')
|
2016-04-26 06:16:03 +00:00
|
|
|
|
2016-04-27 06:54:15 +00:00
|
|
|
# Associate an order with a stripe payment
|
|
|
|
order.set_stripe_charge(charge)
|
2015-07-29 23:09:23 +00:00
|
|
|
|
2016-04-27 06:54:15 +00:00
|
|
|
# If the Stripe payment was successed, set order status approved
|
|
|
|
order.set_approved()
|
2016-05-25 06:23:32 +00:00
|
|
|
|
2017-04-29 17:39:55 +00:00
|
|
|
# Create VM using oppenebula functions
|
2017-04-29 17:46:56 +00:00
|
|
|
# _request = namedtuple('request', 'POST user')
|
|
|
|
# _request.user = request.user
|
2017-04-29 17:39:55 +00:00
|
|
|
# user = namedtuple('user', 'email')
|
|
|
|
# email
|
2017-04-29 17:46:56 +00:00
|
|
|
# _request.POST = {
|
|
|
|
# 'vm_template': vm_template
|
|
|
|
# }
|
2017-04-29 17:39:55 +00:00
|
|
|
|
2017-05-06 22:36:02 +00:00
|
|
|
hosting_admin = HostingManageVMAdmin.__new__(HostingManageVMAdmin)
|
|
|
|
hosting_admin.init_opennebula_client(request)
|
2017-05-06 23:04:45 +00:00
|
|
|
oppennebula_vm_id = hosting_admin.create_vm_view(vm_type.get_specs())
|
|
|
|
plan.oppenebula_id = oppennebula_vm_id
|
2017-04-29 17:39:55 +00:00
|
|
|
|
2016-05-25 06:23:32 +00:00
|
|
|
# Send notification to ungleich as soon as VM has been booked
|
2016-06-05 20:49:51 +00:00
|
|
|
context = {
|
|
|
|
'vm': plan,
|
2016-06-16 06:04:48 +00:00
|
|
|
'order': order,
|
|
|
|
'base_url': "{0}://{1}".format(request.scheme, request.get_host())
|
|
|
|
|
2016-06-05 20:49:51 +00:00
|
|
|
}
|
2016-05-25 06:23:32 +00:00
|
|
|
email_data = {
|
|
|
|
'subject': 'New VM request',
|
2016-06-16 06:04:48 +00:00
|
|
|
'to': request.user.email,
|
2016-06-05 20:49:51 +00:00
|
|
|
'context': context,
|
2016-05-25 06:23:32 +00:00
|
|
|
'template_name': 'new_booked_vm',
|
Created signup view. Added login after signup.Added signup url to nosystem app urls.py. Added logout view, Added logout button on nabber, Added password reset form, Added password view , Added password reset html, Added password reset email for nosystemd app. Added confirm_reset_password.html, Added confirm_ reset password view, Added confirm reset password form, Fixed reset password token generation, Started donation view, Added donation view, Added donation.html, Added donation form, Adding donation.js lib in order to capture stripe payments for nosystem app.
2016-07-22 06:24:32 +00:00
|
|
|
'template_path': 'hosting/emails/'
|
2016-05-25 06:23:32 +00:00
|
|
|
}
|
|
|
|
email = BaseEmail(**email_data)
|
|
|
|
email.send()
|
|
|
|
|
2016-05-03 05:59:40 +00:00
|
|
|
return HttpResponseRedirect(reverse('hosting:orders', kwargs={'pk': order.id}))
|
2016-04-23 07:22:44 +00:00
|
|
|
else:
|
|
|
|
return self.form_invalid(form)
|
2016-04-27 06:54:15 +00:00
|
|
|
|
2016-04-30 18:55:55 +00:00
|
|
|
|
2016-07-11 03:08:51 +00:00
|
|
|
class OrdersHostingDetailView(PermissionRequiredMixin, LoginRequiredMixin, DetailView):
|
2016-05-03 05:59:40 +00:00
|
|
|
template_name = "hosting/order_detail.html"
|
2016-05-14 06:42:42 +00:00
|
|
|
context_object_name = "order"
|
2016-04-29 06:53:24 +00:00
|
|
|
login_url = reverse_lazy('hosting:login')
|
2016-07-11 03:08:51 +00:00
|
|
|
permission_required = ['view_hostingorder']
|
2016-05-03 05:59:40 +00:00
|
|
|
model = HostingOrder
|
2016-04-27 06:54:15 +00:00
|
|
|
|
2017-05-05 12:59:11 +00:00
|
|
|
def get_context_data(self, **kwargs):
|
|
|
|
context = super(DetailView, self).get_context_data(**kwargs)
|
|
|
|
print(context)
|
|
|
|
return context
|
2016-04-27 06:54:15 +00:00
|
|
|
|
2016-05-03 05:59:40 +00:00
|
|
|
class OrdersHostingListView(LoginRequiredMixin, ListView):
|
2016-04-29 06:53:24 +00:00
|
|
|
template_name = "hosting/orders.html"
|
|
|
|
login_url = reverse_lazy('hosting:login')
|
2016-05-03 05:59:40 +00:00
|
|
|
context_object_name = "orders"
|
|
|
|
model = HostingOrder
|
|
|
|
paginate_by = 10
|
2016-05-14 06:42:42 +00:00
|
|
|
ordering = '-id'
|
2016-04-29 06:53:24 +00:00
|
|
|
|
2016-05-03 05:59:40 +00:00
|
|
|
def get_queryset(self):
|
2016-04-29 06:53:24 +00:00
|
|
|
user = self.request.user
|
2016-05-03 05:59:40 +00:00
|
|
|
self.queryset = HostingOrder.objects.filter(customer__user=user)
|
|
|
|
return super(OrdersHostingListView, self).get_queryset()
|
2016-04-29 06:53:24 +00:00
|
|
|
|
2016-05-24 06:19:49 +00:00
|
|
|
|
|
|
|
class OrdersHostingDeleteView(LoginRequiredMixin, DeleteView):
|
2016-05-29 18:37:43 +00:00
|
|
|
login_url = reverse_lazy('hosting:login')
|
2016-05-18 22:58:28 +00:00
|
|
|
success_url = reverse_lazy('hosting:orders')
|
|
|
|
model = HostingOrder
|
2016-04-29 06:53:24 +00:00
|
|
|
|
2016-05-29 18:37:43 +00:00
|
|
|
|
2016-05-03 05:59:40 +00:00
|
|
|
class VirtualMachinesPlanListView(LoginRequiredMixin, ListView):
|
|
|
|
template_name = "hosting/virtual_machines.html"
|
|
|
|
login_url = reverse_lazy('hosting:login')
|
|
|
|
context_object_name = "vms"
|
|
|
|
model = VirtualMachinePlan
|
|
|
|
paginate_by = 10
|
2016-05-14 06:42:42 +00:00
|
|
|
ordering = '-id'
|
2016-04-29 06:53:24 +00:00
|
|
|
|
2016-05-03 05:59:40 +00:00
|
|
|
def get_queryset(self):
|
2017-05-06 23:19:28 +00:00
|
|
|
hosting_admin = HostingManageVMAdmin.__new__(HostingManageVMAdmin)
|
2017-05-06 23:39:19 +00:00
|
|
|
print(hosting_admin.show_vms_view(self.request))
|
2016-05-03 05:59:40 +00:00
|
|
|
user = self.request.user
|
|
|
|
self.queryset = VirtualMachinePlan.objects.active(user)
|
|
|
|
return super(VirtualMachinesPlanListView, self).get_queryset()
|
2016-05-04 05:16:41 +00:00
|
|
|
|
|
|
|
|
2017-05-04 04:19:32 +00:00
|
|
|
class CreateVirtualMachinesView(LoginRequiredMixin, View):
|
|
|
|
template_name = "hosting/create_virtual_machine.html"
|
|
|
|
login_url = reverse_lazy('hosting:login')
|
|
|
|
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
|
|
context = {
|
|
|
|
'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
|
|
|
'configuration_options': VirtualMachinePlan.VM_CONFIGURATION
|
|
|
|
}
|
|
|
|
# context = {}
|
|
|
|
return render(request, self.template_name, context)
|
|
|
|
|
|
|
|
def post(self, request):
|
|
|
|
configuration = request.POST.get('configuration')
|
|
|
|
configuration_display = dict(VirtualMachinePlan.VM_CONFIGURATION).get(configuration)
|
|
|
|
vm_template = request.POST.get('vm_template')
|
|
|
|
vm_type = VirtualMachineType.objects.get(id=vm_template)
|
|
|
|
vm_specs = vm_type.get_specs()
|
|
|
|
vm_specs.update({
|
|
|
|
'configuration_display': configuration_display,
|
|
|
|
'configuration': configuration,
|
|
|
|
'final_price': vm_type.final_price,
|
|
|
|
'vm_template': vm_template
|
|
|
|
})
|
2017-05-06 22:36:02 +00:00
|
|
|
request.session['vm_specs'] = vm_specs
|
2017-05-04 04:19:32 +00:00
|
|
|
return redirect(reverse('hosting:payment'))
|
|
|
|
|
|
|
|
# def get_queryset(self):
|
|
|
|
# # hosting_admin = HostingManageVMAdmin.__new__(HostingManageVMAdmin)
|
|
|
|
# # print(hosting_admin.show_vms(self.request))
|
|
|
|
# user = self.request.user
|
|
|
|
# self.queryset = VirtualMachinePlan.objects.active(user)
|
|
|
|
# return super(VirtualMachinesPlanListView, self).get_queryset()
|
|
|
|
|
|
|
|
|
2016-07-11 03:08:51 +00:00
|
|
|
class VirtualMachineView(PermissionRequiredMixin, LoginRequiredMixin, UpdateView):
|
2016-05-04 05:16:41 +00:00
|
|
|
template_name = "hosting/virtual_machine_detail.html"
|
|
|
|
login_url = reverse_lazy('hosting:login')
|
|
|
|
model = VirtualMachinePlan
|
|
|
|
context_object_name = "virtual_machine"
|
2016-07-11 03:08:51 +00:00
|
|
|
permission_required = ['view_virtualmachineplan', 'cancel_virtualmachineplan']
|
2016-06-10 04:50:49 +00:00
|
|
|
fields = '__all__'
|
|
|
|
|
|
|
|
def get_success_url(self):
|
|
|
|
vm = self.get_object()
|
|
|
|
final_url = "%s%s" % (reverse('hosting:virtual_machines', kwargs={'pk': vm.id}),
|
|
|
|
'#status-v')
|
|
|
|
return final_url
|
|
|
|
|
|
|
|
def post(self, *args, **kwargs):
|
|
|
|
vm = self.get_object()
|
|
|
|
vm.cancel_plan()
|
|
|
|
|
|
|
|
context = {
|
2016-06-16 06:04:48 +00:00
|
|
|
'vm': vm,
|
|
|
|
'base_url': "{0}://{1}".format(self.request.scheme, self.request.get_host())
|
2016-06-10 04:50:49 +00:00
|
|
|
}
|
|
|
|
email_data = {
|
|
|
|
'subject': 'Virtual machine plan canceled',
|
|
|
|
'to': self.request.user.email,
|
|
|
|
'context': context,
|
|
|
|
'template_name': 'vm_status_changed',
|
Created signup view. Added login after signup.Added signup url to nosystem app urls.py. Added logout view, Added logout button on nabber, Added password reset form, Added password view , Added password reset html, Added password reset email for nosystemd app. Added confirm_reset_password.html, Added confirm_ reset password view, Added confirm reset password form, Fixed reset password token generation, Started donation view, Added donation view, Added donation.html, Added donation form, Adding donation.js lib in order to capture stripe payments for nosystem app.
2016-07-22 06:24:32 +00:00
|
|
|
'template_path': 'hosting/emails/'
|
2016-06-10 04:50:49 +00:00
|
|
|
}
|
|
|
|
email = BaseEmail(**email_data)
|
|
|
|
email.send()
|
|
|
|
|
|
|
|
return HttpResponseRedirect(self.get_success_url())
|
2017-05-05 12:59:11 +00:00
|
|
|
|
|
|
|
class HostingBillListView(LoginRequiredMixin, ListView):
|
|
|
|
template_name = "hosting/bills.html"
|
|
|
|
login_url = reverse_lazy('hosting:login')
|
|
|
|
context_object_name = "users"
|
|
|
|
model = StripeCustomer
|
|
|
|
paginate_by = 10
|
|
|
|
ordering = '-id'
|
|
|
|
#TODO show only clients i.e. get_query_set
|
|
|
|
|
|
|
|
class HostingBillDetailView(PermissionRequiredMixin, LoginRequiredMixin, DetailView):
|
|
|
|
template_name = "hosting/bill_detail.html"
|
|
|
|
login_url = reverse_lazy('hosting:login')
|
|
|
|
permission_required = ['view_hostingview']
|
|
|
|
context_object_name = "bill"
|
|
|
|
model = HostingBill
|
|
|
|
|
|
|
|
def get_object(self, queryset=None):
|
|
|
|
#Get HostingBill for primary key (Select from customer users)
|
|
|
|
pk = self.kwargs['pk']
|
|
|
|
return HostingBill.objects.filter(customer__id=pk).first()
|
|
|
|
|
|
|
|
def get_context_data(self, **kwargs):
|
|
|
|
# Get context
|
|
|
|
context = super(DetailView, self).get_context_data(**kwargs)
|
2017-05-06 13:16:10 +00:00
|
|
|
# Get User
|
|
|
|
try:
|
|
|
|
user_email = self.object.customer.user.email
|
|
|
|
except AttributeError:
|
|
|
|
self.template_name = 'hosting/bill_error.html'
|
|
|
|
return context
|
2017-05-05 12:59:11 +00:00
|
|
|
# Add VMs to context
|
|
|
|
context['vms'] = []
|
|
|
|
|
|
|
|
# Connect to open nebula server
|
2017-05-06 13:28:18 +00:00
|
|
|
# TODO: handle potential connection error
|
2017-05-05 12:59:11 +00:00
|
|
|
client = oca.Client("{0}:{1}".format(settings.OPENNEBULA_USERNAME,
|
|
|
|
settings.OPENNEBULA_PASSWORD),
|
|
|
|
"{protocol}://{domain}:{port}{endpoint}".format(
|
|
|
|
protocol=settings.OPENNEBULA_PROTOCOL,
|
|
|
|
domain=settings.OPENNEBULA_DOMAIN,
|
|
|
|
port=settings.OPENNEBULA_PORT,
|
|
|
|
endpoint=settings.OPENNEBULA_ENDPOINT
|
|
|
|
))
|
|
|
|
# Get open nebula user id for given email
|
|
|
|
user_pool = oca.UserPool(client)
|
|
|
|
user_pool.info()
|
2017-05-06 13:28:18 +00:00
|
|
|
# TODO: handle potential name error
|
|
|
|
user_id = user_pool.get_by_name(user_email).id
|
2017-05-05 12:59:11 +00:00
|
|
|
|
|
|
|
# Get vm_pool for given user_id
|
|
|
|
vm_pool = oca.VirtualMachinePool(client)
|
|
|
|
vm_pool.info(filter=user_id)
|
2017-05-06 13:28:18 +00:00
|
|
|
|
2017-05-06 12:44:08 +00:00
|
|
|
# Reset total price
|
|
|
|
context['bill'].total_price = 0
|
2017-05-05 12:59:11 +00:00
|
|
|
# Add vm in vm_pool to context
|
|
|
|
for vm in vm_pool:
|
|
|
|
name = vm.name
|
|
|
|
cores = int(vm.template.vcpu)
|
|
|
|
memory = int(vm.template.memory) / 1024
|
|
|
|
# Check if vm has more than one disk
|
|
|
|
if 'DISK' in vm.template.multiple:
|
|
|
|
disk_size = 0
|
|
|
|
for disk in vm.template.disks:
|
|
|
|
disk_size += int(disk.size) / 1024
|
|
|
|
else:
|
|
|
|
disk_size = int(vm.template.disk.size) / 1024
|
2017-05-06 12:44:08 +00:00
|
|
|
|
|
|
|
#TODO: Replace with vm plan
|
|
|
|
price = 0.6 * disk_size + 2 * memory + 5 * cores
|
2017-05-05 12:59:11 +00:00
|
|
|
vm = {}
|
|
|
|
vm['name'] = name
|
2017-05-06 12:44:08 +00:00
|
|
|
vm['price'] = price
|
2017-05-05 12:59:11 +00:00
|
|
|
vm['disk_size'] = disk_size
|
|
|
|
vm['cores'] = cores
|
|
|
|
vm['memory'] = memory
|
|
|
|
context['vms'].append(vm)
|
2017-05-06 12:44:08 +00:00
|
|
|
context['bill'].total_price += price
|
2017-05-05 12:59:11 +00:00
|
|
|
|
2017-05-06 12:44:08 +00:00
|
|
|
context['bill'].save()
|
2017-05-05 12:59:11 +00:00
|
|
|
return context
|