| 
									
										
										
										
											2018-08-21 23:24:40 +02:00
										 |  |  | import logging | 
					
						
							| 
									
										
										
										
											2018-04-03 22:41:29 +05:30
										 |  |  | from django.contrib.sites.models import Site | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  | from datacenterlight.tasks import create_vm_task | 
					
						
							| 
									
										
										
										
											2018-07-01 22:30:23 +02:00
										 |  |  | from hosting.models import HostingOrder, HostingBill, OrderDetail | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  | from membership.models import StripeCustomer | 
					
						
							|  |  |  | from utils.forms import UserBillingAddressForm | 
					
						
							|  |  |  | from utils.models import BillingAddress | 
					
						
							| 
									
										
										
										
											2018-04-03 22:41:29 +05:30
										 |  |  | from .cms_models import CMSIntegration | 
					
						
							| 
									
										
										
										
											2018-07-01 18:33:10 +02:00
										 |  |  | from .models import VMPricing, VMTemplate | 
					
						
							| 
									
										
										
										
											2018-04-03 22:41:29 +05:30
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-08-21 23:24:40 +02:00
										 |  |  | logger = logging.getLogger(__name__) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-03 22:41:29 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | def get_cms_integration(name): | 
					
						
							|  |  |  |     current_site = Site.objects.get_current() | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         cms_integration = CMSIntegration.objects.get( | 
					
						
							|  |  |  |             name=name, domain=current_site | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     except CMSIntegration.DoesNotExist: | 
					
						
							|  |  |  |         cms_integration = CMSIntegration.objects.get(name=name, domain=None) | 
					
						
							|  |  |  |     return cms_integration | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def create_vm(billing_address_data, stripe_customer_id, specs, | 
					
						
							|  |  |  |               stripe_subscription_obj, card_details_dict, request, | 
					
						
							|  |  |  |               vm_template_id, template, user): | 
					
						
							|  |  |  |     billing_address = BillingAddress( | 
					
						
							|  |  |  |         cardholder_name=billing_address_data['cardholder_name'], | 
					
						
							|  |  |  |         street_address=billing_address_data['street_address'], | 
					
						
							|  |  |  |         city=billing_address_data['city'], | 
					
						
							|  |  |  |         postal_code=billing_address_data['postal_code'], | 
					
						
							|  |  |  |         country=billing_address_data['country'] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     billing_address.save() | 
					
						
							|  |  |  |     customer = StripeCustomer.objects.filter(id=stripe_customer_id).first() | 
					
						
							| 
									
										
										
										
											2018-04-21 21:01:42 +05:30
										 |  |  |     vm_pricing = ( | 
					
						
							|  |  |  |         VMPricing.get_vm_pricing_by_name(name=specs['pricing_name']) | 
					
						
							|  |  |  |         if 'pricing_name' in specs else | 
					
						
							|  |  |  |         VMPricing.get_default_pricing() | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     final_price = ( | 
					
						
							|  |  |  |         specs.get('total_price') | 
					
						
							|  |  |  |         if 'total_price' in specs | 
					
						
							|  |  |  |         else specs.get('price') | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  | 
 | 
					
						
							|  |  |  |     # Create a Hosting Order with vm_id = 0, we shall set it later in | 
					
						
							|  |  |  |     # celery task once the VM instance is up and running | 
					
						
							|  |  |  |     order = HostingOrder.create( | 
					
						
							| 
									
										
										
										
											2018-04-21 21:01:42 +05:30
										 |  |  |         price=final_price, | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  |         customer=customer, | 
					
						
							| 
									
										
										
										
											2018-04-21 21:01:42 +05:30
										 |  |  |         billing_address=billing_address, | 
					
						
							|  |  |  |         vm_pricing=vm_pricing | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-01 22:30:23 +02:00
										 |  |  |     order_detail_obj, obj_created = OrderDetail.objects.get_or_create( | 
					
						
							| 
									
										
										
										
											2018-07-01 18:42:11 +02:00
										 |  |  |         vm_template=VMTemplate.objects.get( | 
					
						
							|  |  |  |             opennebula_vm_template_id=vm_template_id | 
					
						
							|  |  |  |         ), | 
					
						
							| 
									
										
										
										
											2018-07-01 18:33:10 +02:00
										 |  |  |         cores=specs['cpu'], memory=specs['memory'], ssd_size=specs['disk_size'] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-07-01 22:30:23 +02:00
										 |  |  |     order.order_detail = order_detail_obj | 
					
						
							| 
									
										
										
										
											2018-07-01 18:33:10 +02:00
										 |  |  |     order.save() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  |     # Create a Hosting Bill | 
					
						
							|  |  |  |     HostingBill.create(customer=customer, billing_address=billing_address) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # 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 | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |         billing_address_user_form = UserBillingAddressForm( | 
					
						
							|  |  |  |             billing_address_data | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         billing_address_user_form.is_valid() | 
					
						
							|  |  |  |         billing_address_user_form.save() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-27 12:24:53 +02:00
										 |  |  |     # Associate the given stripe subscription with the order | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  |     order.set_subscription_id( | 
					
						
							|  |  |  |         stripe_subscription_obj.id, card_details_dict | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-27 12:24:53 +02:00
										 |  |  |     # Set order status approved | 
					
						
							| 
									
										
										
										
											2018-04-20 20:25:24 +05:30
										 |  |  |     order.set_approved() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     create_vm_task.delay(vm_template_id, user, specs, template, order.id) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-10-05 10:36:13 +02:00
										 |  |  |     clear_all_session_vars(request) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def clear_all_session_vars(request): | 
					
						
							|  |  |  |     if request.session is not None: | 
					
						
							|  |  |  |         for session_var in ['specs', 'template', 'billing_address', | 
					
						
							|  |  |  |                             'billing_address_data', 'card_id', | 
					
						
							| 
									
										
										
										
											2018-10-06 07:47:40 +02:00
										 |  |  |                             'token', 'customer', 'generic_payment_type', | 
					
						
							| 
									
										
										
										
											2018-10-05 10:36:13 +02:00
										 |  |  |                             'generic_payment_details', 'product_id']: | 
					
						
							|  |  |  |             if session_var in request.session: | 
					
						
							| 
									
										
										
										
											2018-10-06 07:47:40 +02:00
										 |  |  |                 del request.session[session_var] |