diff --git a/datacenterlight/locale/de/LC_MESSAGES/django.po b/datacenterlight/locale/de/LC_MESSAGES/django.po index dedd3f84..53da10c4 100644 --- a/datacenterlight/locale/de/LC_MESSAGES/django.po +++ b/datacenterlight/locale/de/LC_MESSAGES/django.po @@ -65,24 +65,6 @@ msgstr "Bitte gib einen Wert von 10 bis 200 ein." msgid "GB Storage (SSD)" msgstr "GB Storage (SSD)" -msgid "Name" -msgstr "" - -msgid "Your Name" -msgstr "Dein Name" - -msgid "Please enter your name." -msgstr "Bitte gib Deinen Namen ein." - -msgid "Email" -msgstr "E-Mail-Adresse" - -msgid "Your Email" -msgstr "Deine E-Mail" - -msgid "Please enter a valid email address." -msgstr "Bitte gib eine gültige E-Mailadresse ein." - msgid "Continue" msgstr "Weiter" @@ -95,6 +77,18 @@ msgstr "Vielen Dank für Deine Nachricht." msgid "Get in touch with us!" msgstr "Sende uns eine Nachricht." +msgid "Name" +msgstr "" + +msgid "Please enter your name." +msgstr "Bitte gib Deinen Namen ein." + +msgid "Email" +msgstr "E-Mail-Adresse" + +msgid "Please enter a valid email address." +msgstr "Bitte gib eine gültige E-Mailadresse ein." + msgid "Message" msgstr "Nachricht" @@ -188,13 +182,13 @@ msgid "All Rights Reserved" msgstr "Alle Rechte vorbehalten" msgid "Toggle navigation" -msgstr "Konfiguration" +msgstr "Umschalten" msgid "Why Data Center Light?" msgstr "Warum Data Center Light?" msgid "Login" -msgstr "" +msgstr "Anmelden" msgid "Dashboard" msgstr "" @@ -264,6 +258,39 @@ msgstr "Kontaktiere uns" msgid "Switzerland " msgstr "Schweiz " +msgid "Welcome back" +msgstr "Willkommen zurück" + +msgid "" +"Review your billing address and card details and proceed to make payment." +msgstr "" +"Überprüfe die Rechnungsadresse und Kreditkartendaten und fahre mit der " +"Zahlung fort." + +msgid "Log in" +msgstr "Anmelden" + +msgid "" +"Already signed up?
By logging in you can retrieve saved billing " +"information." +msgstr "" +"Bereits eingeloggt? Nach der Anmeldung kannst Du gespeicherte " +"Rechnungsinformationen abrufen." + +msgid "LOGIN" +msgstr "ANMELDEN" + +msgid "Don't have an account yet?" +msgstr "Besitzt du kein Benutzerkonto?" + +msgid "You can sign up by filling in the information below." +msgstr "" +"Du kannst Dich anmelden, indem Du die die untenstehenden Informationen " +"ausfüllst." + +msgid "Forgot password?" +msgstr "Passwort vergessen?" + msgid "Your Order" msgstr "Deine Bestellung" @@ -288,6 +315,9 @@ msgstr "inkl. Mehrwertsteuer" msgid "Month" msgstr "Monat" +msgid "Sign up" +msgstr "Registrieren" + msgid "Billing Address" msgstr "Rechnungsadresse" @@ -295,15 +325,10 @@ msgid "Credit Card" msgstr "Kreditkarte" msgid "" -"\n" -" Please fill in your credit card information " -"below. We are using Stripe for payment and do not store\n" -" your information in our database.\n" -" " +"Please fill in your credit card information below. We are using Stripe for payment and do not " +"store your information in our database." msgstr "" -"\n" "Bitte füll Deine Kreditkarteninformationen unten aus. Wir nutzen Stripe für die Bezahlung und " "speichern keine Informationen in unserer Datenbank." @@ -330,6 +355,13 @@ msgstr "" msgid "Card Type" msgstr "Kartentyp" +msgid "" +"You are not making any payment yet. After placing your order, you will be " +"taken to the Submit Payment Page." +msgstr "" +"Es wird noch keine Bezahlung vorgenommen. Die Bezahlung wird erst ausgelöst, " +"nachdem Du die Bestellung auf der nächsten Seite bestätigt hast." + msgid "Processing" msgstr "Weiter" @@ -479,11 +511,23 @@ msgstr "Ungültige RAM-Grösse" msgid "Invalid storage size" msgstr "Ungültige Speicher-Grösse" -msgid "is not a proper name" -msgstr "ist kein gültiger Name" +msgid "Another user exists with that email!" +msgstr "" -msgid "is not a proper email" -msgstr "ist keine gültige E-Mailadresse" +#~ msgid "Email Address" +#~ msgstr "E-Mail-Adresse" + +#~ msgid "is not a proper name" +#~ msgstr "ist kein gültiger Name" + +#~ msgid "is not a proper email" +#~ msgstr "ist keine gültige E-Mailadresse" + +#~ msgid "Your Name" +#~ msgstr "Dein Name" + +#~ msgid "Your Email" +#~ msgstr "Deine E-Mail" #~ msgid "" #~ "\n" diff --git a/datacenterlight/templates/datacenterlight/calculator_form.html b/datacenterlight/templates/datacenterlight/calculator_form.html index cdba4809..1b8586b6 100644 --- a/datacenterlight/templates/datacenterlight/calculator_form.html +++ b/datacenterlight/templates/datacenterlight/calculator_form.html @@ -81,43 +81,6 @@ -
-
- - -
-
- {% for message in messages %} - {% if 'name' in message.tags %} -
    -
  • - {{ message|safe }} -
  • -
- {% endif %} - {% endfor %} -
-
-
-
- - -
-
- {% for message in messages %} - {% if 'email' in message.tags %} -
    -
  • - {{ message|safe }} -
  • -
- {% endif %} - {% endfor %} -
-
diff --git a/datacenterlight/templates/datacenterlight/landing_payment.html b/datacenterlight/templates/datacenterlight/landing_payment.html index f4974a56..c7ada779 100644 --- a/datacenterlight/templates/datacenterlight/landing_payment.html +++ b/datacenterlight/templates/datacenterlight/landing_payment.html @@ -1,190 +1,182 @@ {% extends "hosting/base_short.html" %} {% load staticfiles bootstrap3 i18n %} +{% block css_extra %} + +{% endblock css_extra %} + {% block navbar %} {% include "datacenterlight/includes/_navbar.html" %} {% endblock navbar %} {% block content %} -
-
-
-

{%trans "Your Order" %}

-
-
- {%trans "Cores" %} -
-
- {%trans "Memory" %} -
-
- {%trans "Disk space" %} -
-
- {%trans "Configuration" %} -
-
-
-
- {{request.session.specs.cpu|floatformat}} -
-
- {{request.session.specs.memory|floatformat}} GB -
-
- {{request.session.specs.disk_size|floatformat}} GB -
-
- {{request.session.template.name}} -
-
-
-
- {%trans "Total" %} {%trans "including VAT" %} -
-
-
-
{{request.session.specs.price}} - CHF/{% trans "Month" %} +
+
+
+ {% if request.user.is_authenticated %} +
+

{% trans "Welcome back" %} {{request.user.name}}!

+

{% trans "Review your billing address and card details and proceed to make payment." %}

-
+ {% else %} +

{%trans "Log in" %}

+
+

{% blocktrans %}Already signed up?
By logging in you can retrieve saved billing information.{% endblocktrans %}

+
+ {% for field in login_form %} + {% csrf_token %} + {% bootstrap_field field show_label=False type='fields'%} + {% endfor %} + +
+ +
+
+

+ {% trans "Don't have an account yet?" %}
+ {% trans "You can sign up by filling in the information below." %}
+ {% trans "Forgot password?" %} +

+ {% endif %}
-
-
-
-
-

{%trans "Billing Address"%}

-
+
+
+ {% if not request.user.is_authenticated %} +

{%trans "Sign up"%}

+ {% else %} +

{%trans "Billing Address"%}

+ {% endif %} +
+ {% for message in messages %} + {% if 'duplicate_email' in message.tags %} +

{{message}}

