merge master
This commit is contained in:
		
				commit
				
					
						c60d45c292
					
				
			
		
					 24 changed files with 561 additions and 314 deletions
				
			
		|  | @ -1,6 +1,7 @@ | ||||||
| Next release: | Next release: | ||||||
|     * Bugfix: [dcl, hosting] Fix Stripe js error in confirm payment page |     * Bugfix: [dcl, hosting] Fix Stripe js error in confirm payment page | ||||||
|     * #3847: [ungleich] change text 'hosting products' -> 'our products' |     * #3847: [ungleich] change text 'hosting products' -> 'our products' | ||||||
|  |     * #3829: [dcl] Handle landing login fail in payment page itself | ||||||
| 1.2.6: 2017-10-10 | 1.2.6: 2017-10-10 | ||||||
|     * Bugfix: [dcl] Refactor and optimize images, links in glasfaser page |     * Bugfix: [dcl] Refactor and optimize images, links in glasfaser page | ||||||
|     * Bugfix: [dcl] Fix email not being sent issue |     * Bugfix: [dcl] Fix email not being sent issue | ||||||
|  |  | ||||||
|  | @ -126,56 +126,42 @@ msgstr "" | ||||||
| msgid "Thank you!" | msgid "Thank you!" | ||||||
| msgstr "Vielen Dank!" | msgstr "Vielen Dank!" | ||||||
| 
 | 
 | ||||||
| msgid "Account Activation" | msgid "Data Center Light Account Activation" | ||||||
| msgstr "Account Aktivierung" | msgstr "Data Center Light Account Aktivierung" | ||||||
| 
 | 
 | ||||||
| #, python-format | #, python-format | ||||||
| msgid "" | msgid "" | ||||||
| "\n" | "You can activate your Data Center Light account by clicking <a href=" | ||||||
| "You can activate your Data Center Light account by <a href=\"%(base_url)s" | "\"%(base_url)s%(activation_link)s\" style=\"text-decoration: none; color: " | ||||||
| "%(activation_link)s\">clicking here</a>.<br/>\n" | "#4382c8; font-weight: 400;\">here</a>." | ||||||
|  | msgstr "" | ||||||
|  | "Klicke <a href=\"%(base_url)s%(activation_link)s\"style=\"text-decoration: " | ||||||
|  | "none; color: #4382c8; font-weight: 400;\">here</a> um deinen Data Center " | ||||||
|  | "Light Account zu aktivieren." | ||||||
|  | 
 | ||||||
|  | msgid "" | ||||||
| "You can also copy and paste the following link into the address bar of your " | "You can also copy and paste the following link into the address bar of your " | ||||||
| "browser<br/>\n" | "browser to activate your Data Center Light account." | ||||||
| "to activate your Data Center Light account.<br/>\n" | msgstr "Kopiere den folgenden Link in die Adressleiste deines Browsers." | ||||||
| "%(base_url)s%(activation_link)s\n" |  | ||||||
| msgstr "" |  | ||||||
| "\n" |  | ||||||
| "<a href=\"%(base_url)s%(activation_link)s\">Klicke hier</a> um deinen Data " |  | ||||||
| "Center Light Account zu aktivieren oder kopiere den folgenden Link in die " |  | ||||||
| "Adressleiste deines Browsers.<br/>\n" |  | ||||||
| "%(base_url)s%(activation_link)s\n" |  | ||||||
| 
 | 
 | ||||||
| #, python-format |  | ||||||
| msgid "" | msgid "" | ||||||
| "Your account details are as follows:<br/><br/>\n" | "You can copy and paste the following link into the address bar of your " | ||||||
| "Username : Your email address<br/>\n" | "browser to activate your Data Center Light account." | ||||||
| "Password : %(account_details)s<br/><br/>\n" | msgstr "Kopiere den folgenden Link in die Adressleiste deines Browsers." | ||||||
| "You can reset your password here:\n" |  | ||||||
| "%(base_url)s%(reset_password_url)s\n" |  | ||||||
| msgstr "" |  | ||||||
| 
 | 
 | ||||||
| #, python-format | msgid "Welcome to Data Center Light!" | ||||||
| msgid "" | msgstr "Willkommen beim Data Center Light!" | ||||||
| "You can activate your Data Center Light account by clicking here.\n" |  | ||||||
| "You can also copy and paste the following link into the address bar of your " |  | ||||||
| "browser\n" |  | ||||||
| "to activate your Data Center Light account.\n" |  | ||||||
| "%(base_url)s%(activation_link)s\n" |  | ||||||
| msgstr "" |  | ||||||
| "Klicke hier, um deinen Data Center Light Account zu aktivieren oder kopiere " |  | ||||||
| "den folgenden Link in die Adressleiste deines Browsers.\n" |  | ||||||
| "%(base_url)s%(activation_link)s\n" |  | ||||||
| 
 | 
 | ||||||
| #, python-format |  | ||||||
| msgid "" | msgid "" | ||||||
| "Your account details are as follows:\n" | "Thanks for joining us! We provide the most affordable virtual machines from " | ||||||
| "\n" | "the heart of Switzerland." | ||||||
| "Username : Your email address\n" | msgstr "Bei uns findest Du die günstiges VMs aus der Schweiz." | ||||||
| "Password : %(account_details)s\n" | 
 | ||||||
| "\n" | msgid "Try now, order a VM. VM price starts from only 15CHF per month." | ||||||
| "You can reset your password here:\n" | msgstr "Unser Angebot beginnt bei 15 CHF pro Monat. Probier's jetzt aus!" | ||||||
| "%(base_url)s%(reset_password_url)s\n" | 
 | ||||||
| msgstr "" | msgid "ORDER VM" | ||||||
|  | msgstr "VM BESTELLEN" | ||||||
| 
 | 
 | ||||||
| msgid "Home" | msgid "Home" | ||||||
| msgstr "Home" | msgstr "Home" | ||||||
|  | @ -512,6 +498,15 @@ msgstr "" | ||||||
| "Deine VM ist gleich bereit. Wir senden Dir eine Bestätigungsemail, sobald Du " | "Deine VM ist gleich bereit. Wir senden Dir eine Bestätigungsemail, sobald Du " | ||||||
| "auf sie zugreifen kannst." | "auf sie zugreifen kannst." | ||||||
| 
 | 
 | ||||||
|  | #~ 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 "Submit" | #~ msgid "Submit" | ||||||
| #~ msgstr "Absenden" | #~ msgstr "Absenden" | ||||||
| 
 | 
 | ||||||
|  | @ -530,15 +525,6 @@ msgstr "" | ||||||
| #~ msgid "Order summary" | #~ msgid "Order summary" | ||||||
| #~ msgstr "Bestellungsübersicht" | #~ msgstr "Bestellungsübersicht" | ||||||
| 
 | 
 | ||||||
| #~ 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!" | #~ msgid "We are cutting down the costs significantly!" | ||||||
| #~ msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen" | #~ msgstr "Wir sorgen dafür, dass die Kosten für Dich signifikant abnehmen" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										
											BIN
										
									
								
								datacenterlight/static/datacenterlight/img/logo_black.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								datacenterlight/static/datacenterlight/img/logo_black.png
									
										
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| After Width: | Height: | Size: 7.3 KiB | 
|  | @ -5,6 +5,7 @@ from celery.utils.log import get_task_logger | ||||||
| from celery import current_task | from celery import current_task | ||||||
| from django.conf import settings | from django.conf import settings | ||||||
| from django.core.mail import EmailMessage | from django.core.mail import EmailMessage | ||||||
|  | from django.core.urlresolvers import reverse | ||||||
| from django.utils import translation | from django.utils import translation | ||||||
| from django.utils.translation import ugettext_lazy as _ | from django.utils.translation import ugettext_lazy as _ | ||||||
| 
 | 
 | ||||||
