Merge pull request #493 from pcoder/tiwariav-task/3756/landing_billing_page
Tiwariav task/3756/landing billing page
This commit is contained in:
		
				commit
				
					
						ed459c827b
					
				
			
		
					 15 changed files with 711 additions and 403 deletions
				
			
		|  | @ -8,7 +8,7 @@ msgid "" | |||
| msgstr "" | ||||
| "Project-Id-Version: PACKAGE VERSION\n" | ||||
| "Report-Msgid-Bugs-To: \n" | ||||
| "POT-Creation-Date: 2017-09-16 14:09+0000\n" | ||||
| "POT-Creation-Date: 2017-09-23 21:22+0000\n" | ||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | ||||
|  | @ -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" | ||||
| 
 | ||||
|  | @ -151,6 +145,15 @@ msgstr "" | |||
| "Adressleiste deines Browsers.<br/>\n" | ||||
| "%(base_url)s%(activation_link)s\n" | ||||
| 
 | ||||
| #, python-format | ||||
| msgid "" | ||||
| "Your account details are as follows:<br/><br/>\n" | ||||
| "Username : Your email address<br/>\n" | ||||
| "Password : %(account_details)s<br/><br/>\n" | ||||
| "You can reset your password here:\n" | ||||
| "%(base_url)s%(reset_password_url)s\n" | ||||
| msgstr "" | ||||
| 
 | ||||
| #, python-format | ||||
| msgid "" | ||||
| "You can activate your Data Center Light account by clicking here.\n" | ||||
|  | @ -163,6 +166,17 @@ msgstr "" | |||
| "den folgenden Link in die Adressleiste deines Browsers.\n" | ||||
| "%(base_url)s%(activation_link)s\n" | ||||
| 
 | ||||
| #, python-format | ||||
| msgid "" | ||||
| "Your account details are as follows:\n" | ||||
| "\n" | ||||
| "Username : Your email address\n" | ||||
| "Password : %(account_details)s\n" | ||||
| "\n" | ||||
| "You can reset your password here:\n" | ||||
| "%(base_url)s%(reset_password_url)s\n" | ||||
| msgstr "" | ||||
| 
 | ||||
| msgid "Home" | ||||
| msgstr "Home" | ||||
| 
 | ||||
|  | @ -264,6 +278,45 @@ 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?<br>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 "Sign up" | ||||
| msgstr "Registrieren" | ||||
| 
 | ||||
| msgid "Billing Address" | ||||
| msgstr "Rechnungsadresse" | ||||
| 
 | ||||
| msgid "Your Order" | ||||
| msgstr "Deine Bestellung" | ||||
| 
 | ||||
|  | @ -288,23 +341,15 @@ msgstr "inkl. Mehrwertsteuer" | |||
| msgid "Month" | ||||
| msgstr "Monat" | ||||
| 
 | ||||
| msgid "Billing Address" | ||||
| msgstr "Rechnungsadresse" | ||||
| 
 | ||||
| msgid "Credit Card" | ||||
| msgstr "Kreditkarte" | ||||
| 
 | ||||
| msgid "" | ||||
| "\n" | ||||
| "                                Please fill in your credit card information " | ||||
| "below. We are using <a\n" | ||||
| "                                    href=\"https://stripe.com\" target=" | ||||
| "\"_blank\">Stripe</a> for payment and do not store\n" | ||||
| "                                your information in our database.\n" | ||||
| "                                " | ||||
| "Please fill in your credit card information below. We are using <a href=" | ||||
| "\"https://stripe.com\" target=\"_blank\">Stripe</a> for payment and do not " | ||||
| "store your information in our database." | ||||
| msgstr "" | ||||
| "\n" | ||||
| "Bitte füll Deine Kreditkarteninformationen unten aus. Wir nutzen <a href=" | ||||
| "Bitte fülle Deine Kreditkarteninformationen unten aus. Wir nutzen <a href=" | ||||
| "\"https://stripe.com\" target=\"_blank\">Stripe</a> für die Bezahlung und " | ||||
| "speichern keine Informationen in unserer Datenbank." | ||||
| 
 | ||||
|  | @ -330,6 +375,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" | ||||
| 
 | ||||
|  | @ -365,6 +417,15 @@ msgstr "" | |||
| msgid "Place order" | ||||
| msgstr "Bestellen" | ||||
| 
 | ||||
| msgid "Processing..." | ||||
| msgstr "Abarbeitung..." | ||||
| 
 | ||||
| msgid "Hold tight, we are processing your request" | ||||
| msgstr "Bitte warten - wir verbeiten Deine Anfrage gerade" | ||||
| 
 | ||||
| msgid "Some problem encountered. Please try again later." | ||||
| msgstr "Ein Problem ist aufgetreten. Bitte versuche es später noch einmal." | ||||
| 
 | ||||
| msgid "We are cutting down the costs significantly!" | ||||
| msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen" | ||||
| 
 | ||||
|  | @ -479,11 +540,38 @@ 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 "Error." | ||||
| msgstr "" | ||||
| 
 | ||||
| msgid "is not a proper email" | ||||
| msgstr "ist keine gültige E-Mailadresse" | ||||
| msgid "" | ||||
| "There was a payment related error. On close of this popup, you will be " | ||||
| "redirected back to the payment page." | ||||
| msgstr "" | ||||
| 
 | ||||
| msgid "Thank you for the order." | ||||
| msgstr "Danke für Deine Bestellung." | ||||
| 
 | ||||
| msgid "" | ||||
| "Your VM will be up and running in a few moments. We will send you a " | ||||
| "confirmation email as soon as it is ready." | ||||
| msgstr "" | ||||
| "Deine VM ist gleich bereit. Wir senden Dir eine Bestätigungsemail, sobald Du " | ||||
| "auf sie zugreifen kannst." | ||||
| 
 | ||||
