diff --git a/datacenterlight/templates/datacenterlight/landing_payment.html b/datacenterlight/templates/datacenterlight/landing_payment.html index fa638d77..d195690b 100644 --- a/datacenterlight/templates/datacenterlight/landing_payment.html +++ b/datacenterlight/templates/datacenterlight/landing_payment.html @@ -25,14 +25,15 @@ <h3>{%trans "Log in" %}</h3> <hr class="top-hr"> <p style="margin-bottom: 20px;">{% blocktrans %}Already signed up?<br>By logging in you can retrieve saved billing information.{% endblocktrans %}</p> - <form role="form" id="login-form" method="post" action="{% url 'hosting:login' %}" novalidate> + <form role="form" id="login-form" method="post" action="" novalidate> {% for field in login_form %} {% csrf_token %} {% bootstrap_field field show_label=False type='fields'%} {% endfor %} + <p class="text-danger">{{login_form.non_field_errors|striptags}}</p> <input type='hidden' name='next' value='{{request.path}}'/> <div class="form-group text-right"> - <button type="submit" class="btn btn-wide btn-vm-contact">{% trans "LOGIN" %}</button> + <button type="submit" class="btn btn-wide btn-vm-contact" name="login_form">{% trans "LOGIN" %}</button> </div> </form> <p> @@ -58,7 +59,7 @@ {% endfor %} <form role="form" id="billing-form" method="post" action="" novalidate> {% csrf_token %} - {% for field in form %} + {% for field in billing_address_form %} {% bootstrap_field field show_label=False type='fields'%} {% endfor %} </form> @@ -153,22 +154,12 @@ {% endif %} <div id='payment_error'> {% for message in messages %} - {% if 'failed_payment' in message.tags or 'make_charge_error' in message.tags %} + {% if 'failed_payment' in message.tags or 'make_charge_error' in message.tags or 'error' in message.tags %} <ul class="list-unstyled"> <li><p class="card-warning-content card-warning-error">{{ message|safe }}</p></li> </ul> - {% elif not form.non_field_errors %} - <p class="card-warning-content"> - {% trans "You are not making any payment yet. After placing your order, you will be taken to the Submit Payment Page." %} - </p> {% endif %} {% endfor %} - - {% for error in form.non_field_errors %} - <p class="card-warning-content card-warning-error"> - {{ error|escape }} - </p> - {% endfor %} </div> <div class="text-right"> <button class="btn btn-vm-contact btn-wide" type="submit">{%trans "SUBMIT" %}</button> diff --git a/datacenterlight/views.py b/datacenterlight/views.py index 81c83685..bd1a7f51 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -345,26 +345,45 @@ class PaymentOrderView(FormView): else: return BillingAddressFormSignup - def get_form_kwargs(self): - form_kwargs = super(PaymentOrderView, self).get_form_kwargs() - # if user is signed in, get billing address - if self.request.user.is_authenticated(): - form_kwargs.update({ - 'instance': self.request.user.billing_addresses.first() - }) - if 'billing_address_data' in self.request.session: - billing_address_data = self.request.session['billing_address_data'] - form_kwargs.update({ - 'initial': billing_address_data - }) - return form_kwargs - def get_context_data(self, **kwargs): context = super(PaymentOrderView, self).get_context_data(**kwargs) + if 'billing_address_data' in self.request.session: + billing_address_data = self.request.session['billing_address_data'] + else: + billing_address_data = {} + + if self.request.user.is_authenticated(): + if billing_address_data: + billing_address_form = BillingAddressForm( + initial=billing_address_data + ) + else: + billing_address_form = BillingAddressForm( + instance=self.request.user.billing_addresses.first() + ) + # Get user last order + last_hosting_order = HostingOrder.objects.filter( + customer__user=self.request.user + ).last() + + # If user has already an hosting order, get the credit card + # data from it + if last_hosting_order: + credit_card_data = last_hosting_order.get_cc_data() + if credit_card_data: + context['credit_card_data'] = credit_card_data + else: + context['credit_card_data'] = None + else: + billing_address_form = BillingAddressFormSignup( + initial=billing_address_data + ) + context.update({ 'stripe_key': settings.STRIPE_API_PUBLIC_KEY, 'site_url': reverse('datacenterlight:index'), - 'login_form': HostingUserLoginForm() + 'login_form': HostingUserLoginForm(prefix='login_form'), + 'billing_address_form': billing_address_form }) return context @@ -376,9 +395,32 @@ class PaymentOrderView(FormView): return self.render_to_response(self.get_context_data()) def post(self, request, *args, **kwargs): - form = self.get_form() - if form.is_valid(): - token = form.cleaned_data.get('token') + if 'login_form' in request.POST: + login_form = HostingUserLoginForm(data=request.POST, + prefix='login_form') + if login_form.is_valid(): + email = login_form.cleaned_data.get('email') + password = login_form.cleaned_data.get('password') + auth_user = authenticate(email=email, password=password) + if auth_user: + login(self.request, auth_user) + return HttpResponseRedirect( + reverse('datacenterlight:payment') + ) + else: + context = self.get_context_data() + context['login_form'] = login_form + return self.render_to_response(context) + if request.user.is_authenticated(): + address_form = BillingAddressForm( + data=request.POST, + ) + else: + address_form = BillingAddressFormSignup( + data=request.POST, + ) + if address_form.is_valid(): + token = address_form.cleaned_data.get('token') if request.user.is_authenticated(): this_user = { 'email': request.user.email, @@ -388,8 +430,8 @@ class PaymentOrderView(FormView): email=this_user.get('email'), token=token) else: - user_email = form.cleaned_data.get('email') - user_name = form.cleaned_data.get('name') + user_email = address_form.cleaned_data.get('email') + user_name = address_form.cleaned_data.get('name') this_user = { 'email': user_email, 'name': user_name @@ -422,13 +464,18 @@ class PaymentOrderView(FormView): token=token, customer_name=user_name) - request.session['billing_address_data'] = form.cleaned_data + request.session['billing_address_data'] = address_form.cleaned_data request.session['user'] = this_user # Get or create stripe customer if not customer: - form.add_error("__all__", "Invalid credit card") + address_form.add_error( + "__all__", "Invalid credit card" + ) return self.render_to_response( - self.get_context_data(form=form)) + self.get_context_data( + billing_address_form=address_form + ) + ) request.session['token'] = token if type(customer) is StripeCustomer: request.session['customer'] = customer.stripe_id @@ -437,7 +484,9 @@ class PaymentOrderView(FormView): return HttpResponseRedirect( reverse('datacenterlight:order_confirmation')) else: - return self.form_invalid(form) + context = self.get_context_data() + context['billing_address_form'] = address_form + return self.render_to_response(context) class OrderConfirmationView(DetailView): @@ -548,9 +597,13 @@ class OrderConfirmationView(DetailView): try: custom_user = CustomUser.objects.get( email=user.get('email')) - customer = StripeCustomer.objects.filter( + stripe_customer = StripeCustomer.objects.filter( user_id=custom_user.id).first() - stripe_customer_id = customer.id + if stripe_customer is None: + stripe_customer = StripeCustomer.objects.create( + user=custom_user, stripe_id=stripe_api_cus_id + ) + stripe_customer_id = stripe_customer.id except CustomUser.DoesNotExist: logger.debug( "Customer {} does not exist.".format(user.get('email'))) diff --git a/hosting/forms.py b/hosting/forms.py index 056d0004..7be7a588 100644 --- a/hosting/forms.py +++ b/hosting/forms.py @@ -29,6 +29,8 @@ class HostingUserLoginForm(forms.Form): def clean(self): email = self.cleaned_data.get('email') password = self.cleaned_data.get('password') + if self.errors: + return self.cleaned_data is_auth = authenticate(email=email, password=password) if not is_auth: raise forms.ValidationError(