| 
									
										
										
										
											2017-08-30 12:02:53 +02:00
										 |  |  | import logging | 
					
						
							| 
									
										
										
										
											2017-07-06 14:18:22 +03:00
										 |  |  | import uuid | 
					
						
							| 
									
										
										
										
											2017-09-25 00:30:28 +05:30
										 |  |  | from datetime import datetime | 
					
						
							| 
									
										
										
										
											2017-09-14 02:24:10 +05:30
										 |  |  | from time import sleep | 
					
						
							| 
									
										
										
										
											2017-07-06 14:18:22 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  | from django import forms | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  | from django.conf import settings | 
					
						
							|  |  |  | from django.contrib import messages | 
					
						
							|  |  |  | from django.contrib.auth.mixins import LoginRequiredMixin | 
					
						
							|  |  |  | from django.contrib.auth.tokens import default_token_generator | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  | from django.core.exceptions import ValidationError | 
					
						
							| 
									
										
										
										
											2017-07-06 14:18:22 +03:00
										 |  |  | from django.core.files.base import ContentFile | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  | from django.core.urlresolvers import reverse_lazy, reverse | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  | from django.http import ( | 
					
						
							|  |  |  |     Http404, HttpResponseRedirect, HttpResponse, JsonResponse | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2017-09-14 02:24:10 +05:30
										 |  |  | from django.shortcuts import redirect, render | 
					
						
							| 
									
										
										
										
											2018-07-07 01:50:46 +02:00
										 |  |  | from django.utils.decorators import method_decorator | 
					
						
							| 
									
										
										
										
											2018-07-03 21:52:44 +02:00
										 |  |  | from django.utils.html import escape | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | from django.utils.http import urlsafe_base64_decode | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  | from django.utils.safestring import mark_safe | 
					
						
							| 
									
										
										
										
											2017-09-16 20:55:37 +05:30
										 |  |  | from django.utils.translation import get_language, ugettext_lazy as _ | 
					
						
							| 
									
										
										
										
											2017-09-14 02:24:10 +05:30
										 |  |  | from django.utils.translation import ugettext | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  | from django.views.decorators.cache import never_cache | 
					
						
							| 
									
										
										
										
											2017-09-20 23:19:32 +05:30
										 |  |  | from django.views.generic import ( | 
					
						
							|  |  |  |     View, CreateView, FormView, ListView, DetailView, DeleteView, | 
					
						
							|  |  |  |     TemplateView, UpdateView | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2016-07-10 22:08:51 -05:00
										 |  |  | from guardian.mixins import PermissionRequiredMixin | 
					
						
							| 
									
										
										
										
											2017-09-13 05:30:05 +05:30
										 |  |  | from oca.pool import WrongIdError | 
					
						
							| 
									
										
										
										
											2016-05-29 13:37:43 -05:00
										 |  |  | from stored_messages.api import mark_read | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  | from stored_messages.models import Message | 
					
						
							|  |  |  | from stored_messages.settings import stored_messages_settings | 
					
						
							| 
									
										
										
										
											2016-04-19 01:04:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 15:55:58 +05:30
										 |  |  | from datacenterlight.models import VMTemplate, VMPricing | 
					
						
							| 
									
										
										
										
											2018-06-27 12:08:48 +02:00
										 |  |  | from datacenterlight.utils import create_vm, get_cms_integration | 
					
						
							| 
									
										
										
										
											2018-06-12 09:36:00 +02:00
										 |  |  | from hosting.models import UserCardDetail | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  | from membership.models import CustomUser, StripeCustomer | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  | from opennebula_api.models import OpenNebulaManager | 
					
						
							| 
									
										
										
										
											2017-12-25 15:07:12 +01:00
										 |  |  | from opennebula_api.serializers import ( | 
					
						
							|  |  |  |     VirtualMachineSerializer, VirtualMachineTemplateSerializer, | 
					
						
							|  |  |  |     VMTemplateSerializer | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2017-09-24 15:49:40 +05:30
										 |  |  | from utils.forms import ( | 
					
						
							|  |  |  |     BillingAddressForm, PasswordResetRequestForm, UserBillingAddressForm, | 
					
						
							|  |  |  |     ResendActivationEmailForm | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2018-06-12 08:13:48 +02:00
										 |  |  | from utils.hosting_utils import get_vm_price_with_vat, HostingUtils | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  | from utils.mailer import BaseEmail | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  | from utils.stripe_utils import StripeUtils | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  | from utils.tasks import send_plain_email_task | 
					
						
							| 
									
										
										
										
											2017-09-20 23:19:32 +05:30
										 |  |  | from utils.views import ( | 
					
						
							| 
									
										
										
										
											2017-09-24 15:49:40 +05:30
										 |  |  |     PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin, | 
					
						
							|  |  |  |     ResendActivationLinkViewMixin | 
					
						
							| 
									
										
										
										
											2017-09-20 23:19:32 +05:30
										 |  |  | ) | 
					
						
							| 
									
										
										
										
											2017-12-25 15:07:12 +01:00
										 |  |  | from .forms import ( | 
					
						
							|  |  |  |     HostingUserSignupForm, HostingUserLoginForm, UserHostingKeyForm, | 
					
						
							|  |  |  |     generate_ssh_key_name | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2018-04-07 12:53:53 +02:00
										 |  |  | from .mixins import ProcessVMSelectionMixin, HostingContextMixin | 
					
						
							| 
									
										
										
										
											2017-09-25 00:30:28 +05:30
										 |  |  | from .models import ( | 
					
						
							|  |  |  |     HostingOrder, HostingBill, HostingPlan, UserHostingKey, VMDetail | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-29 13:31:05 +05:30
										 |  |  | logger = logging.getLogger(__name__) | 
					
						
							| 
									
										
										
										
											2017-05-13 06:59:57 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-29 17:51:58 +02:00
										 |  |  | CONNECTION_ERROR = "Your VMs cannot be displayed at the moment due to a \
 | 
					
						
							|  |  |  |                     backend connection error. please try again in a few \ | 
					
						
							|  |  |  |                     minutes." | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  | decorators = [never_cache] | 
					
						
							| 
									
										
										
										
											2016-04-19 01:04:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-01 23:06:51 +02:00
										 |  |  | class DashboardView(LoginRequiredMixin, View): | 
					
						
							| 
									
										
										
										
											2017-08-22 20:45:18 +05:30
										 |  |  |     template_name = "hosting/dashboard.html" | 
					
						
							| 
									
										
										
										
											2017-10-01 23:06:51 +02:00
										 |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							| 
									
										
										
										
											2017-08-22 20:45:18 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_context_data(self, **kwargs): | 
					
						
							|  |  |  |         context = {} | 
					
						
							|  |  |  |         return context | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-08-22 20:45:18 +05:30
										 |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							|  |  |  |         context = self.get_context_data() | 
					
						
							|  |  |  |         return render(request, self.template_name, context) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  | class DjangoHostingView(ProcessVMSelectionMixin, View): | 
					
						
							| 
									
										
										
										
											2016-04-19 01:04:15 -05:00
										 |  |  |     template_name = "hosting/django.html" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_context_data(self, **kwargs): | 
					
						
							| 
									
										
										
										
											2016-06-07 00:29:22 -05:00
										 |  |  |         HOSTING = 'django' | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  |         templates = OpenNebulaManager().get_templates() | 
					
						
							|  |  |  |         data = VirtualMachineTemplateSerializer(templates, many=True).data | 
					
						
							| 
									
										
										
										
											2017-05-21 22:01:26 -05:00
										 |  |  |         configuration_options = HostingPlan.get_serialized_configs() | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |         context = { | 
					
						
							| 
									
										
										
										
											2016-06-07 00:29:22 -05:00
										 |  |  |             'hosting': HOSTING, | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |             'hosting_long': "Django", | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  |             # 'configuration_detail': configuration_detail, | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |             'domain': "django-hosting.ch", | 
					
						
							|  |  |  |             'google_analytics': "UA-62285904-6", | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  |             'vm_types': data, | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |             'email': "info@django-hosting.ch", | 
					
						
							| 
									
										
										
										
											2017-05-21 22:01:26 -05:00
										 |  |  |             'configuration_options': configuration_options, | 
					
						
							|  |  |  |             'templates': templates, | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-05-19 01:47:16 -04:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-19 01:04:15 -05:00
										 |  |  |         return context | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2016-05-19 01:47:16 -04:30
										 |  |  |         request.session['hosting_url'] = reverse('hosting:djangohosting') | 
					
						
							| 
									
										
										
										
											2016-04-19 01:04:15 -05:00
										 |  |  |         context = self.get_context_data() | 
					
						
							| 
									
										
										
										
											2016-04-23 02:22:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-19 01:04:15 -05:00
										 |  |  |         return render(request, self.template_name, context) | 
					
						
							| 
									
										
										
										
											2015-07-30 19:07:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-05-27 12:21:30 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  | class RailsHostingView(ProcessVMSelectionMixin, View): | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |     template_name = "hosting/rails.html" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_context_data(self, **kwargs): | 
					
						
							| 
									
										
										
										
											2016-06-07 00:29:22 -05:00
										 |  |  |         HOSTING = 'rails' | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         templates = OpenNebulaManager().get_templates() | 
					
						
							| 
									
										
										
										
											2017-05-21 22:01:26 -05:00
										 |  |  |         configuration_options = HostingPlan.get_serialized_configs() | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |         context = { | 
					
						
							| 
									
										
										
										
											2016-06-07 00:29:22 -05:00
										 |  |  |             'hosting': HOSTING, | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |             'hosting_long': "Ruby On Rails", | 
					
						
							|  |  |  |             'domain': "rails-hosting.ch", | 
					
						
							|  |  |  |             'google_analytics': "UA-62285904-5", | 
					
						
							|  |  |  |             'email': "info@rails-hosting.ch", | 
					
						
							| 
									
										
										
										
											2017-05-21 22:01:26 -05:00
										 |  |  |             'configuration_options': configuration_options, | 
					
						
							|  |  |  |             'templates': templates, | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |         return context | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2016-05-19 01:47:16 -04:30
										 |  |  |         request.session['hosting_url'] = reverse('hosting:railshosting') | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |         context = self.get_context_data() | 
					
						
							|  |  |  |         return render(request, self.template_name, context) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  | class NodeJSHostingView(ProcessVMSelectionMixin, View): | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |     template_name = "hosting/nodejs.html" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_context_data(self, **kwargs): | 
					
						
							| 
									
										
										
										
											2016-06-07 00:29:22 -05:00
										 |  |  |         HOSTING = 'nodejs' | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  |         templates = OpenNebulaManager().get_templates() | 
					
						
							| 
									
										
										
										
											2017-05-21 22:01:26 -05:00
										 |  |  |         configuration_options = HostingPlan.get_serialized_configs() | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |         context = { | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  |             'hosting': HOSTING, | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |             'hosting_long': "NodeJS", | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  |             # 'configuration_detail': configuration_detail, | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |             'domain': "node-hosting.ch", | 
					
						
							|  |  |  |             'google_analytics': "UA-62285904-7", | 
					
						
							|  |  |  |             'email': "info@node-hosting.ch", | 
					
						
							| 
									
										
										
										
											2017-05-21 22:01:26 -05:00
										 |  |  |             'templates': templates, | 
					
						
							|  |  |  |             'configuration_options': configuration_options, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |         return context | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2016-05-19 01:47:16 -04:30
										 |  |  |         request.session['hosting_url'] = reverse('hosting:nodejshosting') | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |         context = self.get_context_data() | 
					
						
							| 
									
										
										
										
											2016-04-23 02:22:44 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |         return render(request, self.template_name, context) | 
					
						
							| 
									
										
										
										
											2016-06-30 01:23:14 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class HostingPricingView(ProcessVMSelectionMixin, View): | 
					
						
							|  |  |  |     template_name = "hosting/hosting_pricing.html" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_context_data(self, **kwargs): | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  |         # configuration_options = dict(VirtualMachinePlan.VM_CONFIGURATION) | 
					
						
							|  |  |  |         templates = OpenNebulaManager().get_templates() | 
					
						
							| 
									
										
										
										
											2017-05-21 22:01:26 -05:00
										 |  |  |         configuration_options = HostingPlan.get_serialized_configs() | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-30 01:23:14 -05:00
										 |  |  |         context = { | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  |             # 'configuration_options': configuration_options, | 
					
						
							| 
									
										
										
										
											2016-06-30 01:23:14 -05:00
										 |  |  |             'email': "info@django-hosting.ch", | 
					
						
							| 
									
										
										
										
											2017-05-21 22:01:26 -05:00
										 |  |  |             'templates': templates, | 
					
						
							|  |  |  |             'configuration_options': configuration_options, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-30 01:23:14 -05:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         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 01:03:32 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class IndexView(View): | 
					
						
							|  |  |  |     template_name = "hosting/index.html" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_context_data(self, **kwargs): | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  |         templates = OpenNebulaManager().get_templates() | 
					
						
							|  |  |  |         data = VirtualMachineTemplateSerializer(templates, many=True).data | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |         context = { | 
					
						
							|  |  |  |             'hosting': "nodejs", | 
					
						
							|  |  |  |             'hosting_long': "NodeJS", | 
					
						
							|  |  |  |             'domain': "node-hosting.ch", | 
					
						
							|  |  |  |             'google_analytics': "UA-62285904-7", | 
					
						
							|  |  |  |             'email': "info@node-hosting.ch", | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  |             'vm_types': data | 
					
						
							|  |  |  |             # 'vm_types': VirtualMachineType.get_serialized_vm_types(), | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |         return context | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							|  |  |  |         context = self.get_context_data() | 
					
						
							|  |  |  |         return render(request, self.template_name, context) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 12:53:53 +02:00
										 |  |  | class LoginView(HostingContextMixin, LoginViewMixin): | 
					
						
							| 
									
										
										
										
											2016-08-20 00:57:35 -05:00
										 |  |  |     template_name = "hosting/login.html" | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |     form_class = HostingUserLoginForm | 
					
						
							| 
									
										
										
										
											2017-09-07 22:24:03 +05:30
										 |  |  |     success_url = reverse_lazy('hosting:dashboard') | 
					
						
							| 
									
										
										
										
											2016-06-04 02:59:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 19:07:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 12:53:53 +02:00
										 |  |  | class SignupView(HostingContextMixin, CreateView): | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |     template_name = 'hosting/signup.html' | 
					
						
							|  |  |  |     form_class = HostingUserSignupForm | 
					
						
							| 
									
										
										
										
											2016-05-19 00:58:28 +02:00
										 |  |  |     model = CustomUser | 
					
						
							| 
									
										
										
										
											2017-12-27 08:32:55 +01:00
										 |  |  |     success_url = reverse_lazy('hosting:dashboard') | 
					
						
							| 
									
										
										
										
											2015-07-30 19:07:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |     def get_success_url(self): | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |         next_url = self.request.session.get( | 
					
						
							| 
									
										
										
										
											2017-05-25 16:23:31 +02:00
										 |  |  |             'next', self.success_url) | 
					
						
							| 
									
										
										
										
											2016-04-30 13:55:55 -05:00
										 |  |  |         return next_url | 
					
						
							| 
									
										
										
										
											2015-07-30 19:07:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |     def form_valid(self, form): | 
					
						
							|  |  |  |         name = form.cleaned_data.get('name') | 
					
						
							|  |  |  |         email = form.cleaned_data.get('email') | 
					
						
							|  |  |  |         password = form.cleaned_data.get('password') | 
					
						
							| 
									
										
										
										
											2017-07-26 16:45:49 +05:30
										 |  |  |         this_base_url = "{0}://{1}".format(self.request.scheme, | 
					
						
							|  |  |  |                                            self.request.get_host()) | 
					
						
							|  |  |  |         CustomUser.register(name, password, email, | 
					
						
							|  |  |  |                             app='dcl', base_url=this_base_url) | 
					
						
							| 
									
										
										
										
											2017-06-11 05:18:06 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |         return HttpResponseRedirect(reverse_lazy('hosting:signup-validate')) | 
					
						
							| 
									
										
										
										
											2015-07-28 21:22:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-12-27 08:33:53 +01:00
										 |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							|  |  |  |         if self.request.user.is_authenticated(): | 
					
						
							|  |  |  |             return HttpResponseRedirect(self.get_success_url()) | 
					
						
							|  |  |  |         return super(SignupView, self).get(request, *args, **kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 17:34:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 12:53:53 +02:00
										 |  |  | class SignupValidateView(HostingContextMixin, TemplateView): | 
					
						
							| 
									
										
										
										
											2017-06-11 05:18:06 +05:30
										 |  |  |     template_name = "hosting/signup_validate.html" | 
					
						
							| 
									
										
										
										
											2017-06-29 17:34:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 05:18:06 +05:30
										 |  |  |     def get_context_data(self, **kwargs): | 
					
						
							|  |  |  |         context = super(SignupValidateView, self).get_context_data(**kwargs) | 
					
						
							| 
									
										
										
										
											2017-07-26 16:45:49 +05:30
										 |  |  |         login_url = '<a href="' + \ | 
					
						
							| 
									
										
										
										
											2017-08-04 17:49:35 +02:00
										 |  |  |                     reverse('hosting:login') + '">' + str(_('login')) + '</a>' | 
					
						
							| 
									
										
										
										
											2017-07-26 16:45:49 +05:30
										 |  |  |         home_url = '<a href="' + \ | 
					
						
							| 
									
										
										
										
											2017-08-04 17:49:35 +02:00
										 |  |  |                    reverse('datacenterlight:index') + '">Data Center Light</a>' | 
					
						
							| 
									
										
										
										
											2017-06-29 19:23:25 +03:00
										 |  |  |         message = '{signup_success_message} {lurl}</a> \
 | 
					
						
							| 
									
										
										
										
											2017-06-17 19:38:22 +05:30
										 |  |  |                  <br />{go_back} {hurl}.'.format( | 
					
						
							| 
									
										
										
										
											2017-06-29 19:23:25 +03:00
										 |  |  |             signup_success_message=_( | 
					
						
							|  |  |  |                 'Thank you for signing up. We have sent an email to you. ' | 
					
						
							| 
									
										
										
										
											2017-09-29 08:50:03 +02:00
										 |  |  |                 'Please follow the instructions in it to activate your ' | 
					
						
							|  |  |  |                 'account. Once activated, you can login using'), | 
					
						
							| 
									
										
										
										
											2017-06-29 19:23:25 +03:00
										 |  |  |             go_back=_('Go back to'), | 
					
						
							|  |  |  |             lurl=login_url, | 
					
						
							|  |  |  |             hurl=home_url | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2017-06-11 05:18:06 +05:30
										 |  |  |         context['message'] = mark_safe(message) | 
					
						
							| 
									
										
										
										
											2017-06-17 19:38:22 +05:30
										 |  |  |         context['section_title'] = _('Sign up') | 
					
						
							| 
									
										
										
										
											2017-06-11 05:18:06 +05:30
										 |  |  |         return context | 
					
						
							| 
									
										
										
										
											2015-08-09 22:13:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 17:34:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 13:15:44 +02:00
										 |  |  | class SignupValidatedView(SignupValidateView, HostingContextMixin): | 
					
						
							| 
									
										
										
										
											2017-06-11 05:18:06 +05:30
										 |  |  |     template_name = "hosting/signup_validate.html" | 
					
						
							| 
									
										
										
										
											2017-06-29 17:34:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 05:18:06 +05:30
										 |  |  |     def get_context_data(self, **kwargs): | 
					
						
							|  |  |  |         context = super(SignupValidateView, self).get_context_data(**kwargs) | 
					
						
							|  |  |  |         validated = CustomUser.validate_url(self.kwargs['validate_slug']) | 
					
						
							| 
									
										
										
										
											2017-07-26 16:45:49 +05:30
										 |  |  |         login_url = '<a href="' + \ | 
					
						
							| 
									
										
										
										
											2017-08-04 17:49:35 +02:00
										 |  |  |                     reverse('hosting:login') + '">' + str(_('login')) + '</a>' | 
					
						
							| 
									
										
										
										
											2017-06-29 19:23:25 +03:00
										 |  |  |         section_title = _('Account activation') | 
					
						
							| 
									
										
										
										
											2017-09-23 01:03:43 +05:30
										 |  |  |         user = CustomUser.objects.filter( | 
					
						
							|  |  |  |             validation_slug=self.kwargs['validate_slug']).first() | 
					
						
							| 
									
										
										
										
											2017-06-11 05:18:06 +05:30
										 |  |  |         if validated: | 
					
						
							| 
									
										
										
										
											2017-09-29 08:50:03 +02:00
										 |  |  |             message = ('{account_activation_string} <br />' | 
					
						
							|  |  |  |                        ' {login_string} {lurl}.').format( | 
					
						
							| 
									
										
										
										
											2017-07-26 16:45:49 +05:30
										 |  |  |                 account_activation_string=_( | 
					
						
							|  |  |  |                     "Your account has been activated."), | 
					
						
							| 
									
										
										
										
											2017-06-29 19:23:25 +03:00
										 |  |  |                 login_string=_("You can now"), | 
					
						
							|  |  |  |                 lurl=login_url) | 
					
						
							| 
									
										
										
										
											2017-09-27 02:45:24 +05:30
										 |  |  |             email_data = { | 
					
						
							|  |  |  |                 'subject': _('Welcome to Data Center Light!'), | 
					
						
							| 
									
										
										
										
											2017-09-27 03:09:43 +05:30
										 |  |  |                 'to': user.email, | 
					
						
							| 
									
										
										
										
											2017-09-27 02:45:24 +05:30
										 |  |  |                 'context': { | 
					
						
							|  |  |  |                     'base_url': "{0}://{1}".format( | 
					
						
							|  |  |  |                         self.request.scheme, | 
					
						
							|  |  |  |                         self.request.get_host() | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 'template_name': 'welcome_user', | 
					
						
							|  |  |  |                 'template_path': 'datacenterlight/emails/', | 
					
						
							|  |  |  |                 'from_address': settings.DCL_SUPPORT_FROM_ADDRESS, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             email = BaseEmail(**email_data) | 
					
						
							|  |  |  |             email.send() | 
					
						
							| 
									
										
										
										
											2017-06-11 05:18:06 +05:30
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2017-07-26 16:45:49 +05:30
										 |  |  |             home_url = '<a href="' + \ | 
					
						
							| 
									
										
										
										
											2018-04-07 13:16:36 +02:00
										 |  |  |                        reverse('datacenterlight:cms_index') + \ | 
					
						
							| 
									
										
										
										
											2017-08-19 02:21:34 +05:30
										 |  |  |                        '">Data Center Light</a>' | 
					
						
							| 
									
										
										
										
											2017-06-17 19:38:22 +05:30
										 |  |  |             message = '{sorry_message} <br />{go_back_to} {hurl}'.format( | 
					
						
							| 
									
										
										
										
											2017-06-29 19:23:25 +03:00
										 |  |  |                 sorry_message=_("Sorry. Your request is invalid."), | 
					
						
							|  |  |  |                 go_back_to=_('Go back to'), | 
					
						
							|  |  |  |                 hurl=home_url | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2017-06-11 05:18:06 +05:30
										 |  |  |         context['message'] = mark_safe(message) | 
					
						
							|  |  |  |         context['section_title'] = section_title | 
					
						
							|  |  |  |         return context | 
					
						
							| 
									
										
										
										
											2015-07-30 19:07:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-12-27 09:03:17 +01:00
										 |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							|  |  |  |         if self.request.user.is_authenticated(): | 
					
						
							|  |  |  |             return HttpResponseRedirect(reverse_lazy('hosting:dashboard')) | 
					
						
							|  |  |  |         return super(SignupValidatedView, self).get(request, *args, **kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 19:07:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 12:53:53 +02:00
										 |  |  | class ResendActivationEmailView(HostingContextMixin, | 
					
						
							|  |  |  |                                 ResendActivationLinkViewMixin): | 
					
						
							| 
									
										
										
										
											2017-09-24 15:49:40 +05:30
										 |  |  |     template_name = 'hosting/resend_activation_link.html' | 
					
						
							|  |  |  |     form_class = ResendActivationEmailForm | 
					
						
							|  |  |  |     success_url = reverse_lazy('hosting:login') | 
					
						
							|  |  |  |     email_template_path = 'datacenterlight/emails/' | 
					
						
							|  |  |  |     email_template_name = 'user_activation' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 12:53:53 +02:00
										 |  |  | class PasswordResetView(HostingContextMixin, PasswordResetViewMixin): | 
					
						
							| 
									
										
										
										
											2017-06-12 20:51:48 +05:30
										 |  |  |     site = 'dcl' | 
					
						
							| 
									
										
										
										
											2016-06-21 00:10:38 -05: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 01:24:32 -05:00
										 |  |  |     template_email_path = 'hosting/emails/' | 
					
						
							| 
									
										
										
										
											2016-06-21 00:10:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-07 12:53:53 +02:00
										 |  |  | class PasswordResetConfirmView(HostingContextMixin, | 
					
						
							|  |  |  |                                PasswordResetConfirmViewMixin): | 
					
						
							| 
									
										
										
										
											2016-06-21 00:10:38 -05:00
										 |  |  |     template_name = 'hosting/confirm_reset_password.html' | 
					
						
							|  |  |  |     success_url = reverse_lazy('hosting:login') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |     def post(self, request, uidb64=None, token=None, *arg, **kwargs): | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             uid = urlsafe_base64_decode(uidb64) | 
					
						
							|  |  |  |             user = CustomUser.objects.get(pk=uid) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             opennebula_client = OpenNebulaManager( | 
					
						
							|  |  |  |                 email=user.email, | 
					
						
							|  |  |  |                 password=user.password, | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         except (TypeError, ValueError, OverflowError, CustomUser.DoesNotExist): | 
					
						
							|  |  |  |             user = None | 
					
						
							|  |  |  |             opennebula_client = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         form = self.form_class(request.POST) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 23:52:02 +02:00
										 |  |  |         if user is not None and default_token_generator.check_token(user, | 
					
						
							|  |  |  |                                                                     token): | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |             if form.is_valid(): | 
					
						
							|  |  |  |                 new_password = form.cleaned_data['new_password2'] | 
					
						
							|  |  |  |                 user.set_password(new_password) | 
					
						
							|  |  |  |                 user.save() | 
					
						
							| 
									
										
										
										
											2017-09-02 16:50:09 +05:30
										 |  |  |                 messages.success(request, _('Password has been reset.')) | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 # Change opennebula password | 
					
						
							| 
									
										
										
										
											2017-09-25 09:35:18 +02:00
										 |  |  |                 opennebula_client.change_user_password(user.password) | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 return self.form_valid(form) | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |                 messages.error( | 
					
						
							| 
									
										
										
										
											2017-09-02 16:50:09 +05:30
										 |  |  |                     request, _('Password reset has not been successful.')) | 
					
						
							|  |  |  |                 form.add_error(None, | 
					
						
							|  |  |  |                                _('Password reset has not been successful.')) | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |                 return self.form_invalid(form) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2017-09-02 16:50:09 +05:30
										 |  |  |             error_msg = _('The reset password link is no longer valid.') | 
					
						
							|  |  |  |             messages.error(request, _(error_msg)) | 
					
						
							|  |  |  |             form.add_error(None, error_msg) | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |             return self.form_invalid(form) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-21 00:10:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-04 23:44:15 -05:00
										 |  |  | class NotificationsView(LoginRequiredMixin, TemplateView): | 
					
						
							| 
									
										
										
										
											2016-05-29 13:37:43 -05:00
										 |  |  |     template_name = 'hosting/notifications.html' | 
					
						
							| 
									
										
										
										
											2016-07-04 23:44:15 -05:00
										 |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							| 
									
										
										
										
											2016-05-29 13:37:43 -05: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-04 23:44:15 -05:00
										 |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							| 
									
										
										
										
											2016-05-29 13:37:43 -05: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-06-03 13:33:05 +02:00
										 |  |  | class SSHKeyDeleteView(LoginRequiredMixin, DeleteView): | 
					
						
							|  |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |     success_url = reverse_lazy('hosting:ssh_keys') | 
					
						
							| 
									
										
										
										
											2017-06-03 13:33:05 +02:00
										 |  |  |     model = UserHostingKey | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-04 20:54:28 +05:30
										 |  |  |     def get_object(self, queryset=None): | 
					
						
							| 
									
										
										
										
											2017-08-04 17:49:35 +02:00
										 |  |  |         """ Hook to ensure UserHostingKey object is owned by request.user.
 | 
					
						
							|  |  |  |             We reply with a Http404 if the user is not the owner of the key. | 
					
						
							|  |  |  |         """
 | 
					
						
							| 
									
										
										
										
											2017-08-04 20:54:28 +05:30
										 |  |  |         obj = super(SSHKeyDeleteView, self).get_object() | 
					
						
							| 
									
										
										
										
											2017-08-04 17:49:35 +02:00
										 |  |  |         if not obj.user == self.request.user: | 
					
						
							| 
									
										
										
										
											2017-08-04 20:54:28 +05:30
										 |  |  |             raise Http404 | 
					
						
							|  |  |  |         return obj | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |     def delete(self, request, *args, **kwargs): | 
					
						
							|  |  |  |         owner = self.request.user | 
					
						
							| 
									
										
										
										
											2017-08-30 09:42:56 +02:00
										 |  |  |         manager = OpenNebulaManager( | 
					
						
							|  |  |  |             email=owner.email, | 
					
						
							|  |  |  |             password=owner.password | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |         pk = self.kwargs.get('pk') | 
					
						
							|  |  |  |         # Get user ssh key | 
					
						
							| 
									
										
										
										
											2017-06-09 15:36:14 -05:00
										 |  |  |         public_key = UserHostingKey.objects.get(pk=pk).public_key | 
					
						
							| 
									
										
										
										
											2017-08-30 09:42:56 +02:00
										 |  |  |         manager.manage_public_key([{'value': public_key, 'state': False}]) | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         return super(SSHKeyDeleteView, self).delete(request, *args, **kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 17:34:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  | class SSHKeyListView(LoginRequiredMixin, ListView): | 
					
						
							|  |  |  |     template_name = "hosting/user_keys.html" | 
					
						
							| 
									
										
										
										
											2016-07-04 23:44:15 -05:00
										 |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |     context_object_name = "keys" | 
					
						
							|  |  |  |     model = UserHostingKey | 
					
						
							|  |  |  |     paginate_by = 10 | 
					
						
							|  |  |  |     ordering = '-id' | 
					
						
							| 
									
										
										
										
											2016-05-20 16:41:42 -04:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |     def get_queryset(self): | 
					
						
							|  |  |  |         user = self.request.user | 
					
						
							|  |  |  |         self.queryset = UserHostingKey.objects.filter(user=user) | 
					
						
							|  |  |  |         return super(SSHKeyListView, self).get_queryset() | 
					
						
							| 
									
										
										
										
											2017-05-03 23:19:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |     def render_to_response(self, context, **response_kwargs): | 
					
						
							|  |  |  |         if not self.queryset: | 
					
						
							| 
									
										
										
										
											2017-07-12 08:21:43 +03:00
										 |  |  |             return HttpResponseRedirect(reverse('hosting:choice_ssh_keys')) | 
					
						
							| 
									
										
										
										
											2017-09-06 23:52:02 +02:00
										 |  |  |         return super(SSHKeyListView, self).render_to_response(context, | 
					
						
							|  |  |  |                                                               **response_kwargs) | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-05 16:57:49 +03:00
										 |  |  | class SSHKeyChoiceView(LoginRequiredMixin, View): | 
					
						
							|  |  |  |     template_name = "hosting/choice_ssh_keys.html" | 
					
						
							|  |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-07-05 16:57:49 +03:00
										 |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							|  |  |  |         context = {} | 
					
						
							|  |  |  |         return render(request, self.template_name, context) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-07-06 11:47:12 +03:00
										 |  |  |     def post(self, request, *args, **kwargs): | 
					
						
							|  |  |  |         name = generate_ssh_key_name() | 
					
						
							|  |  |  |         private_key, public_key = UserHostingKey.generate_keys() | 
					
						
							| 
									
										
										
										
											2017-07-06 14:18:22 +03:00
										 |  |  |         content = ContentFile(private_key) | 
					
						
							| 
									
										
										
										
											2017-07-26 16:45:49 +05:30
										 |  |  |         ssh_key = UserHostingKey.objects.create( | 
					
						
							|  |  |  |             user=request.user, public_key=public_key, name=name) | 
					
						
							| 
									
										
										
										
											2017-07-06 14:18:22 +03:00
										 |  |  |         filename = name + '_' + str(uuid.uuid4())[:8] + '_private.pem' | 
					
						
							|  |  |  |         ssh_key.private_key.save(filename, content) | 
					
						
							| 
									
										
										
										
											2017-08-30 12:02:53 +02:00
										 |  |  |         owner = self.request.user | 
					
						
							|  |  |  |         manager = OpenNebulaManager( | 
					
						
							|  |  |  |             email=owner.email, | 
					
						
							|  |  |  |             password=owner.password | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         public_key_str = public_key.decode() | 
					
						
							|  |  |  |         manager.manage_public_key([{'value': public_key_str, 'state': True}]) | 
					
						
							| 
									
										
										
										
											2017-07-06 11:47:12 +03:00
										 |  |  |         return redirect(reverse_lazy('hosting:ssh_keys'), foo='bar') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-05 16:57:49 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 00:54:44 +05:30
										 |  |  | @method_decorator(decorators, name='dispatch') | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  | class SSHKeyCreateView(LoginRequiredMixin, FormView): | 
					
						
							|  |  |  |     form_class = UserHostingKeyForm | 
					
						
							|  |  |  |     model = UserHostingKey | 
					
						
							|  |  |  |     template_name = 'hosting/user_key.html' | 
					
						
							|  |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							|  |  |  |     context_object_name = "virtual_machine" | 
					
						
							|  |  |  |     success_url = reverse_lazy('hosting:ssh_keys') | 
					
						
							| 
									
										
										
										
											2017-05-03 23:19:32 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_form_kwargs(self): | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |         kwargs = super(SSHKeyCreateView, self).get_form_kwargs() | 
					
						
							| 
									
										
										
										
											2017-05-03 23:19:32 -05:00
										 |  |  |         kwargs.update({'request': self.request}) | 
					
						
							|  |  |  |         return kwargs | 
					
						
							| 
									
										
										
										
											2016-05-20 16:41:42 -04:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-03 23:19:32 -05:00
										 |  |  |     def form_valid(self, form): | 
					
						
							|  |  |  |         form.save() | 
					
						
							| 
									
										
										
										
											2018-01-08 19:50:42 +01:00
										 |  |  |         if settings.DCL_SSH_KEY_NAME_PREFIX in form.instance.name: | 
					
						
							| 
									
										
										
										
											2017-07-06 14:18:22 +03:00
										 |  |  |             content = ContentFile(form.cleaned_data.get('private_key')) | 
					
						
							| 
									
										
										
										
											2017-07-26 16:45:49 +05:30
										 |  |  |             filename = form.cleaned_data.get( | 
					
						
							|  |  |  |                 'name') + '_' + str(uuid.uuid4())[:8] + '_private.pem' | 
					
						
							| 
									
										
										
										
											2017-07-06 14:18:22 +03:00
										 |  |  |             form.instance.private_key.save(filename, content) | 
					
						
							| 
									
										
										
										
											2017-05-03 23:19:32 -05:00
										 |  |  |         context = self.get_context_data() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 10:58:16 -05:00
										 |  |  |         next_url = self.request.session.get( | 
					
						
							|  |  |  |             'next', | 
					
						
							|  |  |  |             reverse('hosting:create_virtual_machine') | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if 'next' in self.request.session: | 
					
						
							|  |  |  |             context.update({ | 
					
						
							|  |  |  |                 'next_url': next_url | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  |             del (self.request.session['next']) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-03 23:19:32 -05:00
										 |  |  |         if form.cleaned_data.get('private_key'): | 
					
						
							| 
									
										
										
										
											2016-05-24 01:19:49 -05:00
										 |  |  |             context.update({ | 
					
						
							| 
									
										
										
										
											2017-05-03 23:19:32 -05:00
										 |  |  |                 'private_key': form.cleaned_data.get('private_key'), | 
					
						
							| 
									
										
										
										
											2017-05-11 00:11:33 -05:00
										 |  |  |                 'key_name': form.cleaned_data.get('name'), | 
					
						
							| 
									
										
										
										
											2017-05-21 22:35:43 -05:00
										 |  |  |                 'form': UserHostingKeyForm(request=self.request), | 
					
						
							| 
									
										
										
										
											2016-05-24 01:19:49 -05:00
										 |  |  |             }) | 
					
						
							| 
									
										
										
										
											2017-05-03 23:19:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 15:50:10 +02:00
										 |  |  |         owner = self.request.user | 
					
						
							| 
									
										
										
										
											2017-08-29 17:51:58 +02:00
										 |  |  |         manager = OpenNebulaManager( | 
					
						
							|  |  |  |             email=owner.email, | 
					
						
							|  |  |  |             password=owner.password | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         public_key = form.cleaned_data['public_key'] | 
					
						
							|  |  |  |         if type(public_key) is bytes: | 
					
						
							|  |  |  |             public_key = public_key.decode() | 
					
						
							| 
									
										
										
										
											2017-08-30 09:42:56 +02:00
										 |  |  |         manager.manage_public_key([{'value': public_key, 'state': True}]) | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |         return HttpResponseRedirect(self.success_url) | 
					
						
							| 
									
										
										
										
											2016-05-20 16:41:42 -04:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-11 00:11:33 -05:00
										 |  |  |     def post(self, request, *args, **kwargs): | 
					
						
							|  |  |  |         form = self.get_form() | 
					
						
							| 
									
										
										
										
											2017-07-06 11:47:12 +03:00
										 |  |  |         required = 'add_ssh' in self.request.POST | 
					
						
							|  |  |  |         form.fields['name'].required = required | 
					
						
							|  |  |  |         form.fields['public_key'].required = required | 
					
						
							| 
									
										
										
										
											2017-05-11 00:11:33 -05:00
										 |  |  |         if form.is_valid(): | 
					
						
							|  |  |  |             return self.form_valid(form) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return self.form_invalid(form) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-20 16:43:17 -04:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-27 00:54:44 +05:30
										 |  |  | @method_decorator(decorators, name='dispatch') | 
					
						
							| 
									
										
										
										
											2017-08-24 22:11:15 +05:30
										 |  |  | class SettingsView(LoginRequiredMixin, FormView): | 
					
						
							|  |  |  |     template_name = "hosting/settings.html" | 
					
						
							|  |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							|  |  |  |     form_class = BillingAddressForm | 
					
						
							| 
									
										
										
										
											2017-10-21 00:02:35 +02:00
										 |  |  |     permission_required = ['view_usercarddetail'] | 
					
						
							| 
									
										
										
										
											2017-08-24 22:11:15 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-29 17:42:35 +05:30
										 |  |  |     def get_form(self, form_class): | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         Check if the user already saved contact details. If so, then show | 
					
						
							|  |  |  |         the form populated with those details, to let user change them. | 
					
						
							|  |  |  |         """
 | 
					
						
							|  |  |  |         return form_class( | 
					
						
							|  |  |  |             instance=self.request.user.billing_addresses.first(), | 
					
						
							|  |  |  |             **self.get_form_kwargs()) | 
					
						
							| 
									
										
										
										
											2017-08-24 22:11:15 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_context_data(self, **kwargs): | 
					
						
							|  |  |  |         context = super(SettingsView, self).get_context_data(**kwargs) | 
					
						
							|  |  |  |         # Get user | 
					
						
							|  |  |  |         user = self.request.user | 
					
						
							| 
									
										
										
										
											2017-10-30 08:26:35 +01:00
										 |  |  |         stripe_customer = None | 
					
						
							|  |  |  |         if hasattr(user, 'stripecustomer'): | 
					
						
							|  |  |  |             stripe_customer = user.stripecustomer | 
					
						
							| 
									
										
										
										
											2017-10-21 21:27:21 +02:00
										 |  |  |         cards_list = UserCardDetail.get_all_cards_list( | 
					
						
							| 
									
										
										
										
											2017-10-30 08:26:35 +01:00
										 |  |  |             stripe_customer=stripe_customer | 
					
						
							| 
									
										
										
										
											2017-10-15 23:57:15 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2017-08-24 22:11:15 +05:30
										 |  |  |         context.update({ | 
					
						
							| 
									
										
										
										
											2017-10-06 01:17:35 +05:30
										 |  |  |             'cards_list': cards_list, | 
					
						
							| 
									
										
										
										
											2017-08-24 22:11:15 +05:30
										 |  |  |             'stripe_key': settings.STRIPE_API_PUBLIC_KEY | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return context | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-29 17:42:35 +05:30
										 |  |  |     def post(self, request, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2017-10-28 22:19:53 +02:00
										 |  |  |         if 'card' in request.POST and request.POST['card'] is not '': | 
					
						
							|  |  |  |             card_id = escape(request.POST['card']) | 
					
						
							|  |  |  |             user_card_detail = UserCardDetail.objects.get(id=card_id) | 
					
						
							|  |  |  |             UserCardDetail.set_default_card( | 
					
						
							|  |  |  |                 stripe_api_cus_id=request.user.stripecustomer.stripe_id, | 
					
						
							|  |  |  |                 stripe_source_id=user_card_detail.card_id | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             msg = _( | 
					
						
							|  |  |  |                 ("Your {brand} card ending in {last4} set as " | 
					
						
							|  |  |  |                  "default card").format( | 
					
						
							|  |  |  |                     brand=user_card_detail.brand, | 
					
						
							|  |  |  |                     last4=user_card_detail.last4 | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             messages.add_message(request, messages.SUCCESS, msg) | 
					
						
							|  |  |  |             return HttpResponseRedirect(reverse_lazy('hosting:settings')) | 
					
						
							| 
									
										
										
										
											2017-10-16 16:29:09 +02:00
										 |  |  |         if 'delete_card' in request.POST: | 
					
						
							| 
									
										
										
										
											2017-10-21 00:02:35 +02:00
										 |  |  |             try: | 
					
						
							|  |  |  |                 card = UserCardDetail.objects.get(pk=self.kwargs.get('pk')) | 
					
						
							| 
									
										
										
										
											2018-07-07 01:50:46 +02:00
										 |  |  |                 if (request.user.has_perm(self.permission_required[0], card) | 
					
						
							|  |  |  |                         and | 
					
						
							|  |  |  |                         request.user | 
					
						
							|  |  |  |                                 .stripecustomer | 
					
						
							|  |  |  |                                 .usercarddetail_set | 
					
						
							| 
									
										
										
										
											2018-07-07 01:54:45 +02:00
										 |  |  |                                 .count() > 1): | 
					
						
							| 
									
										
										
										
											2017-10-21 13:27:35 +02:00
										 |  |  |                     if card.card_id is not None: | 
					
						
							|  |  |  |                         stripe_utils = StripeUtils() | 
					
						
							| 
									
										
										
										
											2017-10-21 20:37:50 +02:00
										 |  |  |                         stripe_utils.dissociate_customer_card( | 
					
						
							| 
									
										
										
										
											2017-10-21 13:27:35 +02:00
										 |  |  |                             request.user.stripecustomer.stripe_id, | 
					
						
							|  |  |  |                             card.card_id | 
					
						
							|  |  |  |                         ) | 
					
						
							| 
									
										
										
										
											2017-10-27 00:45:26 +02:00
										 |  |  |                         if card.preferred: | 
					
						
							| 
									
										
										
										
											2017-10-28 22:19:53 +02:00
										 |  |  |                             UserCardDetail.set_default_card_from_stripe( | 
					
						
							| 
									
										
										
										
											2017-10-27 00:45:26 +02:00
										 |  |  |                                 request.user.stripecustomer.stripe_id | 
					
						
							|  |  |  |                             ) | 
					
						
							| 
									
										
										
										
											2017-10-21 13:27:35 +02:00
										 |  |  |                         card.delete() | 
					
						
							| 
									
										
										
										
											2017-10-21 20:37:50 +02:00
										 |  |  |                         msg = _("Card deassociation successful") | 
					
						
							|  |  |  |                         messages.add_message(request, messages.SUCCESS, msg) | 
					
						
							| 
									
										
										
										
											2017-10-21 00:02:35 +02:00
										 |  |  |                 else: | 
					
						
							|  |  |  |                     msg = _("You are not permitted to do this operation") | 
					
						
							|  |  |  |                     messages.add_message(request, messages.ERROR, msg) | 
					
						
							|  |  |  |             except UserCardDetail.DoesNotExist: | 
					
						
							|  |  |  |                 msg = _("The selected card does not exist") | 
					
						
							|  |  |  |                 messages.add_message(request, messages.ERROR, msg) | 
					
						
							| 
									
										
										
										
											2017-10-16 16:29:09 +02:00
										 |  |  |             return HttpResponseRedirect(reverse_lazy('hosting:settings')) | 
					
						
							| 
									
										
										
										
											2017-08-29 17:42:35 +05:30
										 |  |  |         form = self.get_form() | 
					
						
							|  |  |  |         if form.is_valid(): | 
					
						
							| 
									
										
										
										
											2017-10-15 19:55:37 +02:00
										 |  |  |             if 'billing-form' in request.POST: | 
					
						
							|  |  |  |                 billing_address_data = form.cleaned_data | 
					
						
							|  |  |  |                 billing_address_data.update({ | 
					
						
							|  |  |  |                     'user': self.request.user.id | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |                 billing_address_user_form = UserBillingAddressForm( | 
					
						
							|  |  |  |                     instance=self.request.user.billing_addresses.first(), | 
					
						
							|  |  |  |                     data=billing_address_data) | 
					
						
							|  |  |  |                 billing_address_user_form.save() | 
					
						
							| 
									
										
										
										
											2017-10-21 20:58:54 +02:00
										 |  |  |                 msg = _("Billing address updated successfully") | 
					
						
							|  |  |  |                 messages.add_message(request, messages.SUCCESS, msg) | 
					
						
							| 
									
										
										
										
											2017-10-15 19:55:37 +02:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 token = form.cleaned_data.get('token') | 
					
						
							| 
									
										
										
										
											2017-10-15 23:37:01 +02:00
										 |  |  |                 stripe_utils = StripeUtils() | 
					
						
							|  |  |  |                 card_details = stripe_utils.get_cards_details_from_token( | 
					
						
							|  |  |  |                     token | 
					
						
							| 
									
										
										
										
											2017-10-15 19:55:37 +02:00
										 |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2017-10-15 23:37:01 +02:00
										 |  |  |                 if not card_details.get('response_object'): | 
					
						
							|  |  |  |                     form.add_error("__all__", card_details.get('error')) | 
					
						
							|  |  |  |                     return self.render_to_response(self.get_context_data()) | 
					
						
							|  |  |  |                 stripe_customer = StripeCustomer.get_or_create( | 
					
						
							|  |  |  |                     email=request.user.email, token=token | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2017-10-28 18:29:19 +02:00
										 |  |  |                 card = card_details['response_object'] | 
					
						
							| 
									
										
										
										
											2017-10-29 21:31:11 +01:00
										 |  |  |                 if UserCardDetail.get_user_card_details(stripe_customer, card): | 
					
						
							| 
									
										
										
										
											2017-10-21 20:37:50 +02:00
										 |  |  |                     msg = _('You seem to have already added this card') | 
					
						
							|  |  |  |                     messages.add_message(request, messages.ERROR, msg) | 
					
						
							| 
									
										
										
										
											2017-10-28 18:29:19 +02:00
										 |  |  |                 else: | 
					
						
							| 
									
										
										
										
											2017-10-29 14:45:14 +01:00
										 |  |  |                     acc_result = stripe_utils.associate_customer_card( | 
					
						
							|  |  |  |                         request.user.stripecustomer.stripe_id, token | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                     if acc_result['response_object'] is None: | 
					
						
							|  |  |  |                         msg = _( | 
					
						
							|  |  |  |                             'An error occurred while associating the card.' | 
					
						
							|  |  |  |                             ' Details: {details}'.format( | 
					
						
							|  |  |  |                                 details=acc_result['error'] | 
					
						
							|  |  |  |                             ) | 
					
						
							|  |  |  |                         ) | 
					
						
							|  |  |  |                         messages.add_message(request, messages.ERROR, msg) | 
					
						
							|  |  |  |                         return self.render_to_response(self.get_context_data()) | 
					
						
							| 
									
										
										
										
											2017-10-27 00:45:26 +02:00
										 |  |  |                     preferred = False | 
					
						
							|  |  |  |                     if stripe_customer.usercarddetail_set.count() == 0: | 
					
						
							|  |  |  |                         preferred = True | 
					
						
							| 
									
										
										
										
											2017-10-21 00:02:35 +02:00
										 |  |  |                     UserCardDetail.create( | 
					
						
							| 
									
										
										
										
											2017-10-15 23:37:01 +02:00
										 |  |  |                         stripe_customer=stripe_customer, | 
					
						
							| 
									
										
										
										
											2017-10-28 18:29:19 +02:00
										 |  |  |                         last4=card['last4'], | 
					
						
							|  |  |  |                         brand=card['brand'], | 
					
						
							|  |  |  |                         fingerprint=card['fingerprint'], | 
					
						
							|  |  |  |                         exp_month=card['exp_month'], | 
					
						
							|  |  |  |                         exp_year=card['exp_year'], | 
					
						
							|  |  |  |                         card_id=card['card_id'], | 
					
						
							| 
									
										
										
										
											2017-10-27 00:45:26 +02:00
										 |  |  |                         preferred=preferred | 
					
						
							| 
									
										
										
										
											2017-10-15 19:55:37 +02:00
										 |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2017-10-21 17:02:24 +02:00
										 |  |  |                     msg = _( | 
					
						
							|  |  |  |                         "Successfully associated the card with your account" | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                     messages.add_message(request, messages.SUCCESS, msg) | 
					
						
							| 
									
										
										
										
											2017-08-29 17:42:35 +05:30
										 |  |  |             return self.render_to_response(self.get_context_data()) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             billing_address_data = form.cleaned_data | 
					
						
							|  |  |  |             return self.form_invalid(form) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-24 22:11:15 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-12 01:57:34 -05:00
										 |  |  | class PaymentVMView(LoginRequiredMixin, FormView): | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |     template_name = 'hosting/payment.html' | 
					
						
							| 
									
										
										
										
											2016-05-12 01:57:34 -05:00
										 |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							| 
									
										
										
										
											2016-04-23 02:22:44 -05:00
										 |  |  |     form_class = BillingAddressForm | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-11 00:11:33 -05:00
										 |  |  |     def get_form_kwargs(self): | 
					
						
							|  |  |  |         current_billing_address = self.request.user.billing_addresses.first() | 
					
						
							|  |  |  |         form_kwargs = super(PaymentVMView, self).get_form_kwargs() | 
					
						
							|  |  |  |         if not current_billing_address: | 
					
						
							|  |  |  |             return form_kwargs | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         form_kwargs.update({ | 
					
						
							|  |  |  |             'initial': { | 
					
						
							| 
									
										
										
										
											2017-07-16 22:33:52 +05:30
										 |  |  |                 'cardholder_name': current_billing_address.cardholder_name, | 
					
						
							| 
									
										
										
										
											2017-05-11 00:11:33 -05:00
										 |  |  |                 'street_address': current_billing_address.street_address, | 
					
						
							|  |  |  |                 'city': current_billing_address.city, | 
					
						
							|  |  |  |                 'postal_code': current_billing_address.postal_code, | 
					
						
							|  |  |  |                 'country': current_billing_address.country, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         return form_kwargs | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |     def get_context_data(self, **kwargs): | 
					
						
							|  |  |  |         context = super(PaymentVMView, self).get_context_data(**kwargs) | 
					
						
							| 
									
										
										
										
											2017-05-11 00:11:33 -05:00
										 |  |  |         # Get user | 
					
						
							|  |  |  |         user = self.request.user | 
					
						
							| 
									
										
										
										
											2017-10-26 15:00:54 +02:00
										 |  |  |         if hasattr(user, 'stripecustomer'): | 
					
						
							|  |  |  |             stripe_customer = user.stripecustomer | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             stripe_customer = None | 
					
						
							| 
									
										
										
										
											2017-10-21 23:14:55 +02:00
										 |  |  |         cards_list = UserCardDetail.get_all_cards_list( | 
					
						
							| 
									
										
										
										
											2017-10-26 15:00:54 +02:00
										 |  |  |             stripe_customer=stripe_customer | 
					
						
							| 
									
										
										
										
											2017-10-21 23:14:55 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |         context.update({ | 
					
						
							| 
									
										
										
										
											2018-05-07 05:07:58 +05:30
										 |  |  |             'stripe_key': settings.STRIPE_API_PUBLIC_KEY, | 
					
						
							|  |  |  |             'vm_pricing': VMPricing.get_vm_pricing_by_name( | 
					
						
							| 
									
										
										
										
											2018-05-07 09:14:31 +05:30
										 |  |  |                 self.request.session.get('specs', {}).get('pricing_name') | 
					
						
							| 
									
										
										
										
											2018-05-07 06:11:44 +05:30
										 |  |  |             ), | 
					
						
							| 
									
										
										
										
											2017-10-21 23:14:55 +02:00
										 |  |  |             'cards_list': cards_list, | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2016-05-25 01:23:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |         return context | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2017-05-24 10:58:16 -05:00
										 |  |  |         if 'next' in request.session: | 
					
						
							|  |  |  |             del request.session['next'] | 
					
						
							| 
									
										
										
										
											2017-10-29 23:48:33 +01:00
										 |  |  |         HostingUtils.clear_items_from_list( | 
					
						
							|  |  |  |             request.session, | 
					
						
							|  |  |  |             ['token', 'card_id', 'customer', 'user'] | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |         return self.render_to_response(self.get_context_data()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2016-04-23 02:22:44 -05:00
										 |  |  |     def post(self, request, *args, **kwargs): | 
					
						
							|  |  |  |         form = self.get_form() | 
					
						
							|  |  |  |         if form.is_valid(): | 
					
						
							| 
									
										
										
										
											2017-05-11 00:11:33 -05:00
										 |  |  |             # Get billing address data | 
					
						
							|  |  |  |             billing_address_data = form.cleaned_data | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  |             token = form.cleaned_data.get('token') | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |             owner = self.request.user | 
					
						
							| 
									
										
										
										
											2017-10-27 00:45:26 +02:00
										 |  |  |             if token is '': | 
					
						
							|  |  |  |                 card_id = form.cleaned_data.get('card') | 
					
						
							|  |  |  |                 customer = owner.stripecustomer | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     user_card_detail = UserCardDetail.objects.get(id=card_id) | 
					
						
							| 
									
										
										
										
											2017-10-28 15:30:42 +02:00
										 |  |  |                     if not request.user.has_perm( | 
					
						
							|  |  |  |                             'view_usercarddetail', user_card_detail | 
					
						
							|  |  |  |                     ): | 
					
						
							| 
									
										
										
										
											2017-10-27 00:45:26 +02:00
										 |  |  |                         raise UserCardDetail.DoesNotExist( | 
					
						
							|  |  |  |                             _("{user} does not have permission to access the " | 
					
						
							|  |  |  |                               "card").format(user=request.user.email) | 
					
						
							|  |  |  |                         ) | 
					
						
							|  |  |  |                 except UserCardDetail.DoesNotExist as e: | 
					
						
							|  |  |  |                     ex = str(e) | 
					
						
							|  |  |  |                     logger.error("Card Id: {card_id}, Exception: {ex}".format( | 
					
						
							|  |  |  |                             card_id=card_id, ex=ex | 
					
						
							|  |  |  |                         ) | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                     msg = _("An error occurred. Details: {}".format(ex)) | 
					
						
							|  |  |  |                     messages.add_message( | 
					
						
							|  |  |  |                         self.request, messages.ERROR, msg, | 
					
						
							|  |  |  |                         extra_tags='make_charge_error' | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                     return HttpResponseRedirect( | 
					
						
							|  |  |  |                         reverse('hosting:payment') + '#payment_error' | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2017-10-28 15:30:42 +02:00
										 |  |  |                 request.session['card_id'] = user_card_detail.id | 
					
						
							| 
									
										
										
										
											2017-10-27 00:45:26 +02:00
										 |  |  |             else: | 
					
						
							|  |  |  |                 # Get or create stripe customer | 
					
						
							|  |  |  |                 customer = StripeCustomer.get_or_create( | 
					
						
							|  |  |  |                     email=owner.email, token=token | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 if not customer: | 
					
						
							|  |  |  |                     msg = _("Invalid credit card") | 
					
						
							|  |  |  |                     messages.add_message( | 
					
						
							|  |  |  |                         self.request, messages.ERROR, msg, | 
					
						
							|  |  |  |                         extra_tags='make_charge_error') | 
					
						
							|  |  |  |                     return HttpResponseRedirect( | 
					
						
							|  |  |  |                         reverse('hosting:payment') + '#payment_error') | 
					
						
							| 
									
										
										
										
											2017-10-28 15:30:42 +02:00
										 |  |  |                 request.session['token'] = token | 
					
						
							| 
									
										
										
										
											2017-09-06 13:25:18 +05:30
										 |  |  |             request.session['billing_address_data'] = billing_address_data | 
					
						
							| 
									
										
										
										
											2017-09-10 12:22:32 +05:30
										 |  |  |             return HttpResponseRedirect("{url}?{query_params}".format( | 
					
						
							|  |  |  |                 url=reverse('hosting:order-confirmation'), | 
					
						
							| 
									
										
										
										
											2017-10-26 17:57:11 +02:00
										 |  |  |                 query_params='page=payment') | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2016-04-23 02:22:44 -05:00
										 |  |  |         else: | 
					
						
							|  |  |  |             return self.form_invalid(form) | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-30 13:55:55 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-25 15:10:34 +01:00
										 |  |  | class OrdersHostingDetailView(LoginRequiredMixin, DetailView): | 
					
						
							| 
									
										
										
										
											2016-05-03 00:59:40 -05:00
										 |  |  |     template_name = "hosting/order_detail.html" | 
					
						
							| 
									
										
										
										
											2016-05-14 02:12:42 -04:30
										 |  |  |     context_object_name = "order" | 
					
						
							| 
									
										
										
										
											2016-04-29 01:53:24 -05:00
										 |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							| 
									
										
										
										
											2016-07-10 22:08:51 -05:00
										 |  |  |     permission_required = ['view_hostingorder'] | 
					
						
							| 
									
										
										
										
											2016-05-03 00:59:40 -05:00
										 |  |  |     model = HostingOrder | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-12 09:38:08 +01:00
										 |  |  |     def get_object(self, queryset=None): | 
					
						
							| 
									
										
										
										
											2017-12-12 12:14:39 +01:00
										 |  |  |         order_id = self.kwargs.get('pk') | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             hosting_order_obj = HostingOrder.objects.get(pk=order_id) | 
					
						
							|  |  |  |             logger.debug("Found HostingOrder for id {order_id}".format( | 
					
						
							|  |  |  |                 order_id=order_id | 
					
						
							|  |  |  |             )) | 
					
						
							| 
									
										
										
										
											2017-12-12 09:38:08 +01:00
										 |  |  |         except HostingOrder.DoesNotExist: | 
					
						
							| 
									
										
										
										
											2017-12-12 12:14:39 +01:00
										 |  |  |             logger.debug("HostingOrder not found for id {order_id}".format( | 
					
						
							|  |  |  |                 order_id=order_id | 
					
						
							|  |  |  |             )) | 
					
						
							| 
									
										
										
										
											2017-12-12 09:38:08 +01:00
										 |  |  |             hosting_order_obj = None | 
					
						
							|  |  |  |         return hosting_order_obj | 
					
						
							| 
									
										
										
										
											2017-09-09 13:27:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |     def get_context_data(self, **kwargs): | 
					
						
							|  |  |  |         # Get context | 
					
						
							| 
									
										
										
										
											2017-12-12 09:53:14 +01:00
										 |  |  |         context = super( | 
					
						
							|  |  |  |             OrdersHostingDetailView, self | 
					
						
							|  |  |  |         ).get_context_data(**kwargs) | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |         obj = self.get_object() | 
					
						
							|  |  |  |         owner = self.request.user | 
					
						
							| 
									
										
										
										
											2017-09-06 23:52:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-21 16:38:54 +05:30
										 |  |  |         if self.request.GET.get('page') == 'payment': | 
					
						
							| 
									
										
										
										
											2017-07-30 20:41:11 +05:30
										 |  |  |             context['page_header_text'] = _('Confirm Order') | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             context['page_header_text'] = _('Invoice') | 
					
						
							| 
									
										
										
										
											2017-12-12 15:43:25 +01:00
										 |  |  |             if not self.request.user.has_perm( | 
					
						
							|  |  |  |                     self.permission_required[0], obj | 
					
						
							|  |  |  |             ): | 
					
						
							|  |  |  |                 logger.debug( | 
					
						
							|  |  |  |                     "User {user} does not have permission on HostingOrder " | 
					
						
							|  |  |  |                     "{order_id}. Raising 404 error now.".format( | 
					
						
							|  |  |  |                         user=self.request.user.email, | 
					
						
							|  |  |  |                         order_id=obj.id if obj else 'None' | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 raise Http404 | 
					
						
							| 
									
										
										
										
											2017-09-06 23:52:02 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 13:27:17 +02:00
										 |  |  |         if obj is not None: | 
					
						
							| 
									
										
										
										
											2017-09-21 17:22:02 +05:30
										 |  |  |             # invoice for previous order | 
					
						
							| 
									
										
										
										
											2017-09-06 23:52:02 +02:00
										 |  |  |             try: | 
					
						
							| 
									
										
										
										
											2017-09-25 01:49:00 +05:30
										 |  |  |                 vm_detail = VMDetail.objects.get(vm_id=obj.vm_id) | 
					
						
							|  |  |  |                 context['vm'] = vm_detail.__dict__ | 
					
						
							| 
									
										
										
										
											2017-09-29 08:50:03 +02:00
										 |  |  |                 context['vm']['name'] = '{}-{}'.format( | 
					
						
							|  |  |  |                     context['vm']['configuration'], context['vm']['vm_id']) | 
					
						
							| 
									
										
										
										
											2018-05-07 06:11:44 +05:30
										 |  |  |                 price, vat, vat_percent, discount = get_vm_price_with_vat( | 
					
						
							| 
									
										
										
										
											2017-10-02 23:17:37 +02:00
										 |  |  |                     cpu=context['vm']['cores'], | 
					
						
							| 
									
										
										
										
											2018-04-16 03:27:54 +02:00
										 |  |  |                     ssd_size=context['vm']['disk_size'], | 
					
						
							|  |  |  |                     memory=context['vm']['memory'], | 
					
						
							| 
									
										
										
										
											2018-04-16 04:00:48 +02:00
										 |  |  |                     pricing_name=(obj.vm_pricing.name | 
					
						
							|  |  |  |                                   if obj.vm_pricing else 'default') | 
					
						
							| 
									
										
										
										
											2017-10-02 23:17:37 +02:00
										 |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2018-04-16 04:39:21 +02:00
										 |  |  |                 context['vm']['vat'] = vat | 
					
						
							| 
									
										
										
										
											2018-04-17 22:23:46 +02:00
										 |  |  |                 context['vm']['price'] = price | 
					
						
							| 
									
										
										
										
											2018-05-07 06:11:44 +05:30
										 |  |  |                 context['vm']['discount'] = discount | 
					
						
							| 
									
										
										
										
											2018-04-17 22:23:46 +02:00
										 |  |  |                 context['vm']['vat_percent'] = vat_percent | 
					
						
							| 
									
										
										
										
											2018-05-07 06:29:53 +05:30
										 |  |  |                 context['vm']['total_price'] = price + vat - discount['amount'] | 
					
						
							| 
									
										
										
										
											2017-09-30 17:55:49 +05:30
										 |  |  |                 context['subscription_end_date'] = vm_detail.end_date() | 
					
						
							| 
									
										
										
										
											2017-09-25 01:49:00 +05:30
										 |  |  |             except VMDetail.DoesNotExist: | 
					
						
							|  |  |  |                 try: | 
					
						
							|  |  |  |                     manager = OpenNebulaManager( | 
					
						
							|  |  |  |                         email=owner.email, password=owner.password | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                     vm = manager.get_vm(obj.vm_id) | 
					
						
							|  |  |  |                     context['vm'] = VirtualMachineSerializer(vm).data | 
					
						
							| 
									
										
										
										
											2018-05-07 06:11:44 +05:30
										 |  |  |                     price, vat, vat_percent, discount = get_vm_price_with_vat( | 
					
						
							| 
									
										
										
										
											2018-04-16 04:46:43 +02:00
										 |  |  |                         cpu=context['vm']['cores'], | 
					
						
							|  |  |  |                         ssd_size=context['vm']['disk_size'], | 
					
						
							|  |  |  |                         memory=context['vm']['memory'], | 
					
						
							|  |  |  |                         pricing_name=(obj.vm_pricing.name | 
					
						
							|  |  |  |                                       if obj.vm_pricing else 'default') | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                     context['vm']['vat'] = vat | 
					
						
							| 
									
										
										
										
											2018-04-17 22:23:46 +02:00
										 |  |  |                     context['vm']['price'] = price | 
					
						
							| 
									
										
										
										
											2018-05-07 06:11:44 +05:30
										 |  |  |                     context['vm']['discount'] = discount | 
					
						
							| 
									
										
										
										
											2018-04-17 22:23:46 +02:00
										 |  |  |                     context['vm']['vat_percent'] = vat_percent | 
					
						
							| 
									
										
										
										
											2018-06-12 11:13:10 +02:00
										 |  |  |                     context['vm']['total_price'] = ( | 
					
						
							|  |  |  |                             price + vat - discount['amount'] | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2017-09-25 01:49:00 +05:30
										 |  |  |                 except WrongIdError: | 
					
						
							|  |  |  |                     messages.error( | 
					
						
							|  |  |  |                         self.request, | 
					
						
							|  |  |  |                         _('The VM you are looking for is unavailable at the ' | 
					
						
							|  |  |  |                           'moment. Please contact Data Center Light support.') | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                     self.kwargs['error'] = 'WrongIdError' | 
					
						
							|  |  |  |                     context['error'] = 'WrongIdError' | 
					
						
							|  |  |  |                 except ConnectionRefusedError: | 
					
						
							|  |  |  |                     messages.error( | 
					
						
							|  |  |  |                         self.request, | 
					
						
							|  |  |  |                         _('In order to create a VM, you need to create/upload ' | 
					
						
							|  |  |  |                           'your SSH KEY first.') | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2017-09-06 23:52:02 +02:00
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2017-09-21 17:22:02 +05:30
										 |  |  |             # new order, confirm payment | 
					
						
							| 
									
										
										
										
											2017-10-28 15:30:42 +02:00
										 |  |  |             if 'token' in self.request.session: | 
					
						
							|  |  |  |                 token = self.request.session['token'] | 
					
						
							|  |  |  |                 stripe_utils = StripeUtils() | 
					
						
							|  |  |  |                 card_details = stripe_utils.get_cards_details_from_token( | 
					
						
							|  |  |  |                     token | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |                 if not card_details.get('response_object'): | 
					
						
							|  |  |  |                     return HttpResponseRedirect(reverse('hosting:payment')) | 
					
						
							|  |  |  |                 card_details_response = card_details['response_object'] | 
					
						
							|  |  |  |                 context['cc_last4'] = card_details_response['last4'] | 
					
						
							|  |  |  |                 context['cc_brand'] = card_details_response['brand'] | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 card_id = self.request.session.get('card_id') | 
					
						
							|  |  |  |                 card_detail = UserCardDetail.objects.get(id=card_id) | 
					
						
							|  |  |  |                 context['cc_last4'] = card_detail.last4 | 
					
						
							|  |  |  |                 context['cc_brand'] = card_detail.brand | 
					
						
							| 
									
										
										
										
											2017-09-06 23:52:02 +02:00
										 |  |  |             context['site_url'] = reverse('hosting:create_virtual_machine') | 
					
						
							| 
									
										
										
										
											2017-09-21 15:14:15 +05:30
										 |  |  |             context['vm'] = self.request.session.get('specs') | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |         return context | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-09-21 16:38:54 +05:30
										 |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2017-09-21 19:32:22 +05:30
										 |  |  |         if not self.kwargs.get('pk'): | 
					
						
							|  |  |  |             if 'specs' not in self.request.session: | 
					
						
							|  |  |  |                 return HttpResponseRedirect( | 
					
						
							|  |  |  |                     reverse('hosting:create_virtual_machine') | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2018-06-12 11:14:36 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             if ('token' not in self.request.session and | 
					
						
							|  |  |  |                     'card_id' not in self.request.session): | 
					
						
							| 
									
										
										
										
											2017-09-21 19:32:22 +05:30
										 |  |  |                 return HttpResponseRedirect(reverse('hosting:payment')) | 
					
						
							| 
									
										
										
										
											2017-09-21 16:38:54 +05:30
										 |  |  |         self.object = self.get_object() | 
					
						
							|  |  |  |         context = self.get_context_data(object=self.object) | 
					
						
							|  |  |  |         if 'failed_payment' in context: | 
					
						
							|  |  |  |             msg = context['card_details'].get('error') | 
					
						
							|  |  |  |             messages.add_message( | 
					
						
							|  |  |  |                 self.request, messages.ERROR, msg, | 
					
						
							|  |  |  |                 extra_tags='failed_payment' | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             return HttpResponseRedirect( | 
					
						
							|  |  |  |                 reverse('hosting:payment') + '#payment_error' | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         return self.render_to_response(context) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  |     def post(self, request): | 
					
						
							|  |  |  |         template = request.session.get('template') | 
					
						
							|  |  |  |         specs = request.session.get('specs') | 
					
						
							| 
									
										
										
										
											2017-10-28 15:30:42 +02:00
										 |  |  |         stripe_utils = StripeUtils() | 
					
						
							| 
									
										
										
										
											2017-10-03 21:35:08 +05:30
										 |  |  |         # We assume that if the user is here, his/her StripeCustomer | 
					
						
							|  |  |  |         # object already exists | 
					
						
							|  |  |  |         stripe_customer_id = request.user.stripecustomer.id | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  |         billing_address_data = request.session.get('billing_address_data') | 
					
						
							|  |  |  |         vm_template_id = template.get('id', 1) | 
					
						
							| 
									
										
										
										
											2017-10-26 17:57:11 +02:00
										 |  |  |         stripe_api_cus_id = request.user.stripecustomer.stripe_id | 
					
						
							| 
									
										
										
										
											2017-10-28 15:30:42 +02:00
										 |  |  |         if 'token' in self.request.session: | 
					
						
							|  |  |  |             card_details = stripe_utils.get_cards_details_from_token( | 
					
						
							|  |  |  |                 request.session['token'] | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             if not card_details.get('response_object'): | 
					
						
							|  |  |  |                 return HttpResponseRedirect(reverse('hosting:payment')) | 
					
						
							|  |  |  |             card_details_response = card_details['response_object'] | 
					
						
							|  |  |  |             card_details_dict = { | 
					
						
							|  |  |  |                 'last4': card_details_response['last4'], | 
					
						
							| 
									
										
										
										
											2017-10-29 14:45:14 +01:00
										 |  |  |                 'brand': card_details_response['brand'], | 
					
						
							|  |  |  |                 'card_id': card_details_response['card_id'] | 
					
						
							| 
									
										
										
										
											2017-10-28 15:30:42 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-10-29 21:31:11 +01:00
										 |  |  |             ucd = UserCardDetail.get_user_card_details( | 
					
						
							| 
									
										
										
										
											2017-10-28 18:29:19 +02:00
										 |  |  |                 request.user.stripecustomer, card_details_response | 
					
						
							| 
									
										
										
										
											2017-10-28 15:30:42 +02:00
										 |  |  |             ) | 
					
						
							| 
									
										
										
										
											2017-10-28 18:29:19 +02:00
										 |  |  |             if not ucd: | 
					
						
							| 
									
										
										
										
											2017-10-29 14:45:14 +01:00
										 |  |  |                 acc_result = stripe_utils.associate_customer_card( | 
					
						
							| 
									
										
										
										
											2017-10-28 18:29:19 +02:00
										 |  |  |                     stripe_api_cus_id, request.session['token'], | 
					
						
							|  |  |  |                     set_as_default=True | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2017-10-29 14:45:14 +01:00
										 |  |  |                 if acc_result['response_object'] is None: | 
					
						
							|  |  |  |                     msg = _( | 
					
						
							|  |  |  |                         'An error occurred while associating the card.' | 
					
						
							|  |  |  |                         ' Details: {details}'.format( | 
					
						
							|  |  |  |                             details=acc_result['error'] | 
					
						
							|  |  |  |                         ) | 
					
						
							|  |  |  |                     ) | 
					
						
							|  |  |  |                     messages.add_message(self.request, messages.ERROR, msg, | 
					
						
							|  |  |  |                                          extra_tags='failed_payment') | 
					
						
							|  |  |  |                     response = { | 
					
						
							|  |  |  |                         'status': False, | 
					
						
							|  |  |  |                         'redirect': "{url}#{section}".format( | 
					
						
							|  |  |  |                             url=reverse('hosting:payment'), | 
					
						
							|  |  |  |                             section='payment_error'), | 
					
						
							|  |  |  |                         'msg_title': str(_('Error.')), | 
					
						
							|  |  |  |                         'msg_body': str( | 
					
						
							|  |  |  |                             _('There was a payment related error.' | 
					
						
							|  |  |  |                               ' On close of this popup, you will be redirected' | 
					
						
							|  |  |  |                               ' back to the payment page.') | 
					
						
							|  |  |  |                         ) | 
					
						
							|  |  |  |                     } | 
					
						
							| 
									
										
										
										
											2018-07-03 21:52:44 +02:00
										 |  |  |                     return JsonResponse(response) | 
					
						
							| 
									
										
										
										
											2017-10-28 15:30:42 +02:00
										 |  |  |         else: | 
					
						
							|  |  |  |             card_id = request.session.get('card_id') | 
					
						
							|  |  |  |             user_card_detail = UserCardDetail.objects.get(id=card_id) | 
					
						
							|  |  |  |             card_details_dict = { | 
					
						
							|  |  |  |                 'last4': user_card_detail.last4, | 
					
						
							| 
									
										
										
										
											2017-10-29 14:45:14 +01:00
										 |  |  |                 'brand': user_card_detail.brand, | 
					
						
							|  |  |  |                 'card_id': user_card_detail.card_id | 
					
						
							| 
									
										
										
										
											2017-10-28 15:30:42 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |             if not user_card_detail.preferred: | 
					
						
							| 
									
										
										
										
											2017-10-28 22:19:53 +02:00
										 |  |  |                 UserCardDetail.set_default_card( | 
					
						
							| 
									
										
										
										
											2017-10-28 15:30:42 +02:00
										 |  |  |                     stripe_api_cus_id=stripe_api_cus_id, | 
					
						
							|  |  |  |                     stripe_source_id=user_card_detail.card_id | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  |         cpu = specs.get('cpu') | 
					
						
							|  |  |  |         memory = specs.get('memory') | 
					
						
							|  |  |  |         disk_size = specs.get('disk_size') | 
					
						
							| 
									
										
										
										
											2018-04-25 16:08:05 +05:30
										 |  |  |         amount_to_be_charged = specs.get('total_price') | 
					
						
							| 
									
										
										
										
											2018-09-05 23:26:51 +02:00
										 |  |  |         plan_name = StripeUtils.get_stripe_plan_name( | 
					
						
							|  |  |  |             cpu=cpu, | 
					
						
							|  |  |  |             memory=memory, | 
					
						
							|  |  |  |             disk_size=disk_size, | 
					
						
							|  |  |  |             price=amount_to_be_charged | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         stripe_plan_id = StripeUtils.get_stripe_plan_id( | 
					
						
							|  |  |  |             cpu=cpu, | 
					
						
							|  |  |  |             ram=memory, | 
					
						
							|  |  |  |             ssd=disk_size, | 
					
						
							|  |  |  |             version=1, | 
					
						
							|  |  |  |             app='dcl', | 
					
						
							|  |  |  |             price=amount_to_be_charged | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  |         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( | 
					
						
							| 
									
										
										
										
											2017-10-03 21:24:35 +05:30
										 |  |  |             stripe_api_cus_id, | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  |             [{"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 | 
					
						
							| 
									
										
										
										
											2017-09-29 08:50:03 +02:00
										 |  |  |         if (stripe_subscription_obj is None or | 
					
						
							| 
									
										
										
										
											2017-10-03 00:26:50 +02:00
										 |  |  |                 stripe_subscription_obj.status != 'active'): | 
					
						
							| 
									
										
										
										
											2018-06-12 08:13:48 +02:00
										 |  |  |             # At this point, we have created a Stripe API card and | 
					
						
							| 
									
										
										
										
											2017-10-29 14:45:14 +01:00
										 |  |  |             # associated it with the customer; but the transaction failed | 
					
						
							| 
									
										
										
										
											2018-07-07 02:03:42 +02:00
										 |  |  |             # due to some reason. So, we would want to dissociate this card | 
					
						
							|  |  |  |             # here. | 
					
						
							|  |  |  |             # ... | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  |             msg = subscription_result.get('error') | 
					
						
							|  |  |  |             messages.add_message(self.request, messages.ERROR, msg, | 
					
						
							|  |  |  |                                  extra_tags='failed_payment') | 
					
						
							| 
									
										
										
										
											2017-09-30 01:02:59 +02:00
										 |  |  |             response = { | 
					
						
							|  |  |  |                 'status': False, | 
					
						
							|  |  |  |                 'redirect': "{url}#{section}".format( | 
					
						
							|  |  |  |                     url=reverse('hosting:payment'), | 
					
						
							|  |  |  |                     section='payment_error'), | 
					
						
							|  |  |  |                 'msg_title': str(_('Error.')), | 
					
						
							|  |  |  |                 'msg_body': str( | 
					
						
							|  |  |  |                     _('There was a payment related error.' | 
					
						
							|  |  |  |                       ' On close of this popup, you will be redirected back to' | 
					
						
							| 
									
										
										
										
											2017-10-26 17:57:11 +02:00
										 |  |  |                       ' the payment page.') | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2017-09-30 01:02:59 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  |             return JsonResponse(response) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-10-28 15:30:42 +02:00
										 |  |  |         if 'token' in request.session: | 
					
						
							| 
									
										
										
										
											2017-10-28 16:48:03 +02:00
										 |  |  |             ucd = UserCardDetail.get_or_create_user_card_detail( | 
					
						
							| 
									
										
										
										
											2017-10-28 15:30:42 +02:00
										 |  |  |                 stripe_customer=self.request.user.stripecustomer, | 
					
						
							|  |  |  |                 card_details=card_details_response | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2017-10-28 22:19:53 +02:00
										 |  |  |             UserCardDetail.save_default_card_local( | 
					
						
							| 
									
										
										
										
											2017-10-28 16:48:03 +02:00
										 |  |  |                 self.request.user.stripecustomer.stripe_id, | 
					
						
							| 
									
										
										
										
											2017-10-28 18:29:19 +02:00
										 |  |  |                 ucd.card_id | 
					
						
							| 
									
										
										
										
											2017-10-28 16:48:03 +02:00
										 |  |  |             ) | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  |         user = { | 
					
						
							|  |  |  |             'name': self.request.user.name, | 
					
						
							| 
									
										
										
										
											2017-09-09 20:46:43 +05:30
										 |  |  |             'email': self.request.user.email, | 
					
						
							| 
									
										
										
										
											2017-09-16 19:30:31 +05:30
										 |  |  |             'pass': self.request.user.password, | 
					
						
							|  |  |  |             'request_scheme': request.scheme, | 
					
						
							|  |  |  |             'request_host': request.get_host(), | 
					
						
							| 
									
										
										
										
											2017-09-16 20:55:37 +05:30
										 |  |  |             'language': get_language(), | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-09-09 13:27:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  |         create_vm( | 
					
						
							|  |  |  |             billing_address_data, stripe_customer_id, specs, | 
					
						
							|  |  |  |             stripe_subscription_obj, card_details_dict, request, | 
					
						
							|  |  |  |             vm_template_id, template, user | 
					
						
							| 
									
										
										
										
											2018-04-18 23:50:52 +02:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2017-09-15 17:34:23 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         response = { | 
					
						
							|  |  |  |             'status': True, | 
					
						
							|  |  |  |             'redirect': reverse('hosting:virtual_machines'), | 
					
						
							| 
									
										
										
										
											2017-09-16 17:54:05 +05:30
										 |  |  |             'msg_title': str(_('Thank you for the order.')), | 
					
						
							| 
									
										
										
										
											2017-09-24 09:34:30 +02:00
										 |  |  |             'msg_body': str( | 
					
						
							|  |  |  |                 _('Your VM will be up and running in a few moments.' | 
					
						
							|  |  |  |                   ' We will send you a confirmation email as soon as' | 
					
						
							|  |  |  |                   ' it is ready.')) | 
					
						
							| 
									
										
										
										
											2017-09-15 17:34:23 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  |         return JsonResponse(response) | 
					
						
							| 
									
										
										
										
											2017-09-09 12:06:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-11 00:11:33 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-03 00:59:40 -05:00
										 |  |  | class OrdersHostingListView(LoginRequiredMixin, ListView): | 
					
						
							| 
									
										
										
										
											2016-04-29 01:53:24 -05:00
										 |  |  |     template_name = "hosting/orders.html" | 
					
						
							|  |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							| 
									
										
										
										
											2016-05-03 00:59:40 -05:00
										 |  |  |     context_object_name = "orders" | 
					
						
							|  |  |  |     model = HostingOrder | 
					
						
							|  |  |  |     paginate_by = 10 | 
					
						
							| 
									
										
										
										
											2016-05-14 02:12:42 -04:30
										 |  |  |     ordering = '-id' | 
					
						
							| 
									
										
										
										
											2016-04-29 01:53:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-03 00:59:40 -05:00
										 |  |  |     def get_queryset(self): | 
					
						
							| 
									
										
										
										
											2016-04-29 01:53:24 -05:00
										 |  |  |         user = self.request.user | 
					
						
							| 
									
										
										
										
											2016-05-03 00:59:40 -05:00
										 |  |  |         self.queryset = HostingOrder.objects.filter(customer__user=user) | 
					
						
							|  |  |  |         return super(OrdersHostingListView, self).get_queryset() | 
					
						
							| 
									
										
										
										
											2016-04-29 01:53:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-12-27 09:09:54 +01:00
										 |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							|  |  |  |         return super(OrdersHostingListView, self).get(request, *args, **kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-24 01:19:49 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | class OrdersHostingDeleteView(LoginRequiredMixin, DeleteView): | 
					
						
							| 
									
										
										
										
											2016-05-29 13:37:43 -05:00
										 |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							| 
									
										
										
										
											2016-05-19 00:58:28 +02:00
										 |  |  |     success_url = reverse_lazy('hosting:orders') | 
					
						
							|  |  |  |     model = HostingOrder | 
					
						
							| 
									
										
										
										
											2016-04-29 01:53:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-29 13:37:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-03 00:59:40 -05:00
										 |  |  | class VirtualMachinesPlanListView(LoginRequiredMixin, ListView): | 
					
						
							|  |  |  |     template_name = "hosting/virtual_machines.html" | 
					
						
							|  |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							|  |  |  |     context_object_name = "vms" | 
					
						
							|  |  |  |     paginate_by = 10 | 
					
						
							| 
									
										
										
										
											2016-05-14 02:12:42 -04:30
										 |  |  |     ordering = '-id' | 
					
						
							| 
									
										
										
										
											2016-04-29 01:53:24 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-03 00:59:40 -05:00
										 |  |  |     def get_queryset(self): | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |         owner = self.request.user | 
					
						
							|  |  |  |         manager = OpenNebulaManager(email=owner.email, | 
					
						
							| 
									
										
										
										
											2017-05-13 05:50:56 +02:00
										 |  |  |                                     password=owner.password) | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |         try: | 
					
						
							|  |  |  |             queryset = manager.get_vms() | 
					
						
							|  |  |  |             serializer = VirtualMachineSerializer(queryset, many=True) | 
					
						
							|  |  |  |             return serializer.data | 
					
						
							|  |  |  |         except ConnectionRefusedError: | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |             messages.error(self.request, | 
					
						
							|  |  |  |                            'We could not load your VMs due to a backend connection \
 | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |                 error. Please try again in a few minutes' | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |                            ) | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |             self.kwargs['error'] = 'connection' | 
					
						
							|  |  |  |             return [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_context_data(self, **kwargs): | 
					
						
							|  |  |  |         error = self.kwargs.get('error') | 
					
						
							|  |  |  |         if error is not None: | 
					
						
							|  |  |  |             print(error) | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |             context = {'error': 'connection'} | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |         else: | 
					
						
							|  |  |  |             context = super(ListView, self).get_context_data(**kwargs) | 
					
						
							| 
									
										
										
										
											2017-09-24 01:08:15 +05:30
										 |  |  |             if UserHostingKey.objects.filter(user=self.request.user).exists(): | 
					
						
							|  |  |  |                 context['show_create_ssh_key_msg'] = False | 
					
						
							|  |  |  |             else: | 
					
						
							|  |  |  |                 context['show_create_ssh_key_msg'] = True | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |         return context | 
					
						
							| 
									
										
										
										
											2016-05-04 00:16:41 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-03 23:19:32 -05:00
										 |  |  | class CreateVirtualMachinesView(LoginRequiredMixin, View): | 
					
						
							|  |  |  |     template_name = "hosting/create_virtual_machine.html" | 
					
						
							|  |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  |     def validate_cores(self, value): | 
					
						
							|  |  |  |         if (value > 48) or (value < 1): | 
					
						
							|  |  |  |             raise ValidationError(_('Invalid number of cores')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def validate_memory(self, value): | 
					
						
							| 
									
										
										
										
											2017-12-21 01:25:52 +01:00
										 |  |  |         if (value > 200) or (value < 1): | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  |             raise ValidationError(_('Invalid RAM size')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def validate_storage(self, value): | 
					
						
							|  |  |  |         if (value > 2000) or (value < 10): | 
					
						
							|  |  |  |             raise ValidationError(_('Invalid storage size')) | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2018-04-25 14:52:25 +05:30
										 |  |  |         context = { | 
					
						
							|  |  |  |             'templates': VMTemplate.objects.all(), | 
					
						
							|  |  |  |             'cms_integration': get_cms_integration('default'), | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  |         return render(request, self.template_name, context) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  |     def post(self, request): | 
					
						
							|  |  |  |         cores = request.POST.get('cpu') | 
					
						
							|  |  |  |         cores_field = forms.IntegerField(validators=[self.validate_cores]) | 
					
						
							|  |  |  |         memory = request.POST.get('ram') | 
					
						
							|  |  |  |         memory_field = forms.IntegerField(validators=[self.validate_memory]) | 
					
						
							|  |  |  |         storage = request.POST.get('storage') | 
					
						
							|  |  |  |         storage_field = forms.IntegerField(validators=[self.validate_storage]) | 
					
						
							|  |  |  |         template_id = int(request.POST.get('config')) | 
					
						
							| 
									
										
										
										
											2018-04-25 15:55:58 +05:30
										 |  |  |         pricing_name = request.POST.get('pricing_name') | 
					
						
							|  |  |  |         vm_pricing = VMPricing.get_vm_pricing_by_name(pricing_name) | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  |         template = VMTemplate.objects.filter( | 
					
						
							|  |  |  |             opennebula_vm_template_id=template_id).first() | 
					
						
							|  |  |  |         template_data = VMTemplateSerializer(template).data | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-25 15:55:58 +05:30
										 |  |  |         if vm_pricing is None: | 
					
						
							|  |  |  |             vm_pricing_name_msg = _( | 
					
						
							|  |  |  |                 "Incorrect pricing name. Please contact support" | 
					
						
							|  |  |  |                 "{support_email}".format( | 
					
						
							|  |  |  |                     support_email=settings.DCL_SUPPORT_FROM_ADDRESS | 
					
						
							|  |  |  |                 ) | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             messages.add_message( | 
					
						
							|  |  |  |                 self.request, messages.ERROR, vm_pricing_name_msg, | 
					
						
							|  |  |  |                 extra_tags='pricing' | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             return redirect(CreateVirtualMachinesView.as_view()) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             vm_pricing_name = vm_pricing.name | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  |             cores = cores_field.clean(cores) | 
					
						
							|  |  |  |         except ValidationError as err: | 
					
						
							|  |  |  |             msg = '{} : {}.'.format(cores, str(err)) | 
					
						
							|  |  |  |             messages.add_message(self.request, messages.ERROR, msg, | 
					
						
							|  |  |  |                                  extra_tags='cores') | 
					
						
							| 
									
										
										
										
											2018-04-25 15:55:58 +05:30
										 |  |  |             return redirect(CreateVirtualMachinesView.as_view()) | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  |         try: | 
					
						
							|  |  |  |             memory = memory_field.clean(memory) | 
					
						
							|  |  |  |         except ValidationError as err: | 
					
						
							|  |  |  |             msg = '{} : {}.'.format(memory, str(err)) | 
					
						
							|  |  |  |             messages.add_message(self.request, messages.ERROR, msg, | 
					
						
							|  |  |  |                                  extra_tags='memory') | 
					
						
							| 
									
										
										
										
											2018-04-25 15:55:58 +05:30
										 |  |  |             return redirect(CreateVirtualMachinesView.as_view()) | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  |         try: | 
					
						
							|  |  |  |             storage = storage_field.clean(storage) | 
					
						
							|  |  |  |         except ValidationError as err: | 
					
						
							|  |  |  |             msg = '{} : {}.'.format(storage, str(err)) | 
					
						
							|  |  |  |             messages.add_message(self.request, messages.ERROR, msg, | 
					
						
							|  |  |  |                                  extra_tags='storage') | 
					
						
							| 
									
										
										
										
											2018-04-25 15:55:58 +05:30
										 |  |  |             return redirect(CreateVirtualMachinesView.as_view()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-07 06:11:44 +05:30
										 |  |  |         price, vat, vat_percent, discount = get_vm_price_with_vat( | 
					
						
							| 
									
										
										
										
											2018-04-25 15:55:58 +05:30
										 |  |  |             cpu=cores, | 
					
						
							|  |  |  |             memory=memory, | 
					
						
							|  |  |  |             ssd_size=storage, | 
					
						
							|  |  |  |             pricing_name=vm_pricing_name | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  |         specs = { | 
					
						
							|  |  |  |             'cpu': cores, | 
					
						
							|  |  |  |             'memory': memory, | 
					
						
							|  |  |  |             'disk_size': storage, | 
					
						
							| 
									
										
										
										
											2018-05-11 17:47:27 +05:30
										 |  |  |             'discount': discount, | 
					
						
							| 
									
										
										
										
											2018-04-25 15:55:58 +05:30
										 |  |  |             'price': price, | 
					
						
							|  |  |  |             'vat': vat, | 
					
						
							|  |  |  |             'vat_percent': vat_percent, | 
					
						
							| 
									
										
										
										
											2018-05-07 06:29:53 +05:30
										 |  |  |             'total_price': price + vat - discount['amount'], | 
					
						
							| 
									
										
										
										
											2018-04-25 15:55:58 +05:30
										 |  |  |             'pricing_name': vm_pricing_name | 
					
						
							| 
									
										
										
										
											2017-09-15 20:03:52 +05:30
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         request.session['specs'] = specs | 
					
						
							|  |  |  |         request.session['template'] = template_data | 
					
						
							| 
									
										
										
										
											2017-05-03 23:19:32 -05:00
										 |  |  |         return redirect(reverse('hosting:payment')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  | class VirtualMachineView(LoginRequiredMixin, View): | 
					
						
							| 
									
										
										
										
											2016-05-04 00:16:41 -05:00
										 |  |  |     template_name = "hosting/virtual_machine_detail.html" | 
					
						
							|  |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							| 
									
										
										
										
											2017-05-08 19:02:29 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |     def get_object(self): | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |         owner = self.request.user | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |         vm = None | 
					
						
							|  |  |  |         manager = OpenNebulaManager( | 
					
						
							|  |  |  |             email=owner.email, | 
					
						
							| 
									
										
										
										
											2017-05-13 05:50:56 +02:00
										 |  |  |             password=owner.password | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2017-05-08 21:49:40 -05:00
										 |  |  |         vm_id = self.kwargs.get('pk') | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |             vm = manager.get_vm(vm_id) | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |             return vm | 
					
						
							| 
									
										
										
										
											2017-06-17 14:46:11 +05:30
										 |  |  |         except WrongIdError: | 
					
						
							|  |  |  |             messages.error(self.request, | 
					
						
							|  |  |  |                            _('We could not find the requested VM. Please \
 | 
					
						
							|  |  |  |                            contact Data Center Light Support.') | 
					
						
							|  |  |  |                            ) | 
					
						
							|  |  |  |             return None | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |         except ConnectionRefusedError: | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |             messages.error(self.request, | 
					
						
							|  |  |  |                            'We could not load your VM due to a backend connection \
 | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |                 error. Please try again in a few minutes' | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |                            ) | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |             return None | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |         except Exception as error: | 
					
						
							| 
									
										
										
										
											2017-12-12 22:55:30 +01:00
										 |  |  |             logger.error(str(error)) | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |             raise Http404() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_success_url(self): | 
					
						
							|  |  |  |         final_url = reverse('hosting:virtual_machines') | 
					
						
							|  |  |  |         return final_url | 
					
						
							| 
									
										
										
										
											2016-06-09 23:50:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-05-08 19:02:29 -05:00
										 |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |         vm = self.get_object() | 
					
						
							| 
									
										
										
										
											2017-06-17 14:46:11 +05:30
										 |  |  |         if vm is None: | 
					
						
							| 
									
										
										
										
											2017-09-15 16:46:56 +05:30
										 |  |  |             if self.request.is_ajax(): | 
					
						
							| 
									
										
										
										
											2017-09-15 16:57:17 +05:30
										 |  |  |                 storage = messages.get_messages(request) | 
					
						
							| 
									
										
										
										
											2017-09-15 17:38:52 +05:30
										 |  |  |                 for m in storage: | 
					
						
							|  |  |  |                     pass | 
					
						
							| 
									
										
										
										
											2017-09-15 16:57:17 +05:30
										 |  |  |                 storage.used = True | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  |                 return JsonResponse({'text': ugettext('Terminated')}) | 
					
						
							| 
									
										
										
										
											2017-09-15 16:46:56 +05:30
										 |  |  |             else: | 
					
						
							|  |  |  |                 return redirect(reverse('hosting:virtual_machines')) | 
					
						
							| 
									
										
										
										
											2017-09-15 17:20:42 +05:30
										 |  |  |         elif self.request.is_ajax(): | 
					
						
							|  |  |  |             return HttpResponse() | 
					
						
							| 
									
										
										
										
											2017-09-29 21:53:02 +02:00
										 |  |  |         context = None | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |             serializer = VirtualMachineSerializer(vm) | 
					
						
							|  |  |  |             context = { | 
					
						
							|  |  |  |                 'virtual_machine': serializer.data, | 
					
						
							| 
									
										
										
										
											2017-09-06 23:52:02 +02:00
										 |  |  |                 'order': HostingOrder.objects.get( | 
					
						
							| 
									
										
										
										
											2018-04-16 04:32:27 +02:00
										 |  |  |                     vm_id=serializer.data['vm_id'] | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-08-31 18:20:02 +02:00
										 |  |  |         except Exception as ex: | 
					
						
							|  |  |  |             logger.debug("Exception generated {}".format(str(ex))) | 
					
						
							| 
									
										
										
										
											2017-09-29 21:53:02 +02:00
										 |  |  |             messages.error(self.request, | 
					
						
							|  |  |  |                            _('We could not find the requested VM. Please ' | 
					
						
							|  |  |  |                              'contact Data Center Light Support.') | 
					
						
							|  |  |  |                            ) | 
					
						
							|  |  |  |             return redirect(reverse('hosting:virtual_machines')) | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-08 19:02:29 -05:00
										 |  |  |         return render(request, self.template_name, context) | 
					
						
							| 
									
										
										
										
											2016-06-09 23:50:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 19:49:40 +01:00
										 |  |  |     @method_decorator(decorators) | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |     def post(self, request, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2017-09-15 16:46:56 +05:30
										 |  |  |         response = {'status': False} | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |         admin_email_body = {} | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |         owner = self.request.user | 
					
						
							| 
									
										
										
										
											2016-06-09 23:50:49 -05:00
										 |  |  |         vm = self.get_object() | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |         manager = OpenNebulaManager( | 
					
						
							|  |  |  |             email=owner.email, | 
					
						
							| 
									
										
										
										
											2017-05-13 05:50:56 +02:00
										 |  |  |             password=owner.password | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |         ) | 
					
						
							| 
									
										
										
										
											2017-09-18 21:52:59 +05:30
										 |  |  |         try: | 
					
						
							|  |  |  |             vm_data = VirtualMachineSerializer(manager.get_vm(vm.id)).data | 
					
						
							| 
									
										
										
										
											2017-09-27 03:41:18 +05:30
										 |  |  |             vm_name = vm_data.get('name') | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |         except WrongIdError as wrong_id_err: | 
					
						
							|  |  |  |             logger.error(str(wrong_id_err)) | 
					
						
							| 
									
										
										
										
											2017-09-21 02:26:42 +05:30
										 |  |  |             return redirect(reverse('hosting:virtual_machines')) | 
					
						
							| 
									
										
										
										
											2016-06-09 23:50:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |         # Cancel Stripe subscription | 
					
						
							| 
									
										
										
										
											2017-12-17 20:20:42 +01:00
										 |  |  |         stripe_utils = StripeUtils() | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             hosting_order = HostingOrder.objects.get( | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |                 vm_id=vm.id | 
					
						
							| 
									
										
										
										
											2017-12-17 20:20:42 +01:00
										 |  |  |             ) | 
					
						
							|  |  |  |             result = stripe_utils.unsubscribe_customer( | 
					
						
							|  |  |  |                 subscription_id=hosting_order.subscription_id | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             stripe_subscription_obj = result.get('response_object') | 
					
						
							|  |  |  |             # Check if the subscription was canceled | 
					
						
							|  |  |  |             if (stripe_subscription_obj is None or | 
					
						
							|  |  |  |                     stripe_subscription_obj.status != 'canceled'): | 
					
						
							|  |  |  |                 error_msg = result.get('error') | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |                 logger.error( | 
					
						
							|  |  |  |                     'Error canceling subscription for {user} and vm id ' | 
					
						
							|  |  |  |                     '{vm_id}'.format(user=owner.email, vm_id=vm.id) | 
					
						
							|  |  |  |                 ) | 
					
						
							| 
									
										
										
										
											2017-12-17 20:20:42 +01:00
										 |  |  |                 logger.error(error_msg) | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |                 admin_email_body['stripe_error_msg'] = error_msg | 
					
						
							| 
									
										
										
										
											2017-12-17 20:20:42 +01:00
										 |  |  |         except HostingOrder.DoesNotExist: | 
					
						
							|  |  |  |             error_msg = ( | 
					
						
							|  |  |  |                 "HostingOrder corresponding to vm_id={vm_id} does" | 
					
						
							|  |  |  |                 "not exist. Hence, can not find subscription to " | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |                 "cancel ".format(vm_id=vm.id) | 
					
						
							| 
									
										
										
										
											2017-12-17 20:20:42 +01:00
										 |  |  |             ) | 
					
						
							|  |  |  |             logger.error(error_msg) | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |             admin_email_body['stripe_error_msg'] = error_msg | 
					
						
							| 
									
										
										
										
											2016-06-09 23:50:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-19 00:59:51 +05:30
										 |  |  |         terminated = manager.delete_vm(vm.id) | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if not terminated: | 
					
						
							| 
									
										
										
										
											2017-12-12 22:55:30 +01:00
										 |  |  |             logger.debug( | 
					
						
							|  |  |  |                 "manager.delete_vm returned False. Hence, error making " | 
					
						
							|  |  |  |                 "xml-rpc call to delete vm failed." | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |             response['text'] = ugettext('Error terminating VM') + vm.id | 
					
						
							| 
									
										
										
										
											2017-09-14 02:24:10 +05:30
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2017-09-15 16:46:56 +05:30
										 |  |  |             for t in range(15): | 
					
						
							| 
									
										
										
										
											2017-09-15 00:57:59 +05:30
										 |  |  |                 try: | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |                     manager.get_vm(vm.id) | 
					
						
							| 
									
										
										
										
											2017-09-15 18:15:06 +05:30
										 |  |  |                 except WrongIdError: | 
					
						
							| 
									
										
										
										
											2017-09-15 16:46:56 +05:30
										 |  |  |                     response['status'] = True | 
					
						
							|  |  |  |                     response['text'] = ugettext('Terminated') | 
					
						
							| 
									
										
										
										
											2017-09-25 00:46:39 +05:30
										 |  |  |                     vm_detail_obj = VMDetail.objects.filter( | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |                         vm_id=vm.id | 
					
						
							| 
									
										
										
										
											2017-12-12 22:55:30 +01:00
										 |  |  |                     ).first() | 
					
						
							| 
									
										
										
										
											2017-09-25 00:30:28 +05:30
										 |  |  |                     vm_detail_obj.terminated_at = datetime.utcnow() | 
					
						
							|  |  |  |                     vm_detail_obj.save() | 
					
						
							| 
									
										
										
										
											2017-12-17 20:20:42 +01:00
										 |  |  |                 except BaseException as base_exception: | 
					
						
							|  |  |  |                     logger.error( | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |                         "manager.get_vm({vm_id}) returned exception: " | 
					
						
							|  |  |  |                         "{details}.".format( | 
					
						
							|  |  |  |                             details=str(base_exception), vm_id=vm.id | 
					
						
							| 
									
										
										
										
											2017-10-03 13:07:41 +02:00
										 |  |  |                         ) | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2017-09-15 00:57:59 +05:30
										 |  |  |                     break | 
					
						
							|  |  |  |                 else: | 
					
						
							|  |  |  |                     sleep(2) | 
					
						
							| 
									
										
										
										
											2017-09-14 02:24:10 +05:30
										 |  |  |             context = { | 
					
						
							| 
									
										
										
										
											2017-09-27 03:38:39 +05:30
										 |  |  |                 'vm_name': vm_name, | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |                 'base_url': "{0}://{1}".format( | 
					
						
							|  |  |  |                     self.request.scheme, self.request.get_host() | 
					
						
							|  |  |  |                 ), | 
					
						
							| 
									
										
										
										
											2017-09-28 01:11:39 +05:30
										 |  |  |                 'page_header': _('Virtual Machine %(vm_name)s Cancelled') % { | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |                     'vm_name': vm_name | 
					
						
							|  |  |  |                 } | 
					
						
							| 
									
										
										
										
											2017-09-14 02:24:10 +05:30
										 |  |  |             } | 
					
						
							|  |  |  |             email_data = { | 
					
						
							|  |  |  |                 'subject': context['page_header'], | 
					
						
							|  |  |  |                 'to': self.request.user.email, | 
					
						
							|  |  |  |                 'context': context, | 
					
						
							|  |  |  |                 'template_name': 'vm_canceled', | 
					
						
							|  |  |  |                 'template_path': 'hosting/emails/', | 
					
						
							|  |  |  |                 'from_address': settings.DCL_SUPPORT_FROM_ADDRESS, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |             email = BaseEmail(**email_data) | 
					
						
							|  |  |  |             email.send() | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |         admin_email_body.update(response) | 
					
						
							|  |  |  |         email_to_admin_data = { | 
					
						
							| 
									
										
										
										
											2017-12-20 22:26:36 +01:00
										 |  |  |             'subject': "Deleted VM and Subscription for VM {vm_id} and " | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |                        "user: {user}".format( | 
					
						
							| 
									
										
										
										
											2018-03-27 00:54:44 +05:30
										 |  |  |                            vm_id=vm.id, user=owner.email | 
					
						
							|  |  |  |                        ), | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |             'from_email': settings.DCL_SUPPORT_FROM_ADDRESS, | 
					
						
							|  |  |  |             'to': ['info@ungleich.ch'], | 
					
						
							|  |  |  |             'body': "\n".join( | 
					
						
							| 
									
										
										
										
											2017-12-20 22:26:36 +01:00
										 |  |  |                 ["%s=%s" % (k, v) for (k, v) in admin_email_body.items()]), | 
					
						
							| 
									
										
										
										
											2017-12-20 20:59:46 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |         send_plain_email_task.delay(email_to_admin_data) | 
					
						
							| 
									
										
										
										
											2018-06-27 12:34:41 +02:00
										 |  |  |         return JsonResponse(response) | 
					
						
							| 
									
										
										
										
											2017-05-05 14:59:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 23:52:02 +02:00
										 |  |  | class HostingBillListView(PermissionRequiredMixin, LoginRequiredMixin, | 
					
						
							|  |  |  |                           ListView): | 
					
						
							| 
									
										
										
										
											2017-05-05 14:59:11 +02:00
										 |  |  |     template_name = "hosting/bills.html" | 
					
						
							|  |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							| 
									
										
										
										
											2017-05-13 20:19:09 -05:00
										 |  |  |     permission_required = ['view_hostingview'] | 
					
						
							| 
									
										
										
										
											2017-05-05 14:59:11 +02:00
										 |  |  |     context_object_name = "users" | 
					
						
							|  |  |  |     model = StripeCustomer | 
					
						
							|  |  |  |     paginate_by = 10 | 
					
						
							|  |  |  |     ordering = '-id' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-06 23:52:02 +02:00
										 |  |  | class HostingBillDetailView(PermissionRequiredMixin, LoginRequiredMixin, | 
					
						
							|  |  |  |                             DetailView): | 
					
						
							| 
									
										
										
										
											2017-05-05 14:59:11 +02:00
										 |  |  |     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): | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |         # Get HostingBill for primary key (Select from customer users) | 
					
						
							| 
									
										
										
										
											2017-05-05 14:59:11 +02:00
										 |  |  |         pk = self.kwargs['pk'] | 
					
						
							| 
									
										
										
										
											2017-05-08 01:56:02 +02:00
										 |  |  |         object = HostingBill.objects.filter(customer__id=pk).first() | 
					
						
							|  |  |  |         if object is None: | 
					
						
							|  |  |  |             self.template_name = 'hosting/bill_error.html' | 
					
						
							|  |  |  |         return object | 
					
						
							| 
									
										
										
										
											2017-05-05 14:59:11 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     def get_context_data(self, **kwargs): | 
					
						
							|  |  |  |         # Get context | 
					
						
							|  |  |  |         context = super(DetailView, self).get_context_data(**kwargs) | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         owner = self.request.user | 
					
						
							|  |  |  |         manager = OpenNebulaManager(email=owner.email, | 
					
						
							| 
									
										
										
										
											2017-05-13 05:50:56 +02:00
										 |  |  |                                     password=owner.password) | 
					
						
							| 
									
										
										
										
											2017-05-07 06:43:28 +02:00
										 |  |  |         # Get vms | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |         queryset = manager.get_vms() | 
					
						
							|  |  |  |         vms = VirtualMachineSerializer(queryset, many=True).data | 
					
						
							| 
									
										
										
										
											2017-05-13 13:47:53 +02:00
										 |  |  |         # Set total price | 
					
						
							|  |  |  |         bill = context['bill'] | 
					
						
							|  |  |  |         bill.total_price = 0.0 | 
					
						
							|  |  |  |         for vm in vms: | 
					
						
							|  |  |  |             bill.total_price += vm['price'] | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |         context['vms'] = vms | 
					
						
							| 
									
										
										
										
											2017-05-08 01:56:02 +02:00
										 |  |  |         return context | 
					
						
							| 
									
										
										
										
											2017-10-01 20:17:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def forbidden_view(request, exception=None, reason=''): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Handle 403 error | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     logger.error(str(exception) if exception else None) | 
					
						
							| 
									
										
										
										
											2017-10-01 23:06:51 +02:00
										 |  |  |     logger.error('Reason = {reason}'.format(reason=reason)) | 
					
						
							| 
									
										
										
										
											2017-10-01 20:32:51 +02:00
										 |  |  |     err_msg = _('There was an error processing your request. Please try ' | 
					
						
							| 
									
										
										
										
											2017-10-01 23:06:51 +02:00
										 |  |  |                 'again.') | 
					
						
							| 
									
										
										
										
											2017-10-01 20:32:51 +02:00
										 |  |  |     messages.add_message(request, messages.ERROR, err_msg) | 
					
						
							| 
									
										
										
										
											2017-10-01 23:06:51 +02:00
										 |  |  |     return HttpResponseRedirect(request.get_full_path()) |