| #~ 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" | ||||
|  |  | |||
|  | @ -80,43 +80,6 @@ | |||
|         <!--<div class="description check-ip"> | ||||
|             <input type="checkbox" name="ipv6"> Ipv6 Only<br> | ||||
|         </div>--> | ||||
|         <div class="form-group"> | ||||
|             <div class="description input justify-center"> | ||||
|                 <label for="name" class="control-label">{% trans "Name"%}</label> | ||||
|                 <input type="text" name="name" class="form-control" placeholder="{% trans 'Your Name'%}" | ||||
|                        data-minlength="3" data-error="{% trans 'Please enter your name.' %}" required> | ||||
|             </div> | ||||
|             <div class="help-block with-errors"> | ||||
|                 {% for message in messages %} | ||||
|                 {% if 'name' in message.tags %} | ||||
|                 <ul class="list-unstyled"> | ||||
|                     <li> | ||||
|                         {{ message|safe }} | ||||
|                     </li> | ||||
|                 </ul> | ||||
|                 {% endif %} | ||||
|                 {% endfor %} | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="form-group"> | ||||
|             <div class="description input justify-center"> | ||||
|                 <label for="email" class="control-label">{% trans "Email"%}</label> | ||||
|                 <input name="email" type="email" pattern="^[^@\s]+@([^@\s]+\.)+[^@\s]+$" class="form-control" | ||||
|                        placeholder="{% trans 'Your Email' %}" | ||||
|                        data-error="{% trans 'Please enter a valid email address.' %}" required> | ||||
|             </div> | ||||
|             <div class="help-block with-errors"> | ||||
|                 {% for message in messages %} | ||||
|                 {% if 'email' in message.tags %} | ||||
|                 <ul class="list-unstyled"> | ||||
|                     <li> | ||||
|                         {{ message|safe }} | ||||
|                     </li> | ||||
|                 </ul> | ||||
|                 {% endif %} | ||||
|                 {% endfor %} | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
|     <input type="submit" class="btn btn-primary disabled" value="{% trans 'Continue' %}"></input> | ||||
| </form> | ||||
|  |  | |||
|  | @ -11,4 +11,14 @@ You can also copy and paste the following link into the address bar of your brow | |||
| to activate your Data Center Light account.<br/> | ||||
| {{base_url}}{{activation_link}} | ||||
| {% endblocktrans %} | ||||
| {% if account_details %} | ||||
| {% url 'hosting:reset_password' as reset_password_url %} | ||||
| <br/><br/> | ||||
| {% blocktrans %}Your account details are as follows:<br/><br/> | ||||
| Username : Your email address<br/> | ||||
| Password : {{account_details}}<br/><br/> | ||||
| You can reset your password here: | ||||
| {{base_url}}{{reset_password_url}} | ||||
| {% endblocktrans %} | ||||
| {% endif %} | ||||
| {% endblock %} | ||||
|  |  | |||
|  | @ -7,4 +7,15 @@ You can also copy and paste the following link into the address bar of your brow | |||
| to activate your Data Center Light account. | ||||
| {{base_url}}{{activation_link}} | ||||
| {% endblocktrans %} | ||||
| {% if account_details %} | ||||
| {% url 'hosting:reset_password' as reset_password_url %} | ||||
| {% blocktrans %}Your account details are as follows: | ||||
| 
 | ||||
| Username : Your email address | ||||
| Password : {{account_details}} | ||||
| 
 | ||||
| You can reset your password here: | ||||
| {{base_url}}{{reset_password_url}} | ||||
| {% endblocktrans %} | ||||
| {% endif %} | ||||
| {% endblock %} | ||||
|  |  | |||
|  | @ -1,190 +1,182 @@ | |||
| {% extends "hosting/base_short.html" %} | ||||
| {% load staticfiles bootstrap3 i18n %} | ||||
| 
 | ||||
| {% block css_extra %} | ||||
|     <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/paymentfont/1.1.2/css/paymentfont.min.css"/> | ||||
| {% endblock css_extra %} | ||||
| 
 | ||||
| {% block navbar %} | ||||
|     {% include "datacenterlight/includes/_navbar.html" %} | ||||
| {% endblock navbar %} | ||||
| 
 | ||||