|  | @ -131,9 +132,9 @@ def create_vm_task(self, vm_template_id, user, specs, template, | ||||||
|             'storage': specs.get('disk_size'), |             'storage': specs.get('disk_size'), | ||||||
|             'price': specs.get('price'), |             'price': specs.get('price'), | ||||||
|             'template': template.get('name'), |             'template': template.get('name'), | ||||||
|             'vm.name': vm['name'], |             'vm_name': vm.get('name'), | ||||||
|             'vm.id': vm['vm_id'], |             'vm_id': vm['vm_id'], | ||||||
|             'order.id': order.id |             'order_id': order.id | ||||||
|         } |         } | ||||||
|         email_data = { |         email_data = { | ||||||
|             'subject': settings.DCL_TEXT + " Order from %s" % context['email'], |             'subject': settings.DCL_TEXT + " Order from %s" % context['email'], | ||||||
|  | @ -155,13 +156,14 @@ def create_vm_task(self, vm_template_id, user, specs, template, | ||||||
|             translation.activate(lang) |             translation.activate(lang) | ||||||
|             # Send notification to the user as soon as VM has been booked |             # Send notification to the user as soon as VM has been booked | ||||||
|             context = { |             context = { | ||||||
|                 'vm': vm, |  | ||||||
|                 'order': order, |  | ||||||
|                 'base_url': "{0}://{1}".format(user.get('request_scheme'), |                 'base_url': "{0}://{1}".format(user.get('request_scheme'), | ||||||
|                                                user.get('request_host')), |                                                user.get('request_host')), | ||||||
|  |                 'order_url': reverse('hosting:orders', | ||||||
|  |                                      kwargs={'pk': order.id}), | ||||||
|                 'page_header': _( |                 'page_header': _( | ||||||
|                     'Your New VM %(vm_name)s at Data Center Light') % { |                     'Your New VM %(vm_name)s at Data Center Light') % { | ||||||
|                                    'vm_name': vm.get('name')} |                     'vm_name': vm.get('name')}, | ||||||
|  |                 'vm_name': vm.get('name') | ||||||
|             } |             } | ||||||
|             email_data = { |             email_data = { | ||||||
|                 'subject': context.get('page_header'), |                 'subject': context.get('page_header'), | ||||||
|  |  | ||||||
|  | @ -1,24 +1,46 @@ | ||||||
| {% extends "datacenterlight/emails/base_email_datacenterlight.html" %} | {% load static i18n %} | ||||||
| {% load static from staticfiles %} | <!DOCTYPE html> | ||||||
| {% load i18n %} | <html> | ||||||
| {% block email_head %} | 
 | ||||||
| {{dcl_text}} {% trans 'Account Activation' %} | <head> | ||||||
| {% endblock %} |     <meta charset="UTF-8"> | ||||||
| {% block email_body %} |     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
| {% blocktrans %} |     <title>{% trans "Data Center Light Account Activation" %}</title> | ||||||
| You can activate your Data Center Light account by <a href="{{base_url}}{{activation_link}}">clicking here</a>.<br/> |     <link rel="shortcut icon" href="{{ base_url }}{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon"> | ||||||
| You can also copy and paste the following link into the address bar of your browser<br/> |     <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:300,400"> | ||||||
| to activate your Data Center Light account.<br/> | </head> | ||||||
| {{base_url}}{{activation_link}} | 
 | ||||||
| {% endblocktrans %} | <body style="margin: 0; padding: 20px 0;"> | ||||||
| {% if account_details %} |     <table style="width: 100%; border-spacing: 0; border-collapse: collapse; max-width: 560px;"> | ||||||
| {% url 'hosting:reset_password' as reset_password_url %} |         <tr> | ||||||
| <br/><br/> |             <td> | ||||||
| {% blocktrans %}Your account details are as follows:<br/><br/> |                 <img src="{{ base_url }}{% static 'datacenterlight/img/logo_black.png' %}" style="width: 200px; height: 50px;"> | ||||||
| Username : Your email address<br/> |             </td> | ||||||
| Password : {{account_details}}<br/><br/> |         </tr> | ||||||
| You can reset your password here: |         <tr> | ||||||
| {{base_url}}{{reset_password_url}} |             <td style="padding-top: 15px;"> | ||||||
| {% endblocktrans %} |                 <h1 style="font-family: Lato, Arial, sans-serif; font-size: 25px; font-weight: 400; margin: 0;">{% trans "Data Center Light Account Activation" %}</h1> | ||||||
| {% endif %} |             </td> | ||||||
| {% endblock %} |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 25px; font-size: 16px;"> | ||||||
|  |                 <p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 0;"> | ||||||
|  |                     {% blocktrans %}You can activate your Data Center Light account by clicking <a href="{{base_url}}{{activation_link}}" style="text-decoration: none; color: #4382c8; font-weight: 400;">here</a>.{% endblocktrans %} | ||||||
|  |                 </p> | ||||||
|  |                 <p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 0;"> | ||||||
|  |                     {% blocktrans %}You can also copy and paste the following link into the address bar of your browser to activate your Data Center Light account.{% endblocktrans %} | ||||||
|  |                 </p> | ||||||
|  |                 <p style="color: #4382c8; line-height: 1.4; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;"> | ||||||
|  |                     {{base_url}}{{activation_link}} | ||||||
|  |                 </p> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 40px; padding-bottom: 25px;"> | ||||||
|  |                 <h3 style="font-family: Lato, Arial, sans-serif; margin: 0; font-weight: 400; font-size: 15px;">{% trans "Your Data Center Light Team" %}</h3> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |     </table> | ||||||
|  | </body> | ||||||
|  | 
 | ||||||
|  | </html> | ||||||
|  |  | ||||||
|  | @ -1,21 +1,9 @@ | ||||||
| {% extends "datacenterlight/emails/base_email_datacenterlight.txt" %} |  | ||||||
| {% load i18n %} | {% load i18n %} | ||||||
| {% block email_head %}{{dcl_text}} {% trans 'Account Activation' %}{% endblock %} | 
 | ||||||
| {% block email_body %} | {% trans "Data Center Light Account Activation" %} | ||||||
| {% blocktrans %}You can activate your Data Center Light account by clicking here. | 
 | ||||||
| You can also copy and paste the following link into the address bar of your browser | {% blocktrans %}You can copy and paste the following link into the address bar of your browser to activate your Data Center Light account.{% endblocktrans %} | ||||||
| to activate your Data Center Light account. | 
 | ||||||
| {{base_url}}{{activation_link}} | {{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 | {% trans "Your Data Center Light Team" %} | ||||||
| Password : {{account_details}} |  | ||||||
| 
 |  | ||||||
| You can reset your password here: |  | ||||||
| {{base_url}}{{reset_password_url}} |  | ||||||
| {% endblocktrans %} |  | ||||||
| {% endif %} |  | ||||||
| {% endblock %} |  | ||||||
|  | @ -0,0 +1,48 @@ | ||||||
|  | {% load static i18n %} | ||||||
|  | <!DOCTYPE html> | ||||||
|  | <html> | ||||||
|  | 
 | ||||||
|  | <head> | ||||||
|  |     <meta charset="UTF-8"> | ||||||
|  |     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
|  |     <title>{% trans "Welcome to Data Center Light!" %}</title> | ||||||
|  |     <link rel="shortcut icon" href="{{ base_url }}{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon"> | ||||||
|  |     <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:300,400"> | ||||||
|  | </head> | ||||||
|  | 
 | ||||||
|  | <body style="margin: 0; padding: 20px 0;"> | ||||||
|  |     <table style="width: 100%; border-spacing: 0; border-collapse: collapse; max-width: 560px;"> | ||||||
|  |         <tr> | ||||||
|  |             <td> | ||||||
|  |                 <img src="{{ base_url }}{% static 'datacenterlight/img/logo_black.png' %}" style="width: 200px; height: 50px;"> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 15px;"> | ||||||
|  |                 <h1 style="font-family: Lato, Arial, sans-serif; font-size: 25px; font-weight: 400; margin: 0;">{% trans "Welcome to Data Center Light!" %}</h1> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 25px; font-size: 16px;"> | ||||||
|  |                 <p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;"> | ||||||
|  |                     {% blocktrans %}Thanks for joining us! We provide the most affordable virtual machines from the heart of Switzerland.{% endblocktrans %} | ||||||
|  |                 </p> | ||||||
|  |                 <p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;"> | ||||||
|  |                     {% blocktrans %}Try now, order a VM. VM price starts from only 15CHF per month.{% endblocktrans %} | ||||||
|  |                 </p> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 30px;"> | ||||||
|  |                 <a class="btn" href="{{ base_url }}{% url 'hosting:create_virtual_machine' %}" style="font-family: Lato, Arial, sans-serif; text-decoration: none; background-color: #1596da; color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px; letter-spacing: 0.5px; border-radius: 3px; display: inline-block;">{% trans "ORDER VM" %}</a> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 40px; padding-bottom: 25px;"> | ||||||
|  |                 <h3 style="font-family: Lato, Arial, sans-serif; margin: 0; font-weight: 400; font-size: 15px;">{% trans "Your Data Center Light Team" %}</h3> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |     </table> | ||||||
|  | </body> | ||||||
|  | 
 | ||||||
|  | </html> | ||||||
|  | @ -0,0 +1,10 @@ | ||||||
|  | {% load i18n %} | ||||||
|  | 
 | ||||||
|  | {% trans "Welcome to Data Center Light!" %} | ||||||
|  | 
 | ||||||
|  | {% blocktrans %}Thanks for joining us! We provide the most affordable virtual machines from the heart of Switzerland.{% endblocktrans %} | ||||||
|  | {% blocktrans %}Try now, order a VM. VM price starts from only 15CHF per month.{% endblocktrans %} | ||||||
|  | 
 | ||||||
|  | {{ base_url }}{% url 'hosting:create_virtual_machine' %} | ||||||
|  | 
 | ||||||
|  | {% trans "Your Data Center Light Team" %} | ||||||
|  | @ -25,14 +25,15 @@ | ||||||
|                         <h3>{%trans "Log in" %}</h3> |                         <h3>{%trans "Log in" %}</h3> | ||||||
|                         <hr class="top-hr"> |                         <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> |                         <p style="margin-bottom: 20px;">{% blocktrans %}Already signed up?<br>By logging in you can retrieve saved billing information.{% endblocktrans %}</p> | ||||||
|                         <form role="form" id="login-form" method="post" action="{% url 'hosting:login' %}" novalidate> |                         <form role="form" id="login-form" method="post" action="" novalidate> | ||||||
|                             {% for field in login_form %} |                             {% for field in login_form %} | ||||||
|                             {% csrf_token %} |                             {% csrf_token %} | ||||||
|                             {% bootstrap_field field show_label=False type='fields'%} |                             {% bootstrap_field field show_label=False type='fields'%} | ||||||
|                             {% endfor %} |                             {% endfor %} | ||||||
|  |                             <p class="text-danger">{{login_form.non_field_errors|striptags}}</p> | ||||||
|                             <input type='hidden' name='next' value='{{request.path}}'/> |                             <input type='hidden' name='next' value='{{request.path}}'/> | ||||||
|                             <div class="form-group text-right"> |                             <div class="form-group text-right"> | ||||||
|                                 <button type="submit" class="btn btn-wide btn-vm-contact">{% trans "LOGIN" %}</button> |                                 <button type="submit" class="btn btn-wide btn-vm-contact" name="login_form">{% trans "LOGIN" %}</button> | ||||||
|                             </div> |                             </div> | ||||||
|                         </form> |                         </form> | ||||||
|                         <p> |                         <p> | ||||||
|  | @ -58,7 +59,7 @@ | ||||||
|                     {% endfor %} |                     {% endfor %} | ||||||
|                     <form role="form" id="billing-form" method="post" action="" novalidate> |                     <form role="form" id="billing-form" method="post" action="" novalidate> | ||||||
|                         {% csrf_token %} |                         {% csrf_token %} | ||||||
|                         {% for field in form %} |                         {% for field in billing_address_form %} | ||||||
|                         {% bootstrap_field field show_label=False type='fields'%} |                         {% bootstrap_field field show_label=False type='fields'%} | ||||||
|                         {% endfor %} |                         {% endfor %} | ||||||
|                     </form> |                     </form> | ||||||
|  | @ -153,22 +154,12 @@ | ||||||
|                                 {% endif %} |                                 {% endif %} | ||||||
|                                 <div id='payment_error'> |                                 <div id='payment_error'> | ||||||
|                                     {% for message in messages %} |                                     {% for message in messages %} | ||||||
|                                         {% if 'failed_payment' in message.tags or 'make_charge_error' in message.tags %} |                                         {% if 'failed_payment' in message.tags or 'make_charge_error' in message.tags or 'error' in message.tags %} | ||||||
|                                             <ul class="list-unstyled"> |                                             <ul class="list-unstyled"> | ||||||
|                                                 <li><p class="card-warning-content card-warning-error">{{ message|safe }}</p></li> |                                                 <li><p class="card-warning-content card-warning-error">{{ message|safe }}</p></li> | ||||||
|                                             </ul> |                                             </ul> | ||||||
|                                         {% elif not form.non_field_errors %} |  | ||||||
|                                             <p class="card-warning-content"> |  | ||||||
|                                                 {% trans "You are not making any payment yet. After placing your order, you will be taken to the Submit Payment Page." %} |  | ||||||
|                                             </p> |  | ||||||
|                                         {% endif %} |                                         {% 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="text-right"> |                                 <div class="text-right"> | ||||||
|                                     <button class="btn btn-vm-contact btn-wide" type="submit">{%trans "SUBMIT" %}</button> |                                     <button class="btn btn-vm-contact btn-wide" type="submit">{%trans "SUBMIT" %}</button> | ||||||
|  |  | ||||||
|  | @ -345,26 +345,45 @@ class PaymentOrderView(FormView): | ||||||
|         else: |         else: | ||||||
|             return BillingAddressFormSignup |             return BillingAddressFormSignup | ||||||
| 
 | 
 | ||||||
|     def get_form_kwargs(self): |  | ||||||
|         form_kwargs = super(PaymentOrderView, self).get_form_kwargs() |  | ||||||
|         # if user is signed in, get billing address |  | ||||||
|         if self.request.user.is_authenticated(): |  | ||||||
|             form_kwargs.update({ |  | ||||||
|                 'instance': self.request.user.billing_addresses.first() |  | ||||||
|             }) |  | ||||||
|         if 'billing_address_data' in self.request.session: |  | ||||||
|             billing_address_data = self.request.session['billing_address_data'] |  | ||||||
|             form_kwargs.update({ |  | ||||||
|                 'initial': billing_address_data |  | ||||||
|             }) |  | ||||||
|         return form_kwargs |  | ||||||
| 
 |  | ||||||
|     def get_context_data(self, **kwargs): |     def get_context_data(self, **kwargs): | ||||||
|         context = super(PaymentOrderView, self).get_context_data(**kwargs) |         context = super(PaymentOrderView, self).get_context_data(**kwargs) | ||||||
|  |         if 'billing_address_data' in self.request.session: | ||||||
|  |             billing_address_data = self.request.session['billing_address_data'] | ||||||
|  |         else: | ||||||
|  |             billing_address_data = {} | ||||||
|  | 
 | ||||||
|  |         if self.request.user.is_authenticated(): | ||||||
|  |             if billing_address_data: | ||||||
|  |                 billing_address_form = BillingAddressForm( | ||||||
|  |                     initial=billing_address_data | ||||||
|  |                 ) | ||||||
|  |             else: | ||||||
|  |                 billing_address_form = BillingAddressForm( | ||||||
|  |                     instance=self.request.user.billing_addresses.first() | ||||||
|  |                 ) | ||||||
|  |             # Get user last order | ||||||
|  |             last_hosting_order = HostingOrder.objects.filter( | ||||||
|  |                 customer__user=self.request.user | ||||||
|  |             ).last() | ||||||
|  | 
 | ||||||
|  |             # If user has already an hosting order, get the credit card | ||||||
|  |             # data from it | ||||||
|  |             if last_hosting_order: | ||||||
|  |                 credit_card_data = last_hosting_order.get_cc_data() | ||||||
|  |                 if credit_card_data: | ||||||
|  |                     context['credit_card_data'] = credit_card_data | ||||||
|  |                 else: | ||||||
|  |                     context['credit_card_data'] = None | ||||||
|  |         else: | ||||||
|  |             billing_address_form = BillingAddressFormSignup( | ||||||
|  |                 initial=billing_address_data | ||||||
|  |             ) | ||||||
|  | 
 | ||||||
|         context.update({ |         context.update({ | ||||||
|             'stripe_key': settings.STRIPE_API_PUBLIC_KEY, |             'stripe_key': settings.STRIPE_API_PUBLIC_KEY, | ||||||
|             'site_url': reverse('datacenterlight:index'), |             'site_url': reverse('datacenterlight:index'), | ||||||
|             'login_form': HostingUserLoginForm() |             'login_form': HostingUserLoginForm(prefix='login_form'), | ||||||
|  |             'billing_address_form': billing_address_form | ||||||
|         }) |         }) | ||||||
|         return context |         return context | ||||||
| 
 | 
 | ||||||
|  | @ -376,9 +395,32 @@ class PaymentOrderView(FormView): | ||||||
|         return self.render_to_response(self.get_context_data()) |         return self.render_to_response(self.get_context_data()) | ||||||
| 
 | 
 | ||||||
|     def post(self, request, *args, **kwargs): |     def post(self, request, *args, **kwargs): | ||||||
|         form = self.get_form() |         if 'login_form' in request.POST: | ||||||
|         if form.is_valid(): |             login_form = HostingUserLoginForm(data=request.POST, | ||||||
|             token = form.cleaned_data.get('token') |                                               prefix='login_form') | ||||||
|  |             if login_form.is_valid(): | ||||||
|  |                 email = login_form.cleaned_data.get('email') | ||||||
|  |                 password = login_form.cleaned_data.get('password') | ||||||
|  |                 auth_user = authenticate(email=email, password=password) | ||||||
|  |                 if auth_user: | ||||||
|  |                     login(self.request, auth_user) | ||||||
|  |                     return HttpResponseRedirect( | ||||||
|  |                         reverse('datacenterlight:payment') | ||||||
|  |                     ) | ||||||
|  |             else: | ||||||
|  |                 context = self.get_context_data() | ||||||
|  |                 context['login_form'] = login_form | ||||||
|  |                 return self.render_to_response(context) | ||||||
|  |         if request.user.is_authenticated(): | ||||||
|  |             address_form = BillingAddressForm( | ||||||
|  |                 data=request.POST, | ||||||
|  |             ) | ||||||
|  |         else: | ||||||
|  |             address_form = BillingAddressFormSignup( | ||||||
|  |                 data=request.POST, | ||||||
|  |             ) | ||||||
|  |         if address_form.is_valid(): | ||||||
|  |             token = address_form.cleaned_data.get('token') | ||||||
|             if request.user.is_authenticated(): |             if request.user.is_authenticated(): | ||||||
|                 this_user = { |                 this_user = { | ||||||
|                     'email': request.user.email, |                     'email': request.user.email, | ||||||
|  | @ -388,8 +430,8 @@ class PaymentOrderView(FormView): | ||||||
|                     email=this_user.get('email'), |                     email=this_user.get('email'), | ||||||
|                     token=token) |                     token=token) | ||||||
|             else: |             else: | ||||||
|                 user_email = form.cleaned_data.get('email') |                 user_email = address_form.cleaned_data.get('email') | ||||||
|                 user_name = form.cleaned_data.get('name') |                 user_name = address_form.cleaned_data.get('name') | ||||||
|                 this_user = { |                 this_user = { | ||||||
|                     'email': user_email, |                     'email': user_email, | ||||||
|                     'name': user_name |                     'name': user_name | ||||||
|  | @ -422,13 +464,18 @@ class PaymentOrderView(FormView): | ||||||
|                         token=token, |                         token=token, | ||||||
|                         customer_name=user_name) |                         customer_name=user_name) | ||||||
| 
 | 
 | ||||||
|             request.session['billing_address_data'] = form.cleaned_data |             request.session['billing_address_data'] = address_form.cleaned_data | ||||||
|             request.session['user'] = this_user |             request.session['user'] = this_user | ||||||
|             # Get or create stripe customer |             # Get or create stripe customer | ||||||
|             if not customer: |             if not customer: | ||||||
|                 form.add_error("__all__", "Invalid credit card") |                 address_form.add_error( | ||||||
|  |                     "__all__", "Invalid credit card" | ||||||
|  |                 ) | ||||||
|                 return self.render_to_response( |                 return self.render_to_response( | ||||||
|                     self.get_context_data(form=form)) |                     self.get_context_data( | ||||||
|  |                         billing_address_form=address_form | ||||||
|  |                     ) | ||||||
|  |                 ) | ||||||
|             request.session['token'] = token |             request.session['token'] = token | ||||||
|             if type(customer) is StripeCustomer: |             if type(customer) is StripeCustomer: | ||||||
|                 request.session['customer'] = customer.stripe_id |                 request.session['customer'] = customer.stripe_id | ||||||
|  | @ -437,7 +484,9 @@ class PaymentOrderView(FormView): | ||||||
|             return HttpResponseRedirect( |             return HttpResponseRedirect( | ||||||
|                 reverse('datacenterlight:order_confirmation')) |                 reverse('datacenterlight:order_confirmation')) | ||||||
|         else: |         else: | ||||||
|             return self.form_invalid(form) |             context = self.get_context_data() | ||||||
|  |             context['billing_address_form'] = address_form | ||||||
|  |             return self.render_to_response(context) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class OrderConfirmationView(DetailView): | class OrderConfirmationView(DetailView): | ||||||
|  | @ -548,9 +597,13 @@ class OrderConfirmationView(DetailView): | ||||||
|             try: |             try: | ||||||
|                 custom_user = CustomUser.objects.get( |                 custom_user = CustomUser.objects.get( | ||||||
|                     email=user.get('email')) |                     email=user.get('email')) | ||||||
|                 customer = StripeCustomer.objects.filter( |                 stripe_customer = StripeCustomer.objects.filter( | ||||||
|                     user_id=custom_user.id).first() |                     user_id=custom_user.id).first() | ||||||
|                 stripe_customer_id = customer.id |                 if stripe_customer is None: | ||||||
|  |                     stripe_customer = StripeCustomer.objects.create( | ||||||
|  |                         user=custom_user, stripe_id=stripe_api_cus_id | ||||||
|  |                     ) | ||||||
|  |                 stripe_customer_id = stripe_customer.id | ||||||
|             except CustomUser.DoesNotExist: |             except CustomUser.DoesNotExist: | ||||||
|                 logger.debug( |                 logger.debug( | ||||||
|                     "Customer {} does not exist.".format(user.get('email'))) |                     "Customer {} does not exist.".format(user.get('email'))) | ||||||
|  |  | ||||||
|  | @ -29,6 +29,8 @@ class HostingUserLoginForm(forms.Form): | ||||||
|     def clean(self): |     def clean(self): | ||||||
|         email = self.cleaned_data.get('email') |         email = self.cleaned_data.get('email') | ||||||
|         password = self.cleaned_data.get('password') |         password = self.cleaned_data.get('password') | ||||||
|  |         if self.errors: | ||||||
|  |             return self.cleaned_data | ||||||
|         is_auth = authenticate(email=email, password=password) |         is_auth = authenticate(email=email, password=password) | ||||||
|         if not is_auth: |         if not is_auth: | ||||||
|             raise forms.ValidationError( |             raise forms.ValidationError( | ||||||
|  |  | ||||||
|  | @ -192,101 +192,78 @@ msgid "Support / Contact" | ||||||
| msgstr "Support / Kontakt" | msgstr "Support / Kontakt" | ||||||
| 
 | 
 | ||||||
| #, python-format | #, python-format | ||||||
| msgid "" | msgid "Your New VM %(vm_name)s" | ||||||
| "You have ordered a new virtual machine!\n" | msgstr "Deine Neue VM %(vm_name)s" | ||||||
| "<br/>\n" |  | ||||||
| "Your order of [%(vm_name)s] has been charged.<br/><br/>\n" |  | ||||||
| "You can view your invoice by clicking the button below.<br/><br/>\n" |  | ||||||
| msgstr "" |  | ||||||
| "Du hast eine neue virtuelle Maschine bestellt!<br/>\n" |  | ||||||
| "Deine Bestellung von [%(vm_name)s] wurde erhoben.<br/><br/>\n" |  | ||||||
| "Um die Rechnung zu sehen, klicke auf den Button unten.<br/><br/>\n" |  | ||||||
| 
 | 
 | ||||||
| msgid "View Invoice" | msgid "You have ordered a new virtual machine!" | ||||||
| msgstr "Zur Rechnung" | msgstr "Du hast eine neue virtuelle Maschine bestellt!" | ||||||
| 
 | 
 | ||||||
| #, python-format | #, python-format | ||||||
| msgid "" | msgid "Your order of [ <strong>%(vm_name)s</strong> ] has been charged." | ||||||
| "You have ordered a new virtual machine!\n" | msgstr "Deine Bestellung von [ <strong>%(vm_name)s</strong> ] wurde erhoben." | ||||||
| "Your order of [%(vm_name)s] has been charged.\n" | 
 | ||||||
| "You can view your invoice here.\n" | msgid "You can view your VM detail by clicking the button below." | ||||||
| msgstr "" | msgstr "Um die Rechnung zu sehen, klicke auf den Button unten." | ||||||
| "Du hast eine neue virtuelle Maschine bestellt!\n" | 
 | ||||||
| "Deine Bestellung von [%(vm_name)s] wurde erhoben.\n" | msgid "View Detail" | ||||||
| "Um die Rechnung zu sehen, klicke hier.\n" | msgstr "Details anzeigen" | ||||||
|  | 
 | ||||||
|  | msgid "Your Data Center Light Team" | ||||||
|  | msgstr "Dein Data Center Light Team" | ||||||
|  | 
 | ||||||
|  | #, python-format | ||||||
|  | msgid "Your order of [%(vm_name)s] has been charged." | ||||||
|  | msgstr "Deine Bestellung von [%(vm_name)s] wurde erhoben." | ||||||
|  | 
 | ||||||
|  | msgid "You can view your VM detail by following the link below." | ||||||
|  | msgstr "Um die Rechnung zu sehen, klicke auf den Link unten." | ||||||
| 
 | 
 | ||||||
| msgid "Password Reset" | msgid "Password Reset" | ||||||
| msgstr "Passwort zurücksetzen" | msgstr "Passwort zurücksetzen" | ||||||
| 
 | 
 | ||||||
| #, python-format | msgid "We received a request to reset your password." | ||||||
| msgid "" | msgstr "Wir haben eine Anfrage erhalten, um Dein Passwort zurückzusetzen." | ||||||
| "\n" | 
 | ||||||
| "You're receiving this email because you requested a password reset for your " | msgid "If you didn't make this request you can safely ignore this email." | ||||||
| "user account at %(site_name)s.<br/>\n" |  | ||||||
| "Please go to the following page and choose a new password: %(base_url)s" |  | ||||||
| "%(password_reset_url)s<br/>\n" |  | ||||||
| "If you didn't request a new password, ignore this e-mail.<br/>\n" |  | ||||||
| "Thank you!\n" |  | ||||||
| msgstr "" | msgstr "" | ||||||
| "\n" | "Falls Du kein neues Passwort angefragt hast, kannst Du diese E-mail " | ||||||
| "Du erhälst diese E-Mail da Du Dein Passwort für Deinen Account bei " | "ignorieren." | ||||||
| "%(site_name)s zurücksetzen möchtest.<br/>\n" | 
 | ||||||
| "Bitte folge diesem Link und wähle ein neues Passwort: %(base_url)s" | msgid "Otherwise, click here to reset your password." | ||||||
| "%(password_reset_url)s Solltest Du kein neues Passwort angefordert haben, " | msgstr "Andernfalls klicke hier, um Dein Passwort zurückzusetzen." | ||||||
| "dann ignoriere diese E-Mail.<br/>\n" | 
 | ||||||
| "Dankeschön!\n" | msgid "Thank you!" | ||||||
|  | msgstr "Dankeschön!" | ||||||
|  | 
 | ||||||
|  | msgid "Virtual Machine Cancellation" | ||||||
|  | msgstr "VM Kündigung" | ||||||
| 
 | 
 | ||||||
| #, python-format | #, python-format | ||||||
| msgid "" | msgid "" | ||||||
| "You're receiving this email because you requested a password reset for your " | "You are receiving this email because your virutal machine [ <strong>" | ||||||
| "user account at %(site_name)s.\n" | "%(vm_name)s</strong> ] has been cancelled." | ||||||
| "Please go to the following page and choose a new password: %(base_url)s" |  | ||||||
| "%(password_reset_url)s\n" |  | ||||||
| "If you didn't request a new password, ignore this e-mail.\n" |  | ||||||
| "Thank you!\n" |  | ||||||
| msgstr "" | msgstr "" | ||||||
| "Du erhälst diese E-Mail da Du Dein Passwort für Deinen Account bei " | "Du erhälst diese E-Mail, da deine virtuelle Maschine [ <strong>%(vm_name)s</" | ||||||
| "%(site_name)s zurücksetzen möchtest.\n" | "strong> ] gekündigt wurde." | ||||||
| "Bitte folge diesem Link und wähle ein neues Passwort: %(base_url)s" | 
 | ||||||
| "%(password_reset_url)s Solltest Du kein neues Passwort angefordert haben, " | msgid "You can always order a new VM by clicking the button below." | ||||||
| "dann ignoriere diese E-Mail.\n" | msgstr "" | ||||||
| "Dankeschön!\n" | "Du kannst einfach eine neue VM bestellen, indem Du den Knopf weiter unten " | ||||||
|  | "drückst." | ||||||
|  | 
 | ||||||
|  | msgid "CREATE VM" | ||||||
|  | msgstr "NEUE VM" | ||||||
| 
 | 
 | ||||||
| #, python-format | #, python-format | ||||||
| msgid "" | msgid "" | ||||||
| "You're receiving this mail because your virtual machine [%(vm_name)s] has " | "You are receiving this email because your virutal machine [%(vm_name)s] has " | ||||||
| "been cancelled.<br/>\n" | "been cancelled." | ||||||
| "You can see your order status by clicking [my VM page] below.<br/>\n" |  | ||||||
| "If you want to order a new virtual machine, you can do it by clicking <a " |  | ||||||
| "href=\"%(base_url)s%(my_virtual_machines_url)s\">this link</a>.<br/>\n" |  | ||||||
| msgstr "" | msgstr "" | ||||||
| "Du erhälst diese E-Mail, Da Deine virtuelle Maschine [%(vm_name)s] gekündigt " | "Du erhälst diese E-Mail, da deine virtuelle Maschine [%(vm_name)s] gekündigt " | ||||||
| "wurde.<br/>\n" | "wurde." | ||||||
| "Um Deinen Auftragsstatus zu sehen, klicke auf die [my VM page] unten.<br/>\n" |  | ||||||
| "Falls Du eine neue virtuelle Maschine bestellen möchtest, kannst Du dies " |  | ||||||
| "tun, indem Du <a href=\"%(base_url)s%(my_virtual_machines_url)s\">diesen " |  | ||||||
| "Link klickst</a>.<br/>\n" |  | ||||||
| 
 | 
 | ||||||
| msgid "My VM page" | msgid "You can always order a new VM by following the link below." | ||||||
| msgstr "Meine VM page" |  | ||||||
| 
 |  | ||||||
| #, python-format |  | ||||||
| msgid "" |  | ||||||
| "You're receiving this mail because your virtual machine [%(vm_name)s] has " |  | ||||||
| "been cancelled.\n" |  | ||||||
| "You can see your order status by clicking here\n" |  | ||||||
| "%(base_url)s%(vm_order_url)s\n" |  | ||||||
| "If you want to order a new virtual machine, you can do it by clicking this " |  | ||||||
| "link.\n" |  | ||||||
| "%(base_url)s%(my_virtual_machines_url)s\n" |  | ||||||
| msgstr "" | msgstr "" | ||||||
| "Du erhälst diese E-Mail, da Deine virtuelle Maschine [%(vm_name)s] gekündigt " |  | ||||||
| "wurde.\n" |  | ||||||
| "Um Deinen Auftragsstatus zu sehen, klicke hier.\n" |  | ||||||
| "%(base_url)s%(vm_order_url)s\n" |  | ||||||
| "Falls Du eine neue virtuelle Maschine bestellen möchtest, kannst Du dies " |  | ||||||
| "tun, indem Du diesen Link klickst.\n" |  | ||||||
| "%(base_url)s%(my_virtual_machines_url)s\n" |  | ||||||
| 
 | 
 | ||||||
| msgid "Toggle navigation" | msgid "Toggle navigation" | ||||||
| msgstr "Umschalten" | msgstr "Umschalten" | ||||||
|  | @ -630,12 +607,6 @@ msgstr "" | ||||||
| "Um auf Deine VM zuzugreifen, <a href=\"%(create_ssh_url)s\">füge Deinen SSH-" | "Um auf Deine VM zuzugreifen, <a href=\"%(create_ssh_url)s\">füge Deinen SSH-" | ||||||
| "Key hinzu</a>" | "Key hinzu</a>" | ||||||
| 
 | 
 | ||||||
| msgid "CREATE VM" |  | ||||||
| msgstr "NEUE VM" |  | ||||||
| 
 |  | ||||||
| msgid "View Detail" |  | ||||||
| msgstr "Details anzeigen" |  | ||||||
| 
 |  | ||||||
| msgid "login" | msgid "login" | ||||||
| msgstr "anmelden" | msgstr "anmelden" | ||||||
| 
 | 
 | ||||||
|  | @ -660,6 +631,9 @@ msgstr "Dein Account wurde aktiviert." | ||||||
| msgid "You can now" | msgid "You can now" | ||||||
| msgstr "Du kannst dich nun" | msgstr "Du kannst dich nun" | ||||||
| 
 | 
 | ||||||
|  | msgid "Welcome to Data Center Light!" | ||||||
|  | msgstr "Willkommen beim Data Center Light!" | ||||||
|  | 
 | ||||||
| msgid "Sorry. Your request is invalid." | msgid "Sorry. Your request is invalid." | ||||||
| msgstr "Entschuldigung, deine Anfrage ist ungültig." | msgstr "Entschuldigung, deine Anfrage ist ungültig." | ||||||
| 
 | 
 | ||||||
|  | @ -730,8 +704,9 @@ msgstr "" | ||||||
| msgid "Error terminating VM" | msgid "Error terminating VM" | ||||||
| msgstr "Fehler beenden VM" | msgstr "Fehler beenden VM" | ||||||
| 
 | 
 | ||||||
| msgid "Virtual Machine Cancellation" | #, python-format | ||||||
| msgstr "VM Kündigung" | msgid "Virtual Machine %(vm_name)s Cancelled" | ||||||
|  | msgstr "Virtuelle Maschine %(vm_name)s Kündigung" | ||||||
| 
 | 
 | ||||||
| msgid "There was an error processing your request. Please try again." | msgid "There was an error processing your request. Please try again." | ||||||
| msgstr "" | msgstr "" | ||||||
|  | @ -741,6 +716,9 @@ msgstr "" | ||||||
| #~ msgid "Reset your password" | #~ msgid "Reset your password" | ||||||
| #~ msgstr "Passwort zurücksetzen" | #~ msgstr "Passwort zurücksetzen" | ||||||
| 
 | 
 | ||||||
|  | #~ msgid "My VM page" | ||||||
|  | #~ msgstr "Meine VM page" | ||||||
|  | 
 | ||||||
| #~ msgid "Invoice Date" | #~ msgid "Invoice Date" | ||||||
| #~ msgstr "Rechnung Datum" | #~ msgstr "Rechnung Datum" | ||||||
| 
 | 
 | ||||||
|  | @ -768,12 +746,27 @@ msgstr "" | ||||||
| #~ msgid "Start VM" | #~ msgid "Start VM" | ||||||
| #~ msgstr "VM jetzt starten" | #~ msgstr "VM jetzt starten" | ||||||
| 
 | 
 | ||||||
|  | #~ msgid "View Invoice" | ||||||
|  | #~ msgstr "Zur Rechnung" | ||||||
|  | 
 | ||||||
|  | #~ msgid "" | ||||||
|  | #~ "You're receiving this mail because your virtual machine [%(vm_name)s] has " | ||||||
|  | #~ "been cancelled.<br/>\n" | ||||||
|  | #~ "You can see your order status by clicking [my VM page] below.<br/>\n" | ||||||
|  | #~ "If you want to order a new virtual machine, you can do it by clicking <a " | ||||||
|  | #~ "href=\"%(base_url)s%(my_virtual_machines_url)s\">this link</a>.<br/>\n" | ||||||
|  | #~ msgstr "" | ||||||
|  | #~ "Du erhälst diese E-Mail, da deine virtuelle Maschine [%(vm_name)s] " | ||||||
|  | #~ "gekündigt wurde.<br/>\n" | ||||||
|  | #~ "Um deinen Auftragsstatus zu sehen, klicke auf die [my VM page] unten.<br/" | ||||||
|  | #~ ">\n" | ||||||
|  | #~ "Falls du eine neue virtuelle Maschine bestellen möchtest, kannst du dies " | ||||||
|  | #~ "tun, indem du <a href=\"%(base_url)s%(my_virtual_machines_url)s\">diesen " | ||||||
|  | #~ "Link klickst</a>.<br/>\n" | ||||||
|  | 
 | ||||||
| #~ msgid "Finish Configuration" | #~ msgid "Finish Configuration" | ||||||
| #~ msgstr "Konfiguration beenden" | #~ msgstr "Konfiguration beenden" | ||||||
| 
 | 
 | ||||||
| #~ msgid "Your New VM %(vm_name)s at Data Center Light" |  | ||||||
| #~ msgstr "Deine neue VM %(vm_name)s bei Data Center Light" |  | ||||||
| 
 |  | ||||||
| #~ msgid "My Virtual Machines" | #~ msgid "My Virtual Machines" | ||||||
| #~ msgstr "Meine virtuellen Maschinen" | #~ msgstr "Meine virtuellen Maschinen" | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,7 +1,9 @@ | ||||||
| import os | import os | ||||||
| import logging | import logging | ||||||
|  | from dateutil.relativedelta import relativedelta | ||||||
| 
 | 
 | ||||||
| from django.db import models | from django.db import models | ||||||
|  | from django.utils import timezone | ||||||
| from django.utils.functional import cached_property | from django.utils.functional import cached_property | ||||||
| from Crypto.PublicKey import RSA | from Crypto.PublicKey import RSA | ||||||
| from membership.models import StripeCustomer, CustomUser | from membership.models import StripeCustomer, CustomUser | ||||||
|  | @ -172,3 +174,9 @@ class VMDetail(models.Model): | ||||||
|     ipv6 = models.TextField(default='') |     ipv6 = models.TextField(default='') | ||||||
|     created_at = models.DateTimeField(auto_now_add=True) |     created_at = models.DateTimeField(auto_now_add=True) | ||||||
|     terminated_at = models.DateTimeField(null=True) |     terminated_at = models.DateTimeField(null=True) | ||||||
|  | 
 | ||||||
|  |     def end_date(self): | ||||||
|  |         end_date = self.terminated_at if self.terminated_at else timezone.now() | ||||||
|  |         months = relativedelta(end_date, self.created_at).months or 1 | ||||||
|  |         end_date = self.created_at + relativedelta(months=months, days=-1) | ||||||
|  |         return end_date | ||||||
|  |  | ||||||
|  | @ -373,4 +373,12 @@ | ||||||
|   outline: none; |   outline: none; | ||||||
|   color: #999; |   color: #999; | ||||||
|   fill: #999; |   fill: #999; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .locale_date { | ||||||
|  |   opacity: 0; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .locale_date.done{ | ||||||
|  |   opacity: 1; | ||||||
| } | } | ||||||
|  | @ -1,14 +1,51 @@ | ||||||
| {% extends "datacenterlight/emails/base_email_datacenterlight.html" %} | {% load static i18n %} | ||||||
| {% load i18n %} | <!DOCTYPE html> | ||||||
| {% block email_head %}{{page_header}}{% endblock %} | <html> | ||||||
| {% block email_body %} | 
 | ||||||
| {% url 'hosting:orders' order.id as order_url %} | <head> | ||||||
| {% blocktrans with vm.name as vm_name %}You have ordered a new virtual machine! |     <meta charset="UTF-8"> | ||||||
| <br/> |     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
| Your order of [{{vm_name}}] has been charged.<br/><br/> |     <title>{% blocktrans %}Your New VM {{vm_name}}{% endblocktrans %}</title> | ||||||
| You can view your invoice by clicking the button below.<br/><br/> |     <link rel="shortcut icon" href="{{ base_url }}{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon"> | ||||||
| {% endblocktrans %} |     <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:300,400"> | ||||||
| <div class="button" style="border-collapse: collapse; font-family: 'Lato', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; padding: 30px 0;" align="center"> | </head> | ||||||
|     <a href="{{ base_url }}{{order_url}}" style="border-radius: 5px; color: #ffffff; display: inline-block; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; font-weight: regular; line-height: 45px; text-align: center; text-decoration: none !important; width: 155px; -webkit-text-size-adjust: none; mso-hide: all; background: #ff6f6f;">{% trans 'View Invoice' %}</a> | 
 | ||||||
| </div> | <body style="margin: 0; padding: 20px 0;"> | ||||||
| {% endblock %} |     <table style="width: 100%; border-spacing: 0; border-collapse: collapse; max-width: 560px;"> | ||||||
|  |         <tr> | ||||||
|  |             <td> | ||||||
|  |                 <img src="{{ base_url }}{% static 'datacenterlight/img/logo_black.png' %}" style="width: 200px; height: 50px;"> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 15px;"> | ||||||
|  |                 <h1 style="font-family: Lato, Arial, sans-serif; font-size: 25px; font-weight: 400; margin: 0;">{% blocktrans %}Your New VM {{ vm_name }}{% endblocktrans %}</h1> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 25px; font-size: 16px;"> | ||||||
|  |                 <p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;"> | ||||||
|  |                     {% blocktrans %}You have ordered a new virtual machine!{% endblocktrans %} | ||||||
|  |                 </p> | ||||||
|  |                 <p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;"> | ||||||
|  |                     {% blocktrans %}Your order of <strong>{{ vm_name }}</strong> has been charged.{% endblocktrans %} | ||||||
|  |                 </p> | ||||||
|  |                 <p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;"> | ||||||
|  |                     {% blocktrans %}You can view your VM detail by clicking the button below.{% endblocktrans %} | ||||||
|  |                 </p> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 30px;"> | ||||||
|  |                 <a class="btn" href="{{ base_url }}{{ order_url }}" style="font-family: Lato, Arial, sans-serif; text-decoration: none; background-color: #1596da; color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px; letter-spacing: 0.5px; border-radius: 3px; display: inline-block; position: relative;">{% trans "View Detail" %}</a> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 40px; padding-bottom: 25px;"> | ||||||
|  |                 <h3 style="font-family: Lato, Arial, sans-serif; margin: 0; font-weight: 400; font-size: 15px;">{% trans "Your Data Center Light Team" %}</h3> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |     </table> | ||||||
|  | </body> | ||||||
|  | 
 | ||||||
|  | </html> | ||||||
|  | @ -1,11 +1,11 @@ | ||||||
| {% extends "datacenterlight/emails/base_email_datacenterlight.txt" %} |  | ||||||
| {% load i18n %} | {% load i18n %} | ||||||
| {% block email_head %}{{page_header}}{% endblock %} | 
 | ||||||
| {% block email_body %} | {% blocktrans %}Your New VM {{vm_name}}{% endblocktrans %} | ||||||
| {% url 'hosting:orders' order.id as order_url %} | 
 | ||||||
| {% blocktrans with vm.name as vm_name %}You have ordered a new virtual machine! | {% blocktrans %}You have ordered a new virtual machine!{% endblocktrans %} | ||||||
| Your order of [{{vm_name}}] has been charged. | {% blocktrans %}Your order of {{vm_name}} has been charged.{% endblocktrans %} | ||||||
| You can view your invoice here. | {% blocktrans %}You can view your VM detail by following the link below.{% endblocktrans %} | ||||||
| {% endblocktrans %} | 
 | ||||||
| {{ base_url }}{{order_url}} | {{ base_url }}{{ order_url }} | ||||||
| {% endblock %} | 
 | ||||||
|  | {% trans "Your Data Center Light Team" %} | ||||||
|  | @ -1,14 +1,52 @@ | ||||||
| {% extends "datacenterlight/emails/base_email_datacenterlight.html" %} | {% load static i18n %} | ||||||
| {% load i18n %} | <!DOCTYPE html> | ||||||
| {% block email_head %} | <html> | ||||||
| {% trans 'Password Reset' %} | 
 | ||||||
| {% endblock %} | <head> | ||||||
| {% block email_body %} |     <meta charset="UTF-8"> | ||||||
| {% url 'hosting:reset_password_confirm' uidb64=uid token=token as password_reset_url %} |     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
| {% blocktrans %} |     <title>{% trans "Password Reset" %}</title> | ||||||
| You're receiving this email because you requested a password reset for your user account at {{site_name}}.<br/> |     <link rel="shortcut icon" href="{{ base_url }}{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon"> | ||||||
| Please go to the following page and choose a new password: {{base_url}}{{ password_reset_url }}<br/> |     <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:300,400"> | ||||||
| If you didn't request a new password, ignore this e-mail.<br/> | </head> | ||||||
| Thank you! | 
 | ||||||
| {% endblocktrans %} | <body style="margin: 0; padding: 20px 0;"> | ||||||
| {% endblock %} |     <table style="width: 100%; border-spacing: 0; border-collapse: collapse; max-width: 560px;"> | ||||||
|  |         <tr> | ||||||
|  |             <td> | ||||||
|  |                 <img src="{{base_url}}{% static 'datacenterlight/img/logo_black.png' %}" style="width: 200px; height: 50px;"> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 15px;"> | ||||||
|  |                 <h1 style="font-family: Lato, Arial, sans-serif; font-size: 25px; font-weight: 400; margin: 0;">{% trans "Password Reset" %}</h1> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 25px; font-size: 16px;"> | ||||||
|  |                 <p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 0;"> | ||||||
|  |                     {% trans "We received a request to reset your password." %} | ||||||
|  |                 </p> | ||||||
|  |                 <p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 0;"> | ||||||
|  |                     {% trans "If you didn't make this request you can safely ignore this email." %} | ||||||
|  |                 <p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 10px; margin-top: 0;"> | ||||||
|  |                     {% trans "Otherwise, click here to reset your password." %} | ||||||
|  |                 </p> | ||||||
|  |                 <p style="color: #4382c8; line-height: 1.4; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;"> | ||||||
|  |                     {% url 'hosting:reset_password_confirm' uidb64=uid token=token as password_reset_url %} | ||||||
|  |                     {{base_url}}{{ password_reset_url }} | ||||||
|  |                 </p> | ||||||
|  |                 <p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin-bottom: 0; margin-top: 10px;"> | ||||||
|  |                     {% trans "Thank you!" %} | ||||||
|  |                 </p> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 40px; padding-bottom: 25px;"> | ||||||
|  |                 <h3 style="font-family: Lato, Arial, sans-serif; margin: 0; font-weight: 400; font-size: 15px;">{% trans "Your Data Center Light Team" %}</h3> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |     </table> | ||||||
|  | </body> | ||||||
|  | 
 | ||||||
|  | </html> | ||||||
|  | @ -1,11 +1,14 @@ | ||||||
| {% extends "datacenterlight/emails/base_email_datacenterlight.txt" %} |  | ||||||
| {% load i18n %} | {% load i18n %} | ||||||
| {% block email_head %}{% trans 'Password Reset' %}{% endblock %} | 
 | ||||||
| {% block email_body %} | {% trans "Password Reset" %} | ||||||
|  | 
 | ||||||
|  | {% trans "We received a request to reset your password." %} | ||||||
|  | {% trans "If you didn't make this request you can safely ignore this email." %} | ||||||
|  | {% trans "Otherwise, click here to reset your password." %} | ||||||
|  | 
 | ||||||
| {% url 'hosting:reset_password_confirm' uidb64=uid token=token as password_reset_url %} | {% url 'hosting:reset_password_confirm' uidb64=uid token=token as password_reset_url %} | ||||||
| {% blocktrans %}You're receiving this email because you requested a password reset for your user account at {{site_name}}. | {{base_url}}{{ password_reset_url }} | ||||||
| Please go to the following page and choose a new password: {{base_url}}{{ password_reset_url }} | 
 | ||||||
| If you didn't request a new password, ignore this e-mail. | {% trans "Thank you!" %} | ||||||
| Thank you! | 
 | ||||||
| {% endblocktrans %} | {% trans "Your Data Center Light Team" %} | ||||||
| {% endblock %} |  | ||||||
|  |  | ||||||
|  | @ -1,15 +1,49 @@ | ||||||
| {% extends "datacenterlight/emails/base_email_datacenterlight.html" %} | {% load static i18n %} | ||||||
| {% load i18n %} | <!DOCTYPE html> | ||||||
| {% block email_head %}{{page_header}}{% endblock %} | <html> | ||||||
| {% block email_body %} | 
 | ||||||
| {% url 'hosting:virtual_machines' as my_virtual_machines_url %} | <head> | ||||||
| {% url 'hosting:orders' as vm_orders_url %} |     <meta charset="UTF-8"> | ||||||
| {% blocktrans with vm.name as vm_name %}You're receiving this mail because your virtual machine [{{vm_name}}] has been cancelled.<br/> |     <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
| You can see your order status by clicking [my VM page] below.<br/> |     <title>{% trans "Virtual Machine Cancellation" %}</title> | ||||||
| If you want to order a new virtual machine, you can do it by clicking <a href="{{base_url}}{{my_virtual_machines_url}}">this link</a>.<br/> |     <link rel="shortcut icon" href="{{ base_url }}{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon"> | ||||||
| {% endblocktrans %} |     <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Lato:300,400"> | ||||||
| <div class="button" style="border-collapse: collapse; font-family: 'Lato', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; padding: 30px 0;" align="center"> | </head> | ||||||
|     <a href="{{ base_url }}{{vm_orders_url}}" style="border-radius: 5px; color: #ffffff; display: inline-block; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; font-weight: regular; line-height: 45px; text-align: center; text-decoration: none !important; width: 155px; -webkit-text-size-adjust: none; mso-hide: all; background: #ff6f6f;">{% trans 'My VM page' %}</a> | 
 | ||||||
| </div> | <body style="margin: 0; padding: 20px 0;"> | ||||||
| {% endblock %} |     <table style="width: 100%; border-spacing: 0; border-collapse: collapse; max-width: 560px;"> | ||||||
|  |         <tr> | ||||||
|  |             <td> | ||||||
|  |                 <img src="{{ base_url }}{% static 'datacenterlight/img/logo_black.png' %}" style="width: 200px; height: 50px;"> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 15px;"> | ||||||
|  |                 <h1 style="font-family: Lato, Arial, sans-serif; font-size: 25px; font-weight: 400; margin: 0;">{% trans "Virtual Machine Cancellation" %}</h1> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 25px; font-size: 16px;"> | ||||||
|  |                 <p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;"> | ||||||
|  |                     {% blocktrans %}You are receiving this email because your virutal machine <strong>{{ vm_name }}</strong> has been cancelled.{% endblocktrans %} | ||||||
|  |                 </p> | ||||||
|  |                 <p style="line-height: 1.75; font-family: Lato, Arial, sans-serif; font-weight: 300; margin: 0;"> | ||||||
|  |                     {% blocktrans %}You can always order a new VM by clicking the button below.{% endblocktrans %} | ||||||
|  |                 </p> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 30px;"> | ||||||
|  |                 <a class="btn" href="{{ base_url }}{% url 'hosting:create_virtual_machine' %}" style="font-family: Lato, Arial, sans-serif; text-decoration: none; background-color: #1596da; color: #fff; padding-top: 10px; padding-bottom: 10px; padding-left: 30px; padding-right: 30px; letter-spacing: 0.5px; border-radius: 3px; display: inline-block; position: relative;">{% trans "CREATE VM" %}</a> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |         <tr> | ||||||
|  |             <td style="padding-top: 40px; padding-bottom: 25px;"> | ||||||
|  |                 <h3 style="font-family: Lato, Arial, sans-serif; margin: 0; font-weight: 400; font-size: 15px;">{% trans "Your Data Center Light Team" %}</h3> | ||||||
|  |             </td> | ||||||
|  |         </tr> | ||||||
|  |     </table> | ||||||
|  | </body> | ||||||
|  | 
 | ||||||
|  | </html> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -1,13 +1,10 @@ | ||||||
| {% extends "datacenterlight/emails/base_email_datacenterlight.txt" %} |  | ||||||
| {% load i18n %} | {% load i18n %} | ||||||
| {% block email_head %}{{page_header}}{% endblock %} | 
 | ||||||
| {% block email_body %} | {% trans "Virtual Machine Cancellation" %} | ||||||
| {% url 'hosting:virtual_machines' as my_virtual_machines_url %} | 
 | ||||||
| {% url 'hosting:orders' order.id as vm_order_url %} | {% blocktrans %}You are receiving this email because your virutal machine {{vm_name}} has been cancelled.{% endblocktrans %} | ||||||
| {% blocktrans with vm.name as vm_name %}You're receiving this mail because your virtual machine [{{vm_name}}] has been cancelled. | {% blocktrans %}You can always order a new VM by following the link below.{% endblocktrans %} | ||||||
| You can see your order status by clicking here | 
 | ||||||
| {{base_url}}{{vm_order_url}} | {{ base_url }}{% url 'hosting:create_virtual_machine' %} | ||||||
| If you want to order a new virtual machine, you can do it by clicking this link. | 
 | ||||||
| {{base_url}}{{my_virtual_machines_url}} | {% trans "Your Data Center Light Team" %} | ||||||
| {% endblocktrans %} |  | ||||||
| {% endblock %} |  | ||||||
|  | @ -32,11 +32,11 @@ | ||||||
|             {% endif %} |             {% endif %} | ||||||
|             <p> |             <p> | ||||||
|                 <strong>{% trans "Date" %}:</strong> |                 <strong>{% trans "Date" %}:</strong> | ||||||
|                 <span id="order-created_at"> |                 <span class="locale_date"> | ||||||
|                     {% if order %} |                     {% if order %} | ||||||
|                         {{order.created_at|date:'Y-m-d H:i'}} |                         {{order.created_at|date:'Y-m-d h:i a'}} | ||||||
|                     {% else %} |                     {% else %} | ||||||
|                         {% now "Y-m-d H:i" %} |                         {% now "Y-m-d h:i a" %} | ||||||
|                     {% endif %} |                     {% endif %} | ||||||
|                 </span> |                 </span> | ||||||
|             </p> |             </p> | ||||||
|  | @ -107,7 +107,9 @@ | ||||||
|                         {% if vm.created_at %} |                         {% if vm.created_at %} | ||||||
|                             <p> |                             <p> | ||||||
|                                 <span>{% trans "Period" %}: </span> |                                 <span>{% trans "Period" %}: </span> | ||||||
|                                 <span>{{ vm.created_at|date:'Y/m/d' }} - {% if vm.terminated_at %}{{ vm.terminated_at|date:'Y/m/d' }}{% else %}{% now 'Y/m/d' %}{% endif %}</span> |                                 <span> | ||||||
|  |                                     <span class="locale_date" data-format="YYYY/MM/DD">{{ vm.created_at|date:'Y-m-d h:i a' }}</span> - <span class="locale_date" data-format="YYYY/MM/DD">{{ subscription_end_date|date:'Y-m-d h:i a' }}</span> | ||||||
|  |                                 </span> | ||||||
|                             </p> |                             </p> | ||||||
|                         {% endif %} |                         {% endif %} | ||||||
|                         <p> |                         <p> | ||||||
|  | @ -194,12 +196,16 @@ | ||||||
| <script type="text/javascript"> | <script type="text/javascript"> | ||||||
|     {% trans "Some problem encountered. Please try again later." as err_msg %} |     {% trans "Some problem encountered. Please try again later." as err_msg %} | ||||||
|     var create_vm_error_message = '{{err_msg|safe}}'; |     var create_vm_error_message = '{{err_msg|safe}}'; | ||||||
| 
 |  | ||||||
|     window.onload = function () { |     window.onload = function () { | ||||||
|         var locale_date = moment.utc(document.getElementById("order-created_at").textContent, 'YYYY-MM-DD HH:mm').toDate(); |         var locale_dates = document.getElementsByClassName("locale_date"); | ||||||
|         locale_date = moment(locale_date).format("YYYY-MM-DD h:mm:ss a"); |         var formats = ['YYYY-MM-DD hh:mm a'] | ||||||
|         document.getElementById('order-created_at').innerHTML = locale_date; |         var i; | ||||||
| 
 |         for (i = 0; i < locale_dates.length; i++) { | ||||||
|  |             var oldDate = moment.utc(locale_dates[i].textContent, formats); | ||||||
|  |             var outputFormat = locale_dates[i].getAttribute('data-format') || oldDate._f; | ||||||
|  |             locale_dates[i].innerHTML = oldDate.local().format(outputFormat); | ||||||
|  |             locale_dates[i].className += ' done'; | ||||||
|  |         } | ||||||
|     }; |     }; | ||||||
| </script> | </script> | ||||||
| {%endblock%} | {%endblock%} | ||||||
|  |  | ||||||
|  | @ -267,6 +267,8 @@ class SignupValidatedView(SignupValidateView): | ||||||
|         login_url = '<a href="' + \ |         login_url = '<a href="' + \ | ||||||
|                     reverse('hosting:login') + '">' + str(_('login')) + '</a>' |                     reverse('hosting:login') + '">' + str(_('login')) + '</a>' | ||||||
|         section_title = _('Account activation') |         section_title = _('Account activation') | ||||||
|  |         user = CustomUser.objects.filter( | ||||||
|  |             validation_slug=self.kwargs['validate_slug']).first() | ||||||
|         if validated: |         if validated: | ||||||
|             message = ('{account_activation_string} <br />' |             message = ('{account_activation_string} <br />' | ||||||
|                        ' {login_string} {lurl}.').format( |                        ' {login_string} {lurl}.').format( | ||||||
|  | @ -274,6 +276,21 @@ class SignupValidatedView(SignupValidateView): | ||||||
|                     "Your account has been activated."), |                     "Your account has been activated."), | ||||||
|                 login_string=_("You can now"), |                 login_string=_("You can now"), | ||||||
|                 lurl=login_url) |                 lurl=login_url) | ||||||
|  |             email_data = { | ||||||
|  |                 'subject': _('Welcome to Data Center Light!'), | ||||||
|  |                 'to': user.email, | ||||||
|  |                 'context': { | ||||||
|  |                     'base_url': "{0}://{1}".format( | ||||||
|  |                         self.request.scheme, | ||||||
|  |                         self.request.get_host() | ||||||
|  |                     ) | ||||||
|  |                 }, | ||||||
|  |                 'template_name': 'welcome_user', | ||||||
|  |                 'template_path': 'datacenterlight/emails/', | ||||||
|  |                 'from_address': settings.DCL_SUPPORT_FROM_ADDRESS, | ||||||
|  |             } | ||||||
|  |             email = BaseEmail(**email_data) | ||||||
|  |             email.send() | ||||||
|         else: |         else: | ||||||
|             home_url = '<a href="' + \ |             home_url = '<a href="' + \ | ||||||
|                        reverse('datacenterlight:index') + \ |                        reverse('datacenterlight:index') + \ | ||||||
|  | @ -686,6 +703,7 @@ class OrdersHostingDetailView(LoginRequiredMixin, | ||||||
|                     disk_size=context['vm']['disk_size'], |                     disk_size=context['vm']['disk_size'], | ||||||
|                     memory=context['vm']['memory'] |                     memory=context['vm']['memory'] | ||||||
|                 ) |                 ) | ||||||
|  |                 context['subscription_end_date'] = vm_detail.end_date() | ||||||
|             except VMDetail.DoesNotExist: |             except VMDetail.DoesNotExist: | ||||||
|                 try: |                 try: | ||||||
|                     manager = OpenNebulaManager( |                     manager = OpenNebulaManager( | ||||||
|  | @ -1048,6 +1066,7 @@ class VirtualMachineView(LoginRequiredMixin, View): | ||||||
| 
 | 
 | ||||||
|         try: |         try: | ||||||
|             vm_data = VirtualMachineSerializer(manager.get_vm(vm.id)).data |             vm_data = VirtualMachineSerializer(manager.get_vm(vm.id)).data | ||||||
|  |             vm_name = vm_data.get('name') | ||||||
|         except WrongIdError: |         except WrongIdError: | ||||||
|             return redirect(reverse('hosting:virtual_machines')) |             return redirect(reverse('hosting:virtual_machines')) | ||||||
| 
 | 
 | ||||||
|  | @ -1073,10 +1092,11 @@ class VirtualMachineView(LoginRequiredMixin, View): | ||||||
|                 else: |                 else: | ||||||
|                     sleep(2) |                     sleep(2) | ||||||
|             context = { |             context = { | ||||||
|                 'vm': vm_data, |                 'vm_name': vm_name, | ||||||
|                 'base_url': "{0}://{1}".format(self.request.scheme, |                 'base_url': "{0}://{1}".format(self.request.scheme, | ||||||
|                                                self.request.get_host()), |                                                self.request.get_host()), | ||||||
|                 'page_header': _('Virtual Machine Cancellation') |                 'page_header': _('Virtual Machine %(vm_name)s Cancelled') % { | ||||||
|  |                     'vm_name': vm_name} | ||||||
|             } |             } | ||||||
|             email_data = { |             email_data = { | ||||||
|                 'subject': context['page_header'], |                 'subject': context['page_header'], | ||||||
|  |  | ||||||
|  | @ -8,7 +8,7 @@ msgid "" | ||||||
| msgstr "" | msgstr "" | ||||||
| "Project-Id-Version: PACKAGE VERSION\n" | "Project-Id-Version: PACKAGE VERSION\n" | ||||||
| "Report-Msgid-Bugs-To: \n" | "Report-Msgid-Bugs-To: \n" | ||||||
| "POT-Creation-Date: 2017-10-13 01:56+0530\n" | "POT-Creation-Date: 2017-10-13 02:21+0530\n" | ||||||
| "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" | ||||||
| "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n" | ||||||
| "Language-Team: LANGUAGE <LL@li.org>\n" | "Language-Team: LANGUAGE <LL@li.org>\n" | ||||||
|  | @ -149,10 +149,10 @@ msgid "Our Products" | ||||||
| msgstr "Unsere Produkte" | msgstr "Unsere Produkte" | ||||||
| 
 | 
 | ||||||
| msgid "" | msgid "" | ||||||
| "Our products include an innovative datacenter, affordable VM hosting, and " | "Our products include an innovative datacenter,<br>affordable VM hosting, and " | ||||||
| "high speed fiber internet for canton Glarus." | "high speed fiber internet for canton Glarus." | ||||||
| msgstr "" | msgstr "" | ||||||
| "Zu unseren Produkten gehört ein innovatives Rechenzentrum, modernes VM-" | "Zu unseren Produkten gehört ein innovatives Rechenzentrum,<br>modernes VM-" | ||||||
| "Hosting und Glasfaser-Internet für den Kanton Glarus." | "Hosting und Glasfaser-Internet für den Kanton Glarus." | ||||||
| 
 | 
 | ||||||
| msgid "Data Center Light" | msgid "Data Center Light" | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ | ||||||
| 		<div class="row"> | 		<div class="row"> | ||||||
| 		  <div class="col-lg-12 text-center wow fadeInDown"> | 		  <div class="col-lg-12 text-center wow fadeInDown"> | ||||||
| 		    <h2 class="section-heading">{% trans "Our Products" %}</h2> | 		    <h2 class="section-heading">{% trans "Our Products" %}</h2> | ||||||
| 		    <h3 class="section-subheading text-muted">{% trans "Our products include an innovative datacenter, affordable VM hosting, and high speed fiber internet for canton Glarus." %}</h3> | 		    <h3 class="section-subheading text-muted" style="line-height: 1.8;">{% blocktrans %}Our products include an innovative datacenter,<br>affordable VM hosting, and high speed fiber internet for canton Glarus.{% endblocktrans %}</h3> | ||||||
| 		  </div> | 		  </div> | ||||||
| 		</div> | 		</div> | ||||||
| 		<div class="row"> | 		<div class="row"> | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue