Refactor code for do_provisioning_generic
This commit is contained in:
parent
f628046417
commit
98b5d03d0b
1 changed files with 228 additions and 41 deletions
|
@ -20,7 +20,7 @@ from hosting.forms import (
|
||||||
)
|
)
|
||||||
from hosting.models import (
|
from hosting.models import (
|
||||||
HostingBill, HostingOrder, UserCardDetail, GenericProduct, UserHostingKey,
|
HostingBill, HostingOrder, UserCardDetail, GenericProduct, UserHostingKey,
|
||||||
StripeTaxRate, IncompleteSubscriptions)
|
StripeTaxRate, IncompleteSubscriptions, IncompletePaymentIntents)
|
||||||
from membership.models import CustomUser, StripeCustomer
|
from membership.models import CustomUser, StripeCustomer
|
||||||
from opennebula_api.serializers import VMTemplateSerializer
|
from opennebula_api.serializers import VMTemplateSerializer
|
||||||
from utils.forms import (
|
from utils.forms import (
|
||||||
|
@ -745,6 +745,16 @@ class OrderConfirmationView(DetailView, FormView):
|
||||||
},
|
},
|
||||||
'stripe_key': settings.STRIPE_API_PUBLIC_KEY,
|
'stripe_key': settings.STRIPE_API_PUBLIC_KEY,
|
||||||
})
|
})
|
||||||
|
IncompletePaymentIntents.objects.create(
|
||||||
|
request=create_incomplete_intent_request(self.request),
|
||||||
|
payment_intent_id=payment_intent.id,
|
||||||
|
stripe_api_cus_id=request.session['customer'],
|
||||||
|
card_details_response=card_details_response,
|
||||||
|
stripe_subscription_id=None,
|
||||||
|
stripe_charge_id=None,
|
||||||
|
gp_details=request.session["generic_payment_details"],
|
||||||
|
billing_address_data=request.session["billing_address_data"]
|
||||||
|
)
|
||||||
return render(request, self.template_name, context)
|
return render(request, self.template_name, context)
|
||||||
|
|
||||||
def post(self, request, *args, **kwargs):
|
def post(self, request, *args, **kwargs):
|
||||||
|
@ -1113,46 +1123,36 @@ class OrderConfirmationView(DetailView, FormView):
|
||||||
return JsonResponse(response)
|
return JsonResponse(response)
|
||||||
|
|
||||||
|
|
||||||
def do_provisioning(request, user, stripe_api_cus_id, card_details_response,
|
def create_incomplete_intent_request(request):
|
||||||
stripe_subscription_obj, stripe_onetime_charge, gp_details,
|
|
||||||
specs, vm_template_id, template, billing_address_data,
|
|
||||||
real_request):
|
|
||||||
"""
|
"""
|
||||||
:param request: a dict
|
Persist session variables so that they could be pick up
|
||||||
{
|
in the webhook for processing.
|
||||||
'scheme': 'https',
|
:param request:
|
||||||
'host': 'domain',
|
|
||||||
'language': 'en-us',
|
|
||||||
'new_user_hosting_key_id': 1,
|
|
||||||
'card_id': 1, # if usercarddetail exists already,
|
|
||||||
'generic_payment_type': 'generic' # represents a generic payment
|
|
||||||
'generic_payment_details': {
|
|
||||||
'amount': 100,
|
|
||||||
'recurring':
|
|
||||||
},
|
|
||||||
}
|
|
||||||
:param user: a dict
|
|
||||||
{
|
|
||||||
'name': 'John Doe',
|
|
||||||
'email': 'john@doe.com'
|
|
||||||
}
|
|
||||||
:param stripe_api_cus_id: 'cus_xxxxxxx' the actual stripe customer id str
|
|
||||||
:param card_details_response:
|
|
||||||
:param stripe_subscription_obj: The actual Stripe's Subscription Object
|
|
||||||
:param stripe_onetime_charge: Stripe's Charge object
|
|
||||||
:param gp_details:
|
|
||||||
:param specs:
|
|
||||||
:param vm_template_id:
|
|
||||||
:param template:
|
|
||||||
:param real_request:
|
|
||||||
:return:
|
:return:
|
||||||
"""
|
"""
|
||||||
# Create user if the user is not logged in and if he is not already
|
req = {
|
||||||
# registered
|
'scheme': request.scheme,
|
||||||
|
'host': request.get_host(),
|
||||||
|
'language': get_language(),
|
||||||
|
'new_user_hosting_key_id': request.session.get(
|
||||||
|
'new_user_hosting_key_id', None),
|
||||||
|
'card_id': request.session.get('card_id', None),
|
||||||
|
'generic_payment_type': request.session.get(
|
||||||
|
'generic_payment_type', None),
|
||||||
|
'generic_payment_details': request.session.get(
|
||||||
|
'generic_payment_details', None),
|
||||||
|
'user': request.session.get('user', None)
|
||||||
|
}
|
||||||
|
return json.dumps(req)
|
||||||
|
|
||||||
|
|
||||||
|
def get_or_create_custom_user(request, stripe_api_cus_id):
|
||||||
new_user = None
|
new_user = None
|
||||||
|
name = request.get('user').get('name')
|
||||||
|
email = request.get('user').get('email')
|
||||||
|
|
||||||
try:
|
try:
|
||||||
custom_user = CustomUser.objects.get(
|
custom_user = CustomUser.objects.get(email=email)
|
||||||
email=user.get('email'))
|
|
||||||
stripe_customer = StripeCustomer.objects.filter(
|
stripe_customer = StripeCustomer.objects.filter(
|
||||||
user_id=custom_user.id).first()
|
user_id=custom_user.id).first()
|
||||||
if stripe_customer is None:
|
if stripe_customer is None:
|
||||||
|
@ -1162,17 +1162,17 @@ def do_provisioning(request, user, stripe_api_cus_id, card_details_response,
|
||||||
stripe_customer_id = stripe_customer.id
|
stripe_customer_id = stripe_customer.id
|
||||||
except CustomUser.DoesNotExist:
|
except CustomUser.DoesNotExist:
|
||||||
logger.debug(
|
logger.debug(
|
||||||
"Customer {} does not exist.".format(user.get('email')))
|
"Customer {} does not exist.".format(email))
|
||||||
password = CustomUser.get_random_password()
|
password = CustomUser.get_random_password()
|
||||||
base_url = "{0}://{1}".format(request['scheme'],
|
base_url = "{0}://{1}".format(request['scheme'],
|
||||||
request['host'])
|
request['host'])
|
||||||
custom_user = CustomUser.register(
|
custom_user = CustomUser.register(
|
||||||
user.get('name'), password,
|
name, password,
|
||||||
user.get('email'),
|
email,
|
||||||
app='dcl', base_url=base_url, send_email=True,
|
app='dcl', base_url=base_url, send_email=True,
|
||||||
account_details=password
|
account_details=password
|
||||||
)
|
)
|
||||||
logger.debug("Created user {}.".format(user.get('email')))
|
logger.debug("Created user {}.".format(email))
|
||||||
stripe_customer = StripeCustomer.objects. \
|
stripe_customer = StripeCustomer.objects. \
|
||||||
create(user=custom_user, stripe_id=stripe_api_cus_id)
|
create(user=custom_user, stripe_id=stripe_api_cus_id)
|
||||||
stripe_customer_id = stripe_customer.id
|
stripe_customer_id = stripe_customer.id
|
||||||
|
@ -1186,8 +1186,11 @@ def do_provisioning(request, user, stripe_api_cus_id, card_details_response,
|
||||||
user_hosting_key.user = new_user
|
user_hosting_key.user = new_user
|
||||||
user_hosting_key.save()
|
user_hosting_key.save()
|
||||||
logger.debug("User %s key is saved" % custom_user.email)
|
logger.debug("User %s key is saved" % custom_user.email)
|
||||||
|
return custom_user, new_user
|
||||||
|
|
||||||
card_id = request.get('card_id', None)
|
|
||||||
|
def set_user_card(card_id, stripe_api_cus_id, custom_user,
|
||||||
|
card_details_response):
|
||||||
if card_id:
|
if card_id:
|
||||||
logger.debug("card_id %s was in request" % card_id)
|
logger.debug("card_id %s was in request" % card_id)
|
||||||
user_card_detail = UserCardDetail.objects.get(id=card_id)
|
user_card_detail = UserCardDetail.objects.get(id=card_id)
|
||||||
|
@ -1217,6 +1220,190 @@ def do_provisioning(request, user, stripe_api_cus_id, card_details_response,
|
||||||
'brand': ucd.brand,
|
'brand': ucd.brand,
|
||||||
'card_id': ucd.card_id
|
'card_id': ucd.card_id
|
||||||
}
|
}
|
||||||
|
return card_details_dict
|
||||||
|
|
||||||
|
|
||||||
|
def do_provisioning_generic(
|
||||||
|
request, stripe_api_cus_id, card_details_response,
|
||||||
|
stripe_subscription_id, stripe_charge_id, gp_details,
|
||||||
|
billing_address_data):
|
||||||
|
user = request.get('user', None)
|
||||||
|
logger.debug("generic_payment_type case")
|
||||||
|
custom_user, new_user = get_or_create_custom_user(
|
||||||
|
request, stripe_api_cus_id)
|
||||||
|
|
||||||
|
card_id = request.get('card_id', None)
|
||||||
|
|
||||||
|
card_details_dict = set_user_card(card_id, stripe_api_cus_id, custom_user,
|
||||||
|
card_details_response)
|
||||||
|
|
||||||
|
# Save billing address
|
||||||
|
billing_address_data.update({
|
||||||
|
'user': custom_user.id
|
||||||
|
})
|
||||||
|
logger.debug('billing_address_data is {}'.format(billing_address_data))
|
||||||
|
|
||||||
|
stripe_cus = StripeCustomer.objects.filter(
|
||||||
|
stripe_id=stripe_api_cus_id
|
||||||
|
).first()
|
||||||
|
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()
|
||||||
|
|
||||||
|
order = HostingOrder.create(
|
||||||
|
price=request['generic_payment_details']['amount'],
|
||||||
|
customer=stripe_cus,
|
||||||
|
billing_address=billing_address,
|
||||||
|
vm_pricing=VMPricing.get_default_pricing()
|
||||||
|
)
|
||||||
|
|
||||||
|
# Create a Hosting Bill
|
||||||
|
HostingBill.create(customer=stripe_cus,
|
||||||
|
billing_address=billing_address)
|
||||||
|
|
||||||
|
# Create Billing Address for User if he does not have one
|
||||||
|
if not stripe_cus.user.billing_addresses.count():
|
||||||
|
billing_address_data.update({
|
||||||
|
'user': stripe_cus.user.id
|
||||||
|
})
|
||||||
|
billing_address_user_form = UserBillingAddressForm(
|
||||||
|
billing_address_data
|
||||||
|
)
|
||||||
|
billing_address_user_form.is_valid()
|
||||||
|
billing_address_user_form.save()
|
||||||
|
|
||||||
|
recurring = request['generic_payment_details'].get('recurring')
|
||||||
|
if recurring:
|
||||||
|
logger.debug("recurring case")
|
||||||
|
# Associate the given stripe subscription with the order
|
||||||
|
order.set_subscription_id(
|
||||||
|
stripe_subscription_id, card_details_dict
|
||||||
|
)
|
||||||
|
logger.debug("recurring case, set order subscription id done")
|
||||||
|
else:
|
||||||
|
logger.debug("one time charge case")
|
||||||
|
# Associate the given stripe charge id with the order
|
||||||
|
stripe_onetime_charge = stripe.Charge.retrieve(stripe_charge_id)
|
||||||
|
order.set_stripe_charge(stripe_onetime_charge)
|
||||||
|
|
||||||
|
# Set order status approved
|
||||||
|
order.set_approved()
|
||||||
|
order.generic_payment_description = gp_details["description"]
|
||||||
|
order.generic_product_id = gp_details["product_id"]
|
||||||
|
order.save()
|
||||||
|
logger.debug("Order saved")
|
||||||
|
# send emails
|
||||||
|
context = {
|
||||||
|
'name': user.get('name'),
|
||||||
|
'email': user.get('email'),
|
||||||
|
'amount': gp_details['amount'],
|
||||||
|
'description': gp_details['description'],
|
||||||
|
'recurring': gp_details['recurring'],
|
||||||
|
'product_name': gp_details['product_name'],
|
||||||
|
'product_id': gp_details['product_id'],
|
||||||
|
'order_id': order.id
|
||||||
|
}
|
||||||
|
|
||||||
|
email_data = {
|
||||||
|
'subject': (settings.DCL_TEXT +
|
||||||
|
" Payment received from %s" % context['email']),
|
||||||
|
'from_email': settings.DCL_SUPPORT_FROM_ADDRESS,
|
||||||
|
'to': ['info@ungleich.ch'],
|
||||||
|
'body': "\n".join(
|
||||||
|
["%s=%s" % (k, v) for (k, v) in context.items()]),
|
||||||
|
'reply_to': [context['email']],
|
||||||
|
}
|
||||||
|
send_plain_email_task.delay(email_data)
|
||||||
|
recurring_text = _(" This is a monthly recurring plan.")
|
||||||
|
if gp_details['recurring_interval'] == "year":
|
||||||
|
recurring_text = _(" This is an yearly recurring plan.")
|
||||||
|
|
||||||
|
email_data = {
|
||||||
|
'subject': _("Confirmation of your payment"),
|
||||||
|
'from_email': settings.DCL_SUPPORT_FROM_ADDRESS,
|
||||||
|
'to': [user.get('email')],
|
||||||
|
'body': _("Hi {name},\n\n"
|
||||||
|
"thank you for your order!\n"
|
||||||
|
"We have just received a payment of CHF {amount:.2f}"
|
||||||
|
" from you.{recurring}\n\n"
|
||||||
|
"Cheers,\nYour Data Center Light team".format(
|
||||||
|
name=user.get('name'),
|
||||||
|
amount=gp_details['amount'],
|
||||||
|
recurring=(
|
||||||
|
recurring_text
|
||||||
|
if gp_details['recurring'] else ''
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
'reply_to': ['info@ungleich.ch'],
|
||||||
|
}
|
||||||
|
send_plain_email_task.delay(email_data)
|
||||||
|
redirect_url = reverse('datacenterlight:index')
|
||||||
|
logger.debug("Sent user/admin emails")
|
||||||
|
logger.debug("redirect_url = %s " % redirect_url)
|
||||||
|
response = {
|
||||||
|
'status': True,
|
||||||
|
'redirect': redirect_url,
|
||||||
|
'msg_title': str(_('Thank you for the payment.')),
|
||||||
|
'msg_body': str(
|
||||||
|
_('You will soon receive a confirmation email of the '
|
||||||
|
'payment. You can always contact us at '
|
||||||
|
'info@ungleich.ch for any question that you may have.')
|
||||||
|
)
|
||||||
|
}
|
||||||
|
logger.debug("after response")
|
||||||
|
logger.debug(str(response))
|
||||||
|
return {'response': JsonResponse(response), 'user': new_user}
|
||||||
|
|
||||||
|
|
||||||
|
def do_provisioning(request, stripe_api_cus_id, card_details_response,
|
||||||
|
stripe_subscription_obj, stripe_onetime_charge, gp_details,
|
||||||
|
specs, vm_template_id, template, billing_address_data,
|
||||||
|
real_request):
|
||||||
|
"""
|
||||||
|
:param request: a dict
|
||||||
|
{
|
||||||
|
'scheme': 'https',
|
||||||
|
'host': 'domain',
|
||||||
|
'language': 'en-us',
|
||||||
|
'new_user_hosting_key_id': 1,
|
||||||
|
'card_id': 1, # if usercarddetail exists already,
|
||||||
|
'generic_payment_type': 'generic' # represents a generic payment
|
||||||
|
'generic_payment_details': {
|
||||||
|
'amount': 100,
|
||||||
|
'recurring':
|
||||||
|
},
|
||||||
|
'user': {
|
||||||
|
'name': 'John Doe',
|
||||||
|
'email': 'john@doe.com'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
:param stripe_api_cus_id: 'cus_xxxxxxx' the actual stripe customer id str
|
||||||
|
:param card_details_response:
|
||||||
|
:param stripe_subscription_obj: The actual Stripe's Subscription Object
|
||||||
|
:param stripe_onetime_charge: Stripe's Charge object
|
||||||
|
:param gp_details:
|
||||||
|
:param specs:
|
||||||
|
:param vm_template_id:
|
||||||
|
:param template:
|
||||||
|
:param real_request:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
# Create user if the user is not logged in and if he is not already
|
||||||
|
# registered
|
||||||
|
custom_user, new_user = get_or_create_custom_user(
|
||||||
|
request, stripe_api_cus_id)
|
||||||
|
|
||||||
|
card_id = request.get('card_id', None)
|
||||||
|
|
||||||
|
card_details_dict = set_user_card(card_id, stripe_api_cus_id, custom_user,
|
||||||
|
card_details_response)
|
||||||
|
|
||||||
# Save billing address
|
# Save billing address
|
||||||
billing_address_data.update({
|
billing_address_data.update({
|
||||||
|
|
Loading…
Reference in a new issue