| {% block content %} | ||||
| <!-- Credit card form --> | ||||
| <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/paymentfont/1.1.2/css/paymentfont.min.css"/> | ||||
| <div class="dcl-order-container"> | ||||
|     <div class="payment-container"> | ||||
|         <div class="row"> | ||||
|             <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 dcl-order-sec"> | ||||
|                 <h3><strong>{%trans "Your Order" %}</strong></h3> | ||||
|                 <div class="col-xs-6 col-sm-12 col-md-12 col-lg-12 dcl-order-table-header"> | ||||
|                     <div class="col-xs-12 col-sm-2 col-md-1 col-lg-1 tbl-header"> | ||||
|                         {%trans "Cores" %} | ||||
|                     </div> | ||||
|                     <div class="col-xs-12 col-sm-3 col-md-4 col-lg-4 tbl-header"> | ||||
|                         {%trans "Memory" %} | ||||
|                     </div> | ||||
|                     <div class="col-xs-12 col-sm-3 col-md-3 col-lg-3 tbl-header"> | ||||
|                         {%trans "Disk space" %} | ||||
|                     </div> | ||||
|                     <div class="col-xs-12 col-sm-4 col-md-4 col-lg-4 tbl-header"> | ||||
|                         {%trans "Configuration" %} | ||||
|                     </div> | ||||
|                 </div> | ||||
|                 <div class="col-xs-6 col-sm-12 col-md-12 col-lg-12 dcl-order-table-content"> | ||||
|                     <div class="col-xs-12 col-sm-2 col-md-1 col-lg-1 tbl-content"> | ||||
|                         {{request.session.specs.cpu|floatformat}} | ||||
|                     </div> | ||||
|                     <div class="col-xs-12 col-sm-3 col-md-4 col-lg-4 tbl-content"> | ||||
|                         {{request.session.specs.memory|floatformat}} GB | ||||
|                     </div> | ||||
|                     <div class="col-xs-12 col-sm-3 col-md-3 col-lg-3 tbl-content"> | ||||
|                         {{request.session.specs.disk_size|floatformat}} GB | ||||
|                     </div> | ||||
|                     <div class="col-xs-12 col-sm-4 col-md-4 col-lg-4 tbl-content"> | ||||
|                         {{request.session.template.name}} | ||||
|                     </div> | ||||
|                 </div> | ||||
|                 <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 dcl-order-table-total"> | ||||
|                     <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 tbl-tot tbl-no-padding"> | ||||
|                         {%trans "Total" %} <span>{%trans "including VAT" %}</span> | ||||
|                     </div> | ||||
|                     <div class="col-xs-6 col-sm-6 col-md-6 col-lg-6 tbl-no-padding"> | ||||
|                         <div class="col-xs-12 col-sm-4 col-md-4 col-lg-4"></div> | ||||
|                         <div class="col-xs-12 col-sm-6 col-md-6 col-lg-6 tbl-total">{{request.session.specs.price}} | ||||
|                             CHF<span class="dcl-price-month">/{% trans "Month" %}</span> | ||||
|         <div class="dcl-payment-grid"> | ||||
|             <div class="dcl-payment-box"> | ||||
|                 <div class="dcl-payment-section"> | ||||
|                     {% if request.user.is_authenticated %} | ||||
|                         <div class="dcl-payment-user"> | ||||
|                             <h4>{% trans "Welcome back" %} {{request.user.name}}!</h4> | ||||
|                             <p>{% trans "Review your billing address and card details and proceed to make payment." %}</p> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     {% else %} | ||||
|                         <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> | ||||
|                             {% for field in login_form %} | ||||
|                             {% csrf_token %} | ||||
|                             {% bootstrap_field field show_label=False type='fields'%} | ||||
|                             {% endfor %} | ||||
|                             <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> | ||||
|                             </div> | ||||
|                         </form> | ||||
|                         <p> | ||||
|                             {% trans "Don't have an account yet?" %}<br> | ||||
|                             {% trans "You can sign up by filling in the information below." %}<br> | ||||
|                             <a href="{% url 'hosting:reset_password' %}">{% trans "Forgot password?" %}</a> | ||||
|                         </p> | ||||
|                     {% endif %} | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|         <div class="row"> | ||||
|             <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 dcl-billing-sec"> | ||||
|                 <div class="col-xs-12 col-sm-5 col-md-6  billing dcl-billing"> | ||||
|                     <h3><b>{%trans "Billing Address"%}</b></h3> | ||||
|                     <hr> | ||||
|             <div class="dcl-payment-box"> | ||||
|                 <div class="dcl-payment-section"> | ||||
|                     {% if not request.user.is_authenticated %} | ||||
|                         <h3><b>{%trans "Sign up"%}</b></h3> | ||||
|                     {% else %} | ||||
|                         <h3><b>{%trans "Billing Address"%}</b></h3> | ||||
|                     {% endif %} | ||||
|                     <hr class="top-hr"> | ||||
|                     {% for message in messages %} | ||||
|                         {% if 'duplicate_email' in message.tags %} | ||||
|                         <p class="text-danger">{{message}}</p> | ||||
|                         {% endif %} | ||||
|                     {% endfor %} | ||||
|                     <form role="form" id="billing-form" method="post" action="" novalidate> | ||||
|                         {% for field in form %} | ||||
|                         {% csrf_token %} | ||||
|                         {% for field in form %} | ||||
|                         {% bootstrap_field field show_label=False type='fields'%} | ||||
|                         {% endfor %} | ||||
|                     </form> | ||||
|                 </div> | ||||
|                 <div class="col-xs-12 col-sm-7 col-md-6 creditcard-box dcl-creditcard"> | ||||
|             </div> | ||||
|             <div class="dcl-payment-box"> | ||||
|                 <div class="dcl-payment-section"> | ||||
|                     <h3>{%trans "Your Order" %}</h3> | ||||
|                     <hr class="top-hr"> | ||||
|                     <div class="dcl-payment-order"> | ||||
|                         <p>{% trans "Cores"%} <strong class="pull-right">{{request.session.specs.cpu|floatformat}}</strong></p> | ||||
|                         <hr> | ||||
|                         <p>{% trans "Memory"%} <strong class="pull-right">{{request.session.specs.memory|floatformat}} GB</strong></p> | ||||
|                         <hr> | ||||
|                         <p>{% trans "Disk space"%} <strong class="pull-right">{{request.session.specs.disk_size|floatformat}} GB</strong></p> | ||||
|                         <hr> | ||||
|                         <p>{% trans "Configuration"%} <strong class="pull-right">{{request.session.template.name}}</strong></p> | ||||
|                         <hr> | ||||
|                         <p class="last-p"><strong>{%trans "Total" %}</strong>  <small>({%trans "including VAT" %})</small> <strong class="pull-right">{{request.session.specs.price}} CHF/{% trans "Month" %}</strong></p> | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|             <div class="dcl-payment-box"> | ||||
|                 <div class="dcl-payment-section"> | ||||
|                     <h3><b>{%trans "Credit Card"%}</b></h3> | ||||
|                     <hr> | ||||
|                     <hr class="top-hr"> | ||||
|                     <p> | ||||
|                         {% blocktrans %}Please fill in your credit card information below. We are using <a href="https://stripe.com" target="_blank">Stripe</a> for payment and do not store your information in our database.{% endblocktrans %} | ||||
|                     </p> | ||||
|                     <div> | ||||
|                         <div> | ||||
|                             <p> | ||||
|                                 {% blocktrans %} | ||||
|                                 Please fill in your credit card information below. We are using <a | ||||
|                                     href="https://stripe.com" target="_blank">Stripe</a> for payment and do not store | ||||
|                                 your information in our database. | ||||
|                                 {% endblocktrans %} | ||||
|                             </p> | ||||
|                         </div> | ||||
|                         <br> | ||||
|                         <div> | ||||
|                             {% if credit_card_data.last4 %} | ||||
|                         {% if credit_card_data.last4 %} | ||||
|                             <form role="form" id="payment-form-with-creditcard" novalidate> | ||||
|                                 <h5 class="billing-head">Credit Card</h5> | ||||
|                                 <h5 class="membership-lead">Last 4: *****{{credit_card_data.last4}}</h5> | ||||
|                                 <h5 class="membership-lead">Type: {{credit_card_data.cc_brand}}</h5> | ||||
|                                 <input type="hidden" name="credit_card_needed" value="false"/> | ||||
|                             </form> | ||||
|                             <div class="row"> | ||||
|                                 <div class="col-xs-12"> | ||||
|                                         {% if not messages and not form.non_field_errors %} | ||||
|                                             <p class="card-warning-content card-warning-addtional-margin"> | ||||
|                                                 {% trans "You are not making any payment yet. After submitting your card information, you will be taken to the Confirm Order Page." %} | ||||
|                                             </p> | ||||
|                                         {% endif %} | ||||
|                                         <div id='payment_error'> | ||||
|                                             {% for message in messages %} | ||||
|                                                 {% if 'failed_payment' or 'make_charge_error' in message.tags %} | ||||
|                                                  <ul class="list-unstyled"><li> | ||||
|                                                      <p class="card-warning-content card-warning-error">{{ message|safe }}</p> | ||||
|                                                 </li></ul> | ||||
|                                                 {% endif %} | ||||
|                                             {% endfor %} | ||||
|                                             {% for error in form.non_field_errors %} | ||||
|                                                 <p class="card-warning-content card-warning-error"> | ||||
|                                                     {{ error|escape }} | ||||
|                                                 </p> | ||||
|                                             {% endfor %} | ||||
|                                         </div> | ||||
|                                     </div> | ||||
|                                 <div class="col-xs-12"> | ||||
|                                     <div class="col-xs-6 pull-right"> | ||||
|                                         <button id="payment_button_with_creditcard" class="btn btn-success stripe-payment-btn" | ||||
|                                                 type="submit"> | ||||
|                                             {%trans "Submit" %} | ||||
|                                         </button> | ||||
|                                     </div> | ||||
|                                 </div> | ||||
|                             {% if not messages and not form.non_field_errors %} | ||||
|                                 <p class="card-warning-content card-warning-addtional-margin"> | ||||
|                                     {% trans "You are not making any payment yet. After submitting your card information, you will be taken to the Confirm Order Page." %} | ||||
|                                 </p> | ||||
|                             {% endif %} | ||||
|                             <div id='payment_error'> | ||||
|                                 {% for message in messages %} | ||||
|                                     {% if 'failed_payment' or 'make_charge_error' in message.tags %} | ||||
|                                      <ul class="list-unstyled"><li> | ||||
|                                          <p class="card-warning-content card-warning-error">{{ message|safe }}</p> | ||||
|                                     </li></ul> | ||||
|                                     {% endif %} | ||||
|                                 {% endfor %} | ||||
|                                 {% for error in form.non_field_errors %} | ||||
|                                     <p class="card-warning-content card-warning-error"> | ||||
|                                         {{ error|escape }} | ||||
|                                     </p> | ||||
|                                 {% endfor %} | ||||
|                             </div> | ||||
| 
 | ||||
