diff --git a/datacenterlight/templates/datacenterlight/order_detail.html b/datacenterlight/templates/datacenterlight/order_detail.html
index eb91ad7d..8000c925 100644
--- a/datacenterlight/templates/datacenterlight/order_detail.html
+++ b/datacenterlight/templates/datacenterlight/order_detail.html
@@ -39,7 +39,7 @@
{% trans "Billed To:"%}
- {% with request.user.billing_addresses.first as billing_address %}
+ {% with billing_address_data as billing_address %}
{{billing_address.cardholder_name}}
{{billing_address.street_address}}, {{billing_address.postal_code}}
{{billing_address.city}}, {{billing_address.country}}.
{% endwith %}
diff --git a/datacenterlight/views.py b/datacenterlight/views.py
index e0dc44bb..27eee6c2 100644
--- a/datacenterlight/views.py
+++ b/datacenterlight/views.py
@@ -424,55 +424,60 @@ class PaymentOrderView(FormView):
'name': request.user.name
}
custom_user = request.user
+ customer = StripeCustomer.get_or_create(
+ email=this_user.get('email'),
+ token=token)
else:
this_user = {
'email': form.cleaned_data.get('email'),
'name': form.cleaned_data.get('name')
}
- try:
- custom_user = CustomUser.objects.get(
- email=this_user.get('email'))
- except CustomUser.DoesNotExist:
- password = CustomUser.get_random_password()
- # Register the user, and do not send emails
- custom_user = CustomUser.register(
- this_user.get('name'), password,
- this_user.get('email'),
- app='dcl', base_url=None, send_email=False
- )
- new_user = authenticate(
- username=custom_user.email,
- password=password)
- login(request, new_user)
- else:
- # new user used the email of existing user, fail
- messages.error(
- self.request,
- _('Another user exists with that email!'),
- extra_tags='duplicate_email'
- )
- return HttpResponseRedirect(
- reverse('datacenterlight:payment'))
- billing_address_data = form.cleaned_data
- billing_address_data.update({
- 'user': custom_user.id
- })
- billing_address_user_form = UserBillingAddressForm(
- instance=custom_user.billing_addresses.first(),
- data=billing_address_data)
- billing_address_user_form.save()
+ customer = StripeCustomer.create_stripe_customer(
+ email=this_user.get('email'),
+ token=token,
+ customer_name=form.cleaned_data.get('name'))
+ #try:
+ # custom_user = CustomUser.objects.get(
+ # email=this_user.get('email'))
+ #except CustomUser.DoesNotExist:
+ # password = CustomUser.get_random_password()
+ # # Register the user, and do not send emails
+ # custom_user = CustomUser.register(
+ # this_user.get('name'), password,
+ # this_user.get('email'),
+ # app='dcl', base_url=None, send_email=False
+ # )
+ # new_user = authenticate(
+ # username=custom_user.email,
+ # password=password)
+ # login(request, new_user)
+ #else:
+ # # new user used the email of existing user, fail
+ # messages.error(
+ # self.request,
+ # _('Another user exists with that email!'),
+ # extra_tags='duplicate_email'
+ # )
+ # return HttpResponseRedirect(
+ # reverse('datacenterlight:payment'))
+ #billing_address_data = form.cleaned_data
+ #billing_address_data.update({
+ # 'user': custom_user.id
+ #})
+ #billing_address_user_form = UserBillingAddressForm(
+ # instance=custom_user.billing_addresses.first(),
+ # data=billing_address_data)
+ #billing_address_user_form.save()
+ #for k, v in form.cleaned_data.iteritems():
+ request.session['billing_address_data'] = form.cleaned_data
request.session['user'] = this_user
# Get or create stripe customer
- customer = StripeCustomer.get_or_create(
- email=this_user.get('email'),
- token=token)
if not customer:
form.add_error("__all__", "Invalid credit card")
return self.render_to_response(
self.get_context_data(form=form))
-
request.session['token'] = token
- request.session['customer'] = customer.id
+ request.session['customer'] = customer.id if request.user.is_authenticated() else customer
return HttpResponseRedirect(
reverse('datacenterlight:order_confirmation'))
else:
@@ -492,9 +497,14 @@ class OrderConfirmationView(DetailView):
if 'token' not in request.session:
return HttpResponseRedirect(reverse('datacenterlight:payment'))
stripe_customer_id = request.session.get('customer')
- customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
+ if request.user.is_authenticated():
+ customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
+ stripe_api_cus_id = customer.stripe_id
+ else:
+ stripe_api_cus_id = stripe_customer_id
+
stripe_utils = StripeUtils()
- card_details = stripe_utils.get_card_details(customer.stripe_id,
+ card_details = stripe_utils.get_card_details(stripe_api_cus_id,
request.session.get(
'token'))
if not card_details.get('response_object'):
@@ -506,7 +516,8 @@ class OrderConfirmationView(DetailView):
context = {
'site_url': reverse('datacenterlight:index'),
'cc_last4': card_details.get('response_object').get('last4'),
- 'cc_brand': card_details.get('response_object').get('brand')
+ 'cc_brand': card_details.get('response_object').get('brand'),
+ 'billing_address_data': request.session.get('billing_address_data')
}
return render(request, self.template_name, context)
@@ -514,15 +525,23 @@ class OrderConfirmationView(DetailView):
template = request.session.get('template')
specs = request.session.get('specs')
user = request.session.get('user')
+
+
+ #stripe_customer_id = request.session.get('customer')
+ #customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
+
stripe_customer_id = request.session.get('customer')
- customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
- billing_address_data = {}
- billing_address_id = request.user.billing_addresses.first().id
+ if request.user.is_authenticated():
+ customer = StripeCustomer.objects.filter(id=stripe_customer_id).first()
+ stripe_api_cus_id = customer.stripe_id
+ else:
+ stripe_api_cus_id = stripe_customer_id
+
vm_template_id = template.get('id', 1)
# Make stripe charge to a customer
stripe_utils = StripeUtils()
- card_details = stripe_utils.get_card_details(customer.stripe_id,
+ card_details = stripe_utils.get_card_details(stripe_api_cus_id,
request.session.get(
'token'))
if not card_details.get('response_object'):
@@ -563,6 +582,49 @@ class OrderConfirmationView(DetailView):
extra_tags='failed_payment')
return HttpResponseRedirect(
reverse('datacenterlight:payment') + '#payment_error')
+
+ # Create user if the user is not logged in
+ if not request.user.is_authenticated():
+ try:
+ custom_user = CustomUser.objects.get(
+ email=user.get('email'))
+ except CustomUser.DoesNotExist:
+ logger.debug("Customer {} does not exist.".format(user.get('email')))
+ password = CustomUser.get_random_password()
+ # Register the user, and do not send emails
+ custom_user = CustomUser.register(
+ this_user.get('name'), password,
+ this_user.get('email'),
+ app='dcl', base_url=None, send_email=False
+ )
+ logger.debug("Created user {}.".format(user.get('email')))
+ #new_user = authenticate(
+ # username=custom_user.email,
+ # password=password)
+ #login(request, new_user)
+ else:
+ # new user used the email of existing user, fail
+ messages.error(
+ self.request,
+ _('Another user exists with that email!'),
+ extra_tags='duplicate_email'
+ )
+ return HttpResponseRedirect(
+ reverse('datacenterlight:payment'))
+
+ # Save billing address
+ billing_address_data = request.session.get('billing_address_data')
+ logger.debug('billing_address_data is {}'.format(billing_address_data))
+ billing_address_data.update({
+ 'user': custom_user.id
+ })
+ billing_address_user_form = UserBillingAddressForm(
+ instance=custom_user.billing_addresses.first(),
+ data=billing_address_data)
+ billing_address_user_form.save()
+ billing_address_id = billing_address_user_form.id
+ logger.debug("billking address id = {}".format(billing_address_id))
+
create_vm_task.delay(vm_template_id, user, specs, template,
stripe_customer_id, billing_address_data,
billing_address_id,
diff --git a/dynamicweb/settings/base.py b/dynamicweb/settings/base.py
index dc2917ea..a13b95af 100644
--- a/dynamicweb/settings/base.py
+++ b/dynamicweb/settings/base.py
@@ -368,7 +368,7 @@ MIGRATION_MODULES = {
'cmsplugin_filer_teaser': 'cmsplugin_filer_teaser.migrations_django',
'cmsplugin_filer_utils': 'cmsplugin_filer_utils.migrations_django',
'cmsplugin_filer_video': 'cmsplugin_filer_video.migrations_django',
- 'djangocms_text_ckeditor': 'djangocms_text_ckeditor.migrations',
+ 'djangocms_text_ckeditor': 'djangocms_text_ckeditor.migrations_django',
}
STATICFILES_FINDERS = (
diff --git a/membership/models.py b/membership/models.py
index 5d7c7b11..1be441b2 100644
--- a/membership/models.py
+++ b/membership/models.py
@@ -176,6 +176,25 @@ class StripeCustomer(models.Model):
def __str__(self):
return "%s - %s" % (self.stripe_id, self.user.email)
+ @classmethod
+ def create_stripe_api_customer(cls, email=None, token=None, customer_name=None):
+ """
+ This method creates a Stripe API customer with the given
+ email, token and customer_name. This is different from
+ get_or_create method below in that it does not create a
+ CustomUser and associate the customer created in stripe
+ with it, while get_or_create does that before creating the
+ stripe user.
+ """
+ stripe_utils = StripeUtils()
+ stripe_data = stripe_utils.create_customer(token, email, customer_name)
+ if stripe_data.get('response_object'):
+ stripe_cus_id = stripe_data.get('response_object').get('id')
+ return stripe_cus_id
+ else:
+ return None
+
+
@classmethod
def get_or_create(cls, email=None, token=None):
"""
@@ -195,7 +214,6 @@ class StripeCustomer(models.Model):
except StripeCustomer.DoesNotExist:
user = CustomUser.objects.get(email=email)
-
stripe_utils = StripeUtils()
stripe_data = stripe_utils.create_customer(token, email, user.name)
if stripe_data.get('response_object'):