Merge branch 'master' into task/3848/ungleich_page_optimize

This commit is contained in:
Arvind Tiwari 2017-10-26 03:03:19 +05:30
commit 801c840a4d
58 changed files with 1667 additions and 616 deletions

View file

@ -1,7 +1,16 @@
Next release: 1.2.8: 2017-10-21
* Remove ALLOWED_HOST alplora.ch
* Add ALLOWED_HOST hack4glarus.ch
* Fetch page_title and meta_description dynamically in glasfaser CMS template
1.2.7: 2017-10-20
* 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 * #3829: [dcl] Handle landing login fail in payment page itself
* #3794: [dcl, hosting] Update email styles
* #3828: [dcl, hosting] invoice period set to show monthly subscription
* #3838: [hosting] restyle signup/login/password reset/password pages
* Bugfix: [dg] Remove validate email link in the registration email
* Feature: [ungleich_page] Add new glasfaser CMS template
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

@ -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-10 21:35+0530\n" "POT-Creation-Date: 2017-10-16 00:57+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"
@ -126,56 +126,57 @@ 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 "Your account details are as follows"
msgid "" msgstr "Deine Account Details sind unten aufgelistet"
"Your account details are as follows:<br/><br/>\n"
"Username : Your email address<br/>\n"
"Password : %(account_details)s<br/><br/>\n"
"You can reset your password here:\n"
"%(base_url)s%(reset_password_url)s\n"
msgstr ""
#, python-format msgid "Username"
msgid "" msgstr "Username"
"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 " msgid "Your email address"
"browser\n" msgstr "Deine E-Mail-Adresse"
"to activate your Data Center Light account.\n"
"%(base_url)s%(activation_link)s\n" msgid "Password"
msgstr "" msgstr "Passwort"
"Klicke hier, um deinen Data Center Light Account zu aktivieren oder kopiere "
"den folgenden Link in die Adressleiste deines Browsers.\n" msgid "You can reset your password here"
"%(base_url)s%(activation_link)s\n" msgstr "Du kannst dein Passwort hier zurück setzen"
#, python-format
msgid "" msgid ""
"Your account details are as follows:\n" "You can copy and paste the following link into the address bar of your "
"\n" "browser to activate your Data Center Light account."
"Username : Your email address\n" msgstr "Kopiere den folgenden Link in die Adressleiste deines Browsers."
"Password : %(account_details)s\n"
"\n" msgid "Welcome to Data Center Light!"
"You can reset your password here:\n" msgstr "Willkommen beim Data Center Light!"
"%(base_url)s%(reset_password_url)s\n"
msgstr "" msgid ""
"Thanks for joining us! We provide the most affordable virtual machines from "
"the heart of Switzerland."
msgstr "Bei uns findest Du die günstiges VMs aus der Schweiz."
msgid "Try now, order a VM. VM price starts from only 15CHF per month."
msgstr "Unser Angebot beginnt bei 15 CHF pro Monat. Probier's jetzt aus!"
msgid "ORDER VM"
msgstr "VM BESTELLEN"
msgid "Home" msgid "Home"
msgstr "Home" msgstr "Home"
@ -512,6 +513,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 +540,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"
@ -560,9 +561,6 @@ msgstr ""
#~ "kontaktiere uns unter support@datacenterlight.ch. Unser Team wird sich " #~ "kontaktiere uns unter support@datacenterlight.ch. Unser Team wird sich "
#~ "umgehend um dein Anliegen kümmern!" #~ "umgehend um dein Anliegen kümmern!"
#~ msgid "Email Address"
#~ msgstr "E-Mail-Adresse"
#~ msgid "is not a proper name" #~ msgid "is not a proper name"
#~ msgstr "ist kein gültiger Name" #~ msgstr "ist kein gültiger Name"

View file