|                             {% else %} | ||||
|                             <div class="text-right"> | ||||
|                                 <button id="payment_button_with_creditcard" class="btn btn-success btn-vm-contact" type="submit">{%trans "Submit" %}</button> | ||||
|                             </div> | ||||
|                         {% else %} | ||||
|                             <form action="" id="payment-form-new" method="POST"> | ||||
|                                 <input type="hidden" name="token"/> | ||||
|                                 <div class="group"> | ||||
|                                     <div class="col-xs-12 col-sm-12 col-md-10 col-lg-9 credit-card-goup"> | ||||
|                                        <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 card-element card-number-element"> | ||||
|                                     <div class="credit-card-goup"> | ||||
|                                        <div class="card-element card-number-element"> | ||||
|                                            <label>{%trans "Card Number" %}</label> | ||||
|                                            <div id="card-number-element" class="field my-input"></div> | ||||
|                                        </div> | ||||
|                                        <div class="col-xs-5 col-sm-3 col-md-3 col-lg-3 card-element card-expiry-element"> | ||||
|                                            <label>{%trans "Expiry Date" %}</label> | ||||
|                                            <div id="card-expiry-element" class="field my-input"></div> | ||||
|                                        <div class="row"> | ||||
|                                            <div class="col-xs-5 card-element card-expiry-element"> | ||||
|                                                <label>{%trans "Expiry Date" %}</label> | ||||
|                                                <div id="card-expiry-element" class="field my-input"></div> | ||||
|                                            </div> | ||||
|                                            <div class="col-xs-3 col-xs-offset-4 card-element card-cvc-element"> | ||||
|                                                <label>{%trans "CVC" %}</label> | ||||
|                                                <div id="card-cvc-element" class="field my-input"></div> | ||||
|                                            </div> | ||||
|                                        </div> | ||||
|                                        <div class="col-xs-12 col-sm-2 col-md-6 col-lg-7 hide-mobile"></div> | ||||
|                                        <div class="col-xs-3 col-sm-3 col-md-3 col-lg-2 card-element card-cvc-element"> | ||||
|                                            <label>{%trans "CVC" %}</label> | ||||
|                                            <div id="card-cvc-element" class="field my-input"></div> | ||||
|                                        </div> | ||||
|                                        <div class="col-xs-12 col-sm-12 col-md-12 col-lg-12 card-element brand"> | ||||
|                                        <div class="card-element brand"> | ||||
|                                            <label>{%trans "Card Type" %}</label> | ||||
|                                            <i class="pf pf-credit-card" id="brand-icon"></i> | ||||
|                                        </div> | ||||
|                                     </div> | ||||
|                                 </div> | ||||
|                                 <div id="card-errors" role="alert"></div> | ||||
|                                 <div class="row"> | ||||
|                                     <div class="col-xs-12"> | ||||
|                                         {% if not messages and not form.non_field_errors %} | ||||
|                                 <div id="card-errors"></div> | ||||
|                                 {% if not messages and 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 %} | ||||
|                                 <div id='payment_error'> | ||||
|                                     {% for message in messages %} | ||||
|                                         {% if 'failed_payment' in message.tags or 'make_charge_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 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." %} | ||||
|                                             </p> | ||||
|                                         {% endif %} | ||||
|                                         <div id='payment_error'> | ||||
|                                             {% for message in messages %} | ||||
|                                                 {% if 'failed_payment' or 'make_charge_error' in message.tags %} | ||||
|                                                  <ul class="list-unstyled"><li> | ||||
|                                                      <p class="card-warning-content card-warning-error">{{ message|safe }}</p> | ||||
|                                                 </li></ul> | ||||
|                                                 {% endif %} | ||||
|                                             {% endfor %} | ||||
|                                     {% endfor %} | ||||
| 
 | ||||
|                                             {% for error in form.non_field_errors %} | ||||
|                                                 <p class="card-warning-content card-warning-error"> | ||||
|                                                     {{ error|escape }} | ||||
|                                                 </p> | ||||
|                                             {% endfor %} | ||||
|                                         </div> | ||||
|                                     </div> | ||||
|                                     <div class="col-xs-12"> | ||||
|                                         <div class="col-xs-6 pull-right"> | ||||
|                                             <button class="btn btn-success stripe-payment-btn" type="submit">{%trans "Submit" %} | ||||
|                                             </button> | ||||
|                                         </div> | ||||
|                                     </div> | ||||
|                                     {% 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> | ||||
|                                 </div> | ||||
| 
 | ||||
|                                 <div class="row" style="display:none;"> | ||||
|                                     <div class="col-xs-12"> | ||||
|                                         <p class="payment-errors"></p> | ||||
|                                     </div> | ||||
|                                 <div style="display:none;"> | ||||
|                                     <p class="payment-errors"></p> | ||||
|                                 </div> | ||||
|                             </form> | ||||
| 
 | ||||
|                             {% endif %} | ||||
|                         </div> | ||||
|                         {% endif %} | ||||
|                     </div> | ||||
|                 </div> | ||||
|             </div> | ||||
|  |  | |||
|  | @ -9,98 +9,135 @@ | |||
| 
 | ||||
| {% block content %} | ||||
| 
 | ||||
|     <div class="order-detail-container"> | ||||
|        {% if messages %} | ||||
|             <div class="row"> | ||||
|                 <div class="col-xs-12 col-md-8 col-md-offset-2"> | ||||
|                     <br/> | ||||
|                     <div class="alert alert-warning"> | ||||
|                         {% for message in messages %} | ||||
|                         <span>{{ message }}</span> | ||||
|                         {% endfor %} | ||||
|                     </div> | ||||
| <div class="order-detail-container"> | ||||
|    {% if messages %} | ||||
|         <div class="row"> | ||||
|             <div class="col-xs-12 col-md-8 col-md-offset-2"> | ||||
|                 <br/> | ||||
|                 <div class="alert alert-warning"> | ||||
|                     {% for message in messages %} | ||||
|                     <span>{{ message }}</span> | ||||
|                     {% endfor %} | ||||
|                 </div> | ||||
|             </div> | ||||
|         {% endif %} | ||||
|         {% if not error %} | ||||
|             <div class="row"> | ||||
|                 <div class="col-xs-12 col-md-8 col-md-offset-2"> | ||||
|                     <div class="invoice-title"> | ||||
|                         <h2>{% trans "Confirm Order"%}</h2> | ||||
|                     </div> | ||||
|                     <hr> | ||||
|                     <div class="row"> | ||||
|                         <div class="col-xs-12 col-sm-6 pull-right order-confirm-date"> | ||||
|                             <address> | ||||
|                                 <strong>{% trans "Date"%}:</strong><br> | ||||
|                                 <span id="order-created_at">{% now "Y-m-d H:i" %}</span><br><br> | ||||
|                             </address> | ||||
|                         </div> | ||||
|                         <div class="col-xs-12 col-sm-6"> | ||||
|                             <address> | ||||
|                             <h3><b>{% trans "Billed To:"%}</b></h3> | ||||
|                             {% with request.session.billing_address_data as billing_address %} | ||||
|                                 {{billing_address|get_value_from_dict:'cardholder_name'}}<br> {{billing_address|get_value_from_dict:'street_address'}}, {{billing_address|get_value_from_dict:'postal_code'}}<br> | ||||
|                                 {{billing_address|get_value_from_dict:'city'}}, {{billing_address|get_value_from_dict:'country'}}. | ||||
|                             {% endwith %} | ||||
|                             </address> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                     <div class="row"> | ||||
|                         <div class="col-xs-6"> | ||||
|                             <address> | ||||
|                                 <strong>{% trans "Payment Method:"%}</strong><br> | ||||
|                                     {{cc_brand}} {% trans "ending in" %} **** {{cc_last4}}<br> | ||||
|                                     {{request.session.user.email}} | ||||
|                             </address> | ||||
|                         </div> | ||||
|                     </div> | ||||
|         </div> | ||||
|     {% endif %} | ||||
|     {% if not error %} | ||||
|         <div class="row"> | ||||
|             <div class="col-xs-12 col-md-8 col-md-offset-2"> | ||||
|                 <div class="invoice-title"> | ||||
|                     <h2>{% trans "Confirm Order"%}</h2> | ||||
|                 </div> | ||||
|             </div> | ||||
| 
 | ||||
|             <div class="row"> | ||||
|                 <div class="col-md-8 col-md-offset-2"> | ||||
|                     <h3><b>{% trans "Order summary"%}</b></h3> | ||||
|                     <hr> | ||||
|                     <div class="content"> | ||||
|                         {% with request.session.specs as vm %} | ||||
|                             <p><b>{% trans "Cores"%}</b> <span class="pull-right">{{vm.cpu}}</span></p> | ||||
|                             <hr> | ||||
|                             <p><b>{% trans "Memory"%}</b> <span class="pull-right">{{vm.memory}} GB</span></p> | ||||
|                             <hr> | ||||
|                             <p><b>{% trans "Disk space"%}</b> <span class="pull-right">{{vm.disk_size}} GB</span></p> | ||||
|                             <hr> | ||||
|                             <p><b>{% trans "Configuration"%}</b> <span class="pull-right">{{request.session.template.name}}</span></p> | ||||
|                             <hr> | ||||
|                             <h4>{% trans "Total"%}<p class="pull-right"><b>{{vm.price}} CHF</b><span class="dcl-price-month"> /{% trans "Month" %}</span></p></h4> | ||||
|                 <hr> | ||||
|                 <div class="row"> | ||||
|                     <div class="col-xs-12 col-sm-6 pull-right order-confirm-date"> | ||||
|                         <address> | ||||
|                             <strong>{% trans "Date"%}:</strong><br> | ||||
|                             <span id="order-created_at">{% now "Y-m-d H:i" %}</span><br><br> | ||||
|                         </address> | ||||
|                     </div> | ||||
|                     <div class="col-xs-12 col-sm-6"> | ||||
|                         <address> | ||||
|                         <h3><b>{% trans "Billed To:"%}</b></h3> | ||||
|                         {% with billing_address_data as billing_address %} | ||||
|                             {{billing_address.cardholder_name}}<br> {{billing_address.street_address}}, {{billing_address.postal_code}}<br> | ||||
|                             {{billing_address.city}}, {{billing_address.country}}. | ||||
|                         {% endwith %} | ||||
|                         </address> | ||||
|                     </div> | ||||
|                 </div> | ||||
|                 <div class="row"> | ||||
|                     <div class="col-xs-6"> | ||||
|                         <address> | ||||
|                             <strong>{% trans "Payment Method:"%}</strong><br> | ||||
|                                 {{cc_brand}} {% trans "ending in" %} **** {{cc_last4}}<br> | ||||
|                                 {{request.session.user.email}} | ||||
|                         </address> | ||||
|                     </div> | ||||
|                     <br/> | ||||
|                     <form method="post"> | ||||
|                         {% csrf_token %} | ||||
|                         <div class="row"> | ||||
|                             <div class="col-sm-8"> | ||||
|                                 <p class="dcl-place-order-text">{% blocktrans with vm_price=request.session.specs.price %}By clicking "Place order" this plan will charge your credit card account with the fee of {{ vm_price }}CHF/month{% endblocktrans %}.</p> | ||||
|                             </div> | ||||
|                             <div class="col-sm-4 content"> | ||||
|                                 <a href="{{next_url}}" ><button class="btn btn-info pull-right">{% trans "Place order"%}</button></a> | ||||
|                             </div> | ||||
|                         </div> | ||||
|                     </form> | ||||
|                 </div> | ||||
|             </div> | ||||
|         {% endif %} | ||||
|         </div> | ||||
| 
 | ||||
|         <div class="row"> | ||||
|             <div class="col-md-8 col-md-offset-2"> | ||||
|                 <h3><b>{% trans "Order summary"%}</b></h3> | ||||
|                 <hr> | ||||
|                 <div class="content"> | ||||
|                     {% with request.session.specs as vm %} | ||||
|                         <p><b>{% trans "Cores"%}</b> <span class="pull-right">{{vm.cpu}}</span></p> | ||||
|                         <hr> | ||||
|                         <p><b>{% trans "Memory"%}</b> <span class="pull-right">{{vm.memory}} GB</span></p> | ||||
|                         <hr> | ||||
|                         <p><b>{% trans "Disk space"%}</b> <span class="pull-right">{{vm.disk_size}} GB</span></p> | ||||
|                         <hr> | ||||
|                         <p><b>{% trans "Configuration"%}</b> <span class="pull-right">{{request.session.template.name}}</span></p> | ||||
|                         <hr> | ||||
|                         <h4>{% trans "Total"%}<p class="pull-right"><b>{{vm.price}} CHF</b><span class="dcl-price-month"> /{% trans "Month" %}</span></p></h4> | ||||
|                     {% endwith %} | ||||
|                 </div> | ||||
|                 <br/> | ||||
|                 <form method="post" id="virtual_machine_create_form"> | ||||
|                     {% csrf_token %} | ||||
|                     <div class="row"> | ||||
|                         <div class="col-sm-8"> | ||||
|                             <p class="dcl-place-order-text">{% blocktrans with vm_price=request.session.specs.price %}By clicking "Place order" this plan will charge your credit card account with the fee of {{ vm_price }}CHF/month{% endblocktrans %}.</p> | ||||
|                         </div> | ||||
|                         <div class="col-sm-4 content"> | ||||
|                             <button class="btn btn-info pull-right" | ||||
|                                     id="btn-create-vm" | ||||
|                                     data-href="{% url 'hosting:order-confirmation' %}" | ||||
|                                     data-toggle="modal" | ||||
|                                     data-target="#createvm-modal"> | ||||
|                                 {% trans "Place order"%} | ||||
|                             </button> | ||||
|                         </div> | ||||
|                     </div> | ||||
|                 </form> | ||||
|             </div> | ||||
|         </div> | ||||
|     {% endif %} | ||||
| </div> | ||||
| <!-- Create VM Modal --> | ||||
| <div class="modal fade" id="createvm-modal" tabindex="-1" role="dialog" | ||||
|      aria-hidden="true" data-backdrop="static" data-keyboard="false"> | ||||
|     <div class="modal-dialog"> | ||||
|         <div class="modal-content"> | ||||
|             <div class="modal-header"> | ||||
|                 <button type="button" class="close hidden" data-dismiss="modal" | ||||
|                         aria-label="create-vm-close"> | ||||
|                     <span aria-hidden="true">×</span> | ||||
|                 </button> | ||||
|             </div> | ||||
|             <div class="modal-body"> | ||||
|                 <div class="modal-icon"> | ||||
|                     <i class="fa fa-cog fa-spin fa-3x fa-fw"></i> | ||||
|                     <span class="sr-only">{% trans "Processing..." %}</span> | ||||
|                 </div> | ||||
|                 <h4 class="modal-title" id="createvm-modal-title"> | ||||
|                 </h4> | ||||
|                 <div class="modal-text" id="createvm-modal-body"> | ||||
|                     {% trans "Hold tight, we are processing your request" %} | ||||
|                 </div> | ||||
|                 <div class="modal-footer"> | ||||
|                     <a id="createvm-modal-done-btn" class="btn btn-success btn-ok btn-wide hide" href="">{% trans "OK" %}</a> | ||||
|                     <button id="createvm-modal-close-btn" type="button" class="btn btn-danger btn-ok btn-wide hide" data-dismiss="modal" aria-label="create-vm-close">{% trans "Close" %}</button> | ||||
|                 </div> | ||||
|             </div> | ||||
|         </div> | ||||
|     </div> | ||||
| </div> | ||||
| <!-- / Create VM Modal --> | ||||
| 
 | ||||
| 
 | ||||
|     <script type="text/javascript"> | ||||
| <script type="text/javascript"> | ||||
|     {% trans "Some problem encountered. Please try again later." as err_msg %} | ||||
|     var create_vm_error_message = '{{err_msg|safe}}.'; | ||||
| 
 | ||||
|         window.onload = function () { | ||||
|                 var locale_date = moment.utc(document.getElementById("order-created_at").textContent,'YYYY-MM-DD HH:mm').toDate(); | ||||
|                 locale_date =  moment(locale_date).format("YYYY-MM-DD h:mm:ss a"); | ||||
|                 document.getElementById('order-created_at').innerHTML = locale_date; | ||||
|     window.onload = function () { | ||||
|         var locale_date = moment.utc(document.getElementById("order-created_at").textContent,'YYYY-MM-DD HH:mm').toDate(); | ||||
|         locale_date =  moment(locale_date).format("YYYY-MM-DD h:mm:ss a"); | ||||
|         document.getElementById('order-created_at').innerHTML = locale_date; | ||||
|     }; | ||||
| 
 | ||||
|         }; | ||||
| 
 | ||||
|     </script> | ||||
| </script> | ||||
| {%endblock%} | ||||
|  |  | |||
|  | @ -1,19 +1,26 @@ | |||
| import logging | ||||
| import json | ||||
| 
 | ||||
| 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 | ||||
| from django.http import HttpResponseRedirect, HttpResponse | ||||
| from django.shortcuts import render | ||||
| from django.utils.translation import ugettext_lazy as _ | ||||
| from django.utils.translation import get_language, ugettext_lazy as _ | ||||
| from django.views.decorators.cache import cache_control | ||||
| 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.serializers import VMTemplateSerializer | ||||
| from utils.forms import BillingAddressForm | ||||
| from utils.forms import ( | ||||
|     BillingAddressForm, BillingAddressFormSignup, UserBillingAddressForm | ||||
| ) | ||||
| from utils.hosting_utils import get_vm_price | ||||
| from utils.mailer import BaseEmail | ||||
| from utils.stripe_utils import StripeUtils | ||||
|  | @ -21,6 +28,8 @@ from utils.tasks import send_plain_email_task | |||
| from .forms import BetaAccessForm, ContactForm | ||||
| from .models import BetaAccess, BetaAccessVMType, BetaAccessVM, VMTemplate | ||||
| 
 | ||||
| logger = logging.getLogger(__name__) | ||||
| 
 | ||||
| 
 | ||||
| class ContactUsView(FormView): | ||||
|     template_name = "datacenterlight/contact_form.html" | ||||
|  | @ -227,11 +236,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: | ||||
|  | @ -258,39 +262,16 @@ class IndexView(CreateView): | |||
|                                  extra_tags='storage') | ||||
|             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") | ||||
| 
 | ||||
|         amount_to_be_charged = get_vm_price(cpu=cores, memory=memory, | ||||
|                                             disk_size=storage) | ||||
|         specs = { | ||||
|             'cpu': cores, | ||||
|             'memory': memory, | ||||
|             'disk_size': storage, | ||||
|             'price': amount_to_be_charged | ||||
|         } | ||||
| 
 | ||||
|         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): | ||||
|  | @ -353,20 +334,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 | ||||
| 
 | ||||
