merge master

This commit is contained in:
Arvind Tiwari 2017-10-15 01:52:29 +05:30
commit c60d45c292
24 changed files with 561 additions and 314 deletions

View file

@ -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

View file

@ -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"

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

View file

@ -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'),

View file

@ -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>

View file

@ -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 %}

View file

@ -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>

View file

@ -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" %}

View file

@ -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>

View file

@ -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')))

View file

@ -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(

View file

@ -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"

View file

@ -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

View file

@ -374,3 +374,11 @@
color: #999; color: #999;
fill: #999; fill: #999;
} }
.locale_date {
opacity: 0;
}
.locale_date.done{
opacity: 1;
}

View file

@ -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>

View file

@ -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" %}

View file

@ -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>

View file

@ -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 %}

View file

@ -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>

View file

@ -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 %}

View file

@ -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%}

View file

@ -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'],

View file

@ -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"

View file

@ -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">