@ -182,7 +182,11 @@ button, input, optgroup, select, textarea {
.navbar-brand { .navbar-brand {
padding: 10px 15px; padding: 10px 15px;
cursor: pointer; }
@media (max-width: 767px) {
.navbar-brand {
padding: 10px 10px;
}
} }
.navbar-right { .navbar-right {
@ -1544,7 +1548,7 @@ tech-sub-sec h2 {
} }
footer { footer {
padding: 50px 0; padding: 50px 20px;
background-color: #f8f8f8; background-color: #f8f8f8;
} }

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 181 KiB

After

Width:  |  Height:  |  Size: 58 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,58 @@
{% 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>
<p>
{% if account_details %}
{% url 'hosting:reset_password' as reset_password_url %}
{% trans "Your account details are as follows" %}:
{% trans "Username" %} : {% trans "Your email address" %}
{% trans "Password" %} : {{account_details}}
{% trans "You can reset your password here" %}:
{{base_url}}{{reset_password_url}}
{% endif %}
</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,20 @@
{% 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 %} {% if account_details %}
{% url 'hosting:reset_password' as reset_password_url %} {% url 'hosting:reset_password' as reset_password_url %}
{% blocktrans %}Your account details are as follows: {% trans "Your account details are as follows" %}:
Username : Your email address {% trans "Username" %} : {% trans "Your email address" %}
Password : {{account_details}} {% trans "Password" %} : {{account_details}}
You can reset your password here: {% trans "You can reset your password here" %}:
{{base_url}}{{reset_password_url}} {{base_url}}{{reset_password_url}}
{% endblocktrans %}
{% endif %} {% endif %}
{% endblock %}
{% trans "Your Data Center Light Team" %}

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

@ -1,38 +1,39 @@
{% load staticfiles i18n%} {% load staticfiles i18n%}
{% get_current_language as LANGUAGE_CODE %} {% get_current_language as LANGUAGE_CODE %}
<footer>
<div class="container">
<ul class="list-inline">
{% if request.resolver_match.url_name != "index" %}
<li>
<a href="{% url 'datacenterlight:index' %}">{% trans "Home" %}</a>
</li>
<li class="footer-menu-divider">&sdot;</li>
{% endif %}
<li>
<a class="url-init" href="{% url 'datacenterlight:index' %}#how">{% trans "Highlights" %}</a>
</li>
<li>
<a class="url-init" href="{% url 'datacenterlight:index' %}#your">{% trans "Scale out" %}</a>
</li>
<li>
<a class="url-init" href="{% url 'datacenterlight:index' %}#our">{% trans "Reliable and light" %}</a>
</li>
{% if request.resolver_match.url_name != "index" %}
<li>
<a class="url-init" href="{% url 'datacenterlight:index' %}#price">{% trans "Pricing" %}</a>
</li>
<li class="footer-menu-divider">&sdot;</li>
{% else %}
<li>
<a class="url-init" href="{% url 'datacenterlight:index' %}#price">{% trans "Order VM" %}</a>
</li>
{% endif %}
<li>
<a class="url-init" href="{% url 'datacenterlight:index' %}#contact">{% trans "Contact" %}</a>
</li>
</ul>
<p class="copyright text-muted small">Copyright &copy; ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p> <footer>
</div> <div class="container">
</footer> <ul class="list-inline">
{% if request.resolver_match.url_name != "index" %}
<li>
<a href="{% url 'datacenterlight:index' %}">{% trans "Home" %}</a>
</li>
<li class="footer-menu-divider">&sdot;</li>
{% endif %}
<li>
<a class="url-init" href="{% url 'datacenterlight:index' %}#how">{% trans "Highlights" %}</a>
</li>
<li>
<a class="url-init" href="{% url 'datacenterlight:index' %}#your">{% trans "Scale out" %}</a>
</li>
<li>
<a class="url-init" href="{% url 'datacenterlight:index' %}#our">{% trans "Reliable and light" %}</a>
</li>
{% if request.resolver_match.url_name != "index" %}
<li>
<a class="url-init" href="{% url 'datacenterlight:index' %}#price">{% trans "Pricing" %}</a>
</li>
<li class="footer-menu-divider">&sdot;</li>
{% else %}
<li>
<a class="url-init" href="{% url 'datacenterlight:index' %}#price">{% trans "Order VM" %}</a>
</li>
{% endif %}
<li>
<a class="url-init" href="{% url 'datacenterlight:index' %}#contact">{% trans "Contact" %}</a>
</li>
</ul>
<p class="copyright text-muted small">Copyright &copy; ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p>
</div>
</footer>

View file

@ -218,6 +218,7 @@ CMS_TEMPLATES = (
('page.html', gettext('Page')), ('page.html', gettext('Page')),
# dcl # dcl
('datacenterlight/cms_page.html', gettext('Data Center Light')), ('datacenterlight/cms_page.html', gettext('Data Center Light')),
('ungleich_page/glasfaser_cms_page.html', gettext('Glasfaser')),
) )
DATABASES = { DATABASES = {
@ -347,8 +348,6 @@ MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media')
MEDIA_URL = APP_ROOT_ENDPOINT + 'media/' MEDIA_URL = APP_ROOT_ENDPOINT + 'media/'
FILE_UPLOAD_PERMISSIONS = 0o644 FILE_UPLOAD_PERMISSIONS = 0o644
META_SITE_PROTOCOL = 'http'
META_USE_SITES = True
MIGRATION_MODULES = { MIGRATION_MODULES = {
'cms': 'cms.migrations', 'cms': 'cms.migrations',
# 'filer': 'filer.migrations_django', # 'filer': 'filer.migrations_django',
@ -359,9 +358,6 @@ MIGRATION_MODULES = {
'djangocms_link': 'djangocms_link.migrations_django', 'djangocms_link': 'djangocms_link.migrations_django',
'djangocms_teaser': 'djangocms_teaser.migrations_django', 'djangocms_teaser': 'djangocms_teaser.migrations_django',
'djangocms_column': 'djangocms_column.migrations_django', 'djangocms_column': 'djangocms_column.migrations_django',
'djangocms_flash': 'djangocms_flash.migrations_django',
'djangocms_googlemap': 'djangocms_googlemap.migrations_django',
'djangocms_inherit': 'djangocms_inherit.migrations_django',
'djangocms_style': 'djangocms_style.migrations_django', 'djangocms_style': 'djangocms_style.migrations_django',
'cmsplugin_filer_image': 'cmsplugin_filer_image.migrations_django', 'cmsplugin_filer_image': 'cmsplugin_filer_image.migrations_django',
'cmsplugin_filer_file': 'cmsplugin_filer_file.migrations_django', 'cmsplugin_filer_file': 'cmsplugin_filer_file.migrations_django',
@ -495,11 +491,10 @@ AUTH_USER_MODEL = 'membership.CustomUser'
STRIPE_DESCRIPTION_ON_PAYMENT = "Payment for ungleich GmbH services" STRIPE_DESCRIPTION_ON_PAYMENT = "Payment for ungleich GmbH services"
# EMAIL MESSAGES # EMAIL MESSAGES
REGISTRATION_MESSAGE = {'subject': "Validation mail", REGISTRATION_MESSAGE = {
'message': 'Thank You for registering for account on Digital Glarus.\n' 'subject': "Digital Glarus registration",
'Please verify Your account under following link ' 'message': 'Thank You for registering for account on Digital Glarus.'
'http://{host}/en-us/digitalglarus/login/validate/{slug}', }
}
STRIPE_API_PRIVATE_KEY = env('STRIPE_API_PRIVATE_KEY') STRIPE_API_PRIVATE_KEY = env('STRIPE_API_PRIVATE_KEY')
STRIPE_API_PUBLIC_KEY = env('STRIPE_API_PUBLIC_KEY') STRIPE_API_PUBLIC_KEY = env('STRIPE_API_PUBLIC_KEY')
STRIPE_API_PRIVATE_KEY_TEST = env('STRIPE_API_PRIVATE_KEY_TEST') STRIPE_API_PRIVATE_KEY_TEST = env('STRIPE_API_PRIVATE_KEY_TEST')

View file

@ -31,5 +31,5 @@ ALLOWED_HOSTS = [
".ipv6onlyhosting.com", ".ipv6onlyhosting.com",
".ipv6onlyhosting.net", ".ipv6onlyhosting.net",
".digitalglarus.ch", ".digitalglarus.ch",
".alplora.ch" ".hack4glarus.ch"
] ]

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-10 21:35+0530\n" "POT-Creation-Date: 2017-10-16 01:06+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"
@ -155,9 +155,6 @@ msgstr "Ich möchte einen existierenden SSH-Key nutzen"
msgid "Upload" msgid "Upload"
msgstr "Hochladen" msgstr "Hochladen"
msgid "Your VM hosted in Switzerland"
msgstr "Deine VM in der Schweiz"
msgid "Set your new password" msgid "Set your new password"
msgstr "Setze Dein neues Passwort" msgstr "Setze Dein neues Passwort"
@ -195,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"
@ -300,13 +274,16 @@ msgstr "Dashboard"
msgid "Logout" msgid "Logout"
msgstr "Abmelden" msgstr "Abmelden"
msgid "Don't have an account yet ? " msgid "Log in"
msgstr "Anmelden"
msgid "Don't have an account yet ?"
msgstr "Besitzt du kein Benutzerkonto?" msgstr "Besitzt du kein Benutzerkonto?"
msgid "Sign up" msgid "Sign up"
msgstr "Registrieren" msgstr "Registrieren"
msgid "Forgot your password ? " msgid "Forgot your password ?"
msgstr "Passwort vergessen?" msgstr "Passwort vergessen?"
msgid "Resend activation link" msgid "Resend activation link"
@ -478,7 +455,7 @@ msgstr "Deine Kreditkartennummer"
msgid "Submit" msgid "Submit"
msgstr "Absenden" msgstr "Absenden"
msgid "Reset your password" msgid "Password reset"
msgstr "Passwort zurücksetzen" msgstr "Passwort zurücksetzen"
msgid "UPDATE" msgid "UPDATE"
@ -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,14 +704,21 @@ 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 ""
"Es gab einen Fehler bei der Bearbeitung Deine Anfrage. Bitte versuche es " "Es gab einen Fehler bei der Bearbeitung Deine Anfrage. Bitte versuche es "
"noch einmal." "noch einmal."
#~ msgid "Reset your password"
#~ msgstr "Passwort zurücksetzen"
#~ msgid "My VM page"
#~ msgstr "Meine VM page"
#~ msgid "Invoice Date" #~ msgid "Invoice Date"
#~ msgstr "Rechnung Datum" #~ msgstr "Rechnung Datum"
@ -765,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"
@ -828,9 +824,6 @@ msgstr ""
#~ msgid "Keys" #~ msgid "Keys"
#~ msgstr "Keys" #~ msgstr "Keys"
#~ msgid "Log in"
#~ msgstr "Anmelden"
#~ msgid "You haven been logged out" #~ msgid "You haven been logged out"
#~ msgstr "Du wurdest abgemeldet" #~ msgstr "Du wurdest abgemeldet"

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

@ -18,7 +18,7 @@
} }
.content-dashboard{ .content-dashboard{
min-height: calc(100vh - 70px); min-height: calc(100vh - 60px);
width: 80%; width: 80%;
margin: 0 auto; margin: 0 auto;
max-width: 1120px; max-width: 1120px;
@ -66,7 +66,9 @@
width: 280px; width: 280px;
} }
.content-dashboard { .content-dashboard {
width: 90%; padding-left: 15px;
padding-right: 15px;
width: 100%;
} }
} }
.btn:focus, .btn:active:focus { .btn:focus, .btn:active:focus {
@ -296,10 +298,6 @@
max-width: 360px; max-width: 360px;
} }
.btn-wide {
min-width: 100px;
}
.caps-link { .caps-link {
font-weight: 600; font-weight: 600;
color: #8da4c0; color: #8da4c0;
@ -376,3 +374,11 @@
color: #999; color: #999;
fill: #999; fill: #999;
} }
.locale_date {
opacity: 0;
}
.locale_date.done{
opacity: 1;
}

View file

@ -17,9 +17,11 @@ h3,
h4, h4,
h5, h5,
h6 { h6 {
/*font-family: 'Lato-Regular', sans-serif;*/
font-family: 'Lato', sans-serif; font-family: 'Lato', sans-serif;
/*font-weight: 300;*/ }
.allcaps {
text-transform: uppercase;
} }
.topnav { .topnav {
@ -31,6 +33,11 @@ h6 {
.navbar-brand { .navbar-brand {
padding: 10px 15px; padding: 10px 15px;
} }
@media (max-width: 767px) {
.navbar-brand {
padding: 10px 0;
}
}
.navbar-default { .navbar-default {
background: #fff; background: #fff;
@ -46,7 +53,7 @@ h6 {
.navbar-transparent { .navbar-transparent {
background: transparent; background: transparent;
border: none; border: none;
padding: 20px; padding: 20px 0;
box-shadow: none; box-shadow: none;
} }
@ -72,7 +79,6 @@ h6 {
.navbar-transparent #logoWhite{ .navbar-transparent #logoWhite{
display: block; display: block;
width: 220px; width: 220px;
/* color: #fff; */
} }
.navbar-right .highlights-dropdown .dropdown-menu { .navbar-right .highlights-dropdown .dropdown-menu {
@ -92,16 +98,6 @@ h6 {
border-color: #e7e7e7; border-color: #e7e7e7;
box-shadow: -8px 14px 20px -5px rgba(77, 77, 77, 0.5); box-shadow: -8px 14px 20px -5px rgba(77, 77, 77, 0.5);
} }
/* .navbar-right .highlights-dropdown .dropdown-menu:before {
content: '';
display: block;
height: 1px;
background: #e7e7e7;
position: absolute;
top: -1px;
left: -1px;
right: -1px;
} */
} }
.navbar-right .highlights-dropdown .dropdown-menu > li > a{ .navbar-right .highlights-dropdown .dropdown-menu > li > a{
font-size: 13px; font-size: 13px;
@ -274,16 +270,15 @@ h6 {
/*------Auth section---------*/ /*------Auth section---------*/
.auth-container { .auth-container {
min-height: calc(100vh - 120px); min-height: calc(100vh - 180px);
position: relative; position: relative;
/* flex-grow: 1; */
display: flex; display: flex;
flex-direction: column; flex-direction: column;
justify-content: center; justify-content: center;
} }
.auth-bg { .auth-bg {
background: url(../img/auth-bg-sm.jpg); background: url(../img/pattern.jpg) no-repeat center center;
position: fixed; position: fixed;
left: 0; left: 0;
top: 0; top: 0;
@ -293,7 +288,6 @@ h6 {
background-position: center center; background-position: center center;
background-size: cover; background-size: cover;
background-attachment: fixed; background-attachment: fixed;
} }
.auth-bg::before { .auth-bg::before {
@ -303,7 +297,7 @@ h6 {
bottom: 0; bottom: 0;
left: 0; left: 0;
right: 0; right: 0;
background: rgba(75, 75, 101, 0.55); background: rgba(90, 116, 175, 0.7);
z-index: 1; z-index: 1;
} }
@ -313,69 +307,38 @@ h6 {
.auth-container .auth-content { .auth-container .auth-content {
width: 100%; width: 100%;
margin: 0 auto; margin: 0 auto 15px;
max-width: 390px; max-width: 400px;
padding: 0 15px;
} }
.auth-container .auth-center { .auth-container .auth-content.wide {
/* position: absolute; */ max-width: 480px;
/* left: 50%; */
/* top: 50%; */
/* transform: translate(-50%, -50%); */
/* width: 100%; */
}
.auth-container .auth-title {
margin-bottom: 50px;
}
.auth-container .auth-title h2 {
color: #fff;
font-size: 44px;
text-align: center;
width: 425px;
margin: 0 auto;
margin-bottom: 30px;
position: relative;
}
.auth-container .auth-title h2::after {
content: "";
position: absolute;
bottom: -20px;
background: #fff;
height: 7px;
width: 70px;
left: 50%;
transform: translate(-50%, 0);
} }
.auth-box { .auth-box {
position: relative;
background: #fff; background: #fff;
padding: 0; padding: 40px 20px 20px;
padding-bottom: 30px;
box-sizing: border-box; box-sizing: border-box;
box-shadow: 0 10px 20px rgba(0, 0, 0, 0.19), 0 6px 6px rgba(0, 0, 0, 0.23); box-shadow: 0 6px 12px rgba(0, 0, 0, 0.09), 0 5px 5px rgba(0, 0, 0, 0.23);
border-radius: 4px;
z-index: 10; z-index: 10;
} }
.auth-box .section-heading { .auth-box .section-heading {
color: #5a5a5a; color: #5a5a5a;
padding-top: 30px; font-weight: 300;
padding-bottom: 5px;
text-align: center; text-align: center;
text-transform: uppercase; letter-spacing: 1px;
letter-spacing: 3px; font-size: 36px;
font-size: 20px;
border-radius: 3px 3px 0px 0px; border-radius: 3px 3px 0px 0px;
margin: 0 auto; margin: 0 auto 10px;
} }
.auth-box .form { .auth-box .form {
padding: 20px; padding: 20px;
width: 80%;
margin: 0 auto; margin: 0 auto;
max-width: 360px;
} }
.auth-box .form .red { .auth-box .form .red {
@ -383,27 +346,56 @@ h6 {
} }
.auth-box .form .btn { .auth-box .form .btn {
box-shadow: 0 0px 9px rgba(0, 0, 0, 0.19), 0 3px 5px rgba(0, 0, 0, 0.23); letter-spacing: 2px;
letter-spacing: 3px; font-size: 16px;
font-size: 17px; padding: 6px 12px;
min-width: 140px;
margin-top: 15px;
text-transform: uppercase; text-transform: uppercase;
} }
.auth-box .form .form-control { .auth-box .form .form-control {
height: 44px; height: 48px;
font-size: 16px; font-size: 14px;
padding: 10px 17px;
line-height: 30px;
border-color: #aaa;
}
.auth-box .form .form-control:focus,
.auth-box .form .form-control:active {
box-shadow: none;
border-radius: 0;
}
.auth-box .form-control::-webkit-input-placeholder {
color: #aaa;
}
.auth-box .form-control:-moz-placeholder{
/* Firefox 18- */
color: #aaa;
}
.auth-box .form-control::-moz-placeholder{
/* Firefox 19+ */
color: #aaa;
}
.auth-box .form-control:-ms-input-placeholder {
color: #aaa;
} }
.auth-box .auth-footer { .auth-box .auth-footer {
text-align: center; text-align: center;
padding: 10px; padding: 5px;
} }
.auth-box .auth-footer .text { .auth-box .auth-footer {
color: #777; color: #777;
} }
.auth-box .auth-footer .links a { .auth-box .auth-footer a {
color: #1e94cc; color: #1e94cc;
} }
@ -411,20 +403,11 @@ h6 {
color: #1e94cc; color: #1e94cc;
} }
.auth-box.sign-up {
padding-bottom: 5px;
}
.auth-box.sign-up .form {
padding: 15px 20px 0 20px;
}
.sign-up-message { .sign-up-message {
padding: 25px 30px 25px 30px; padding: 25px 30px 25px 30px;
text-align: center; text-align: center;
font-size: 18px; font-size: 18px;
line-height: 30px; line-height: 30px;
/*font-family: 'Lato' !important;*/
font-weight: 300 !important; font-weight: 300 !important;
} }
@ -458,16 +441,7 @@ h6 {
} }
.auth-box .form { .auth-box .form {
padding: 15px 0px 0 0; padding: 15px 0 15px 0;
}
.auth-box.sign-up .form {
padding: 15px 0px 0 0;
}
.auth-box .form .form-control {
height: 44px;
font-size: 13px;
} }
.auth-container .auth-title { .auth-container .auth-title {
@ -476,7 +450,7 @@ h6 {
} }
.auth-box .msg-list { .auth-box .msg-list {
padding: 15px 25px 5px; padding: 20px 25px 0;
text-align: center; text-align: center;
} }
@ -493,19 +467,14 @@ h6 {
margin-bottom: 50px; margin-bottom: 50px;
} }
.auth-box .form {
width: 90%;
}
.auth-box .section-heading { .auth-box .section-heading {
font-size: 15px; font-size: 32px;
} }
} }
footer { footer {
padding: 20px; padding: 20px 0;
background-color: #f8f8f8; background-color: #f8f8f8;
/* position: absolute */
right: 0; right: 0;
bottom: 0; bottom: 0;
left: 0; left: 0;
@ -537,7 +506,6 @@ a.unlink:hover {
/***** DCL payment page **********/ /***** DCL payment page **********/
.dcl-order-container { .dcl-order-container {
/*font-family: Lato;*/
font-weight: 300; font-weight: 300;
} }
@ -580,9 +548,7 @@ a.unlink:hover {
} }
.dcl-place-order-text{ .dcl-place-order-text{
/* font-size: 13px; */
color: #808080; color: #808080;
/* margin-bottom: 15px; */
} }
.dcl-order-table-total .tbl-total { .dcl-order-table-total .tbl-total {
@ -610,7 +576,6 @@ a.unlink:hover {
} }
.card-warning-content { .card-warning-content {
/*font-family: Lato;*/
font-weight: 300; font-weight: 300;
border: 1px solid #a1a1a1; border: 1px solid #a1a1a1;
border-radius: 3px; border-radius: 3px;
@ -638,18 +603,6 @@ a.unlink:hover {
right: 0; right: 0;
} }
.brand {
}
.brand #brand-icon {
}
.card-number-element {
}
.card-expiry-element {
}
.card-cvc-element label { .card-cvc-element label {
padding-left: 10px; padding-left: 10px;
} }
@ -735,9 +688,6 @@ a.unlink:hover {
margin-bottom: 30px; margin-bottom: 30px;
} }
.brand {
}
.card-expiry-element { .card-expiry-element {
padding-right: 10px; padding-right: 10px;
} }
@ -802,10 +752,23 @@ a.unlink:hover {
} }
} }
.footer-light {
.footer-light a:hover, .footer-light a:focus, .footer-light a:active { position: relative;
}
.footer-light footer {
background: transparent;
color: #eee;
}
.footer-light a,
.footer-light .text-muted {
color: #ddd; color: #ddd;
} }
.footer-light a:hover, .footer-light a:focus, .footer-light a:active {
color: #fff;
}
.footer-vm p.copyright {
margin-top: 4px;
}
.visible-mobile { .visible-mobile {
display: none !important; display: none !important;

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 181 KiB

View file

@ -54,19 +54,18 @@
{% include "hosting/includes/_navbar_user.html" %} {% include "hosting/includes/_navbar_user.html" %}
{% endblock navbar %} {% endblock navbar %}
<div class="{% if request.user.is_authenticated %}content-dashboard{% endif %}">
<div class="content-dashboard">
{% block content %} {% block content %}
{% endblock %} {% endblock %}
</div> </div>
<!-- Footer --> <!-- Footer -->
{% if request.user.is_authenticated %} {% if request.user.is_authenticated %}
<footer class="footer-vm"> <footer class="footer-vm">
<div class="container"> <div class="container">
<p class="copyright text-muted small">Copyright &copy; ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p> <p class="copyright text-muted small">Copyright &copy; ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p>
</div> </div>
</footer> </footer>
{% else %} {% else %}
<div class="footer-light"> <div class="footer-light">
{% include "datacenterlight/includes/_footer.html" %} {% include "datacenterlight/includes/_footer.html" %}

View file

@ -1,21 +1,17 @@
{% extends "hosting/base_short.html" %} {% extends "hosting/base_short.html" %}
{% load staticfiles bootstrap3%} {% load staticfiles bootstrap3 i18n %}
{% load i18n %}
{% block navbar %} {% block navbar %}
{% include 'hosting/includes/_navbar_transparent.html' %} {% include 'hosting/includes/_navbar_transparent.html' %}
{% endblock navbar %} {% endblock navbar %}
{% block content %} {% block content %}
<div class="auth-container"> <div class="auth-container">
<div class="auth-bg"></div> <div class="auth-bg"></div>
<div class="auth-center"> <div class="auth-center">
<div class="auth-title">
<h2>{% trans "Your VM hosted in Switzerland"%}</h2>
</div>
<div class="auth-content"> <div class="auth-content">
<div class="intro-message auth-box sign-up"> <div class="auth-box sign-up">
<h2 class="section-heading">{% trans "Set your new password"%}</h2> <h1 class="section-heading">{% trans "Set your new password" %}</h1>
{% if messages %} {% if messages %}
<ul class="list-unstyled msg-list"> <ul class="list-unstyled msg-list">
{% for message in messages %} {% for message in messages %}
@ -28,23 +24,18 @@
{% for field in form %} {% for field in form %}
{% bootstrap_field field show_label=False %} {% bootstrap_field field show_label=False %}
{% endfor %} {% endfor %}
{% buttons %} <div class="text-center">
<button type="submit" class="btn btn-block btn-success"> <button type="submit" class="btn choice-btn">
{% trans "Reset"%} {% trans "Reset" %}
</button> </button>
{% endbuttons %} </div>
</form> </form>
<div class="auth-footer"> <div class="auth-footer">
<div class="text"> <span>{% trans "Already have an account ?" %}</span>&nbsp;
<span>{% trans "Already have an account ?"%}</span> <a class="unlink" href="{% url 'hosting:login' %}">{% trans "Login" %}</a>
</div>
<div class="links">
<a class="unlink" href="{% url 'hosting:login' %}">{% trans "Login"%}</a>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

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

@ -1,8 +1,7 @@
{% if messages %} {% if messages %}
<ul class="list-unstyled msg-list"> <ul class="list-unstyled msg-list">
{% for message in messages %} {% for message in messages %}
<div <div class="alert {% if message.tags and message.tags == 'error' %} alert-danger {% else %} alert-{{message.tags}} {% endif %}">{{ message|safe }}</div>
class="alert {% if message.tags and message.tags == 'error' %} alert-danger {% else %} alert-{{message.tags}} {% endif %}">{{ message|safe }}</div>
{% endfor %} {% endfor %}
</ul> </ul>
{% endif %} {% endif %}

View file

@ -1,11 +1,13 @@
{% load static i18n %} {% load static i18n %}
<nav class="navbar navbar-default topnav navbar-transparent" role="navigation"> <nav class="navbar navbar-default topnav navbar-transparent" role="navigation">
<div class="topnav"> <div class="container">
<!-- Brand and toggle get grouped for better mobile display --> <div class="topnav">
<div class="navbar-header"> <!-- Brand and toggle get grouped for better mobile display -->
<a id="logoWhite" class="navbar-brand topnav" href="{% url 'datacenterlight:index' %}"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a> <div class="navbar-header">
<a id="logoWhite" class="navbar-brand topnav" href="{% url 'datacenterlight:index' %}"><img src="{% static 'datacenterlight/img/logo_white.svg' %}"></a>
</div>
</div> </div>
<!-- /.container -->
</div> </div>
<!-- /.container -->
</nav> </nav>

View file

@ -1,49 +1,43 @@
{% extends "hosting/base_short.html" %} {% extends "hosting/base_short.html" %}
{% load i18n %} {% load i18n staticfiles bootstrap3%}
{% load staticfiles bootstrap3%}
{% block navbar %} {% block navbar %}
{% include 'hosting/includes/_navbar_transparent.html' %} {% include 'hosting/includes/_navbar_transparent.html' %}
{% endblock navbar %} {% endblock navbar %}
{% block content %} {% block content %}
<div class="auth-container"> <div class="auth-container">
<div class="auth-bg"></div> <div class="auth-bg"></div>
<div class="auth-center"> <div class="auth-center">
<div class="auth-title"> <div class="auth-content">
<h2>{% trans "Your VM hosted in Switzerland"%}</h2> <div class="auth-box">
</div> <h1 class="section-heading allcaps">{% trans "Log in" %}</h1>
<div class="auth-content"> {% include 'hosting/includes/_messages.html' %}
<div class="intro-message auth-box"> <form action="{% url 'hosting:login' %}" method="post" class="form" novalidated>
<h2 class="section-heading">{% trans "Login"%}</h2> {% csrf_token %}
{% include 'hosting/includes/_messages.html' %} {% for field in form %}
<form action="{% url 'hosting:login' %}" method="post" class="form" novalidated> {% bootstrap_field field show_label=False type='fields'%}
{% csrf_token %} {% endfor %}
{% for field in form %} <p class="red">{{form.non_field_errors|striptags}}</p>
{% bootstrap_field field show_label=False type='fields'%} <div class="text-center">
{% endfor %} <button type="submit" class="btn choice-btn">
<p class="red">{{form.non_field_errors|striptags}}</p> {% trans "Log in" %}
{% buttons %} </button>
<button type="submit" class="btn btn-block btn-success"> </div>
{% trans "Login"%} <input type='hidden' name='next' value='{{request.GET.next}}'/>
</button> </form>
{% endbuttons %} <div class="auth-footer">
<input type='hidden' name='next' value='{{request.GET.next}}'/> <div>
</form> {% trans "Don't have an account yet ?" %}&nbsp;
<div class="auth-footer"> <a class="" href="{% url 'hosting:signup' %}">{% trans "Sign up" %}</a>
<div class="text"> </div>
<span>{% trans "Don't have an account yet ? "%}</span> <div>
</div> or <a href="{% url 'hosting:reset_password' %}">{% trans "Forgot your password ?" %}</a><br>
<div class="links"> or <a href="{% url 'hosting:resend_activation_link' %}">{% trans "Resend activation link" %}</a>
<a class="unlink" href="{% url 'hosting:signup' %}">{% trans "Sign up"%}</a> </div>
<span class="text"> or </span>
<a class="unlink" href="{% url 'hosting:reset_password' %}">{% trans "Forgot your password ? "%}</a>
<span class="text"> or </span><br/>
<a class="unlink" href="{% url 'hosting:resend_activation_link' %}">{% trans "Resend activation link"%}</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock %} {% 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

@ -1,37 +1,40 @@
{% extends "hosting/base_short.html" %} {% extends "hosting/base_short.html" %}
{% load staticfiles bootstrap3%} {% load staticfiles bootstrap3 i18n %}
{% load i18n %}
{% block navbar %} {% block navbar %}
{% include 'hosting/includes/_navbar_transparent.html' %} {% include 'hosting/includes/_navbar_transparent.html' %}
{% endblock navbar %} {% endblock navbar %}
{% block content %} {% block content %}
<div class="auth-container"> <div class="auth-container">
<div class="auth-bg"></div> <div class="auth-bg"></div>
<div class="auth-center"> <div class="auth-center">
<div class="auth-title"> <div class="auth-content wide">
<h2>{% trans "Your VM hosted in Switzerland"%}</h2> <div class="auth-box sign-up">
</div> <h1 class="section-heading">{% trans "Resend activation link" %}</h1>
<div class="auth-content"> {% include 'hosting/includes/_messages.html' %}
<div class="intro-message auth-box sign-up">
<h2 class="section-heading">{% trans "Resend activation link"%}</h2>
{% include 'hosting/includes/_messages.html' %}
<form action="{% url 'hosting:resend_activation_link' %}" method="post" class="form" novalidate> <form action="{% url 'hosting:resend_activation_link' %}" method="post" class="form" novalidate>
{% csrf_token %} {% csrf_token %}
{% for field in form %} {% for field in form %}
{% bootstrap_field field show_label=False %} {% bootstrap_field field show_label=False %}
{% endfor %} {% endfor %}
{% buttons %} <div class="text-center">
<button type="submit" class="btn btn-block btn-success"> <button type="submit" class="btn choice-btn">
{% trans "Submit"%} {% trans "Submit"%}
</button> </button>
{% endbuttons %} </div>
</form> </form>
<div class="auth-footer">
<div>
{% trans "Don't have an account yet ?" %}&nbsp;
<a class="" href="{% url 'hosting:signup' %}">{% trans "Sign up" %}</a>
</div>
<div>
or <a href="{% url 'hosting:reset_password' %}">{% trans "Forgot your password ?" %}</a>
</div>
</div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -1,44 +1,37 @@
{% extends "hosting/base_short.html" %} {% extends "hosting/base_short.html" %}
{% load staticfiles bootstrap3%} {% load i18n staticfiles bootstrap3%}
{% load i18n %}
{% block navbar %} {% block navbar %}
{% include 'hosting/includes/_navbar_transparent.html' %} {% include 'hosting/includes/_navbar_transparent.html' %}
{% endblock navbar %} {% endblock navbar %}
{% block content %} {% block content %}
<div class="auth-container"> <div class="auth-container">
<div class="auth-bg"></div> <div class="auth-bg"></div>
<div class="auth-center"> <div class="auth-center">
<div class="auth-title">
<h2>{% trans "Your VM hosted in Switzerland"%}</h2>
</div>
<div class="auth-content"> <div class="auth-content">
<div class="intro-message auth-box sign-up"> <div class="auth-box sign-up">
<h2 class="section-heading">{% trans "Reset your password"%}</h2> <h1 class="section-heading">{% trans "Password reset" %}</h1>
{% include 'hosting/includes/_messages.html' %} {% include 'hosting/includes/_messages.html' %}
<form action="{% url 'hosting:reset_password' %}" method="post" class="form" novalidate> <form action="{% url 'hosting:reset_password' %}" method="post" class="form" novalidate>
{% csrf_token %} {% csrf_token %}
{% for field in form %} {% for field in form %}
{% bootstrap_field field show_label=False %} {% bootstrap_field field show_label=False %}
{% endfor %} {% endfor %}
{% buttons %} <div class="text-center">
<button type="submit" class="btn btn-block btn-success"> <button type="submit" class="btn choice-btn">
{% trans "Reset"%} {% trans "Reset" %}
</button> </button>
{% endbuttons %} </div>
</form> </form>
<div class="auth-footer"> <div class="auth-footer">
<div class="text"> <div>
<span>{% trans "Already have an account ?"%}</span> <span>{% trans "Already have an account ?" %}</span>&nbsp;
</div> <a href="{% url 'hosting:login' %}">{% trans "Login" %}</a>
<div class="links">
<a class="unlink" href="{% url 'hosting:login' %}">{% trans "Login"%}</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
{% endblock %} {% endblock %}

View file

@ -2,41 +2,36 @@
{% load staticfiles bootstrap3 i18n %} {% load staticfiles bootstrap3 i18n %}
{% block navbar %} {% block navbar %}
{% include 'hosting/includes/_navbar_transparent.html' %} {% include 'hosting/includes/_navbar_transparent.html' %}
{% endblock navbar %} {% endblock navbar %}
{% block content %} {% block content %}
<div class="auth-container auth-signup"> <div class="auth-container auth-signup">
<div class="auth-bg"></div> <div class="auth-bg"></div>
<div class="auth-center "> <div class="auth-center ">
<div class="auth-title"> <div class="auth-content">
<h2>{% trans "Your VM hosted in Switzerland"%}</h2> <div class="auth-box sign-up">
</div> <h1 class="section-heading allcaps">{% trans "Sign up" %}</h1>
<div class="auth-content"> {% include 'hosting/includes/_messages.html' %}
<div class="intro-message auth-box sign-up"> <form action="{% url 'hosting:signup' %}" method="post" class="form" novalidate>
<h2 class="section-heading">{% trans "Sign up"%}</h2> {% csrf_token %}
{% include 'hosting/includes/_messages.html' %} {% for field in form %}
<form action="{% url 'hosting:signup' %}" method="post" class="form" novalidate> {% bootstrap_field field show_label=False %}
{% csrf_token %} {% endfor %}
{% for field in form %} <div class="text-center">
{% bootstrap_field field show_label=False %} <button type="submit" class="btn choice-btn">
{% endfor %} {% trans "Sign up" %}
{% buttons %} </button>
<button type="submit" class="btn btn-block btn-info"> </div>
{% trans "Sign up"%} </form>
</button> <div class="auth-footer">
{% endbuttons %} <div>
</form> <span>{% trans "Already have an account ?" %}</span>&nbsp;
<div class="auth-footer"> <a href="{% url 'hosting:login' %}">{% trans "Login" %}</a>
<div class="text"> </div>
<span>{% trans "Already have an account ?"%}</span>
</div>
<div class="links">
<a class="unlink" href="{% url 'hosting:login' %}">{% trans "Login"%}</a>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
</div>
{% endblock %} {% endblock %}

View file

@ -6,21 +6,17 @@
{% endblock navbar %} {% endblock navbar %}
{% block content %} {% block content %}
<div class="auth-container"> <div class="auth-container">
<div class="auth-bg"></div> <div class="auth-bg"></div>
<div class="auth-center"> <div class="auth-center">
<div class="auth-title"> <div class="auth-content wide">
<h2>{% trans "Your VM hosted in Switzerland"%}</h2>
{% include 'hosting/includes/_messages.html' %}
</div>
<div class="auth-content">
<div class="intro-message auth-box sign-up"> <div class="intro-message auth-box sign-up">
<h2 class="section-heading">{{section_title}}</h2> <h2 class="section-heading">{{section_title}}</h2>
<div class="sign-up-message"> <div class="sign-up-message">
{{message}} {{message}}
</div> </div>
</div> </div>
</div>
</div> </div>
</div> </div>
</div>
{% 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

@ -0,0 +1,62 @@
from menus.base import NavigationNode
from menus.menu_pool import menu_pool
from django.utils.translation import ugettext_lazy as _
from cms.menu_bases import CMSAttachMenu
from cms.templatetags.cms_tags import _get_placeholder
from cms.utils.plugins import get_plugins
class GlasfaserMenu(CMSAttachMenu):
name = _("Glasfaser menu")
def get_nodes(self, request):
nodes = []
glasfaser_cms = 'ungleich_page/glasfaser_cms_page.html'
if request and request.current_page.get_template() == glasfaser_cms:
template_context = {
"request": request,
}
placeholder_name_list = [
'Top Section', 'Middle Section', 'Glasfaser Services',
'Glasfaser About', 'Contact Section'
]
plugins_list = [
'SectionWithImage', 'UngelichContactUsSection',
'UngelichTextSection', 'Service', 'About'
]
for placeholder_name in placeholder_name_list:
placeholder = _get_placeholder(
request.current_page, request.current_page,
template_context, placeholder_name
)
plugins = get_plugins(
request, placeholder, request.current_page.get_template()
)
for plugin in plugins:
if type(plugin).__name__ in plugins_list:
section_hash = request.build_absolute_uri()
if hasattr(plugin, 'menu_text'):
menu_text = plugin.menu_text
if menu_text.strip() == '':
continue
menu_words = menu_text.split()
if len(menu_words) > 0:
section_hash = '{}#{}'.format(
section_hash,
menu_words[0]
)
else:
continue
newnode = NavigationNode(
menu_text,
url=section_hash,
id="{}-{}".format(
request.current_page.id, plugin.id
)
)
nodes.append(newnode)
return nodes
menu_pool.register_menu(GlasfaserMenu)

View file

@ -0,0 +1,147 @@
from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
from .models import (
UngelichContactUsSection, UngelichTextSection, Service, ServiceItem,
About, AboutItem, SectionWithImage
)
def get_section_id(plugin_instance, default):
"""
A helper function to get the section id from a given menu text
:param plugin_instance:
:param default: The default section id to return in case a section id
is not found
:return: The section id for the plugin_instance
"""
section_id = default
if hasattr(plugin_instance, 'menu_text'):
menu_words = plugin_instance.menu_text.split()
if len(menu_words) > 0:
section_id = menu_words[0]
return section_id
@plugin_pool.register_plugin
class SectionWithImagePlugin(CMSPluginBase):
model = SectionWithImage
render_template = "ungleich_page/glasfaser/section_with_image.html"
cache = False
def render(self, context, instance, placeholder):
context.update({
'image': instance.image,
'object': instance,
'placeholder': placeholder
})
return context
@plugin_pool.register_plugin
class SectionContact(CMSPluginBase):
model = UngelichContactUsSection
render_template = "ungleich_page/glasfaser/section_contact.html"
cache = False
def render(self, context, instance, placeholder):
context = super(SectionContact, self).render(
context, instance, placeholder
)
context['instance'] = instance
context['section_id'] = get_section_id(instance, 'contact')
return context
@plugin_pool.register_plugin
class SectionTextParagraphDCL(CMSPluginBase):
model = UngelichTextSection
render_template = "ungleich_page/glasfaser/section_text_dcl.html"
cache = False
def render(self, context, instance, placeholder):
context = super(SectionTextParagraphDCL, self).render(
context, instance, placeholder
)
context['instance'] = instance
context['section_id'] = get_section_id(instance, 'your')
return context
@plugin_pool.register_plugin
class SectionTextParagraphGlasfaser(CMSPluginBase):
model = UngelichTextSection
render_template = "ungleich_page/glasfaser/section_text_glasfaser.html"
cache = False
def render(self, context, instance, placeholder):
context = super(SectionTextParagraphGlasfaser, self).render(
context, instance, placeholder
)
context['instance'] = instance
context['section_id'] = get_section_id(instance, 'our')
return context
@plugin_pool.register_plugin
class GlasfaserServicesPlugin(CMSPluginBase):
name = "Glasfaser Services Plugin"
model = Service
render_template = "ungleich_page/glasfaser/section_services.html"
cache = False
allow_children = True
child_classes = ['GlasfaserServicesItemPlugin']
def render(self, context, instance, placeholder):
context['service_instance'] = instance
context['section_id'] = get_section_id(instance, 'services')
return context
@plugin_pool.register_plugin
class GlasfaserServicesItemPlugin(CMSPluginBase):
name = "Glasfaser Service Item Plugin"
model = ServiceItem
render_template = "ungleich_page/glasfaser/_services_item.html"
cache = False
require_parent = True
parent_classes = ['GlasfaserServicesPlugin']
def render(self, context, instance, placeholder):
context = super(GlasfaserServicesItemPlugin, self).render(
context, instance, placeholder
)
context['instance'] = instance
return context
@plugin_pool.register_plugin
class GlasfaserAboutPlugin(CMSPluginBase):
name = "Glasfaser About Plugin"
model = About
render_template = "ungleich_page/glasfaser/section_about.html"
cache = False
allow_children = True
child_classes = ['GlasfaserAboutItemPlugin']
def render(self, context, instance, placeholder):
context['about_instance'] = instance
context['section_id'] = get_section_id(instance, 'about')
return context
@plugin_pool.register_plugin
class GlasfaserAboutItemPlugin(CMSPluginBase):
name = "Glasfaser About Item Plugin"
model = AboutItem
render_template = "ungleich_page/glasfaser/_about_item.html"
cache = False
require_parent = True
parent_classes = ['GlasfaserAboutPlugin']
def render(self, context, instance, placeholder):
context = super(GlasfaserAboutItemPlugin, self).render(
context, instance, placeholder
)
context['instance'] = instance
return context

View file

@ -0,0 +1,106 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2017-10-18 18:23
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import djangocms_text_ckeditor.fields
import filer.fields.image
class Migration(migrations.Migration):
initial = True
dependencies = [
('filer', '0004_auto_20160328_1434'),
('cms', '0014_auto_20160404_1908'),
]
operations = [
migrations.CreateModel(
name='Service',
fields=[
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
('title', models.CharField(max_length=200)),
('sub_title', models.CharField(max_length=200)),
],
options={
'abstract': False,
},
bases=('cms.cmsplugin',),
),
migrations.CreateModel(
name='ServiceItem',
fields=[
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
('title', models.CharField(max_length=200)),
('description', djangocms_text_ckeditor.fields.HTMLField()),
('image', filer.fields.image.FilerImageField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='service_item_image', to='filer.Image')),
],
options={
'abstract': False,
},
bases=('cms.cmsplugin',),
),
migrations.CreateModel(
name='UngelichContactUsSection',
fields=[
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
('email', models.EmailField(max_length=200)),
],
options={
'abstract': False,
},
bases=('cms.cmsplugin',),
),
migrations.CreateModel(
name='UngelichPicture',
fields=[
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
('title', models.CharField(max_length=400)),
],
options={
'abstract': False,
},
bases=('cms.cmsplugin',),
),
migrations.CreateModel(
name='UngelichTextSection',
fields=[
('cmsplugin_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='cms.CMSPlugin')),
('title', models.CharField(max_length=200)),
('description', djangocms_text_ckeditor.fields.HTMLField()),
],
options={
'abstract': False,
},
bases=('cms.cmsplugin',),
),
migrations.CreateModel(
name='About',
fields=[
('service_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='ungleich_page.Service')),
],
options={
'abstract': False,
},
bases=('ungleich_page.service',),
),
migrations.CreateModel(
name='AboutItem',
fields=[
('ungelichpicture_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='ungleich_page.UngelichPicture')),
('inverted', models.BooleanField(default=False)),
],
options={
'abstract': False,
},
bases=('ungleich_page.ungelichpicture',),
),
migrations.AddField(
model_name='ungelichpicture',
name='image',
field=filer.fields.image.FilerImageField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='image', to='filer.Image'),
),
]

View file

@ -0,0 +1,30 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2017-10-18 22:02
from __future__ import unicode_literals
from django.db import migrations, models
import django.db.models.deletion
import filer.fields.image
class Migration(migrations.Migration):
dependencies = [
('filer', '0004_auto_20160328_1434'),
('ungleich_page', '0001_initial'),
]
operations = [
migrations.CreateModel(
name='SectionWithImage',
fields=[
('ungelichpicture_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='ungleich_page.UngelichPicture')),
('price_tag_url', models.URLField(default='', max_length=300)),
('price_tag_image', filer.fields.image.FilerImageField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='price_tag_image', to='filer.Image')),
],
options={
'abstract': False,
},
bases=('ungleich_page.ungelichpicture',),
),
]

View file

@ -0,0 +1,35 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2017-10-19 10:07
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ungleich_page', '0002_sectionwithimage'),
]
operations = [
migrations.AddField(
model_name='sectionwithimage',
name='menu_text',
field=models.CharField(default='', max_length=100),
),
migrations.AddField(
model_name='service',
name='menu_text',
field=models.CharField(default='', max_length=100),
),
migrations.AddField(
model_name='ungelichcontactussection',
name='menu_text',
field=models.CharField(default='', max_length=100),
),
migrations.AddField(
model_name='ungelichtextsection',
name='menu_text',
field=models.CharField(default='', max_length=100),
),
]

View file

@ -0,0 +1,40 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2017-10-19 11:13
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ungleich_page', '0003_auto_20171019_1007'),
]
operations = [
migrations.AlterField(
model_name='sectionwithimage',
name='menu_text',
field=models.CharField(blank=True, default='', max_length=100),
),
migrations.AlterField(
model_name='sectionwithimage',
name='price_tag_url',
field=models.URLField(blank=True, default='', max_length=300),
),
migrations.AlterField(
model_name='service',
name='menu_text',
field=models.CharField(blank=True, default='', max_length=100),
),
migrations.AlterField(
model_name='ungelichcontactussection',
name='menu_text',
field=models.CharField(blank=True, default='', max_length=100),
),
migrations.AlterField(
model_name='ungelichtextsection',
name='menu_text',
field=models.CharField(blank=True, default='', max_length=100),
),
]

View file

@ -0,0 +1,45 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2017-10-19 15:17
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ungleich_page', '0004_auto_20171019_1113'),
]
operations = [
migrations.AddField(
model_name='ungelichcontactussection',
name='address',
field=models.CharField(blank=True, default='In der Au 7, Schwanden 8762', max_length=100),
),
migrations.AddField(
model_name='ungelichcontactussection',
name='contact_form_header_text',
field=models.CharField(blank=True, default='Send us a message.', max_length=100),
),
migrations.AddField(
model_name='ungelichcontactussection',
name='contact_text',
field=models.CharField(blank=True, default='Contact', max_length=100),
),
migrations.AddField(
model_name='ungelichcontactussection',
name='country',
field=models.CharField(blank=True, default='Switzerland', max_length=100),
),
migrations.AddField(
model_name='ungelichcontactussection',
name='organization_name',
field=models.CharField(blank=True, default='ungleich GmbH', max_length=100),
),
migrations.AlterField(
model_name='ungelichcontactussection',
name='email',
field=models.EmailField(default='info@ungleich.ch', max_length=200),
),
]

View file

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2017-10-20 06:42
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('ungleich_page', '0005_auto_20171019_1517'),
]
operations = [
migrations.AddField(
model_name='aboutitem',
name='link_url',
field=models.URLField(blank=True, default='', max_length=300),
),
]

View file

@ -1,3 +1,89 @@
# from django.db import models from cms.models.pluginmodel import CMSPlugin
from django.db import models
from djangocms_text_ckeditor.fields import HTMLField
from filer.fields.image import FilerImageField
# Create your models here.
class UngelichPicture(CMSPlugin):
image = FilerImageField(
null=True,
blank=True,
related_name="image",
on_delete=models.SET_NULL
)
title = models.CharField(max_length=400)
class SectionWithImage(UngelichPicture):
menu_text = models.CharField(max_length=100, default="", blank=True)
price_tag_image = FilerImageField(
null=True,
blank=True,
related_name="price_tag_image",
on_delete=models.SET_NULL
)
price_tag_url = models.URLField(max_length=300, default="", blank=True)
class UngelichContactUsSection(CMSPlugin):
menu_text = models.CharField(max_length=100, default="", blank=True)
email = models.EmailField(max_length=200, default="info@ungleich.ch")
contact_text = models.CharField(
max_length=100, default="Contact", blank=True
)
organization_name = models.CharField(
max_length=100, default="ungleich GmbH", blank=True
)
address = models.CharField(
max_length=100, default="In der Au 7, Schwanden 8762", blank=True
)
country = models.CharField(
max_length=100, default="Switzerland", blank=True
)
contact_form_header_text = models.CharField(
max_length=100, default="Send us a message.", blank=True
)
class UngelichTextSection(CMSPlugin):
menu_text = models.CharField(max_length=100, default="", blank=True)
title = models.CharField(max_length=200)
description = HTMLField()
class Service(CMSPlugin):
menu_text = models.CharField(max_length=100, default="", blank=True)
title = models.CharField(max_length=200)
sub_title = models.CharField(max_length=200)
def __str__(self):
return self.title
class ServiceItem(CMSPlugin):
image = FilerImageField(
null=True,
blank=True,
related_name="service_item_image",
on_delete=models.SET_NULL
)
title = models.CharField(max_length=200)
description = HTMLField()
def __str__(self):
return self.title
class About(Service):
pass
class AboutItem(UngelichPicture):
inverted = models.BooleanField(default=False)
link_url = models.URLField(max_length=300, default="", blank=True)
def __str__(self):
alignment = "Right" if self.inverted else "Left"
return "{alignment} - {title}".format(
alignment=alignment, title=self.title
)

View file

@ -0,0 +1,12 @@
.lead, .split-description.wow.fadeInUp p{
font-family: "Raleway" , "Helvetica Neue", Helvetica, Arial, sans-serif;
font-size: 21px;
color: #3a3a3a;
font-weight: 300 !important;
}
@media(min-width: 768px) {
.custom-padding-bottom{
padding-bottom: 0;
}
}

View file

@ -0,0 +1,12 @@
<li {% if instance.inverted %}class="timeline-inverted"{% endif %}>
{% if instance.link_url %}<a href="{{ instance.link_url }}" target="_blank">{% endif %}
<div class="timeline-image">
<img class="img-circle img-responsive" src="{{ instance.image.url }}" alt="">
</div>
{% if instance.link_url %}</a>{% endif %}
<div class="timeline-panel wow {% if instance.inverted %}slideInRight{% else %}slideInLeft{% endif %}">
<div class="timeline-body">
<p>{{ instance.title }}</p>
</div>
</div>
</li>

View file

@ -0,0 +1,7 @@
<div class="team-member wow fadeInUp" data-wow-delay="0.25s">
<img src="{{ instance.image.url }}" class="img-responsive img-circle" alt="">
<div class="team-member-caption inline-block">
<h4 class="portfolio-caption">{{ instance.title }}</h4>
<p class="text-muted">{{ instance.description }}</p>
</div>
</div>

View file

@ -0,0 +1,12 @@
{% load menu_tags %}
{% for child in children %}
<li class="child{% if child.selected %} selected{% endif %}{% if child.ancestor %} ancestor{% endif %}{% if child.sibling %} sibling{% endif %}{% if child.descendant %} descendant{% endif %}">
<a href="{{ child.attr.redirect_url|default:child.get_absolute_url }}" class="page-scroll">{{ child.get_menu_title }}</a>
{% if child.children %}
<ul>
{% show_menu from_level to_level extra_inactive extra_active template "" "" child %}
</ul>
{% endif %}
</li>
{% endfor %}

View file

@ -0,0 +1,18 @@
{% load cms_tags %}
<section id="{{section_id}}">
<div class="container">
<div class="text-center wow fadeInDown">
<h2 class="section-heading">{{ about_instance.title }}</h2>
<h3 class="section-subheading text-muted">{{ about_instance.sub_title }}</h3>
</div>
<div class="row">
<div class="col-lg-12">
<ul class="timeline">
{% for plugin in about_instance.child_plugin_instances %}
{% render_plugin plugin %}
{% endfor %}
</ul>
</div>
</div>
</div>
</section>

View file

@ -0,0 +1,83 @@
{% load i18n %}
<!-- / contact section -->
<div id="contact_section" class="full-contact-section">
<div class="intro-header-2 contact-section" id="{{section_id}}">
<div class="container">
<div class="row">
<div class="col-sm-6">
<div class="title">
<h2>{{instance.contact_text}}</h2>
</div>
<div class="contact-details">
<div class="subtitle">
<h3>{{instance.organization_name}}</h3>
</div>
<div class="description">
<p>{{instance.email}}</p>
<p>{{instance.address}}</p>
<p>{{instance.country}}</p>
</div>
</div>
<div class="social">
<a target="_blank" class="" href="https://twitter.com/datacenterlight"><i class="fa fa-twitter fa-fw"></i></a>
<a target="_blank" class="" href="https://github.com/ungleich"><i class="fa fa-github fa-fw"></i></a>
<a target="_blank" class="" href="https://www.facebook.com/ungleich.ch/"><i class="fa fa-facebook"></i></a>
</div>
</div>
<div class="col-sm-6">
<div id="contact-form" class="contact-form">
{% if success %}
<div class="contact-form-success">
<div class="subtitle text-center">
<h3>{% trans "Thank you for contacting us." %}</h3>
</div>
<p>
{% trans "Your message was successfully sent to our team." %}
</p>
</div>
{% else %}
<div class="row">
<div class="col-sm-offset-2 col-sm-10">
<div class="subtitle">
<h3>{{instance.contact_form_header_text}}</h3>
</div>
</div>
</div>
<form class="form-horizontal ajax-form" method="POST" action="{% url 'datacenterlight:contact_us' %}" data-toggle="validator" data-response="#contact-form">
{% csrf_token %}
<input type="hidden" value="glasfaser" name="from_page">
<div class="form-group">
<label class="control-label col-sm-2" for="name">{% trans "Name" %}</label>
<div class="col-sm-10">
<input id = "name" type="text" name="name" class="form-control" data-minlength="3" data-error="{% trans 'Please enter your name.' %}" required>
{{contact_form.name.errors}}
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="email">{% trans "Email" %}</label>
<div class="col-sm-10">
<input id = "email" name="email" type="email" pattern="^[^@\s]+@([^@\s]+\.)+[^@\s]+$" class="form-control" data-error="{% trans 'Please enter a valid email address.' %}" required>
{{contact_form.email.errors}}
</div>
</div>
<div class="form-group">
<label class="control-label col-sm-2" for="message">{% trans "Message" %}</label>
<div class="col-sm-10">
<textarea class="form-control" name="message" id="message" rows="6" required></textarea>
{{contact_form.message.errors}}
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10 text-right">
<div class="form-error hide">{% trans "Sorry, there was an unexpected error. Kindly retry." %}</div>
<button type="submit" class="btn btn-default">{% trans "SUBMIT" %}</button>
</div>
</div>
</form>
{% endif %}
</div>
</div>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,17 @@
{% load static i18n cms_tags %}
<section id="{{section_id}}" class="custom-padding-bottom">
<div class="container">
<div class="text-center wow fadeInDown">
<h2 class="section-heading">{{ service_instance.title }}</h2>
<h3 class="section-subheading text-muted">{{ service_instance.sub_title }}</h3>
</div>
<div class="row text-center">
{% for plugin in service_instance.child_plugin_instances %}
<div class="col-sm-4">
{% render_plugin plugin %}
</div>
{% endfor %}
</div>
</div>
</section>

View file

@ -0,0 +1,12 @@
<div class="split-section left" id="{{section_id}}">
<div class="container">
<div class="split-text">
<div class="split-title">
<h2>{{instance.title}}</h2>
</div>
<div class="split-description wow fadeInUp">
<p class="lead">{{instance.description}}</p>
</div>
</div>
</div>
</div>

View file

@ -0,0 +1,13 @@
<section class="split-section right" id="{{section_id}}">
<div class="container">
<div class="split-text text-center">
<div class="wow fadeInDown">
<h2 class="section-heading text-center">{{instance.title}}</h2>
<h3 class="section-subheading text-muted"></h3>
</div>
<div class="split-description text-center wow fadeInUp">
<p class="lead">{{instance.description}}</p>
</div>
</div>
</div>
</section>

View file

@ -0,0 +1,10 @@
<div class="intro-header" style="background:url({{ image.url }}) no-repeat center center; background-size: cover; background-position: left; background-color: rgb(118, 140, 163); background-attachment: fixed; flex-direction: column; align-items: flex-end; justify-content: space-between; padding-top: 70px;" id="home">
<div class="price-tag-container">
{% if object.price_tag_url %}<a href="{{ object.price_tag_url }}" target="_blank">{% endif %}{% if object.price_tag_image %}<div style="background:url({{ object.price_tag_image.url }}) no-repeat center center; background-size: cover;" class="price-tag"></div>{% endif %}{% if object.price_tag_url %}</a>{% endif %}
</div>
<div class="high-speed">
<div class="high-speed-border"></div>
<h1>{{ object.title }}</h1>
<div class="high-speed-border"></div>
</div>
</div>

View file

@ -0,0 +1,107 @@
{% load static bootstrap3 i18n cms_tags sekizai_tags menu_tags %}
{% get_current_language as LANGUAGE_CODE %}
<!DOCTYPE html>
<html lang="{{LANGUAGE_CODE}}">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="author" content="ungleich GmbH">
<meta name="description" content="{% page_attribute 'meta_description' %}">
<title>{% page_attribute "page_title" %}</title>
<!-- Bootstrap Core CSS -->
<link href="{% static 'ungleich_page/css/bootstrap.min.css' %}" rel="stylesheet">
<link href="{% static 'ungleich_page/css/lib/animate.min.css' %}" rel="stylesheet">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<link href="//fonts.googleapis.com/css?family=Open+Sans+Condensed:700|Lato:300,400,700|Montserrat:400,700" rel="stylesheet" type="text/css">
<!-- Custom CSS -->
<link href="{% static 'ungleich_page/css/agency.css' %}" rel="stylesheet">
<link href="{% static 'ungleich_page/css/ungleich.css' %}" rel="stylesheet">
<link href="{% static 'datacenterlight/css/landing-page.css' %}" rel="stylesheet">
<link href="{% static 'ungleich_page/css/glasfaser.css' %}" rel="stylesheet">
{% addtoblock "css" %}
<link href="{% static 'ungleich_page/css/cms.css' %}" media="screen" rel="stylesheet" type="text/css"/>
{% endaddtoblock %}
{% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %}
{% render_block "js" postprocessor "compressor.contrib.sekizai.compress" %}
<!-- Google analytics -->
{% include "google_analytics.html" %}
<!-- End Google Analytics -->
<link rel="shortcut icon" href="{% static 'ungleich_page/img/favicon.ico' %}" type="image/x-icon">
</head>
<body id="page-top" class="index">
{% cms_toolbar %}
<nav class="navbar navbar-default navbar-fixed-top topnav navbar-transparent">
<div class="topnav">
<!-- Brand and toggle get grouped for better mobile display -->
<div class="navbar-header">
<button type="button" class="navbar-toggle" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1">
<span class="sr-only">{% trans "Toggle navigation" %}</span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
<a href="{% url 'ungleich_page:landing' %}" id="logoBlack" class="navbar-brand topnav"><img src="{% static 'ungleich_page/img/logo_black.svg' %}"></a>
<a href="{% url 'ungleich_page:landing' %}" id="logoWhite" class="navbar-brand topnav"><img src="{% static 'ungleich_page/img/logo_white.svg' %}"></a>
</div>
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
<!-- Start Navbar collapse-->
<ul class="nav navbar-nav navbar-right">
{% show_sub_menu 1 None 100 "ungleich_page/glasfaser/menus.html" %}
</ul>
<!-- /.navbar-collapse -->
</div>
</div>
</nav>
{% placeholder 'Top Section' %}
{% placeholder 'Middle Section' %}
{% placeholder 'Glasfaser Services' %}
{% placeholder 'Glasfaser About' %}
{% placeholder 'Contact Section' %}
<!-- Footer -->
{% include "ungleich_page/includes/_footer.html" %}
<!-- jQuery -->
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery/2.1.1/jquery.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
if ($(".has-error").length != 0) {
window.location = window.location.pathname + "#contact_section"
}
});
</script>
<script src="//cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/js/bootstrap.min.js" type="text/javascript"></script>
<!-- Plugin JavaScript -->
<script src="//cdnjs.cloudflare.com/ajax/libs/1000hz-bootstrap-validator/0.11.9/validator.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/classie/1.0.1/classie.min.js" type="text/javascript"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/wow/1.1.2/wow.min.js" type="text/javascript"></script>
<!-- Custom Theme JavaScript -->
<script src="{% static 'ungleich_page/js/ungleich.js' %}" type="text/javascript"></script>
<script src="{% static 'datacenterlight/js/main.js' %}"></script>
<!-- Custom Fonts -->
<link href="//fonts.googleapis.com/css?family=Raleway" rel="stylesheet" type="text/css">
<link href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">
</body>
</html>

View file

@ -795,7 +795,7 @@ msgstr "Es wurde eine E-Mail mit dem Aktivierungslink an Dich gesendet."
msgid "Account Activation" msgid "Account Activation"
msgstr "Accountaktivierung" msgstr "Accountaktivierung"
msgid "The link to reset your email has been sent to your email" msgid "The link to reset your password has been sent to your email"
msgstr "" msgstr ""
"Der Link zum Zurücksetzen deines Passwortes wurde an deine E-Mail gesendet" "Der Link zum Zurücksetzen deines Passwortes wurde an deine E-Mail gesendet"

View file

@ -104,7 +104,7 @@ class ResendActivationLinkViewMixin(FormView):
class PasswordResetViewMixin(FormView): class PasswordResetViewMixin(FormView):
success_message = _( success_message = _(
"The link to reset your email has been sent to your email") "The link to reset your password has been sent to your email")
site = '' site = ''
def test_generate_email_context(self, user): def test_generate_email_context(self, user):