|  | @ -374,48 +354,49 @@ 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 | ||||
|                 } | ||||
|                 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') | ||||
|                 } | ||||
|                 customer = StripeCustomer.create_stripe_api_customer( | ||||
|                     email=this_user.get('email'), | ||||
|                     token=token, | ||||
|                     customer_name=form.cleaned_data.get('name')) | ||||
|             request.session['billing_address_data'] = form.cleaned_data | ||||
|             request.session['user'] = this_user | ||||
|             # Get or create stripe customer | ||||
|             customer = StripeCustomer.get_or_create(email=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 | ||||
|             request.session[ | ||||
|                 'customer'] = customer.id if request.user.is_authenticated() else customer | ||||
|             return HttpResponseRedirect( | ||||
|                 reverse('datacenterlight:order_confirmation')) | ||||
|         else: | ||||
|  | @ -435,9 +416,15 @@ 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'): | ||||
|  | @ -449,7 +436,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) | ||||
| 
 | ||||
|  | @ -458,29 +446,40 @@ class OrderConfirmationView(DetailView): | |||
|         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() | ||||
|         billing_address_data = request.session.get('billing_address_data') | ||||
|         billing_address_id = request.session.get('billing_address') | ||||
|         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'): | ||||
|             msg = card_details.get('error') | ||||
|             messages.add_message(self.request, messages.ERROR, msg, | ||||
|                                  extra_tags='failed_payment') | ||||
|             return HttpResponseRedirect( | ||||
|                 reverse('datacenterlight:payment') + '#payment_error') | ||||
|             response = { | ||||
|                 'status': False, | ||||
|                 'redirect': "{url}#{section}".format( | ||||
|                     url=reverse('datacenterlight:payment'), | ||||
|                     section='payment_error'), | ||||
|                 'msg_title': str(_('Error.')), | ||||
|                 'msg_body': str( | ||||
|                     _('There was a payment related error.' | ||||
|                       ' On close of this popup, you will be redirected back to' | ||||
|                       ' the payment page.')) | ||||
|             } | ||||
|             return HttpResponse(json.dumps(response), | ||||
|                                 content_type="application/json") | ||||
|         card_details_dict = card_details.get('response_object') | ||||
|         cpu = specs.get('cpu') | ||||
|         memory = specs.get('memory') | ||||
|         disk_size = specs.get('disk_size') | ||||
|         amount_to_be_charged = get_vm_price(cpu=cpu, memory=memory, | ||||
|                                             disk_size=disk_size) | ||||
|         specs['price'] = amount_to_be_charged | ||||
|         amount_to_be_charged = specs.get('price') | ||||
|         plan_name = StripeUtils.get_stripe_plan_name(cpu=cpu, | ||||
|                                                      memory=memory, | ||||
|                                                      disk_size=disk_size) | ||||
|  | @ -494,7 +493,7 @@ class OrderConfirmationView(DetailView): | |||
|             name=plan_name, | ||||
|             stripe_plan_id=stripe_plan_id) | ||||
|         subscription_result = stripe_utils.subscribe_customer_to_plan( | ||||
|             customer.stripe_id, | ||||
|             stripe_api_cus_id, | ||||
|             [{"plan": stripe_plan.get( | ||||
|                 'response_object').stripe_plan_id}]) | ||||
|         stripe_subscription_obj = subscription_result.get('response_object') | ||||
|  | @ -504,11 +503,96 @@ class OrderConfirmationView(DetailView): | |||
|             msg = subscription_result.get('error') | ||||
|             messages.add_message(self.request, messages.ERROR, msg, | ||||
|                                  extra_tags='failed_payment') | ||||
|             return HttpResponseRedirect( | ||||
|                 reverse('datacenterlight:payment') + '#payment_error') | ||||
|             response = { | ||||
|                 'status': False, | ||||
|                 'redirect': "{url}#{section}".format( | ||||
|                     url=reverse('datacenterlight:payment'), | ||||
|                     section='payment_error'), | ||||
|                 'msg_title': str(_('Error.')), | ||||
|                 'msg_body': str( | ||||
|                     _('There was a payment related error.' | ||||
|                       ' On close of this popup, you will be redirected back to' | ||||
|                       ' the payment page.')) | ||||
|             } | ||||
|             return HttpResponse(json.dumps(response), | ||||
|                                 content_type="application/json") | ||||
| 
 | ||||
|         # Create user if the user is not logged in and if he is not already | ||||
|         # registered | ||||
|         if not request.user.is_authenticated(): | ||||
|             try: | ||||
|                 custom_user = CustomUser.objects.get( | ||||
|                     email=user.get('email')) | ||||
|                 customer = StripeCustomer.objects.filter( | ||||
|                     user_id=custom_user.id).first() | ||||
|                 stripe_customer_id = customer.id | ||||
|             except CustomUser.DoesNotExist: | ||||
|                 logger.debug( | ||||
|                     "Customer {} does not exist.".format(user.get('email'))) | ||||
|                 password = CustomUser.get_random_password() | ||||
|                 base_url = "{0}://{1}".format(self.request.scheme, | ||||
|                                               self.request.get_host()) | ||||
|                 custom_user = CustomUser.register( | ||||
|                     user.get('name'), password, | ||||
|                     user.get('email'), | ||||
|                     app='dcl', base_url=base_url, send_email=True, | ||||
|                     account_details=password | ||||
|                 ) | ||||
|                 logger.debug("Created user {}.".format(user.get('email'))) | ||||
|                 stripe_customer = StripeCustomer.objects. \ | ||||
|                     create(user=custom_user, stripe_id=stripe_api_cus_id) | ||||
|                 stripe_customer_id = stripe_customer.id | ||||
|                 new_user = authenticate(username=custom_user.email, | ||||
|                                         password=password) | ||||
|                 login(request, new_user) | ||||
|         else: | ||||
|             customer = StripeCustomer.objects.filter( | ||||
|                 id=stripe_customer_id).first() | ||||
|             custom_user = customer.user | ||||
|             stripe_customer_id = customer.id | ||||
| 
 | ||||
