import logging import pyotp import requests from django.conf import settings from django.contrib.sites.models import Site from datacenterlight.tasks import create_vm_task from hosting.models import HostingOrder, HostingBill, OrderDetail from membership.models import StripeCustomer from utils.forms import UserBillingAddressForm from utils.models import BillingAddress from .cms_models import CMSIntegration from .models import VMPricing, VMTemplate logger = logging.getLogger(__name__) 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 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'], vat_number=billing_address_data['vat_number'], ) billing_address.save() customer = StripeCustomer.objects.filter(id=stripe_customer_id).first() 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') ) # 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( price=final_price, customer=customer, billing_address=billing_address, vm_pricing=vm_pricing ) order_detail_obj, obj_created = OrderDetail.objects.get_or_create( vm_template=VMTemplate.objects.get( opennebula_vm_template_id=vm_template_id ), cores=specs['cpu'], memory=specs['memory'], ssd_size=specs['disk_size'] ) order.order_detail = order_detail_obj order.save() # 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() # Associate the given stripe subscription with the order order.set_subscription_id( stripe_subscription_obj.id, card_details_dict ) # Set order status approved order.set_approved() create_vm_task.delay(vm_template_id, user, specs, template, order.id) 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', 'token', 'customer', 'generic_payment_type', 'generic_payment_details', 'product_id', 'order_confirm_url', 'new_user_hosting_key_id']: if session_var in request.session: del request.session[session_var] def check_otp(name, realm, token): data = { "auth_name": settings.AUTH_NAME, "auth_token": pyotp.TOTP(settings.AUTH_SEED).now(), "auth_realm": settings.AUTH_REALM, "name": name, "realm": realm, "token": token } response = requests.post( "https://{OTP_SERVER}{OTP_VERIFY_ENDPOINT}".format( OTP_SERVER=settings.OTP_SERVER, OTP_VERIFY_ENDPOINT=settings.OTP_VERIFY_ENDPOINT ), data=data ) return response.status_code