Merge branch 'master' into task/3713/clean_up_css

This commit is contained in:
Arvind Tiwari 2018-02-08 17:11:41 +05:30
commit b9c53717e3
29 changed files with 119 additions and 427 deletions

View File

@ -1,3 +1,12 @@
Next:
* #4049: [blog] Replace header background image
* #3670: [hosting] Shorten ssh key name
* #4046: [hosting] Add sdd_size, hdd_size to VirtualMachineSerializer (No visual change)
* bgfix: [hosting] increase invoice pdf resolution
1.3.2: 2018-01-16
* #4000: [all] Replace all ungleich.com with ungleich.ch
* #4067: [ungleich] mobile navbar toggle fix
* #4103: [dcl] Add "Terms of Service" item to the footer
1.3.1: 2017-12-31 1.3.1: 2017-12-31
* feature: [all] Load email configurations host, port and use_tls from env * feature: [all] Load email configurations host, port and use_tls from env
* bugfix: [all] Use ungleich's smtp as relayhost for sending emails * bugfix: [all] Use ungleich's smtp as relayhost for sending emails

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-12-22 01:00+0530\n" "POT-Creation-Date: 2018-01-15 23:12+0000\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"
@ -199,6 +199,9 @@ msgstr "VM bestellen"
msgid "Contact" msgid "Contact"
msgstr "Kontakt" msgstr "Kontakt"
msgid "Terms of Service"
msgstr "Nutzungsbedingungen"
msgid "All Rights Reserved" msgid "All Rights Reserved"
msgstr "Alle Rechte vorbehalten" msgstr "Alle Rechte vorbehalten"

View File

@ -32,6 +32,12 @@
<li> <li>
<a class="url-init" href="{% url 'datacenterlight:index' %}#contact">{% trans "Contact" %}</a> <a class="url-init" href="{% url 'datacenterlight:index' %}#contact">{% trans "Contact" %}</a>
</li> </li>
{% if request.resolver_match.url_name != "index" %}
<li class="footer-menu-divider">&sdot;</li>
{% endif %}
<li>
<a class="url-init" href="/cms/terms-of-service">{% trans "Terms of Service" %}</a>
</li>
</ul> </ul>
<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>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 169 KiB

After

Width:  |  Height:  |  Size: 141 KiB

View File

@ -224,7 +224,7 @@ class SignupViewTest(TestCase):
self.view = SignupView self.view = SignupView
self.signup_data = { self.signup_data = {
'name': 'ungleich', 'name': 'ungleich',
'email': 'test@ungleich.com', 'email': 'test@ungleich.ch',
'password': 'fake_password', 'password': 'fake_password',
'confirm_password': 'fake_password', 'confirm_password': 'fake_password',
} }

View File

@ -540,6 +540,8 @@ ONEADMIN_USER_SSH_PUBLIC_KEY = env('ONEADMIN_USER_SSH_PUBLIC_KEY')
DCL_TEXT = env('DCL_TEXT') DCL_TEXT = env('DCL_TEXT')
DCL_SUPPORT_FROM_ADDRESS = env('DCL_SUPPORT_FROM_ADDRESS') DCL_SUPPORT_FROM_ADDRESS = env('DCL_SUPPORT_FROM_ADDRESS')
DCL_SSH_KEY_NAME_PREFIX = 'dcl-gen-key-'
# Settings for Google analytics # Settings for Google analytics
GOOGLE_ANALYTICS_PROPERTY_IDS = { GOOGLE_ANALYTICS_PROPERTY_IDS = {
'ungleich.ch': 'UA-62285904-1', 'ungleich.ch': 'UA-62285904-1',

View File

@ -4,6 +4,7 @@ import subprocess
import tempfile import tempfile
from django import forms from django import forms
from django.conf import settings
from django.contrib.auth import authenticate from django.contrib.auth import authenticate
from django.utils.translation import ugettext_lazy as _ from django.utils.translation import ugettext_lazy as _
@ -15,8 +16,10 @@ logger = logging.getLogger(__name__)
def generate_ssh_key_name(): def generate_ssh_key_name():
return 'dcl-generated-key-' + datetime.datetime.now().strftime( return '{prefix}{date_time_str}'.format(
'%m%d%y%H%M') prefix=settings.DCL_SSH_KEY_NAME_PREFIX,
date_time_str=datetime.datetime.now().strftime('%m%d%y%H%M%S')
)
class HostingUserLoginForm(forms.Form): class HostingUserLoginForm(forms.Form):

File diff suppressed because one or more lines are too long

View File

@ -1,387 +0,0 @@
/**
* @license
*
* MIT License
*
* Copyright (c) 2017 Erik Koopmans
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
/**
* Generate a PDF from an HTML element or string using html2canvas and jsPDF.
*
* @param {Element|string} source The source element or HTML string.
* @param {Object=} opt An object of optional settings: 'margin', 'filename',
* 'image' ('type' and 'quality'), and 'html2canvas' / 'jspdf', which are
* sent as settings to their corresponding functions.
*/
var html2pdf = (function(html2canvas, jsPDF) {
/* ---------- MAIN FUNCTION ---------- */
var html2pdf = function(source, opt) {
// Handle input.
opt = objType(opt) === 'object' ? opt : {};
var source = html2pdf.parseInput(source, opt);
// Determine the PDF page size.
var pageSize = jsPDF.getPageSize(opt.jsPDF);
pageSize.inner = {
width: pageSize.width - opt.margin[1] - opt.margin[3],
height: pageSize.height - opt.margin[0] - opt.margin[2]
};
pageSize.inner.ratio = pageSize.inner.height / pageSize.inner.width;
// Copy the source element into a PDF-styled container div.
var container = html2pdf.makeContainer(source, pageSize);
var overlay = container.parentElement;
// Get the locations of all hyperlinks.
if (opt.enableLinks) {
// Find all anchor tags and get the container's bounds for reference.
opt.links = [];
var links = container.querySelectorAll('a');
var containerRect = unitConvert(container.getBoundingClientRect(), pageSize.k);
// Treat each client rect as a separate link (for text-wrapping).
Array.prototype.forEach.call(links, function(link) {
var clientRects = link.getClientRects();
for (var i=0; i<clientRects.length; i++) {
var clientRect = unitConvert(clientRects[i], pageSize.k);
clientRect.left -= containerRect.left;
clientRect.top -= containerRect.top;
opt.links.push({ el: link, clientRect: clientRect });
}
});
}
// Render the canvas and pass the result to makePDF.
var onRendered = opt.html2canvas.onrendered || function() {};
opt.html2canvas.onrendered = function(canvas) {
onRendered(canvas);
document.body.removeChild(overlay);
html2pdf.makePDF(canvas, pageSize, opt);
}
html2canvas(container, opt.html2canvas);
};
html2pdf.parseInput = function(source, opt) {
// Parse the opt object.
opt.jsPDF = opt.jsPDF || {};
opt.html2canvas = opt.html2canvas || {};
opt.filename = opt.filename && objType(opt.filename) === 'string' ? opt.filename : 'file.pdf';
opt.enableLinks = opt.hasOwnProperty('enableLinks') ? opt.enableLinks : true;
opt.image = opt.image || {};
opt.image.type = opt.image.type || 'jpeg';
opt.image.quality = opt.image.quality || 0.95;
// Parse the margin property of the opt object.
switch (objType(opt.margin)) {
case 'undefined':
opt.margin = 0;
case 'number':
opt.margin = [opt.margin, opt.margin, opt.margin, opt.margin];
break;
case 'array':
if (opt.margin.length === 2) {
opt.margin = [opt.margin[0], opt.margin[1], opt.margin[0], opt.margin[1]];
}
if (opt.margin.length === 4) {
break;
}
default:
throw 'Invalid margin array.';
}
// Parse the source element/string.
if (!source) {
throw 'Missing source element or string.';
} else if (objType(source) === 'string') {
source = createElement('div', { innerHTML: source });
} else if (objType(source) === 'element') {
source = cloneNode(source, opt.html2canvas.javascriptEnabled);
} else {
throw 'Invalid source - please specify an HTML Element or string.';
}
// Return the parsed input (opt is modified in-place, no need to return).
return source;
};
html2pdf.makeContainer = function(source, pageSize) {
// Define the CSS styles for the container and its overlay parent.
var overlayCSS = {
position: 'fixed', overflow: 'hidden', zIndex: 1000,
left: 0, right: 0, bottom: 0, top: 0,
backgroundColor: 'rgba(0,0,0,0.8)'
};
var containerCSS = {
position: 'absolute', width: pageSize.inner.width + pageSize.unit,
left: 0, right: 0, top: 0, height: 'auto', margin: 'auto',
backgroundColor: 'white'
};
// Set the overlay to hidden (could be changed in the future to provide a print preview).
overlayCSS.opacity = 0;
// Create and attach the elements.
var overlay = createElement('div', { className: 'html2pdf__overlay', style: overlayCSS });
var container = createElement('div', { className: 'html2pdf__container', style: containerCSS });
container.appendChild(source);
overlay.appendChild(container);
document.body.appendChild(overlay);
// Enable page-breaks.
var pageBreaks = source.querySelectorAll('.html2pdf__page-break');
var pxPageHeight = pageSize.inner.height * pageSize.k / 72 * 96;
Array.prototype.forEach.call(pageBreaks, function(el) {
el.style.display = 'block';
var clientRect = el.getBoundingClientRect();
el.style.height = pxPageHeight - (clientRect.top % pxPageHeight) + 'px';
}, this);
// Return the container.
return container;
};
html2pdf.makePDF = function(canvas, pageSize, opt) {
// Calculate the number of pages.
var ctx = canvas.getContext('2d');
var pxFullHeight = canvas.height;
var pxPageHeight = Math.floor(canvas.width * pageSize.inner.ratio);
var nPages = Math.ceil(pxFullHeight / pxPageHeight);
// Create a one-page canvas to split up the full image.
var pageCanvas = document.createElement('canvas');
var pageCtx = pageCanvas.getContext('2d');
var pageHeight = pageSize.inner.height;
pageCanvas.width = canvas.width;
pageCanvas.height = pxPageHeight;
// Initialize the PDF.
var pdf = new jsPDF(opt.jsPDF);
for (var page=0; page<nPages; page++) {
// Trim the final page to reduce file size.
if (page === nPages-1) {
pageCanvas.height = pxFullHeight % pxPageHeight;
pageHeight = pageCanvas.height * pageSize.inner.width / pageCanvas.width;
}
// Display the page.
var w = pageCanvas.width;
var h = pageCanvas.height;
pageCtx.fillStyle = 'white';
pageCtx.fillRect(0, 0, w, h);
pageCtx.drawImage(canvas, 0, page*pxPageHeight, w, h, 0, 0, w, h);
// Add the page to the PDF.
if (page) pdf.addPage();
var imgData = pageCanvas.toDataURL('image/' + opt.image.type, opt.image.quality);
pdf.addImage(imgData, opt.image.type, opt.margin[1], opt.margin[0],
pageSize.inner.width, pageHeight);
// Add hyperlinks.
if (opt.enableLinks) {
var pageTop = page * pageSize.inner.height;
opt.links.forEach(function(link) {
if (link.clientRect.top > pageTop && link.clientRect.top < pageTop + pageSize.inner.height) {
var left = opt.margin[1] + link.clientRect.left;
var top = opt.margin[0] + link.clientRect.top - pageTop;
pdf.link(left, top, link.clientRect.width, link.clientRect.height, { url: link.el.href });
}
});
}
}
// Finish the PDF.
pdf.save( opt.filename );
}
/* ---------- UTILS ---------- */
// Determine the type of a variable/object.
var objType = function(obj) {
if (typeof obj === 'undefined') return 'undefined';
else if (typeof obj === 'string' || obj instanceof String) return 'string';
else if (typeof obj === 'number' || obj instanceof Number) return 'number';
else if (!!obj && obj.constructor === Array) return 'array';
else if (obj && obj.nodeType === 1) return 'element';
else if (typeof obj === 'object') return 'object';
else return 'unknown';
};
// Create an HTML element with optional className, innerHTML, and style.
var createElement = function(tagName, opt) {
var el = document.createElement(tagName);
if (opt.className) el.className = opt.className;
if (opt.innerHTML) {
el.innerHTML = opt.innerHTML;
var scripts = el.getElementsByTagName('script');
for (var i = scripts.length; i-- > 0; null) {
scripts[i].parentNode.removeChild(scripts[i]);
}
}
for (var key in opt.style) {
el.style[key] = opt.style[key];
}
return el;
};
// Deep-clone a node and preserve contents/properties.
var cloneNode = function(node, javascriptEnabled) {
// Recursively clone the node.
var clone = node.nodeType === 3 ? document.createTextNode(node.nodeValue) : node.cloneNode(false);
for (var child = node.firstChild; child; child = child.nextSibling) {
if (javascriptEnabled === true || child.nodeType !== 1 || child.nodeName !== 'SCRIPT') {
clone.appendChild(cloneNode(child, javascriptEnabled));
}
}
if (node.nodeType === 1) {
// Preserve contents/properties of special nodes.
if (node.nodeName === 'CANVAS') {
clone.width = node.width;
clone.height = node.height;
clone.getContext('2d').drawImage(node, 0, 0);
} else if (node.nodeName === 'TEXTAREA' || node.nodeName === 'SELECT') {
clone.value = node.value;
}
// Preserve the node's scroll position when it loads.
clone.addEventListener('load', function() {
clone.scrollTop = node.scrollTop;
clone.scrollLeft = node.scrollLeft;
}, true);
}
// Return the cloned node.
return clone;
}
// Convert units using the conversion value 'k' from jsPDF.
var unitConvert = function(obj, k) {
var newObj = {};
for (var key in obj) {
newObj[key] = obj[key] * 72 / 96 / k;
}
return newObj;
};
// Get dimensions of a PDF page, as determined by jsPDF.
jsPDF.getPageSize = function(orientation, unit, format) {
// Decode options object
if (typeof orientation === 'object') {
var options = orientation;
orientation = options.orientation;
unit = options.unit || unit;
format = options.format || format;
}
// Default options
unit = unit || 'mm';
format = format || 'a4';
orientation = ('' + (orientation || 'P')).toLowerCase();
var format_as_string = ('' + format).toLowerCase();
// Size in pt of various paper formats
pageFormats = {
'a0' : [2383.94, 3370.39], 'a1' : [1683.78, 2383.94],
'a2' : [1190.55, 1683.78], 'a3' : [ 841.89, 1190.55],
'a4' : [ 595.28, 841.89], 'a5' : [ 419.53, 595.28],
'a6' : [ 297.64, 419.53], 'a7' : [ 209.76, 297.64],
'a8' : [ 147.40, 209.76], 'a9' : [ 104.88, 147.40],
'a10' : [ 73.70, 104.88], 'b0' : [2834.65, 4008.19],
'b1' : [2004.09, 2834.65], 'b2' : [1417.32, 2004.09],
'b3' : [1000.63, 1417.32], 'b4' : [ 708.66, 1000.63],
'b5' : [ 498.90, 708.66], 'b6' : [ 354.33, 498.90],
'b7' : [ 249.45, 354.33], 'b8' : [ 175.75, 249.45],
'b9' : [ 124.72, 175.75], 'b10' : [ 87.87, 124.72],
'c0' : [2599.37, 3676.54], 'c1' : [1836.85, 2599.37],
'c2' : [1298.27, 1836.85], 'c3' : [ 918.43, 1298.27],
'c4' : [ 649.13, 918.43], 'c5' : [ 459.21, 649.13],
'c6' : [ 323.15, 459.21], 'c7' : [ 229.61, 323.15],
'c8' : [ 161.57, 229.61], 'c9' : [ 113.39, 161.57],
'c10' : [ 79.37, 113.39], 'dl' : [ 311.81, 623.62],
'letter' : [612, 792],
'government-letter' : [576, 756],
'legal' : [612, 1008],
'junior-legal' : [576, 360],
'ledger' : [1224, 792],
'tabloid' : [792, 1224],
'credit-card' : [153, 243]
};
// Unit conversion
switch (unit) {
case 'pt': k = 1; break;
case 'mm': k = 72 / 25.4; break;
case 'cm': k = 72 / 2.54; break;
case 'in': k = 72; break;
case 'px': k = 72 / 96; break;
case 'pc': k = 12; break;
case 'em': k = 12; break;
case 'ex': k = 6; break;
default:
throw ('Invalid unit: ' + unit);
}
// Dimensions are stored as user units and converted to points on output
if (pageFormats.hasOwnProperty(format_as_string)) {
pageHeight = pageFormats[format_as_string][1] / k;
pageWidth = pageFormats[format_as_string][0] / k;
} else {
try {
pageHeight = format[1];
pageWidth = format[0];
} catch (err) {
throw new Error('Invalid format: ' + format);
}
}
// Handle page orientation
if (orientation === 'p' || orientation === 'portrait') {
orientation = 'p';
if (pageWidth > pageHeight) {
tmp = pageWidth;
pageWidth = pageHeight;
pageHeight = tmp;
}
} else if (orientation === 'l' || orientation === 'landscape') {
orientation = 'l';
if (pageHeight > pageWidth) {
tmp = pageWidth;
pageWidth = pageHeight;
pageHeight = tmp;
}
} else {
throw('Invalid orientation: ' + orientation);
}
// Return information (k is the unit conversion ratio from pts)
var info = { 'width': pageWidth, 'height': pageHeight, 'unit': unit, 'k': k };
return info;
};
// Expose the html2pdf function.
return html2pdf;
}(html2canvas, jsPDF));

File diff suppressed because one or more lines are too long

View File

@ -5,6 +5,9 @@ $(document).ready(function() {
var fileName = $target.attr('id') + '.pdf'; var fileName = $target.attr('id') + '.pdf';
html2pdf($target[0], { html2pdf($target[0], {
filename: fileName, filename: fileName,
html2canvas: {
scale: 2
}
}); });
}); });
$('.btn-print').click(function(e) { $('.btn-print').click(function(e) {

View File

@ -216,8 +216,8 @@
{% block js_extra %} {% block js_extra %}
{% if order %} {% if order %}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.min.js"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.5/jspdf.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.min.js"></script> <script src="{% static 'hosting/js/html2canvas.min.js' %}"></script>
<script src="{% static 'hosting/js/html2pdf.js' %}"></script> <script src="{% static 'hosting/js/html2pdf.min.js' %}"></script>
<script src="{% static 'hosting/js/order.js' %}"></script> <script src="{% static 'hosting/js/order.js' %}"></script>
{% endif %} {% endif %}
{% endblock js_extra %} {% endblock js_extra %}

View File

@ -30,7 +30,7 @@ class HostingUserSignupFormTest(TestCase):
def setUp(self): def setUp(self):
self.completed_data = { self.completed_data = {
'name': 'test name', 'name': 'test name',
'email': 'test@ungleich.com', 'email': 'test@ungleich.ch',
'password': 'test_password', 'password': 'test_password',
'confirm_password': 'test_password' 'confirm_password': 'test_password'
} }

View File

@ -505,7 +505,7 @@ class SignupViewTest(TestCase):
self.view = SignupView self.view = SignupView
self.signup_data = { self.signup_data = {
'name': 'ungleich', 'name': 'ungleich',
'email': 'test@ungleich.com', 'email': 'test@ungleich.ch',
'password': 'fake_password', 'password': 'fake_password',
'confirm_password': 'fake_password', 'confirm_password': 'fake_password',
} }

View File

@ -487,7 +487,7 @@ class SSHKeyCreateView(LoginRequiredMixin, FormView):
def form_valid(self, form): def form_valid(self, form):
form.save() form.save()
if 'dcl-generated-key-' in form.instance.name: if settings.DCL_SSH_KEY_NAME_PREFIX in form.instance.name:
content = ContentFile(form.cleaned_data.get('private_key')) content = ContentFile(form.cleaned_data.get('private_key'))
filename = form.cleaned_data.get( filename = form.cleaned_data.get(
'name') + '_' + str(uuid.uuid4())[:8] + '_private.pem' 'name') + '_' + str(uuid.uuid4())[:8] + '_private.pem'

View File

@ -96,7 +96,7 @@
</div> </div>
<div class="col-lg-4 text-center"> <div class="col-lg-4 text-center">
<i class="fa fa-envelope-o fa-3x sr-contact"></i> <i class="fa fa-envelope-o fa-3x sr-contact"></i>
<p><a href="mailto:your-email@your-domain.com">info@ungleich.com</a></p> <p><a href="mailto:your-email@your-domain.com">info@ungleich.ch</a></p>
</div> </div>
</div> </div>
</div> </div>

View File

@ -49,6 +49,8 @@ class VirtualMachineSerializer(serializers.Serializer):
memory = serializers.SerializerMethodField() memory = serializers.SerializerMethodField()
disk_size = serializers.SerializerMethodField() disk_size = serializers.SerializerMethodField()
hdd_size = serializers.SerializerMethodField()
sdd_size = serializers.SerializerMethodField()
ipv4 = serializers.SerializerMethodField() ipv4 = serializers.SerializerMethodField()
ipv6 = serializers.SerializerMethodField() ipv6 = serializers.SerializerMethodField()
vm_id = serializers.IntegerField(read_only=True, source='id') vm_id = serializers.IntegerField(read_only=True, source='id')
@ -102,6 +104,22 @@ class VirtualMachineSerializer(serializers.Serializer):
disk_size += int(disk.size) disk_size += int(disk.size)
return disk_size / 1024 return disk_size / 1024
def get_sdd_size(self, obj):
template = obj.template
disk_size = 0
for disk in template.disks:
if disk.datastore == 'cephds':
disk_size += int(disk.size)
return disk_size / 1024
def get_hdd_size(self, obj):
template = obj.template
disk_size = 0
for disk in template.disks:
if disk.datastore == 'ceph_hdd_ds':
disk_size += int(disk.size)
return disk_size / 1024
def get_price(self, obj): def get_price(self, obj):
template = obj.template template = obj.template
price = float(template.vcpu) * 5.0 price = float(template.vcpu) * 5.0

View File

@ -209,11 +209,6 @@ fieldset[disabled] .btn-xl.active {
border-color: rgba(255,255,255,.02); border-color: rgba(255,255,255,.02);
} }
.navbar-default .navbar-toggle {
/*border-color: #fed136;
background-color: #fed136;*/
}
.navbar-default .navbar-toggle .icon-bar { .navbar-default .navbar-toggle .icon-bar {
background-color: #fff; background-color: #fff;
} }
@ -280,7 +275,7 @@ fieldset[disabled] .btn-xl.active {
} }
.navbar-default .navbar-brand { .navbar-default .navbar-brand {
padding: 4px 8px 12px; padding: 8px 8px;
} }
.navbar-default.navbar-shrink .navbar-brand { .navbar-default.navbar-shrink .navbar-brand {
padding: 6px 8px 10px; padding: 6px 8px 10px;
@ -345,6 +340,7 @@ header .intro-text .intro-heading {
section { section {
padding: 75px 0; padding: 75px 0;
border-bottom: 1px solid #f3f4f5;
} }
@media(max-width:767px) { @media(max-width:767px) {
@ -353,6 +349,16 @@ section {
} }
} }
section .section-heading-contain {
margin-bottom: 50px;
}
@media(min-width:767px) {
section .section-heading-contain {
margin-bottom: 75px;
}
}
section h2.section-heading { section h2.section-heading {
margin-top: 0; margin-top: 0;
margin-bottom: 15px; margin-bottom: 15px;
@ -361,7 +367,6 @@ section h2.section-heading {
} }
section h3.section-subheading { section h3.section-subheading {
margin-bottom: 50px;
text-transform: none; text-transform: none;
font-family: 'Raleway', "Helvetica Neue", "Open Sans", "Droid Serif", Helvetica, Arial, sans-serif; font-family: 'Raleway', "Helvetica Neue", "Open Sans", "Droid Serif", Helvetica, Arial, sans-serif;
font-size: 16px; font-size: 16px;
@ -371,15 +376,11 @@ section h3.section-subheading {
} }
@media(min-width:768px) { @media(min-width:768px) {
section {
padding: 80px 0;
}
section h2.section-heading { section h2.section-heading {
font-size: 40px; font-size: 40px;
} }
section h3.section-subheading { section h3.section-subheading {
font-size: 18px; font-size: 18px;
margin-bottom: 75px;
} }
} }
@ -699,9 +700,6 @@ section h3.section-subheading {
} }
@media(min-width:768px) { @media(min-width:768px) {
.team-member {
margin-bottom: 50px;
}
.team-member h4 { .team-member h4 {
margin-top: 20px; margin-top: 20px;
margin-bottom: 20px; margin-bottom: 20px;

View File

@ -135,7 +135,7 @@
overflow: hidden; overflow: hidden;
} }
.split-section.right { .split-section.right {
padding: 100px 0; /* padding: 100px 0; */
background: rgba(0,0,0,0.03); background: rgba(0,0,0,0.03);
} }
.split-section.right .split-description { .split-section.right .split-description {

View File

@ -15,3 +15,30 @@ function toggleImage(e) {
$this.fadeIn(300); $this.fadeIn(300);
}); });
}; };
/*!
* Start Bootstrap - Agnecy Bootstrap Theme (http://startbootstrap.com)
* Code licensed under the Apache License v2.0.
* For details, see http://www.apache.org/licenses/LICENSE-2.0.
*/
// jQuery for page scrolling feature - requires jQuery Easing plugin
$(function() {
$('a.page-scroll').bind('click', function(event) {
var $anchor = $(this);
$('html, body').stop().animate({
scrollTop: $($anchor.attr('href')).offset().top
}, 1500, 'easeInOutExpo');
event.preventDefault();
});
});
// Highlight the top nav as scrolling occurs
$('body').scrollspy({
target: '.navbar-fixed-top'
})
// Closes the Responsive Menu on Menu Item Click
$('.navbar-collapse ul li a').click(function() {
$('.navbar-toggle:visible').click();
});

View File

@ -81,7 +81,7 @@
</div> </div>
</div> </div>
<div class="split-section left" id="your"> <section class="split-section left" id="your">
<div class="container"> <div class="container">
<div class="split-text"> <div class="split-text">
<div class="split-title"> <div class="split-title">
@ -94,13 +94,12 @@
</div> </div>
</div> </div>
</div> </div>
</div> </section>
<section class="split-section right" id="our"> <section class="split-section right" id="our">
<div class="container"> <div class="container">
<div class="split-text text-center"> <div class="split-text text-center">
<div class="wow fadeInDown"> <div class="wow section-heading-contain fadeInDown">
<h2 class="section-heading text-center">Was ist es?</h2> <h2 class="section-heading text-center">Was ist es?</h2>
<h3 class="section-subheading text-muted"></h3>
</div> </div>
<div class="split-description text-center wow fadeInUp"> <div class="split-description text-center wow fadeInUp">
<p class="lead">Bei diesem Angebot handelt es sich um einen Internetzugang für Firmenkunden.</p> <p class="lead">Bei diesem Angebot handelt es sich um einen Internetzugang für Firmenkunden.</p>
@ -112,7 +111,7 @@
<section id="services"> <section id="services">
<div class="container"> <div class="container">
<div class="text-center wow fadeInDown"> <div class="text-center section-heading-contain wow fadeInDown">
<h2 class="section-heading">Technische Details</h2> <h2 class="section-heading">Technische Details</h2>
<h3 class="section-subheading text-muted">Im Angebot enthalten sind</h3> <h3 class="section-subheading text-muted">Im Angebot enthalten sind</h3>
</div> </div>
@ -154,7 +153,7 @@
<!-- About Section --> <!-- About Section -->
<section id="about"> <section id="about">
<div class="container"> <div class="container">
<div class="text-center wow fadeInDown"> <div class="text-center wow fadeInDown section-heading-contain">
<h2 class="section-heading">Wie funktioniert es?</h2> <h2 class="section-heading">Wie funktioniert es?</h2>
<h3 class="section-subheading text-muted">So kommen Sie in wenigen einfachen Schritten zu Ihrem High-Speed-Internet</h3> <h3 class="section-subheading text-muted">So kommen Sie in wenigen einfachen Schritten zu Ihrem High-Speed-Internet</h3>
</div> </div>

View File

@ -1,7 +1,7 @@
{% load cms_tags %} {% load cms_tags %}
<section id="{{section_id}}"> <section id="{{section_id}}">
<div class="container"> <div class="container">
<div class="text-center wow fadeInDown"> <div class="text-center section-heading-contain wow fadeInDown">
<h2 class="section-heading">{{ about_instance.title }}</h2> <h2 class="section-heading">{{ about_instance.title }}</h2>
<h3 class="section-subheading text-muted">{{ about_instance.sub_title }}</h3> <h3 class="section-subheading text-muted">{{ about_instance.sub_title }}</h3>
</div> </div>

View File

@ -1,7 +1,7 @@
{% load static i18n cms_tags %} {% load static i18n cms_tags %}
<section id="{{section_id}}" class="custom-padding-bottom"> <section id="{{section_id}}" class="custom-padding-bottom">
<div class="container"> <div class="container">
<div class="text-center wow fadeInDown"> <div class="text-center section-heading-contain wow fadeInDown">
<h2 class="section-heading">{{ service_instance.title }}</h2> <h2 class="section-heading">{{ service_instance.title }}</h2>
<h3 class="section-subheading text-muted">{{ service_instance.sub_title }}</h3> <h3 class="section-subheading text-muted">{{ service_instance.sub_title }}</h3>
</div> </div>

View File

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

View File

@ -2,7 +2,7 @@
<section id="about"> <section id="about">
<div class="container"> <div class="container">
<div class="text-center wow fadeInDown"> <div class="text-center section-heading-contain wow fadeInDown">
<h2 class="section-heading">{% trans "ABOUT" %}</h2> <h2 class="section-heading">{% trans "ABOUT" %}</h2>
<h3 class="section-subheading text-muted">{% trans "The timeline of ungleich" %}</h3> <h3 class="section-subheading text-muted">{% trans "The timeline of ungleich" %}</h3>
</div> </div>

View File

@ -3,7 +3,7 @@
<section id="portfolio" class="bg-light-gray"> <section id="portfolio" class="bg-light-gray">
<div class="container"> <div class="container">
<div class="text-center wow fadeInUp"> <div class="text-center section-heading-contain wow fadeInUp">
<h2 class="section-heading">{% trans "Our Products" %}</h2> <h2 class="section-heading">{% trans "Our Products" %}</h2>
<h3 class="section-subheading text-muted sm_left" style="line-height: 1.5;">{% blocktrans %}Our products include an innovative datacenter,<br>affordable VM hosting, and high speed fiber internet for canton Glarus.{% endblocktrans %}</h3> <h3 class="section-subheading text-muted sm_left" style="line-height: 1.5;">{% blocktrans %}Our products include an innovative datacenter,<br>affordable VM hosting, and high speed fiber internet for canton Glarus.{% endblocktrans %}</h3>
</div> </div>

View File

@ -3,7 +3,7 @@
<section id="services"> <section id="services">
<div class="container"> <div class="container">
<div class="text-center wow fadeInDown"> <div class="text-center section-heading-contain wow fadeInDown">
<h2 class="section-heading">{% trans "our services" %}</h2> <h2 class="section-heading">{% trans "our services" %}</h2>
<h3 class="section-subheading text-muted sm_left"> <h3 class="section-subheading text-muted sm_left">
{% trans "We support our clients in all areas of Unix infrastructure." %}<br/> {% trans "We support our clients in all areas of Unix infrastructure." %}<br/>

View File

@ -25,7 +25,7 @@ class BaseEmail(object):
self.email.from_email = kwargs.get('from_address') self.email.from_email = kwargs.get('from_address')
else: else:
self.email.from_email = '(ungleich) ungleich Support <info@ungleich.ch>' self.email.from_email = '(ungleich) ungleich Support <info@ungleich.ch>'
self.email.to = [kwargs.get('to', 'info@ungleich.com')] self.email.to = [kwargs.get('to', 'info@ungleich.ch')]
def send(self): def send(self):
self.email.send() self.email.send()

View File

@ -44,7 +44,7 @@ class BaseTestCase(TestCase):
# Request Object # Request Object
self.request = HttpRequest() self.request = HttpRequest()
self.request.META['SERVER_NAME'] = 'ungleich.com' self.request.META['SERVER_NAME'] = 'ungleich.ch'
self.request.META['SERVER_PORT'] = '80' self.request.META['SERVER_PORT'] = '80'
def get_client(self, user): def get_client(self, user):