|         # 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 = billing_address_user_form.save() | ||||
|         billing_address_id = billing_address.id | ||||
|         logger.debug("billing address id = {}".format(billing_address_id)) | ||||
|         user = { | ||||
|             'name': custom_user.name, | ||||
|             'email': custom_user.email, | ||||
|             'pass': custom_user.password, | ||||
|             'request_scheme': request.scheme, | ||||
|             'request_host': request.get_host(), | ||||
|             'language': get_language(), | ||||
|         } | ||||
| 
 | ||||
|         create_vm_task.delay(vm_template_id, user, specs, template, | ||||
|                              stripe_customer_id, billing_address_data, | ||||
|                              billing_address_id, | ||||
|                              stripe_subscription_obj, card_details_dict) | ||||
|         request.session['order_confirmation'] = True | ||||
|         return HttpResponseRedirect(reverse('datacenterlight:order_success')) | ||||
|         for session_var in ['specs', 'template', 'billing_address', | ||||
|                             'billing_address_data', | ||||
|                             'token', 'customer']: | ||||
|             if session_var in request.session: | ||||
|                 del request.session[session_var] | ||||
| 
 | ||||
|         response = { | ||||
|             'status': True, | ||||
|             'redirect': reverse( | ||||
|                 'hosting:virtual_machines') if request.user.is_authenticated() else reverse( | ||||
|                 'datacenterlight:index'), | ||||
|             'msg_title': str(_('Thank you for the order.')), | ||||
|             'msg_body': str( | ||||
|                 _('Your VM will be up and running in a few moments.' | ||||
|                   ' We will send you a confirmation email as soon as' | ||||
|                   ' it is ready.')) | ||||
|         } | ||||
| 
 | ||||