+ {% endif %} + {% endfor %}
- {% for field in form %} {% csrf_token %} + {% for field in form %} {% bootstrap_field field show_label=False type='fields'%} {% endfor %}
-
+
+
+
+

{%trans "Your Order" %}

+
+
+

{% trans "Cores"%} {{request.session.specs.cpu|floatformat}}

+
+

{% trans "Memory"%} {{request.session.specs.memory|floatformat}} GB

+
+

{% trans "Disk space"%} {{request.session.specs.disk_size|floatformat}} GB

+
+

{% trans "Configuration"%} {{request.session.template.name}}

+
+

{%trans "Total" %}  ({%trans "including VAT" %}) {{request.session.specs.price}} CHF/{% trans "Month" %}

+
+
+
+
+

{%trans "Credit Card"%}

-
+
+

+ {% blocktrans %}Please fill in your credit card information below. We are using Stripe for payment and do not store your information in our database.{% endblocktrans %} +

-
-

- {% blocktrans %} - Please fill in your credit card information below. We are using Stripe for payment and do not store - your information in our database. - {% endblocktrans %} -

-
-
-
- {% if credit_card_data.last4 %} + {% if credit_card_data.last4 %}
Credit Card
Last 4: *****{{credit_card_data.last4}}
Type: {{credit_card_data.cc_brand}}
-
-
- {% if not messages and not form.non_field_errors %} -

- {% trans "You are not making any payment yet. After submitting your card information, you will be taken to the Confirm Order Page." %} -

- {% endif %} -
- {% for message in messages %} - {% if 'failed_payment' or 'make_charge_error' in message.tags %} -
  • -

    {{ message|safe }}

    -
- {% endif %} - {% endfor %} - {% for error in form.non_field_errors %} -

- {{ error|escape }} -

- {% endfor %} -
-
-
-
- -
-
+ {% if not messages and not form.non_field_errors %} +

+ {% trans "You are not making any payment yet. After submitting your card information, you will be taken to the Confirm Order Page." %} +

+ {% endif %} +
+ {% for message in messages %} + {% if 'failed_payment' or 'make_charge_error' in message.tags %} +
  • +

    {{ message|safe }}

    +
+ {% endif %} + {% endfor %} + {% for error in form.non_field_errors %} +

+ {{ error|escape }} +

+ {% endfor %}
- - {% else %} +
+ +
+ {% else %}
-
-
+
+
-
- -
+
+
+ +
+
+
+ +
+
-
-
- -
-
-
+
- -
-
- {% if not messages and not form.non_field_errors %} +
+ {% if not messages and not form.non_field_errors %} +

+ {% trans "You are not making any payment yet. After placing your order, you will be taken to the Submit Payment Page." %} +

+ {% endif %} +
+ {% for message in messages %} + {% if 'failed_payment' in message.tags or 'make_charge_error' in message.tags %} +
    +
  • {{ message|safe }}

  • +
+ {% elif not form.non_field_errors %}

- {% trans "You are not making any payment yet. After submitting your card information, you will be taken to the Confirm Order Page." %} + {% trans "You are not making any payment yet. After placing your order, you will be taken to the Submit Payment Page." %}

{% endif %} -
- {% for message in messages %} - {% if 'failed_payment' or 'make_charge_error' in message.tags %} -
  • -

    {{ message|safe }}

    -
- {% endif %} - {% endfor %} + {% endfor %} - {% for error in form.non_field_errors %} -

- {{ error|escape }} -

- {% endfor %} -
-
-
-
- -
-
+ {% for error in form.non_field_errors %} +

+ {{ error|escape }} +

+ {% endfor %} +
+
+
- + {% endif %}
diff --git a/datacenterlight/templates/datacenterlight/order_detail.html b/datacenterlight/templates/datacenterlight/order_detail.html index 085b0c37..eb91ad7d 100644 --- a/datacenterlight/templates/datacenterlight/order_detail.html +++ b/datacenterlight/templates/datacenterlight/order_detail.html @@ -39,9 +39,9 @@

{% trans "Billed To:"%}

- {% with request.session.billing_address_data as billing_address %} - {{billing_address|get_value_from_dict:'cardholder_name'}}
{{billing_address|get_value_from_dict:'street_address'}}, {{billing_address|get_value_from_dict:'postal_code'}}
- {{billing_address|get_value_from_dict:'city'}}, {{billing_address|get_value_from_dict:'country'}}. + {% with request.user.billing_addresses.first 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 0521ffef..e0dc44bb 100644 --- a/datacenterlight/views.py +++ b/datacenterlight/views.py @@ -1,6 +1,7 @@ from django import forms from django.conf import settings from django.contrib import messages +from django.contrib.auth import login, authenticate from django.core.exceptions import ValidationError from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect @@ -12,11 +13,15 @@ from django.views.generic import FormView, CreateView, TemplateView, DetailView from datacenterlight.tasks import create_vm_task from hosting.models import HostingOrder +from hosting.forms import HostingUserLoginForm from membership.models import CustomUser, StripeCustomer from opennebula_api.models import OpenNebulaManager -from opennebula_api.serializers import VirtualMachineTemplateSerializer, \ - VMTemplateSerializer -from utils.forms import BillingAddressForm +from opennebula_api.serializers import ( + VirtualMachineTemplateSerializer, VMTemplateSerializer +) +from utils.forms import ( + BillingAddressForm, BillingAddressFormSignup, UserBillingAddressForm +) from utils.mailer import BaseEmail from utils.stripe_utils import StripeUtils from utils.tasks import send_plain_email_task @@ -74,7 +79,7 @@ class SuccessView(TemplateView): def get(self, request, *args, **kwargs): if 'specs' not in request.session or 'user' not in request.session: return HttpResponseRedirect(reverse('datacenterlight:index')) - elif 'token' not in request.session: + if 'token' not in request.session: return HttpResponseRedirect(reverse('datacenterlight:payment')) elif 'order_confirmation' not in request.session: return HttpResponseRedirect( @@ -100,7 +105,7 @@ class PricingView(TemplateView): 'templates': VirtualMachineTemplateSerializer(templates, many=True).data, } - except: + except Exception: messages.error(request, 'We have a temporary problem to connect to our backend. \ Please try again in a few minutes' @@ -280,11 +285,6 @@ class IndexView(CreateView): opennebula_vm_template_id=template_id).first() template_data = VMTemplateSerializer(template).data - name = request.POST.get('name') - email = request.POST.get('email') - name_field = forms.CharField() - email_field = forms.EmailField() - try: cores = cores_field.clean(cores) except ValidationError as err: @@ -312,39 +312,14 @@ class IndexView(CreateView): return HttpResponseRedirect( reverse('datacenterlight:index') + "#order_form") - try: - name = name_field.clean(name) - except ValidationError as err: - msg = '{} {}.'.format(name, _('is not a proper name')) - messages.add_message(self.request, messages.ERROR, msg, - extra_tags='name') - return HttpResponseRedirect( - reverse('datacenterlight:index') + "#order_form") - - try: - email = email_field.clean(email) - except ValidationError as err: - msg = '{} {}.'.format(email, _('is not a proper email')) - messages.add_message(self.request, messages.ERROR, msg, - extra_tags='email') - return HttpResponseRedirect( - reverse('datacenterlight:index') + "#order_form") - specs = { 'cpu': cores, 'memory': memory, 'disk_size': storage, 'price': price } - - this_user = { - 'name': name, - 'email': email - } - request.session['specs'] = specs request.session['template'] = template_data - request.session['user'] = this_user return HttpResponseRedirect(reverse('datacenterlight:payment')) def get_success_url(self): @@ -407,20 +382,19 @@ class WhyDataCenterLightView(IndexView): class PaymentOrderView(FormView): template_name = 'datacenterlight/landing_payment.html' - form_class = BillingAddressForm + + def get_form_class(self): + if self.request.user.is_authenticated(): + return BillingAddressForm + else: + return BillingAddressFormSignup def get_form_kwargs(self): form_kwargs = super(PaymentOrderView, self).get_form_kwargs() - billing_address_data = self.request.session.get('billing_address_data') - if billing_address_data: + # if user is signed in, get billing address + if self.request.user.is_authenticated(): form_kwargs.update({ - 'initial': { - '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'], - } + 'instance': self.request.user.billing_addresses.first() }) return form_kwargs @@ -428,46 +402,75 @@ class PaymentOrderView(FormView): context = super(PaymentOrderView, self).get_context_data(**kwargs) context.update({ 'stripe_key': settings.STRIPE_API_PUBLIC_KEY, - 'site_url': reverse('datacenterlight:index') + 'site_url': reverse('datacenterlight:index'), + 'login_form': HostingUserLoginForm() }) return context @cache_control(no_cache=True, must_revalidate=True, no_store=True) def get(self, request, *args, **kwargs): - if 'specs' not in request.session or 'user' not in request.session: + # user is no longer added to session on the index page + if 'specs' not in request.session: return HttpResponseRedirect(reverse('datacenterlight:index')) return self.render_to_response(self.get_context_data()) def post(self, request, *args, **kwargs): form = self.get_form() if form.is_valid(): - # Get billing address data - billing_address_data = form.cleaned_data token = form.cleaned_data.get('token') - user = request.session.get('user') - try: - CustomUser.objects.get(email=user.get('email')) - except CustomUser.DoesNotExist: - password = CustomUser.get_random_password() - # Register the user, and do not send emails - CustomUser.register(user.get('name'), - password, - user.get('email'), - app='dcl', - base_url=None, send_email=False) - + if request.user.is_authenticated(): + this_user = { + 'email': request.user.email, + 'name': request.user.name + } + custom_user = request.user + 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() + request.session['user'] = this_user # Get or create stripe customer - customer = StripeCustomer.get_or_create(email=user.get('email'), - token=token) + 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)) - # Create Billing Address - billing_address = form.save() - request.session['billing_address_data'] = billing_address_data - request.session['billing_address'] = billing_address.id request.session['token'] = token request.session['customer'] = customer.id return HttpResponseRedirect( @@ -513,8 +516,8 @@ class OrderConfirmationView(DetailView): user = request.session.get('user') stripe_customer_id = request.session.get('customer') customer = StripeCustomer.objects.filter(id=stripe_customer_id).first() - billing_address_data = request.session.get('billing_address_data') - billing_address_id = request.session.get('billing_address') + billing_address_data = {} + billing_address_id = request.user.billing_addresses.first().id vm_template_id = template.get('id', 1) # Make stripe charge to a customer diff --git a/hosting/locale/de/LC_MESSAGES/django.po b/hosting/locale/de/LC_MESSAGES/django.po index ede9b66f..09408293 100644 --- a/hosting/locale/de/LC_MESSAGES/django.po +++ b/hosting/locale/de/LC_MESSAGES/django.po @@ -265,7 +265,7 @@ msgstr "" "Link klickst.
\n" msgid "My VM page" -msgstr "" +msgstr "Meine VM page" #, python-format msgid "" @@ -286,10 +286,10 @@ msgstr "" "%(base_url)s%(my_virtual_machines_url)s\n" msgid "Toggle navigation" -msgstr "Konfiguration" +msgstr "Umschalten" msgid "Dashboard" -msgstr "Mein Dashboard" +msgstr "Dashboard" msgid "Logout" msgstr "Abmelden" @@ -598,7 +598,7 @@ msgid "View Detail" msgstr "Details anzeigen" msgid "login" -msgstr "Einloggen" +msgstr "anmelden" msgid "" "Thank you for signing up. We have sent an email to you. Please follow the " diff --git a/hosting/static/hosting/css/landing-page.css b/hosting/static/hosting/css/landing-page.css index 71b7a33d..5fb46f76 100644 --- a/hosting/static/hosting/css/landing-page.css +++ b/hosting/static/hosting/css/landing-page.css @@ -586,7 +586,7 @@ a.unlink:hover { } .dcl-order-table-total .tbl-total { - text-align: center; + text-align: right; color: #000; padding-left: 44px; } @@ -614,8 +614,8 @@ a.unlink:hover { font-weight: 300; border: 1px solid #a1a1a1; border-radius: 3px; - padding: 5px; - margin-bottom: 15px; + padding: 8px 10px; + margin-bottom: 20px; } .card-warning-error { border: 1px solid #EB4D5C; @@ -656,7 +656,7 @@ a.unlink:hover { .card-element { margin-bottom: 10px; - padding: 0; + /* padding: 0; */ } .card-element label{ @@ -674,12 +674,12 @@ a.unlink:hover { #card-errors { clear: both; - padding: 0 0 10px; + padding: 0 5px 10px; color: #eb4d5c; } .credit-card-goup{ - padding: 0; + padding: 0 5px; } .order-confirm-date{ @@ -854,6 +854,8 @@ a.list-group-item-danger:focus, color: #eb4d5c; } .has-error .form-control, +.has-error .form-control:focus, +.has-error .form-control:active, .has-error .input-group-addon { color: #eb4d5c; border-color: #eb4d5c; @@ -867,3 +869,11 @@ a.list-group-item-danger.active:focus { .panel-danger > .panel-heading .badge { background-color: #eb4d5c; } + +/* bootstrap input box-shadom disable */ +.has-error .form-control:focus, +.has-error .form-control:active, +.has-success .form-control:focus, +.has-success .form-control:active { + box-shadow: inset 0 0 1px rgba(0,0,0,0.25); +} \ No newline at end of file diff --git a/hosting/static/hosting/css/payment.css b/hosting/static/hosting/css/payment.css index 68a36837..b1b0460d 100644 --- a/hosting/static/hosting/css/payment.css +++ b/hosting/static/hosting/css/payment.css @@ -22,7 +22,100 @@ } .summary-box .content { - padding-top: 15px; +} +/* landing page payment new style */ +.last-p { + margin-bottom: 0; +} +.dcl-payment-section { + max-width: 391px; + margin: 0 auto 30px; + padding: 0 10px 30px; + border-bottom: 1px solid #edebeb; + height: 100%; +} +.dcl-payment-section hr{ + margin-top: 15px; + margin-bottom: 15px; +} +.dcl-payment-section .top-hr { + margin-left: -10px; +} +.dcl-payment-section h3 { + font-weight: 600; +} +.dcl-payment-section p { + padding: 0 5px; + font-weight: 400; +} +.dcl-payment-section .card-warning-content { + padding: 8px 10px; + font-weight: 300; +} +.dcl-payment-order strong{ + font-size: 17px; +} +.dcl-payment-order p { + font-weight: 300; +} +.dcl-payment-section .form-group { + margin-bottom: 10px; +} +.dcl-payment-section .form-control { + box-shadow: none; + padding: 6px 12px; + height: 32px; +} +.dcl-payment-user { + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; +} + +.dcl-payment-user h4 { + font-weight: 600; + padding-left: 5px; + font-size: 17px; +} + +@media (min-width: 768px) { + .dcl-payment-grid { + display: flex; + align-items: stretch; + flex-wrap: wrap; + } + .dcl-payment-box { + width: 50%; + position: relative; + padding: 0 30px; + } + .dcl-payment-box:nth-child(2) { + order: 1; + } + .dcl-payment-box:nth-child(4) { + order: 2; + } + .dcl-payment-section { + padding: 15px 10px; + margin-bottom: 0; + border-bottom-width: 5px; + } + .dcl-payment-box:nth-child(2n) .dcl-payment-section { + border-bottom: none; + } + .dcl-payment-box:nth-child(1):after, + .dcl-payment-box:nth-child(2):after { + content: ' '; + display: block; + background: #eee; + width: 1px; + position: absolute; + right: 0; + z-index: 2; + top: 20px; + bottom: 20px; + } } \ No newline at end of file diff --git a/utils/forms.py b/utils/forms.py index c3f3b6db..9ed695c0 100644 --- a/utils/forms.py +++ b/utils/forms.py @@ -113,6 +113,12 @@ class BillingAddressForm(forms.ModelForm): } +class BillingAddressFormSignup(BillingAddressForm): + name = forms.CharField(label=_('Name')) + email = forms.EmailField(label=_('Email Address')) + field_order = ['name', 'email'] + + class UserBillingAddressForm(forms.ModelForm): user = forms.ModelChoiceField(queryset=CustomUser.objects.all(), widget=forms.HiddenInput())