| 
									
										
										
										
											2017-07-06 14:18:22 +03:00
										 |  |  | import uuid | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | from django.core.files.base import ContentFile | 
					
						
							| 
									
										
										
										
											2017-07-07 17:49:22 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 19:23:25 +03:00
										 |  |  | from oca.pool import WrongNameError, WrongIdError | 
					
						
							| 
									
										
										
											
												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
										 |  |  | from django.shortcuts import render | 
					
						
							| 
									
										
										
										
											2017-05-08 19:02:29 -05:00
										 |  |  | from django.http import Http404 | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  | from django.core.urlresolvers import reverse_lazy, reverse | 
					
						
							| 
									
										
										
										
											2016-04-29 01:53:24 -05:00
										 |  |  | from django.contrib.auth.mixins import LoginRequiredMixin | 
					
						
							| 
									
										
										
										
											2017-06-29 19:23:25 +03:00
										 |  |  | from django.views.generic import View, CreateView, FormView, ListView, DetailView, \ | 
					
						
							| 
									
										
										
										
											2016-05-29 13:37:43 -05:00
										 |  |  |     DeleteView, TemplateView, UpdateView | 
					
						
							|  |  |  | from django.http import HttpResponseRedirect | 
					
						
							| 
									
										
										
										
											2017-05-06 15:28:18 +02:00
										 |  |  | from django.contrib import messages | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  | from django.conf import settings | 
					
						
							| 
									
										
										
										
											2017-05-03 23:19:32 -05:00
										 |  |  | from django.shortcuts import redirect | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | from django.utils.http import urlsafe_base64_decode | 
					
						
							|  |  |  | from django.contrib.auth.tokens import default_token_generator | 
					
						
							| 
									
										
										
										
											2016-05-29 13:37:43 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-10 22:08:51 -05:00
										 |  |  | from guardian.mixins import PermissionRequiredMixin | 
					
						
							| 
									
										
										
										
											2016-05-29 13:37:43 -05:00
										 |  |  | from stored_messages.settings import stored_messages_settings | 
					
						
							|  |  |  | from stored_messages.models import Message | 
					
						
							|  |  |  | from stored_messages.api import mark_read | 
					
						
							| 
									
										
										
										
											2017-06-29 19:23:25 +03:00
										 |  |  | from django.utils.safestring import mark_safe | 
					
						
							| 
									
										
										
										
											2016-04-19 01:04:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  | from membership.models import CustomUser, StripeCustomer | 
					
						
							|  |  |  | from utils.stripe_utils import StripeUtils | 
					
						
							| 
									
										
										
										
											2017-05-11 00:11:33 -05:00
										 |  |  | from utils.forms import BillingAddressForm, PasswordResetRequestForm, UserBillingAddressForm | 
					
						
							| 
									
										
										
										
											2016-08-20 00:57:35 -05:00
										 |  |  | from utils.views import PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin | 
					
						
							| 
									
										
										
										
											2016-05-25 01:23:32 -05:00
										 |  |  | from utils.mailer import BaseEmail | 
					
						
							| 
									
										
										
										
											2017-05-13 13:47:53 +02:00
										 |  |  | from .models import HostingOrder, HostingBill, HostingPlan, UserHostingKey | 
					
						
							| 
									
										
										
										
											2017-07-06 11:47:12 +03:00
										 |  |  | from .forms import HostingUserSignupForm, HostingUserLoginForm, UserHostingKeyForm, generate_ssh_key_name | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  | from .mixins import ProcessVMSelectionMixin | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | from opennebula_api.models import OpenNebulaManager | 
					
						
							| 
									
										
										
										
											2017-06-29 19:23:25 +03:00
										 |  |  | from opennebula_api.serializers import VirtualMachineSerializer, \ | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |     VirtualMachineTemplateSerializer | 
					
						
							| 
									
										
										
										
											2017-06-11 05:18:06 +05:30
										 |  |  | from django.utils.translation import ugettext_lazy as _ | 
					
						
							| 
									
										
										
										
											2017-05-13 06:59:57 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +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." | 
					
						
							| 
									
										
										
										
											2016-04-19 01:04:15 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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() | 
					
						
							| 
									
										
										
										
											2017-05-13 00:31:29 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING) | 
					
						
							| 
									
										
										
										
											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
										 |  |  |         # configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING) | 
					
						
							|  |  |  |         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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							|  |  |  |         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-08-20 00:57:35 -05:00
										 |  |  | class LoginView(LoginViewMixin): | 
					
						
							|  |  |  |     template_name = "hosting/login.html" | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  |     form_class = HostingUserLoginForm | 
					
						
							| 
									
										
										
										
											2017-05-20 11:06:10 -05:00
										 |  |  |     success_url = reverse_lazy('hosting:virtual_machines') | 
					
						
							| 
									
										
										
										
											2016-06-04 02:59:37 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-07-30 19:07:29 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-20 01:03:32 -05:00
										 |  |  | class SignupView(CreateView): | 
					
						
							|  |  |  |     template_name = 'hosting/signup.html' | 
					
						
							|  |  |  |     form_class = HostingUserSignupForm | 
					
						
							| 
									
										
										
										
											2016-05-19 00:58:28 +02:00
										 |  |  |     model = CustomUser | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |     success_url = reverse_lazy('hosting:ssh_keys') | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 17:34:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 05:18:06 +05:30
										 |  |  | class SignupValidateView(TemplateView): | 
					
						
							|  |  |  |     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. ' | 
					
						
							|  |  |  |                 'Please follow the instructions in it to activate your account. Once activated, you can login using'), | 
					
						
							|  |  |  |             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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-11 05:18:06 +05:30
										 |  |  | class SignupValidatedView(SignupValidateView): | 
					
						
							|  |  |  |     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-06-11 05:18:06 +05:30
										 |  |  |         if validated: | 
					
						
							| 
									
										
										
										
											2017-06-29 19:23:25 +03: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-06-11 05:18:06 +05:30
										 |  |  |         else: | 
					
						
							| 
									
										
										
										
											2017-07-26 16:45:49 +05:30
										 |  |  |             home_url = '<a href="' + \ | 
					
						
							| 
									
										
										
										
											2017-08-19 02:21:34 +05:30
										 |  |  |                        reverse('datacenterlight:index') + \ | 
					
						
							|  |  |  |                        '">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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												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
										 |  |  | class PasswordResetView(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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
											
												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
										 |  |  | class PasswordResetConfirmView(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) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if user is not None and default_token_generator.check_token(user, token): | 
					
						
							|  |  |  |             if form.is_valid(): | 
					
						
							|  |  |  |                 new_password = form.cleaned_data['new_password2'] | 
					
						
							|  |  |  |                 user.set_password(new_password) | 
					
						
							|  |  |  |                 user.save() | 
					
						
							|  |  |  |                 messages.success(request, 'Password has been reset.') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 # Change opennebula password | 
					
						
							|  |  |  |                 opennebula_client.change_user_password(new_password) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 return self.form_valid(form) | 
					
						
							|  |  |  |             else: | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |                 messages.error( | 
					
						
							|  |  |  |                     request, 'Password reset has not been successful.') | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |                 form.add_error(None, 'Password reset has not been successful.') | 
					
						
							|  |  |  |                 return self.form_invalid(form) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         else: | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |             messages.error( | 
					
						
							|  |  |  |                 request, 'The reset password link is no longer valid.') | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |             form.add_error(None, 'The reset password link is no longer valid.') | 
					
						
							|  |  |  |             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 | 
					
						
							|  |  |  |         manager = OpenNebulaManager() | 
					
						
							|  |  |  |         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-06-03 15:03:55 +02:00
										 |  |  |         # Add ssh key to user | 
					
						
							|  |  |  |         try: | 
					
						
							|  |  |  |             manager.remove_public_key(user=owner, public_key=public_key) | 
					
						
							|  |  |  |         except ConnectionError: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         except WrongNameError: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-06-03 15:03:55 +02:00
										 |  |  |         return super(SSHKeyListView, self).render_to_response(context, **response_kwargs) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							|  |  |  |         context = {} | 
					
						
							|  |  |  |         return render(request, self.template_name, context) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-07-06 11:47:12 +03:00
										 |  |  |         return redirect(reverse_lazy('hosting:ssh_keys'), foo='bar') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-05 16:57:49 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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() | 
					
						
							| 
									
										
										
										
											2017-07-06 14:18:22 +03:00
										 |  |  |         if 'dcl-generated-key-' in form.instance.name: | 
					
						
							|  |  |  |             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-06-03 15:03:55 +02:00
										 |  |  |         manager = OpenNebulaManager() | 
					
						
							| 
									
										
										
										
											2017-05-25 15:50:10 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # Get user ssh key | 
					
						
							| 
									
										
										
										
											2017-07-27 19:45:55 +05:30
										 |  |  |         public_key = str(form.cleaned_data.get('public_key', '')) | 
					
						
							| 
									
										
										
										
											2017-05-25 15:50:10 +02:00
										 |  |  |         # Add ssh key to user | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |         try: | 
					
						
							| 
									
										
										
										
											2017-07-26 16:45:49 +05:30
										 |  |  |             manager.add_public_key( | 
					
						
							|  |  |  |                 user=owner, public_key=public_key, merge=True) | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |         except ConnectionError: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  |         except WrongNameError: | 
					
						
							|  |  |  |             pass | 
					
						
							| 
									
										
										
										
											2017-05-25 15:50:10 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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): | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |         print(self.request.POST.dict()) | 
					
						
							| 
									
										
										
										
											2017-05-11 00:11:33 -05:00
										 |  |  |         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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # Get user last order | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |         last_hosting_order = HostingOrder.objects.filter( | 
					
						
							|  |  |  |             customer__user=user).last() | 
					
						
							| 
									
										
										
										
											2017-05-11 00:11:33 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |         # If user has already an hosting order, get the credit card data from | 
					
						
							|  |  |  |         # it | 
					
						
							| 
									
										
										
										
											2017-05-11 00:11:33 -05:00
										 |  |  |         if last_hosting_order: | 
					
						
							|  |  |  |             credit_card_data = last_hosting_order.get_cc_data() | 
					
						
							|  |  |  |             context.update({ | 
					
						
							|  |  |  |                 'credit_card_data': credit_card_data if credit_card_data else None, | 
					
						
							|  |  |  |             }) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |         context.update({ | 
					
						
							|  |  |  |             'stripe_key': settings.STRIPE_API_PUBLIC_KEY | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2016-05-25 01:23:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-22 08:36:38 -05:00
										 |  |  |         return context | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2017-06-29 17:34:40 +03:00
										 |  |  |         if not UserHostingKey.objects.filter(user=self.request.user).exists(): | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |             messages.success( | 
					
						
							|  |  |  |                 request, | 
					
						
							|  |  |  |                 'In order to create a VM, you create/upload your SSH KEY first.' | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |             return HttpResponseRedirect(reverse('hosting:ssh_keys')) | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-24 10:58:16 -05:00
										 |  |  |         if 'next' in request.session: | 
					
						
							|  |  |  |             del request.session['next'] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |         return self.render_to_response(self.get_context_data()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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-27 01:54:15 -05:00
										 |  |  |             context = self.get_context_data() | 
					
						
							| 
									
										
										
										
											2017-05-11 00:11:33 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-13 13:47:53 +02:00
										 |  |  |             template = request.session.get('template') | 
					
						
							|  |  |  |             specs = request.session.get('specs') | 
					
						
							| 
									
										
										
										
											2017-04-29 12:39:55 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-13 13:47:53 +02:00
										 |  |  |             vm_template_id = template.get('id', 1) | 
					
						
							| 
									
										
										
										
											2017-04-29 12:39:55 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-13 13:47:53 +02:00
										 |  |  |             final_price = specs.get('price') | 
					
						
							| 
									
										
										
										
											2017-04-29 12:39:55 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  |             token = form.cleaned_data.get('token') | 
					
						
							| 
									
										
										
										
											2015-08-09 22:13:38 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |             owner = self.request.user | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  |             # Get or create stripe customer | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |             customer = StripeCustomer.get_or_create(email=owner.email, | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  |                                                     token=token) | 
					
						
							| 
									
										
										
										
											2016-05-21 00:03:17 +02:00
										 |  |  |             if not customer: | 
					
						
							| 
									
										
										
										
											2017-08-07 17:23:58 +03:00
										 |  |  |                 msg = _("Invalid credit card") | 
					
						
							|  |  |  |                 messages.add_message(self.request, messages.ERROR, msg, extra_tags='make_charge_error') | 
					
						
							|  |  |  |                 return HttpResponseRedirect(reverse('hosting:payment') + '#payment_error') | 
					
						
							| 
									
										
										
										
											2016-05-21 00:03:17 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  |             # Create Billing Address | 
					
						
							|  |  |  |             billing_address = form.save() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             # Make stripe charge to a customer | 
					
						
							|  |  |  |             stripe_utils = StripeUtils() | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  |             charge_response = stripe_utils.make_charge(amount=final_price, | 
					
						
							| 
									
										
										
										
											2016-04-30 13:55:55 -05:00
										 |  |  |                                                        customer=customer.stripe_id) | 
					
						
							| 
									
										
										
										
											2015-09-22 05:37:22 -06:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-30 13:55:55 -05:00
										 |  |  |             # Check if the payment was approved | 
					
						
							| 
									
										
										
										
											2017-08-24 02:29:24 +05:30
										 |  |  |             if not charge_response.get('response_object'): | 
					
						
							| 
									
										
										
										
											2017-08-07 17:02:47 +03:00
										 |  |  |                 msg = charge_response.get('error') | 
					
						
							|  |  |  |                 messages.add_message(self.request, messages.ERROR, msg, extra_tags='make_charge_error') | 
					
						
							| 
									
										
										
										
											2017-08-07 17:23:58 +03:00
										 |  |  |                 return HttpResponseRedirect(reverse('hosting:payment') + '#payment_error') | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  |             charge = charge_response.get('response_object') | 
					
						
							| 
									
										
										
										
											2016-04-26 01:16:03 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |             # Create OpenNebulaManager | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |             manager = OpenNebulaManager(email=owner.email, | 
					
						
							| 
									
										
										
										
											2017-05-13 05:50:56 +02:00
										 |  |  |                                         password=owner.password) | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |             # Get user ssh key | 
					
						
							| 
									
										
										
										
											2017-06-29 17:34:40 +03:00
										 |  |  |             if not UserHostingKey.objects.filter(user=self.request.user).exists(): | 
					
						
							| 
									
										
										
										
											2017-06-02 00:49:17 +02:00
										 |  |  |                 context.update({ | 
					
						
							|  |  |  |                     'sshError': 'error', | 
					
						
							|  |  |  |                     'form': form | 
					
						
							|  |  |  |                 }) | 
					
						
							|  |  |  |                 return render(request, self.template_name, context) | 
					
						
							|  |  |  |             # For now just get first one | 
					
						
							|  |  |  |             user_key = UserHostingKey.objects.filter( | 
					
						
							| 
									
										
										
										
											2017-06-29 19:23:25 +03:00
										 |  |  |                 user=self.request.user).first() | 
					
						
							| 
									
										
										
										
											2017-06-29 17:34:40 +03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-08 21:54:12 -05:00
										 |  |  |             # Create a vm using logged user | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |             vm_id = manager.create_vm( | 
					
						
							| 
									
										
										
										
											2017-05-13 06:59:57 +02:00
										 |  |  |                 template_id=vm_template_id, | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |                 # XXX: Confi | 
					
						
							| 
									
										
										
										
											2017-05-13 13:47:53 +02:00
										 |  |  |                 specs=specs, | 
					
						
							| 
									
										
										
										
											2017-05-13 06:59:57 +02:00
										 |  |  |                 ssh_key=user_key.public_key, | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |             # Create a Hosting Order | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |             order = HostingOrder.create( | 
					
						
							|  |  |  |                 price=final_price, | 
					
						
							|  |  |  |                 vm_id=vm_id, | 
					
						
							|  |  |  |                 customer=customer, | 
					
						
							|  |  |  |                 billing_address=billing_address | 
					
						
							| 
									
										
										
										
											2017-05-08 21:49:40 -05:00
										 |  |  |             ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |             # Create a Hosting Bill | 
					
						
							| 
									
										
										
										
											2017-07-07 00:12:29 +05:30
										 |  |  |             HostingBill.create( | 
					
						
							| 
									
										
										
										
											2017-07-26 16:45:49 +05:30
										 |  |  |                 customer=customer, billing_address=billing_address) | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |             # Create Billing Address for User if he does not have one | 
					
						
							|  |  |  |             if not customer.user.billing_addresses.count(): | 
					
						
							|  |  |  |                 billing_address_data.update({ | 
					
						
							|  |  |  |                     'user': customer.user.id | 
					
						
							|  |  |  |                 }) | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |                 billing_address_user_form = UserBillingAddressForm( | 
					
						
							|  |  |  |                     billing_address_data) | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |                 billing_address_user_form.is_valid() | 
					
						
							|  |  |  |                 billing_address_user_form.save() | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  |             # Associate an order with a stripe payment | 
					
						
							|  |  |  |             order.set_stripe_charge(charge) | 
					
						
							| 
									
										
										
										
											2015-07-30 01:09:23 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-04-27 01:54:15 -05:00
										 |  |  |             # If the Stripe payment was successed, set order status approved | 
					
						
							|  |  |  |             order.set_approved() | 
					
						
							| 
									
										
										
										
											2016-05-25 01:23:32 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |             vm = VirtualMachineSerializer(manager.get_vm(vm_id)).data | 
					
						
							| 
									
										
										
										
											2017-04-29 12:39:55 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-05-25 01:23:32 -05:00
										 |  |  |             # Send notification to ungleich as soon as VM has been booked | 
					
						
							| 
									
										
										
										
											2016-06-05 15:49:51 -05:00
										 |  |  |             context = { | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +02:00
										 |  |  |                 'vm': vm, | 
					
						
							| 
									
										
										
										
											2016-06-16 01:04:48 -05:00
										 |  |  |                 'order': order, | 
					
						
							|  |  |  |                 'base_url': "{0}://{1}".format(request.scheme, request.get_host()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-05 15:49:51 -05:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2016-05-25 01:23:32 -05:00
										 |  |  |             email_data = { | 
					
						
							|  |  |  |                 'subject': 'New VM request', | 
					
						
							| 
									
										
										
										
											2016-06-16 01:04:48 -05:00
										 |  |  |                 'to': request.user.email, | 
					
						
							| 
									
										
										
										
											2016-06-05 15:49:51 -05:00
										 |  |  |                 'context': context, | 
					
						
							| 
									
										
										
										
											2016-05-25 01:23:32 -05:00
										 |  |  |                 'template_name': 'new_booked_vm', | 
					
						
							| 
									
										
										
											
												Created signup view. Added login after signup.Added signup url to nosystem app urls.py.  Added logout view, Added logout button on nabber, Added password reset form, Added password view , Added password reset html, Added password reset email for nosystemd app. Added confirm_reset_password.html, Added confirm_ reset password  view, Added confirm reset password form, Fixed reset password token generation, Started donation view, Added donation view, Added donation.html, Added donation form, Adding donation.js lib in order to capture stripe payments for nosystem app.
											
										 
											2016-07-22 01:24:32 -05:00
										 |  |  |                 'template_path': 'hosting/emails/' | 
					
						
							| 
									
										
										
										
											2016-05-25 01:23:32 -05:00
										 |  |  |             } | 
					
						
							|  |  |  |             email = BaseEmail(**email_data) | 
					
						
							|  |  |  |             email.send() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-07-30 18:03:16 +02:00
										 |  |  |             return HttpResponseRedirect( | 
					
						
							|  |  |  |                 "{url}?{query_params}".format(url=reverse('hosting:orders', kwargs={'pk': order.id}), | 
					
						
							|  |  |  |                                               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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-10 22:08:51 -05:00
										 |  |  | class OrdersHostingDetailView(PermissionRequiredMixin, 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-05-12 12:07:05 +02:00
										 |  |  |     def get_context_data(self, **kwargs): | 
					
						
							|  |  |  |         # Get context | 
					
						
							|  |  |  |         context = super(DetailView, self).get_context_data(**kwargs) | 
					
						
							|  |  |  |         obj = self.get_object() | 
					
						
							|  |  |  |         owner = self.request.user | 
					
						
							|  |  |  |         manager = OpenNebulaManager(email=owner.email, | 
					
						
							| 
									
										
										
										
											2017-05-13 05:50:56 +02:00
										 |  |  |                                     password=owner.password) | 
					
						
							| 
									
										
										
										
											2017-07-30 20:41:11 +05:30
										 |  |  |         if self.request.GET.get('page', '') == 'payment': | 
					
						
							|  |  |  |             context['page_header_text'] = _('Confirm Order') | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             context['page_header_text'] = _('Invoice') | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |         try: | 
					
						
							|  |  |  |             vm = manager.get_vm(obj.vm_id) | 
					
						
							|  |  |  |             context['vm'] = VirtualMachineSerializer(vm).data | 
					
						
							| 
									
										
										
										
											2017-06-15 07:30:47 +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' | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |         except ConnectionRefusedError: | 
					
						
							| 
									
										
										
										
											2017-06-15 07:30:47 +05:30
										 |  |  |             messages.error(self.request, | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |                            'In order to create a VM, you need to create/upload your SSH KEY first.' | 
					
						
							|  |  |  |                            ) | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  |         return context | 
					
						
							| 
									
										
										
										
											2017-05-12 12:07:05 +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
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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) | 
					
						
							|  |  |  |         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') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get(self, request, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-06-29 17:34:40 +03:00
										 |  |  |         if not UserHostingKey.objects.filter(user=self.request.user).exists(): | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |             messages.success( | 
					
						
							|  |  |  |                 request, | 
					
						
							|  |  |  |                 'In order to create a VM, you need to create/upload your SSH KEY first.' | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2017-06-03 15:03:55 +02:00
										 |  |  |             return HttpResponseRedirect(reverse('hosting:ssh_keys')) | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |         try: | 
					
						
							|  |  |  |             manager = OpenNebulaManager() | 
					
						
							|  |  |  |             templates = manager.get_templates() | 
					
						
							|  |  |  |             configuration_options = HostingPlan.get_serialized_configs() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             context = { | 
					
						
							|  |  |  |                 'templates': VirtualMachineTemplateSerializer(templates, many=True).data, | 
					
						
							| 
									
										
										
										
											2017-05-24 10:58:16 -05:00
										 |  |  |                 'configuration_options': configuration_options, | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         except: | 
					
						
							| 
									
										
										
										
											2017-05-24 10:58:16 -05:00
										 |  |  |             messages.error( | 
					
						
							|  |  |  |                 request, | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |                 'We could not load the VM templates due to a backend connection \
 | 
					
						
							|  |  |  |                 error. Please try again in a few minutes' | 
					
						
							| 
									
										
										
										
											2017-05-24 10:58:16 -05:00
										 |  |  |             ) | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |             context = { | 
					
						
							| 
									
										
										
										
											2017-05-24 10:58:16 -05:00
										 |  |  |                 'error': 'connection' | 
					
						
							| 
									
										
										
										
											2017-06-29 17:34:40 +03:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2017-05-12 12:13:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-03 23:19:32 -05:00
										 |  |  |         return render(request, self.template_name, context) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def post(self, request): | 
					
						
							| 
									
										
										
										
											2017-05-13 06:59:57 +02:00
										 |  |  |         manager = OpenNebulaManager() | 
					
						
							|  |  |  |         template_id = request.POST.get('vm_template_id') | 
					
						
							|  |  |  |         template = manager.get_template(template_id) | 
					
						
							| 
									
										
										
										
											2017-05-13 13:47:53 +02:00
										 |  |  |         configuration_id = int(request.POST.get('configuration')) | 
					
						
							|  |  |  |         configuration = HostingPlan.objects.get(id=configuration_id) | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |         request.session['template'] = VirtualMachineTemplateSerializer( | 
					
						
							|  |  |  |             template).data | 
					
						
							| 
									
										
										
										
											2017-05-13 13:47:53 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-25 11:27:49 +02:00
										 |  |  |         request.session['specs'] = configuration.serialize() | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							|  |  |  |             print(error) | 
					
						
							|  |  |  |             raise Http404() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_success_url(self): | 
					
						
							|  |  |  |         final_url = reverse('hosting:virtual_machines') | 
					
						
							|  |  |  |         return final_url | 
					
						
							| 
									
										
										
										
											2016-06-09 23:50:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											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: | 
					
						
							|  |  |  |             return redirect(reverse('hosting:virtual_machines')) | 
					
						
							| 
									
										
										
										
											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-08-19 02:32:37 +05:30
										 |  |  |                 'order': HostingOrder.objects.get(vm_id=serializer.data['vm_id']) | 
					
						
							| 
									
										
										
										
											2017-05-14 12:22:10 +02:00
										 |  |  |             } | 
					
						
							|  |  |  |         except: | 
					
						
							|  |  |  |             pass | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-08 19:02:29 -05:00
										 |  |  |         return render(request, self.template_name, context) | 
					
						
							| 
									
										
										
										
											2016-06-09 23:50:49 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |     def post(self, request, *args, **kwargs): | 
					
						
							| 
									
										
										
										
											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
										 |  |  | 
 | 
					
						
							|  |  |  |         opennebula_vm_id = self.kwargs.get('pk') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         terminated = manager.delete_vm( | 
					
						
							|  |  |  |             vm.id | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if not terminated: | 
					
						
							|  |  |  |             messages.error( | 
					
						
							|  |  |  |                 request, | 
					
						
							|  |  |  |                 'Error terminating VM %s' % (opennebula_vm_id) | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             return HttpResponseRedirect(self.get_success_url()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-09 23:50:49 -05:00
										 |  |  |         context = { | 
					
						
							| 
									
										
										
										
											2016-06-16 01:04:48 -05:00
										 |  |  |             'vm': vm, | 
					
						
							|  |  |  |             'base_url': "{0}://{1}".format(self.request.scheme, self.request.get_host()) | 
					
						
							| 
									
										
										
										
											2016-06-09 23:50:49 -05:00
										 |  |  |         } | 
					
						
							|  |  |  |         email_data = { | 
					
						
							|  |  |  |             'subject': 'Virtual machine plan canceled', | 
					
						
							|  |  |  |             'to': self.request.user.email, | 
					
						
							|  |  |  |             'context': context, | 
					
						
							|  |  |  |             'template_name': 'vm_status_changed', | 
					
						
							| 
									
										
										
											
												Created signup view. Added login after signup.Added signup url to nosystem app urls.py.  Added logout view, Added logout button on nabber, Added password reset form, Added password view , Added password reset html, Added password reset email for nosystemd app. Added confirm_reset_password.html, Added confirm_ reset password  view, Added confirm reset password form, Fixed reset password token generation, Started donation view, Added donation view, Added donation.html, Added donation form, Adding donation.js lib in order to capture stripe payments for nosystem app.
											
										 
											2016-07-22 01:24:32 -05:00
										 |  |  |             'template_path': 'hosting/emails/' | 
					
						
							| 
									
										
										
										
											2016-06-09 23:50:49 -05:00
										 |  |  |         } | 
					
						
							|  |  |  |         email = BaseEmail(**email_data) | 
					
						
							|  |  |  |         email.send() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  |         messages.error( | 
					
						
							|  |  |  |             request, | 
					
						
							|  |  |  |             'VM %s terminated successfully' % (opennebula_vm_id) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-06-09 23:50:49 -05:00
										 |  |  |         return HttpResponseRedirect(self.get_success_url()) | 
					
						
							| 
									
										
										
										
											2017-05-05 14:59:11 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-12 00:56:35 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-13 20:19:09 -05: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-05-05 14:59:11 +02:00
										 |  |  | class HostingBillDetailView(PermissionRequiredMixin, LoginRequiredMixin, DetailView): | 
					
						
							|  |  |  |     template_name = "hosting/bill_detail.html" | 
					
						
							|  |  |  |     login_url = reverse_lazy('hosting:login') | 
					
						
							|  |  |  |     permission_required = ['view_hostingview'] | 
					
						
							|  |  |  |     context_object_name = "bill" | 
					
						
							|  |  |  |     model = HostingBill | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     def get_object(self, queryset=None): | 
					
						
							| 
									
										
										
										
											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 |