|         return HttpResponse(json.dumps(response), | ||||
|                             content_type="application/json") | ||||
|  |  | |||
|  | @ -268,7 +268,7 @@ msgstr "" | |||
| "Link klickst</a>.<br/>\n" | ||||
| 
 | ||||
| msgid "My VM page" | ||||
| msgstr "" | ||||
| msgstr "Meine VM page" | ||||
| 
 | ||||
| #, python-format | ||||
| msgid "" | ||||
|  | @ -623,7 +623,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 " | ||||
|  |  | |||
|  | @ -857,6 +857,8 @@ a.list-group-item-danger:focus, | |||
|     background: rgba(235, 204, 209, 0.2); | ||||
| } | ||||
| .has-error .form-control, | ||||
| .has-error .form-control:focus, | ||||
| .has-error .form-control:active, | ||||
| .has-error .input-group-addon { | ||||
|     color: #eb4d5c; | ||||
|     border-color: #eb4d5c; | ||||
|  | @ -871,6 +873,13 @@ a.list-group-item-danger.active:focus { | |||
|     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); | ||||
| } | ||||
| .checkmark { | ||||
|   display: inline-block; | ||||
| } | ||||
|  |  | |||
|  | @ -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; | ||||
| 	} | ||||
| } | ||||
|  | @ -13,7 +13,12 @@ | |||
|         {% endif %} | ||||
|         {% if not error %} | ||||
|             <div class="dashboard-subtitle"> | ||||
|                 <p>{% trans 'To create a new virtual machine, click "Create VM"' %}</p> | ||||
|                 <p>{% trans 'To create a new virtual machine, click "Create VM"' %} | ||||
|                 {% if show_create_ssh_key_msg %} | ||||
|                      {% url 'hosting:create_ssh_key' as create_ssh_url %} | ||||
|                      <br/>{% blocktrans %}To access your VM, add your SSH key <a href="{{create_ssh_url}}">here</a>{% endblocktrans %} | ||||
|                 {% endif %} | ||||
|                 </p> | ||||
|                 <div class="text-right"> | ||||
|                     <a class="btn btn-vm" href="{% url 'hosting:create_virtual_machine' %}"><span class="css-plus"></span> <span>{% trans "CREATE VM" %}</span></a> | ||||
|                 </div> | ||||
|  |  | |||
|  | @ -613,13 +613,6 @@ class PaymentVMView(LoginRequiredMixin, FormView): | |||
|         return context | ||||
| 
 | ||||
|     def get(self, request, *args, **kwargs): | ||||
|         if not UserHostingKey.objects.filter(user=self.request.user).exists(): | ||||
|             messages.success( | ||||
|                 request, | ||||
|                 'In order to create a VM, you create/upload your SSH KEY first.' | ||||
|             ) | ||||
|             return HttpResponseRedirect(reverse('hosting:ssh_keys')) | ||||
| 
 | ||||
|         if 'next' in request.session: | ||||
|             del request.session['next'] | ||||
| 
 | ||||
|  | @ -885,6 +878,10 @@ class VirtualMachinesPlanListView(LoginRequiredMixin, ListView): | |||
|             context = {'error': 'connection'} | ||||
|         else: | ||||
|             context = super(ListView, self).get_context_data(**kwargs) | ||||
|             if UserHostingKey.objects.filter(user=self.request.user).exists(): | ||||
|                 context['show_create_ssh_key_msg'] = False | ||||
|             else: | ||||
|                 context['show_create_ssh_key_msg'] = True | ||||
|         return context | ||||
| 
 | ||||
| 
 | ||||
|  | @ -905,15 +902,6 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View): | |||
|             raise ValidationError(_('Invalid storage size')) | ||||
| 
 | ||||
|     def get(self, request, *args, **kwargs): | ||||
|         if not UserHostingKey.objects.filter(user=self.request.user).exists(): | ||||
|             messages.success( | ||||
|                 request, | ||||
|                 _( | ||||
|                     'In order to create a VM, you need to ' | ||||
|                     'create/upload your SSH KEY first.' | ||||
|                 ) | ||||
|             ) | ||||
|             return HttpResponseRedirect(reverse('hosting:ssh_keys')) | ||||
|         context = {'templates': VMTemplate.objects.all()} | ||||
|         return render(request, self.template_name, context) | ||||
| 
 | ||||
|  |  | |||
|  | @ -82,7 +82,7 @@ class CustomUser(AbstractBaseUser, PermissionsMixin): | |||
| 
 | ||||
|     @classmethod | ||||
|     def register(cls, name, password, email, app='digital_glarus', | ||||
|                  base_url=None, send_email=True): | ||||
|                  base_url=None, send_email=True, account_details=None): | ||||
|         user = cls.objects.filter(email=email).first() | ||||
|         if not user: | ||||
|             user = cls.objects.create_user(name=name, email=email, | ||||
|  | @ -112,6 +112,9 @@ class CustomUser(AbstractBaseUser, PermissionsMixin): | |||
|                             'template_name': 'user_activation', | ||||
|                             'template_path': 'datacenterlight/emails/' | ||||
|                         } | ||||
|                         if account_details: | ||||
|                             email_data['context'][ | ||||
|                                 'account_details'] = account_details | ||||
|                         email = BaseEmail(**email_data) | ||||
|                         email.send() | ||||
|                 return user | ||||
|  | @ -176,6 +179,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 +217,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'): | ||||
|  |  | |||
|  | @ -150,9 +150,10 @@ class OpenNebulaManager(): | |||
|                 oca.User.METHODS['allocate'], email, | ||||
|                 password, 'core') | ||||
|             logger.debug( | ||||
|                 "User {0} does not exist. Created the user. User id = {1}", | ||||
|                 email, | ||||
|                 opennebula_user | ||||
|                 "User {} does not exist. Created the user. User id = {}".format( | ||||
|                     email, | ||||
|                     opennebula_user | ||||
|                 ) | ||||
|             ) | ||||
|             return opennebula_user | ||||
|         except ConnectionRefusedError: | ||||
|  |  | |||
|  | @ -131,6 +131,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()) | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue