merged master
This commit is contained in:
commit
2d05720016
41 changed files with 1224 additions and 343 deletions
11
.travis.yml
11
.travis.yml
|
@ -1,13 +1,14 @@
|
||||||
language: python
|
language: python
|
||||||
python:
|
python:
|
||||||
- "3.5"
|
- "3.4.2"
|
||||||
- "3.6"
|
# - "3.6"
|
||||||
|
|
||||||
env:
|
env:
|
||||||
# Set a dummy secret key
|
- DJANGO_SECRET_KEY=0 OPENNEBULA_USERNAME='test' OPENNEBULA_PASSWORD='test' OPENNEBULA_PROTOCOL='http' OPENNEBULA_DOMAIN='test_domain' OPENNEBULA_PORT='2633' OPENNEBULA_ENDPOINT='/RPC2' DCL_TEXT='Data Center Light' CELERY_MAX_RETRIES=0
|
||||||
- DJANGO_SECRET_KEY=0
|
|
||||||
# install dependencies
|
# install dependencies
|
||||||
install: "pip install -r requirements.txt"
|
install: "pip install -r requirements.txt"
|
||||||
script:
|
script:
|
||||||
- flake8
|
- flake8
|
||||||
- python manage.py test
|
- python manage.py test -v 3
|
||||||
|
# - coverage run --source='.' manage.py test dynamicweb -v 3
|
||||||
|
# - coverage report
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
1.2.10: 2017-11-26
|
||||||
|
* #3843: [ungleich] Add generic ungleich CMS template
|
||||||
|
* #3672: [all] Clean existing automated tests
|
||||||
1.2.9: 2017-11-13
|
1.2.9: 2017-11-13
|
||||||
* #3848: [ungleich] Optimize ungleich.ch landing page
|
* #3848: [ungleich] Optimize ungleich.ch landing page
|
||||||
* #3360: [ungleich] Ungleich.ch landing page animation fix
|
* #3360: [ungleich] Ungleich.ch landing page animation fix
|
||||||
|
|
|
@ -3,6 +3,10 @@ ungleich
|
||||||
|
|
||||||
dynamicweb
|
dynamicweb
|
||||||
----------
|
----------
|
||||||
|
|
||||||
|
.. image:: https://travis-ci.org/ungleich/dynamicweb.svg?branch=master
|
||||||
|
:target: https://travis-ci.org/ungleich/dynamicweb
|
||||||
|
|
||||||
Website for ungleich GmbH
|
Website for ungleich GmbH
|
||||||
=======
|
=======
|
||||||
|
|
||||||
|
|
|
@ -31,3 +31,14 @@ def get_value_from_dict(dict_data, key):
|
||||||
return dict_data.get(key)
|
return dict_data.get(key)
|
||||||
else:
|
else:
|
||||||
return ""
|
return ""
|
||||||
|
|
||||||
|
|
||||||
|
@register.filter('multiply')
|
||||||
|
def multiply(value, arg):
|
||||||
|
"""
|
||||||
|
usage: {{ quantity|multiply:price }}
|
||||||
|
:param value:
|
||||||
|
:param arg:
|
||||||
|
:return:
|
||||||
|
"""
|
||||||
|
return value*arg
|
||||||
|
|
|
@ -8,6 +8,8 @@ from django.conf import settings
|
||||||
from django.core.management import call_command
|
from django.core.management import call_command
|
||||||
from django.test import TestCase, override_settings
|
from django.test import TestCase, override_settings
|
||||||
from model_mommy import mommy
|
from model_mommy import mommy
|
||||||
|
from unittest import skipIf
|
||||||
|
|
||||||
from datacenterlight.models import VMTemplate
|
from datacenterlight.models import VMTemplate
|
||||||
from datacenterlight.tasks import create_vm_task
|
from datacenterlight.tasks import create_vm_task
|
||||||
from membership.models import StripeCustomer
|
from membership.models import StripeCustomer
|
||||||
|
@ -16,6 +18,11 @@ from utils.hosting_utils import get_vm_price
|
||||||
from utils.stripe_utils import StripeUtils
|
from utils.stripe_utils import StripeUtils
|
||||||
|
|
||||||
|
|
||||||
|
@skipIf(
|
||||||
|
settings.STRIPE_API_PRIVATE_KEY_TEST is None or
|
||||||
|
settings.STRIPE_API_PRIVATE_KEY_TEST is "",
|
||||||
|
"""Stripe details unavailable, so skipping CeleryTaskTestCase"""
|
||||||
|
)
|
||||||
class CeleryTaskTestCase(TestCase):
|
class CeleryTaskTestCase(TestCase):
|
||||||
@override_settings(
|
@override_settings(
|
||||||
task_eager_propagates=True,
|
task_eager_propagates=True,
|
||||||
|
@ -47,6 +54,11 @@ class CeleryTaskTestCase(TestCase):
|
||||||
# OpenNebula
|
# OpenNebula
|
||||||
call_command('fetchvmtemplates')
|
call_command('fetchvmtemplates')
|
||||||
|
|
||||||
|
@skipIf(
|
||||||
|
settings.OPENNEBULA_DOMAIN is None or settings.OPENNEBULA_DOMAIN is
|
||||||
|
"test_domain",
|
||||||
|
"""OpenNebula details unavailable, so skipping test_create_vm_task"""
|
||||||
|
)
|
||||||
def test_create_vm_task(self):
|
def test_create_vm_task(self):
|
||||||
"""Tests the create vm task for monthly subscription
|
"""Tests the create vm task for monthly subscription
|
||||||
|
|
||||||
|
@ -110,13 +122,11 @@ class CeleryTaskTestCase(TestCase):
|
||||||
msg = subscription_result.get('error')
|
msg = subscription_result.get('error')
|
||||||
raise Exception("Creating subscription failed: {}".format(msg))
|
raise Exception("Creating subscription failed: {}".format(msg))
|
||||||
|
|
||||||
async_task = create_vm_task.delay(vm_template_id, self.user,
|
async_task = create_vm_task.delay(
|
||||||
specs,
|
vm_template_id, self.user, specs, template_data,
|
||||||
template_data,
|
stripe_customer.id, billing_address_data,
|
||||||
stripe_customer.id,
|
stripe_subscription_obj.id, card_details_dict
|
||||||
billing_address_data,
|
)
|
||||||
stripe_subscription_obj.id,
|
|
||||||
card_details_dict)
|
|
||||||
new_vm_id = 0
|
new_vm_id = 0
|
||||||
res = None
|
res = None
|
||||||
for i in range(0, 10):
|
for i in range(0, 10):
|
||||||
|
|
|
@ -15,9 +15,11 @@ from membership.models import CustomUser, StripeCustomer
|
||||||
from utils.tests import BaseTestCase
|
from utils.tests import BaseTestCase
|
||||||
|
|
||||||
|
|
||||||
from .views import LoginView, SignupView, PasswordResetView, PasswordResetConfirmView,\
|
from .views import (
|
||||||
|
LoginView, SignupView, PasswordResetView, PasswordResetConfirmView,
|
||||||
MembershipPricingView, MembershipPaymentView
|
MembershipPricingView, MembershipPaymentView
|
||||||
from .models import MembershipType, MembershipOrder
|
)
|
||||||
|
from .models import MembershipType
|
||||||
|
|
||||||
|
|
||||||
class ContactViewTest(TestCase):
|
class ContactViewTest(TestCase):
|
||||||
|
@ -41,13 +43,19 @@ class ContactViewTest(TestCase):
|
||||||
|
|
||||||
class ViewsTest(CMSTestCase):
|
class ViewsTest(CMSTestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.page1 = create_page('home', 'home_digitalglarus.html', published=True, language='en-us')
|
self.page1 = create_page(
|
||||||
self.page2 = create_page('about', 'about.html', published=True, language='en-us', slug='about')
|
'home', 'home_digitalglarus.html', published=True,
|
||||||
|
language='en-us'
|
||||||
|
)
|
||||||
|
self.page2 = create_page(
|
||||||
|
'about', 'about.html', published=True, language='en-us',
|
||||||
|
slug='about'
|
||||||
|
)
|
||||||
|
|
||||||
def test_digitalglarus_templates(self):
|
def test_digitalglarus_templates(self):
|
||||||
res1 = self.client.get('/en-us/')
|
res1 = self.client.get('/en-us/')
|
||||||
self.assertContains(res1, 'Digital Glarus', status_code=200)
|
self.assertContains(res1, 'Digital Glarus', status_code=200)
|
||||||
res2 = self.client.get('/en-us/about/')
|
res2 = self.client.get('/en-us/cms/about/')
|
||||||
self.assertEqual(res2.status_code, 200)
|
self.assertEqual(res2.status_code, 200)
|
||||||
|
|
||||||
|
|
||||||
|
@ -69,7 +77,9 @@ class MembershipPricingViewTest(BaseTestCase):
|
||||||
# Anonymous user should get data
|
# Anonymous user should get data
|
||||||
response = self.client.get(self.url)
|
response = self.client.get(self.url)
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
self.assertEqual(response.context['membership_type'], self.membership_type)
|
self.assertEqual(
|
||||||
|
response.context['membership_type'], self.membership_type
|
||||||
|
)
|
||||||
self.assertTemplateUsed(response, self.expected_template)
|
self.assertTemplateUsed(response, self.expected_template)
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,8 +111,10 @@ class MembershipPaymentViewTest(BaseTestCase):
|
||||||
|
|
||||||
# Anonymous user should get redirect to login
|
# Anonymous user should get redirect to login
|
||||||
response = self.client.get(self.url)
|
response = self.client.get(self.url)
|
||||||
expected_url = "%s?next=%s" % (reverse('digitalglarus:signup'),
|
expected_url = "%s?next=%s" % (
|
||||||
reverse('digitalglarus:membership_payment'))
|
reverse('digitalglarus:signup'),
|
||||||
|
reverse('digitalglarus:membership_payment')
|
||||||
|
)
|
||||||
self.assertRedirects(response, expected_url=expected_url,
|
self.assertRedirects(response, expected_url=expected_url,
|
||||||
status_code=302, target_status_code=200)
|
status_code=302, target_status_code=200)
|
||||||
|
|
||||||
|
@ -132,19 +144,29 @@ class MembershipPaymentViewTest(BaseTestCase):
|
||||||
}
|
}
|
||||||
response = self.customer_client.post(self.url, self.billing_address)
|
response = self.customer_client.post(self.url, self.billing_address)
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
self.assertTrue(StripeCustomer.objects.filter(user__email=self.customer.email).exists())
|
self.assertTrue(
|
||||||
stripe_customer = StripeCustomer.objects.get(user__email=self.customer.email)
|
StripeCustomer.objects.filter(
|
||||||
|
user__email=self.customer.email
|
||||||
|
).exists()
|
||||||
|
)
|
||||||
|
stripe_customer = StripeCustomer.objects.get(
|
||||||
|
user__email=self.customer.email
|
||||||
|
)
|
||||||
self.assertEqual(stripe_customer.user, self.customer)
|
self.assertEqual(stripe_customer.user, self.customer)
|
||||||
self.assertTrue(MembershipOrder.objects.filter(customer=stripe_customer).exists())
|
# self.assertTrue(MembershipOrder.objects.filter(customer=stripe_customer).exists())
|
||||||
membership_order = MembershipOrder.objects.filter(customer=stripe_customer).first()
|
# membership_order = MembershipOrder.objects.filter(
|
||||||
session_data = {
|
# customer=stripe_customer
|
||||||
'membership_price': membership_order.membership.type.first_month_price,
|
# ).first()
|
||||||
'membership_dates': membership_order.membership.type.first_month_formated_range
|
# session_data = {
|
||||||
}
|
# 'membership_price':
|
||||||
self.assertEqual(session_data.get('membership_price'),
|
# membership_order.membership.type.first_month_price,
|
||||||
self.session_data.get('membership_price'))
|
# 'membership_dates':
|
||||||
self.assertEqual(session_data.get('membership_dates'),
|
# membership_order.membership.type.first_month_formated_range
|
||||||
self.session_data.get('membership_dates'))
|
# }
|
||||||
|
# self.assertEqual(session_data.get('membership_price'),
|
||||||
|
# self.session_data.get('membership_price'))
|
||||||
|
# self.assertEqual(session_data.get('membership_dates'),
|
||||||
|
# self.session_data.get('membership_dates'))
|
||||||
|
|
||||||
# self.assertTrue(HostingOrder.objects.filter(customer=stripe_customer).exists())
|
# self.assertTrue(HostingOrder.objects.filter(customer=stripe_customer).exists())
|
||||||
# hosting_order = HostingOrder.objects.filter(customer=stripe_customer)[0]
|
# hosting_order = HostingOrder.objects.filter(customer=stripe_customer)[0]
|
||||||
|
@ -212,7 +234,9 @@ class SignupViewTest(TestCase):
|
||||||
self.assertTemplateUsed(response, self.expected_template)
|
self.assertTemplateUsed(response, self.expected_template)
|
||||||
|
|
||||||
def test_anonymous_user_can_signup(self):
|
def test_anonymous_user_can_signup(self):
|
||||||
response = self.client.post(self.url, data=self.signup_data, follow=True)
|
response = self.client.post(
|
||||||
|
self.url, data=self.signup_data, follow=True
|
||||||
|
)
|
||||||
self.user = CustomUser.objects.get(email=self.signup_data.get('email'))
|
self.user = CustomUser.objects.get(email=self.signup_data.get('email'))
|
||||||
self.assertEqual(response.context['user'], self.user)
|
self.assertEqual(response.context['user'], self.user)
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
|
@ -219,6 +219,7 @@ CMS_TEMPLATES = (
|
||||||
# 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')),
|
('ungleich_page/glasfaser_cms_page.html', gettext('Glasfaser')),
|
||||||
|
('ungleich_page/ungleich_cms_page.html', gettext('ungleich')),
|
||||||
)
|
)
|
||||||
|
|
||||||
DATABASES = {
|
DATABASES = {
|
||||||
|
|
|
@ -1,25 +1,18 @@
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
from unittest import mock
|
|
||||||
from model_mommy import mommy
|
from model_mommy import mommy
|
||||||
|
from .forms import HostingUserLoginForm, HostingUserSignupForm
|
||||||
from .forms import HostingOrderAdminForm, HostingUserLoginForm, HostingUserSignupForm
|
|
||||||
from .models import VirtualMachinePlan
|
|
||||||
|
|
||||||
|
|
||||||
class HostingUserLoginFormTest(TestCase):
|
class HostingUserLoginFormTest(TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
password = 'user_password'
|
password = 'user_password'
|
||||||
self.user = mommy.make('CustomUser')
|
self.user = mommy.make('CustomUser', validated=1)
|
||||||
|
|
||||||
self.user.set_password(password)
|
self.user.set_password(password)
|
||||||
self.user.save()
|
self.user.save()
|
||||||
self.completed_data = {
|
self.completed_data = {
|
||||||
'email': self.user.email,
|
'email': self.user.email,
|
||||||
'password': password
|
'password': password
|
||||||
}
|
}
|
||||||
|
|
||||||
self.incorrect_data = {
|
self.incorrect_data = {
|
||||||
'email': 'test',
|
'email': 'test',
|
||||||
}
|
}
|
||||||
|
@ -34,9 +27,7 @@ class HostingUserLoginFormTest(TestCase):
|
||||||
|
|
||||||
|
|
||||||
class HostingUserSignupFormTest(TestCase):
|
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.com',
|
||||||
|
@ -58,13 +49,11 @@ class HostingUserSignupFormTest(TestCase):
|
||||||
|
|
||||||
|
|
||||||
class HostingOrderAdminFormTest(TestCase):
|
class HostingOrderAdminFormTest(TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
||||||
self.customer = mommy.make('StripeCustomer')
|
self.customer = mommy.make('StripeCustomer')
|
||||||
self.vm_plan = mommy.make('VirtualMachinePlan')
|
self.vm_plan = mommy.make('VirtualMachinePlan')
|
||||||
self.vm_canceled_plan = mommy.make('VirtualMachinePlan',
|
# self.vm_canceled_plan = mommy.make('VirtualMachinePlan',
|
||||||
status=VirtualMachinePlan.CANCELED_STATUS)
|
# status=VirtualMachinePlan.CANCELED_STATUS)
|
||||||
|
|
||||||
self.mocked_charge = {
|
self.mocked_charge = {
|
||||||
'amount': 5100,
|
'amount': 5100,
|
||||||
|
@ -87,30 +76,30 @@ class HostingOrderAdminFormTest(TestCase):
|
||||||
'customer': None
|
'customer': None
|
||||||
}
|
}
|
||||||
|
|
||||||
@mock.patch('utils.stripe_utils.StripeUtils.make_charge')
|
# @mock.patch('utils.stripe_utils.StripeUtils.make_charge')
|
||||||
def test_valid_form(self, stripe_mocked_call):
|
# def test_valid_form(self, stripe_mocked_call):
|
||||||
stripe_mocked_call.return_value = {
|
# stripe_mocked_call.return_value = {
|
||||||
'paid': True,
|
# 'paid': True,
|
||||||
'response_object': self.mocked_charge,
|
# 'response_object': self.mocked_charge,
|
||||||
'error': None
|
# 'error': None
|
||||||
}
|
# }
|
||||||
form = HostingOrderAdminForm(data=self.completed_data)
|
# form = HostingOrderAdminForm(data=self.completed_data)
|
||||||
self.assertTrue(form.is_valid())
|
# self.assertTrue(form.is_valid())
|
||||||
|
|
||||||
@mock.patch('utils.stripe_utils.StripeUtils.make_charge')
|
# @mock.patch('utils.stripe_utils.StripeUtils.make_charge')
|
||||||
def test_invalid_form_canceled_vm(self, stripe_mocked_call):
|
# def test_invalid_form_canceled_vm(self, stripe_mocked_call):
|
||||||
|
#
|
||||||
self.completed_data.update({
|
# self.completed_data.update({
|
||||||
'vm_plan': self.vm_canceled_plan.id
|
# 'vm_plan': self.vm_canceled_plan.id
|
||||||
})
|
# })
|
||||||
stripe_mocked_call.return_value = {
|
# stripe_mocked_call.return_value = {
|
||||||
'paid': True,
|
# 'paid': True,
|
||||||
'response_object': self.mocked_charge,
|
# 'response_object': self.mocked_charge,
|
||||||
'error': None
|
# 'error': None
|
||||||
}
|
# }
|
||||||
form = HostingOrderAdminForm(data=self.completed_data)
|
# form = HostingOrderAdminForm(data=self.completed_data)
|
||||||
self.assertFalse(form.is_valid())
|
# self.assertFalse(form.is_valid())
|
||||||
|
#
|
||||||
def test_invalid_form(self):
|
# def test_invalid_form(self):
|
||||||
form = HostingOrderAdminForm(data=self.incompleted_data)
|
# form = HostingOrderAdminForm(data=self.incompleted_data)
|
||||||
self.assertFalse(form.is_valid())
|
# self.assertFalse(form.is_valid())
|
||||||
|
|
|
@ -1,75 +1,75 @@
|
||||||
from django.test import TestCase
|
# from django.test import TestCase
|
||||||
|
#
|
||||||
from django.core.management import call_command
|
# from django.core.management import call_command
|
||||||
|
#
|
||||||
|
#
|
||||||
from .models import VirtualMachineType
|
# #from .models import VirtualMachineType
|
||||||
|
#
|
||||||
|
#
|
||||||
class VirtualMachineTypeModelTest(TestCase):
|
# class VirtualMachineTypeModelTest(TestCase):
|
||||||
|
#
|
||||||
def setUp(self):
|
# def setUp(self):
|
||||||
self.HETZNER_NUG_NAME = 'hetzner_nug'
|
# self.HETZNER_NUG_NAME = 'hetzner_nug'
|
||||||
self.HETZNER_NAME = 'hetzner'
|
# self.HETZNER_NAME = 'hetzner'
|
||||||
self.HETZNER_RAID6_NAME = 'hetzner_raid6'
|
# self.HETZNER_RAID6_NAME = 'hetzner_raid6'
|
||||||
self.HETZNER_GLUSTERFS_NAME = 'hetzner_glusterfs'
|
# self.HETZNER_GLUSTERFS_NAME = 'hetzner_glusterfs'
|
||||||
self.BERN_NAME = 'bern'
|
# self.BERN_NAME = 'bern'
|
||||||
self.HETZNER_NUG_EXPECTED_PRICE = 79
|
# self.HETZNER_NUG_EXPECTED_PRICE = 79
|
||||||
self.HETZNER_EXPECTED_PRICE = 180
|
# self.HETZNER_EXPECTED_PRICE = 180
|
||||||
self.HETZNER_RAID6_EXPECTED_PRICE = 216
|
# self.HETZNER_RAID6_EXPECTED_PRICE = 216
|
||||||
self.HETZNER_GLUSTERFS_EXPECTED_PRICE = 252
|
# self.HETZNER_GLUSTERFS_EXPECTED_PRICE = 252
|
||||||
self.BERN_EXPECTED_PRICE = 202
|
# self.BERN_EXPECTED_PRICE = 202
|
||||||
|
#
|
||||||
call_command('create_vm_types')
|
# call_command('create_vm_types')
|
||||||
|
#
|
||||||
def test_calculate_price(self):
|
# def test_calculate_price(self):
|
||||||
|
#
|
||||||
# hetzner_nug
|
# # hetzner_nug
|
||||||
# specifications = {
|
# # specifications = {
|
||||||
# 'cores': 2,
|
# # 'cores': 2,
|
||||||
# 'memory': 10,
|
# # 'memory': 10,
|
||||||
# 'disk_size': 100
|
# # 'disk_size': 100
|
||||||
# }
|
# # }
|
||||||
# vm_type = VirtualMachineType.objects.get(hosting_company=self.HETZNER_NUG_NAME)
|
# # vm_type = VirtualMachineType.objects.get(hosting_company=self.HETZNER_NUG_NAME)
|
||||||
# calculated_price = vm_type.calculate_price(specifications)
|
# # calculated_price = vm_type.calculate_price(specifications)
|
||||||
# self.assertEqual(calculated_price, self.HETZNER_NUG_EXPECTED_PRICE)
|
# # self.assertEqual(calculated_price, self.HETZNER_NUG_EXPECTED_PRICE)
|
||||||
|
#
|
||||||
# hetzner
|
# # hetzner
|
||||||
specifications = {
|
# specifications = {
|
||||||
'cores': 2,
|
# 'cores': 2,
|
||||||
'memory': 10,
|
# 'memory': 10,
|
||||||
'disk_size': 100
|
# 'disk_size': 100
|
||||||
}
|
# }
|
||||||
vm_type = VirtualMachineType.objects.get(hosting_company=self.HETZNER_NAME)
|
# vm_type = VirtualMachineType.objects.get(hosting_company=self.HETZNER_NAME)
|
||||||
calculated_price = vm_type.calculate_price(specifications)
|
# calculated_price = vm_type.calculate_price(specifications)
|
||||||
self.assertEqual(calculated_price, self.HETZNER_EXPECTED_PRICE)
|
# self.assertEqual(calculated_price, self.HETZNER_EXPECTED_PRICE)
|
||||||
|
#
|
||||||
# hetzner_raid6
|
# # hetzner_raid6
|
||||||
# specifications = {
|
# # specifications = {
|
||||||
# 'cores': 2,
|
# # 'cores': 2,
|
||||||
# 'memory': 10,
|
# # 'memory': 10,
|
||||||
# 'disk_size': 100
|
# # 'disk_size': 100
|
||||||
# }
|
# # }
|
||||||
# vm_type = VirtualMachineType.objects.get(hosting_company=self.HETZNER_RAID6_NAME)
|
# # vm_type = VirtualMachineType.objects.get(hosting_company=self.HETZNER_RAID6_NAME)
|
||||||
# calculated_price = vm_type.calculate_price(specifications)
|
# # calculated_price = vm_type.calculate_price(specifications)
|
||||||
# self.assertEqual(calculated_price, self.HETZNER_RAID6_EXPECTED_PRICE)
|
# # self.assertEqual(calculated_price, self.HETZNER_RAID6_EXPECTED_PRICE)
|
||||||
|
#
|
||||||
# hetzner_glusterfs
|
# # hetzner_glusterfs
|
||||||
# specifications = {
|
# # specifications = {
|
||||||
# 'cores': 2,
|
# # 'cores': 2,
|
||||||
# 'memory': 10,
|
# # 'memory': 10,
|
||||||
# 'disk_size': 100
|
# # 'disk_size': 100
|
||||||
# }
|
# # }
|
||||||
# vm_type = VirtualMachineType.objects.get(hosting_company=self.HETZNER_GLUSTERFS_NAME)
|
# # vm_type = VirtualMachineType.objects.get(hosting_company=self.HETZNER_GLUSTERFS_NAME)
|
||||||
# calculated_price = vm_type.calculate_price(specifications)
|
# # calculated_price = vm_type.calculate_price(specifications)
|
||||||
# self.assertEqual(calculated_price, self.HETZNER_GLUSTERFS_EXPECTED_PRICE)
|
# # self.assertEqual(calculated_price, self.HETZNER_GLUSTERFS_EXPECTED_PRICE)
|
||||||
|
#
|
||||||
# bern
|
# # bern
|
||||||
specifications = {
|
# specifications = {
|
||||||
'cores': 2,
|
# 'cores': 2,
|
||||||
'memory': 10,
|
# 'memory': 10,
|
||||||
'disk_size': 100
|
# 'disk_size': 100
|
||||||
}
|
# }
|
||||||
vm_type = VirtualMachineType.objects.get(hosting_company=self.BERN_NAME)
|
# vm_type = VirtualMachineType.objects.get(hosting_company=self.BERN_NAME)
|
||||||
calculated_price = vm_type.calculate_price(specifications)
|
# calculated_price = vm_type.calculate_price(specifications)
|
||||||
self.assertEqual(calculated_price, self.BERN_EXPECTED_PRICE)
|
# self.assertEqual(calculated_price, self.BERN_EXPECTED_PRICE)
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
from unittest import mock
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.core.urlresolvers import reverse
|
from django.core.urlresolvers import reverse
|
||||||
|
@ -6,21 +5,29 @@ from django.core.urlresolvers import resolve
|
||||||
from django.contrib.auth.tokens import default_token_generator
|
from django.contrib.auth.tokens import default_token_generator
|
||||||
from django.utils.http import urlsafe_base64_encode
|
from django.utils.http import urlsafe_base64_encode
|
||||||
from django.utils.encoding import force_bytes
|
from django.utils.encoding import force_bytes
|
||||||
|
from unittest import skipIf
|
||||||
|
|
||||||
from model_mommy import mommy
|
from model_mommy import mommy
|
||||||
from stored_messages.models import Inbox
|
from stored_messages.models import Inbox
|
||||||
|
|
||||||
|
|
||||||
from membership.models import CustomUser, StripeCustomer
|
from membership.models import CustomUser, StripeCustomer
|
||||||
from .models import VirtualMachineType, HostingOrder, VirtualMachinePlan
|
from .models import HostingOrder
|
||||||
from .views import DjangoHostingView, RailsHostingView, NodeJSHostingView, LoginView, SignupView, \
|
from .views import (
|
||||||
PaymentVMView, OrdersHostingDetailView, OrdersHostingListView, VirtualMachineView, \
|
DjangoHostingView, RailsHostingView, NodeJSHostingView, LoginView,
|
||||||
VirtualMachinesPlanListView, PasswordResetView, PasswordResetConfirmView, HostingPricingView, \
|
SignupView, PaymentVMView, OrdersHostingDetailView, OrdersHostingListView,
|
||||||
NotificationsView, MarkAsReadNotificationView, GenerateVMSSHKeysView
|
VirtualMachinesPlanListView, PasswordResetView, PasswordResetConfirmView,
|
||||||
|
HostingPricingView, NotificationsView, MarkAsReadNotificationView
|
||||||
|
)
|
||||||
from utils.tests import BaseTestCase
|
from utils.tests import BaseTestCase
|
||||||
|
|
||||||
|
|
||||||
|
@skipIf(
|
||||||
|
(settings.OPENNEBULA_DOMAIN is None or
|
||||||
|
settings.OPENNEBULA_DOMAIN == "test_domain"),
|
||||||
|
"""OpenNebula details unavailable, so skipping
|
||||||
|
ProcessVMSelectionTestMixin"""
|
||||||
|
)
|
||||||
class ProcessVMSelectionTestMixin(object):
|
class ProcessVMSelectionTestMixin(object):
|
||||||
|
|
||||||
def url_resolve_to_view_correctly(self):
|
def url_resolve_to_view_correctly(self):
|
||||||
|
@ -30,14 +37,15 @@ class ProcessVMSelectionTestMixin(object):
|
||||||
def test_get(self):
|
def test_get(self):
|
||||||
response = self.client.get(self.url)
|
response = self.client.get(self.url)
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
self.assertEqual(self.view.get_context_data(), self.expected_context)
|
# self.assertEqual(self.view.get_context_data(), self.expected_context)
|
||||||
self.assertEqual(response.context['hosting'], self.expected_context['hosting'])
|
self.assertEqual(response.context['hosting'], self.expected_context['hosting'])
|
||||||
self.assertTemplateUsed(response, self.expected_template)
|
self.assertTemplateUsed(response, self.expected_template)
|
||||||
|
|
||||||
def test_anonymous_post(self):
|
# def test_anonymous_post(self):
|
||||||
response = self.client.post(self.url)
|
# params = {'vm_template_id': 1, 'configuration': 1}
|
||||||
self.assertRedirects(response, expected_url=reverse('hosting:login'),
|
# response = self.client.post(self.url, params)
|
||||||
status_code=302, target_status_code=200)
|
# self.assertRedirects(response, expected_url=reverse('hosting:login'),
|
||||||
|
# status_code=302, target_status_code=200)
|
||||||
|
|
||||||
|
|
||||||
class DjangoHostingViewTest(TestCase, ProcessVMSelectionTestMixin):
|
class DjangoHostingViewTest(TestCase, ProcessVMSelectionTestMixin):
|
||||||
|
@ -47,15 +55,16 @@ class DjangoHostingViewTest(TestCase, ProcessVMSelectionTestMixin):
|
||||||
self.view = DjangoHostingView()
|
self.view = DjangoHostingView()
|
||||||
self.expected_template = 'hosting/django.html'
|
self.expected_template = 'hosting/django.html'
|
||||||
HOSTING = 'django'
|
HOSTING = 'django'
|
||||||
configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
|
# configuration_detail = dict(
|
||||||
|
# VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
|
||||||
self.expected_context = {
|
self.expected_context = {
|
||||||
'hosting': HOSTING,
|
'hosting': HOSTING,
|
||||||
'hosting_long': "Django",
|
'hosting_long': "Django",
|
||||||
'configuration_detail': configuration_detail,
|
# 'configuration_detail': configuration_detail,
|
||||||
'domain': "django-hosting.ch",
|
'domain': "django-hosting.ch",
|
||||||
'google_analytics': "UA-62285904-6",
|
'google_analytics': "UA-62285904-6",
|
||||||
'email': "info@django-hosting.ch",
|
'email': "info@django-hosting.ch",
|
||||||
'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
# 'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -66,15 +75,16 @@ class RailsHostingViewTest(TestCase, ProcessVMSelectionTestMixin):
|
||||||
self.view = RailsHostingView()
|
self.view = RailsHostingView()
|
||||||
self.expected_template = 'hosting/rails.html'
|
self.expected_template = 'hosting/rails.html'
|
||||||
HOSTING = 'rails'
|
HOSTING = 'rails'
|
||||||
configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
|
# configuration_detail = dict(
|
||||||
|
# VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
|
||||||
self.expected_context = {
|
self.expected_context = {
|
||||||
'hosting': HOSTING,
|
'hosting': HOSTING,
|
||||||
'hosting_long': "Ruby On Rails",
|
'hosting_long': "Ruby On Rails",
|
||||||
'configuration_detail': configuration_detail,
|
# 'configuration_detail': configuration_detail,
|
||||||
'domain': "rails-hosting.ch",
|
'domain': "rails-hosting.ch",
|
||||||
'google_analytics': "UA-62285904-5",
|
'google_analytics': "UA-62285904-5",
|
||||||
'email': "info@rails-hosting.ch",
|
'email': "info@rails-hosting.ch",
|
||||||
'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
# 'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -85,18 +95,25 @@ class NodeJSHostingViewTest(TestCase, ProcessVMSelectionTestMixin):
|
||||||
self.view = NodeJSHostingView()
|
self.view = NodeJSHostingView()
|
||||||
self.expected_template = 'hosting/nodejs.html'
|
self.expected_template = 'hosting/nodejs.html'
|
||||||
HOSTING = 'nodejs'
|
HOSTING = 'nodejs'
|
||||||
configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
|
# configuration_detail = dict(
|
||||||
|
# VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
|
||||||
self.expected_context = {
|
self.expected_context = {
|
||||||
'hosting': HOSTING,
|
'hosting': HOSTING,
|
||||||
'hosting_long': "NodeJS",
|
'hosting_long': "NodeJS",
|
||||||
'configuration_detail': configuration_detail,
|
# 'configuration_detail': configuration_detail,
|
||||||
'domain': "node-hosting.ch",
|
'domain': "node-hosting.ch",
|
||||||
'google_analytics': "UA-62285904-7",
|
'google_analytics': "UA-62285904-7",
|
||||||
'email': "info@node-hosting.ch",
|
'email': "info@node-hosting.ch",
|
||||||
'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
# 'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@skipIf(
|
||||||
|
(settings.OPENNEBULA_DOMAIN is None or
|
||||||
|
settings.OPENNEBULA_DOMAIN == "test_domain"),
|
||||||
|
"""OpenNebula details unavailable, so skipping
|
||||||
|
HostingPricingViewTest.test_get"""
|
||||||
|
)
|
||||||
class HostingPricingViewTest(TestCase):
|
class HostingPricingViewTest(TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
@ -104,11 +121,11 @@ class HostingPricingViewTest(TestCase):
|
||||||
self.view = HostingPricingView()
|
self.view = HostingPricingView()
|
||||||
self.expected_template = 'hosting/hosting_pricing.html'
|
self.expected_template = 'hosting/hosting_pricing.html'
|
||||||
|
|
||||||
configuration_options = dict(VirtualMachinePlan.VM_CONFIGURATION)
|
# configuration_options = dict(VirtualMachinePlan.VM_CONFIGURATION)
|
||||||
self.expected_context = {
|
self.expected_context = {
|
||||||
'configuration_options': configuration_options,
|
# 'configuration_options': configuration_options,
|
||||||
'email': "info@django-hosting.ch",
|
'email': "info@django-hosting.ch",
|
||||||
'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
# 'vm_types': VirtualMachineType.get_serialized_vm_types(),
|
||||||
}
|
}
|
||||||
|
|
||||||
def url_resolve_to_view_correctly(self):
|
def url_resolve_to_view_correctly(self):
|
||||||
|
@ -118,13 +135,13 @@ class HostingPricingViewTest(TestCase):
|
||||||
def test_get(self):
|
def test_get(self):
|
||||||
response = self.client.get(self.url)
|
response = self.client.get(self.url)
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
self.assertEqual(self.view.get_context_data(), self.expected_context)
|
# self.assertEqual(self.view.get_context_data(), self.expected_context)
|
||||||
self.assertTemplateUsed(response, self.expected_template)
|
self.assertTemplateUsed(response, self.expected_template)
|
||||||
|
|
||||||
def test_anonymous_post(self):
|
# def test_anonymous_post(self):
|
||||||
response = self.client.post(self.url)
|
# response = self.client.post(self.url)
|
||||||
self.assertRedirects(response, expected_url=reverse('hosting:login'),
|
# self.assertRedirects(response, expected_url=reverse('hosting:login'),
|
||||||
status_code=302, target_status_code=200)
|
# status_code=302, target_status_code=200)
|
||||||
|
|
||||||
|
|
||||||
class PaymentVMViewTest(BaseTestCase):
|
class PaymentVMViewTest(BaseTestCase):
|
||||||
|
@ -135,10 +152,10 @@ class PaymentVMViewTest(BaseTestCase):
|
||||||
self.view = PaymentVMView
|
self.view = PaymentVMView
|
||||||
|
|
||||||
# VM
|
# VM
|
||||||
self.vm = mommy.make(VirtualMachineType, base_price=10000,
|
# self.vm = mommy.make(VirtualMachineType, base_price=10000,
|
||||||
memory_price=100,
|
# memory_price=100,
|
||||||
core_price=1000,
|
# core_price=1000,
|
||||||
disk_size_price=1)
|
# disk_size_price=1)
|
||||||
|
|
||||||
# post data
|
# post data
|
||||||
self.billing_address = {
|
self.billing_address = {
|
||||||
|
@ -153,56 +170,56 @@ class PaymentVMViewTest(BaseTestCase):
|
||||||
self.url = reverse('hosting:payment')
|
self.url = reverse('hosting:payment')
|
||||||
|
|
||||||
# Session data
|
# Session data
|
||||||
self.session_data = {
|
# self.session_data = {
|
||||||
'vm_specs': {
|
# 'vm_specs': {
|
||||||
'hosting_company': self.vm.hosting_company,
|
# 'hosting_company': self.vm.hosting_company,
|
||||||
'cores': 1,
|
# 'cores': 1,
|
||||||
'memory': 10,
|
# 'memory': 10,
|
||||||
'disk_size': 10000,
|
# 'disk_size': 10000,
|
||||||
'price': 22000,
|
# 'price': 22000,
|
||||||
'configuration': dict(VirtualMachinePlan.VM_CONFIGURATION).get('django')
|
# 'configuration': dict(VirtualMachinePlan.VM_CONFIGURATION).get('django')
|
||||||
}
|
# }
|
||||||
}
|
# }
|
||||||
|
|
||||||
session = self.customer_client.session
|
# session = self.customer_client.session
|
||||||
session.update(self.session_data)
|
# session.update(self.session_data)
|
||||||
session.save()
|
# session.save()
|
||||||
|
|
||||||
def test_url_resolve_to_view_correctly(self):
|
def test_url_resolve_to_view_correctly(self):
|
||||||
found = resolve(self.url)
|
found = resolve(self.url)
|
||||||
self.assertEqual(found.func.__name__, self.view.__name__)
|
self.assertEqual(found.func.__name__, self.view.__name__)
|
||||||
|
|
||||||
@mock.patch('utils.stripe_utils.StripeUtils.create_customer')
|
# @mock.patch('utils.stripe_utils.StripeUtils.create_customer')
|
||||||
def test_post(self, stripe_mocked_call):
|
# def test_post(self, stripe_mocked_call):
|
||||||
|
#
|
||||||
# Anonymous user should get redirect to login
|
# # Anonymous user should get redirect to login
|
||||||
response = self.client.post(self.url)
|
# response = self.client.post(self.url)
|
||||||
expected_url = "%s?next=%s" % (reverse('hosting:login'), reverse('hosting:payment'))
|
# expected_url = "%s?next=%s" % (reverse('hosting:login'), reverse('hosting:payment'))
|
||||||
self.assertRedirects(response, expected_url=expected_url,
|
# self.assertRedirects(response, expected_url=expected_url,
|
||||||
status_code=302, target_status_code=200)
|
# status_code=302, target_status_code=200)
|
||||||
|
#
|
||||||
# Customer user should be able to pay
|
# # Customer user should be able to pay
|
||||||
stripe_mocked_call.return_value = {
|
# stripe_mocked_call.return_value = {
|
||||||
'paid': True,
|
# 'paid': True,
|
||||||
'response_object': self.stripe_mocked_customer,
|
# 'response_object': self.stripe_mocked_customer,
|
||||||
'error': None
|
# 'error': None
|
||||||
}
|
# }
|
||||||
response = self.customer_client.post(self.url, self.billing_address)
|
# response = self.customer_client.post(self.url, self.billing_address)
|
||||||
self.assertEqual(response.status_code, 200)
|
# self.assertEqual(response.status_code, 200)
|
||||||
self.assertTrue(StripeCustomer.objects.filter(user__email=self.customer.email).exists())
|
# self.assertTrue(StripeCustomer.objects.filter(user__email=self.customer.email).exists())
|
||||||
stripe_customer = StripeCustomer.objects.get(user__email=self.customer.email)
|
# stripe_customer = StripeCustomer.objects.get(user__email=self.customer.email)
|
||||||
self.assertEqual(stripe_customer.user, self.customer)
|
# self.assertEqual(stripe_customer.user, self.customer)
|
||||||
self.assertTrue(HostingOrder.objects.filter(customer=stripe_customer).exists())
|
# self.assertTrue(HostingOrder.objects.filter(customer=stripe_customer).exists())
|
||||||
hosting_order = HostingOrder.objects.filter(customer=stripe_customer)[0]
|
# hosting_order = HostingOrder.objects.filter(customer=stripe_customer)[0]
|
||||||
vm_plan = {
|
# vm_plan = {
|
||||||
'cores': hosting_order.vm_plan.cores,
|
# 'cores': hosting_order.vm_plan.cores,
|
||||||
'memory': hosting_order.vm_plan.memory,
|
# 'memory': hosting_order.vm_plan.memory,
|
||||||
'disk_size': hosting_order.vm_plan.disk_size,
|
# 'disk_size': hosting_order.vm_plan.disk_size,
|
||||||
'price': hosting_order.vm_plan.price,
|
# 'price': hosting_order.vm_plan.price,
|
||||||
'hosting_company': hosting_order.vm_plan.vm_type.hosting_company,
|
# 'hosting_company': hosting_order.vm_plan.vm_type.hosting_company,
|
||||||
'configuration': hosting_order.vm_plan.configuration
|
# 'configuration': hosting_order.vm_plan.configuration
|
||||||
}
|
# }
|
||||||
self.assertEqual(vm_plan, self.session_data.get('vm_specs'))
|
# self.assertEqual(vm_plan, self.session_data.get('vm_specs'))
|
||||||
|
|
||||||
def test_get(self):
|
def test_get(self):
|
||||||
|
|
||||||
|
@ -285,73 +302,73 @@ class MarkAsReadNotificationViewTest(BaseTestCase):
|
||||||
self.assertTemplateUsed(response, self.expected_template)
|
self.assertTemplateUsed(response, self.expected_template)
|
||||||
|
|
||||||
|
|
||||||
class GenerateVMSSHKeysViewTest(BaseTestCase):
|
# class GenerateVMSSHKeysViewTest(BaseTestCase):
|
||||||
|
#
|
||||||
def setUp(self):
|
# def setUp(self):
|
||||||
super(GenerateVMSSHKeysViewTest, self).setUp()
|
# super(GenerateVMSSHKeysViewTest, self).setUp()
|
||||||
|
#
|
||||||
self.view = GenerateVMSSHKeysView
|
# # self.view = GenerateVMSSHKeysView
|
||||||
self.vm = mommy.make(VirtualMachinePlan)
|
# # self.vm = mommy.make(VirtualMachinePlan)
|
||||||
self.expected_template = 'hosting/virtual_machine_key.html'
|
# self.expected_template = 'hosting/virtual_machine_key.html'
|
||||||
self.url = reverse('hosting:virtual_machine_key', kwargs={'pk': self.vm.id})
|
# self.url = reverse('hosting:virtual_machine_key', kwargs={'pk': self.vm.id})
|
||||||
|
#
|
||||||
def test_url_resolve_to_view_correctly(self):
|
# def test_url_resolve_to_view_correctly(self):
|
||||||
found = resolve(self.url)
|
# found = resolve(self.url)
|
||||||
self.assertEqual(found.func.__name__, self.view.__name__)
|
# self.assertEqual(found.func.__name__, self.view.__name__)
|
||||||
|
#
|
||||||
def test_get(self):
|
# def test_get(self):
|
||||||
|
#
|
||||||
# Anonymous user should get redirect to login
|
# # Anonymous user should get redirect to login
|
||||||
response = self.client.get(self.url)
|
# response = self.client.get(self.url)
|
||||||
expected_url = "%s?next=%s" % (reverse('hosting:login'),
|
# expected_url = "%s?next=%s" % (reverse('hosting:login'),
|
||||||
reverse('hosting:virtual_machine_key',
|
# reverse('hosting:virtual_machine_key',
|
||||||
kwargs={'pk': self.vm.id}))
|
# kwargs={'pk': self.vm.id}))
|
||||||
self.assertRedirects(response, expected_url=expected_url,
|
# self.assertRedirects(response, expected_url=expected_url,
|
||||||
status_code=302, target_status_code=200)
|
# status_code=302, target_status_code=200)
|
||||||
|
#
|
||||||
# Logged user should get the page
|
# # Logged user should get the page
|
||||||
response = self.customer_client.get(self.url, follow=True)
|
# response = self.customer_client.get(self.url, follow=True)
|
||||||
self.assertEqual(response.status_code, 200)
|
# self.assertEqual(response.status_code, 200)
|
||||||
updated_vm = VirtualMachinePlan.objects.get(id=self.vm.id)
|
# #updated_vm = VirtualMachinePlan.objects.get(id=self.vm.id)
|
||||||
self.assertEqual(response.context['public_key'].decode("utf-8"), updated_vm.public_key)
|
# #self.assertEqual(response.context['public_key'].decode("utf-8"), updated_vm.public_key)
|
||||||
self.assertTrue(response.context['private_key'] is not None)
|
# self.assertTrue(response.context['private_key'] is not None)
|
||||||
self.assertEqual(len(response.context['public_key']), 380)
|
# self.assertEqual(len(response.context['public_key']), 380)
|
||||||
self.assertTrue(len(response.context['private_key']) is 1678 or 1674)
|
# self.assertTrue(len(response.context['private_key']) is 1678 or 1674)
|
||||||
self.assertTemplateUsed(response, self.expected_template)
|
# self.assertTemplateUsed(response, self.expected_template)
|
||||||
|
|
||||||
|
|
||||||
class VirtualMachineViewTest(BaseTestCase):
|
# class VirtualMachineViewTest(BaseTestCase):
|
||||||
|
#
|
||||||
def setUp(self):
|
# def setUp(self):
|
||||||
super(VirtualMachineViewTest, self).setUp()
|
# super(VirtualMachineViewTest, self).setUp()
|
||||||
|
#
|
||||||
self.stripe_customer = mommy.make(StripeCustomer, user=self.customer)
|
# self.stripe_customer = mommy.make(StripeCustomer, user=self.customer)
|
||||||
self.vm = mommy.make(VirtualMachinePlan)
|
# #self.vm = mommy.make(VirtualMachinePlan)
|
||||||
self.vm.assign_permissions(self.customer)
|
# self.vm.assign_permissions(self.customer)
|
||||||
self.order = mommy.make(HostingOrder, customer=self.stripe_customer, vm_plan=self.vm)
|
# self.order = mommy.make(HostingOrder, customer=self.stripe_customer, vm_plan=self.vm)
|
||||||
self.url = reverse('hosting:virtual_machines', kwargs={'pk': self.vm.id})
|
# self.url = reverse('hosting:virtual_machines', kwargs={'pk': self.vm.id})
|
||||||
self.view = VirtualMachineView()
|
# self.view = VirtualMachineView()
|
||||||
self.expected_template = 'hosting/virtual_machine_detail.html'
|
# self.expected_template = 'hosting/virtual_machine_detail.html'
|
||||||
|
#
|
||||||
def url_resolve_to_view_correctly(self):
|
# def url_resolve_to_view_correctly(self):
|
||||||
found = resolve(self.url)
|
# found = resolve(self.url)
|
||||||
self.assertEqual(found.func.__name__, self.view.__name__)
|
# self.assertEqual(found.func.__name__, self.view.__name__)
|
||||||
|
#
|
||||||
def test_get(self):
|
# def test_get(self):
|
||||||
|
#
|
||||||
# Anonymous user should get redirect to login
|
# # Anonymous user should get redirect to login
|
||||||
response = self.client.get(self.url)
|
# response = self.client.get(self.url)
|
||||||
expected_url = "%s?next=%s" % (reverse('hosting:login'),
|
# expected_url = "%s?next=%s" % (reverse('hosting:login'),
|
||||||
reverse('hosting:virtual_machines',
|
# reverse('hosting:virtual_machines',
|
||||||
kwargs={'pk': self.vm.id}))
|
# kwargs={'pk': self.vm.id}))
|
||||||
self.assertRedirects(response, expected_url=expected_url,
|
# self.assertRedirects(response, expected_url=expected_url,
|
||||||
status_code=302, target_status_code=200)
|
# status_code=302, target_status_code=200)
|
||||||
|
#
|
||||||
# Customer should be able to get data
|
# # Customer should be able to get data
|
||||||
response = self.customer_client.get(self.url, follow=True)
|
# response = self.customer_client.get(self.url, follow=True)
|
||||||
self.assertEqual(response.status_code, 200)
|
# self.assertEqual(response.status_code, 200)
|
||||||
self.assertEqual(response.context['virtual_machine'], self.vm)
|
# self.assertEqual(response.context['virtual_machine'], self.vm)
|
||||||
self.assertTemplateUsed(response, self.expected_template)
|
# self.assertTemplateUsed(response, self.expected_template)
|
||||||
|
|
||||||
|
|
||||||
class VirtualMachinesPlanListViewTest(BaseTestCase):
|
class VirtualMachinesPlanListViewTest(BaseTestCase):
|
||||||
|
@ -361,8 +378,8 @@ class VirtualMachinesPlanListViewTest(BaseTestCase):
|
||||||
|
|
||||||
self.stripe_customer = mommy.make(StripeCustomer, user=self.customer)
|
self.stripe_customer = mommy.make(StripeCustomer, user=self.customer)
|
||||||
mommy.make(HostingOrder, customer=self.stripe_customer, approved=True, _quantity=20)
|
mommy.make(HostingOrder, customer=self.stripe_customer, approved=True, _quantity=20)
|
||||||
_vms = VirtualMachinePlan.objects.all()
|
# _vms = VirtualMachinePlan.objects.all()
|
||||||
self.vms = sorted(_vms, key=lambda vm: vm.id, reverse=True)
|
# self.vms = sorted(_vms, key=lambda vm: vm.id, reverse=True)
|
||||||
self.url = reverse('hosting:virtual_machines')
|
self.url = reverse('hosting:virtual_machines')
|
||||||
self.view = VirtualMachinesPlanListView()
|
self.view = VirtualMachinesPlanListView()
|
||||||
self.expected_template = 'hosting/virtual_machines.html'
|
self.expected_template = 'hosting/virtual_machines.html'
|
||||||
|
@ -383,7 +400,7 @@ class VirtualMachinesPlanListViewTest(BaseTestCase):
|
||||||
# Customer should be able to get his orders
|
# Customer should be able to get his orders
|
||||||
response = self.customer_client.get(self.url, follow=True)
|
response = self.customer_client.get(self.url, follow=True)
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
self.assertEqual(list(response.context['vms']), self.vms[:10])
|
# self.assertEqual(list(response.context['vms']), self.vms[:10])
|
||||||
self.assertTemplateUsed(response, self.expected_template)
|
self.assertTemplateUsed(response, self.expected_template)
|
||||||
|
|
||||||
|
|
||||||
|
@ -456,7 +473,7 @@ class LoginViewTest(TestCase):
|
||||||
self.url = reverse('hosting:login')
|
self.url = reverse('hosting:login')
|
||||||
self.view = LoginView
|
self.view = LoginView
|
||||||
self.expected_template = 'hosting/login.html'
|
self.expected_template = 'hosting/login.html'
|
||||||
self.user = mommy.make('membership.CustomUser')
|
self.user = mommy.make('membership.CustomUser', validated=1)
|
||||||
self.password = 'fake_password'
|
self.password = 'fake_password'
|
||||||
self.user.set_password(self.password)
|
self.user.set_password(self.password)
|
||||||
self.user.save()
|
self.user.save()
|
||||||
|
@ -505,7 +522,7 @@ class SignupViewTest(TestCase):
|
||||||
def test_anonymous_user_can_signup(self):
|
def test_anonymous_user_can_signup(self):
|
||||||
response = self.client.post(self.url, data=self.signup_data, follow=True)
|
response = self.client.post(self.url, data=self.signup_data, follow=True)
|
||||||
self.user = CustomUser.objects.get(email=self.signup_data.get('email'))
|
self.user = CustomUser.objects.get(email=self.signup_data.get('email'))
|
||||||
self.assertEqual(response.context['user'], self.user)
|
# self.assertEqual(response.context['user'], self.user)
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
|
|
||||||
|
@ -540,10 +557,11 @@ class PasswordResetViewTest(BaseTestCase):
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
|
|
||||||
def test_test_generate_email_context(self):
|
def test_test_generate_email_context(self):
|
||||||
context = self.setup_view(self.view()).\
|
context = self.setup_view(self.view()).test_generate_email_context(
|
||||||
test_generate_email_context(self.user)
|
self.user
|
||||||
|
)
|
||||||
self.assertEqual(context.get('user'), self.user)
|
self.assertEqual(context.get('user'), self.user)
|
||||||
self.assertEqual(context.get('site_name'), 'ungleich')
|
self.assertEqual(context.get('site_name'), settings.DCL_TEXT)
|
||||||
self.assertEqual(len(context.get('token')), 24)
|
self.assertEqual(len(context.get('token')), 24)
|
||||||
|
|
||||||
|
|
||||||
|
@ -578,7 +596,9 @@ class PasswordResetConfirmViewTest(BaseTestCase):
|
||||||
self.assertEqual(response.status_code, 200)
|
self.assertEqual(response.status_code, 200)
|
||||||
self.assertTemplateUsed(response, self.expected_template)
|
self.assertTemplateUsed(response, self.expected_template)
|
||||||
|
|
||||||
def test_post(self):
|
# def test_post(self):
|
||||||
response = self.client.post(self.url, data=self.post_data, follow=True)
|
# response = self.client.post(
|
||||||
self.assertEqual(response.status_code, 200)
|
# self.url, data=self.post_data, follow=True
|
||||||
self.assertTrue(not response.context['form'].errors)
|
# )
|
||||||
|
# self.assertEqual(response.status_code, 200)
|
||||||
|
# self.assertTrue(not response.context['form'].errors)
|
||||||
|
|
|
@ -1,29 +1,41 @@
|
||||||
import re
|
# import re
|
||||||
|
|
||||||
from django.test import TestCase
|
# from django.test import TestCase
|
||||||
from django.core.urlresolvers import reverse
|
# from django.core.urlresolvers import reverse
|
||||||
from django.core import mail
|
# from django.core import mail
|
||||||
|
|
||||||
|
|
||||||
class LoginTestCase(TestCase):
|
# class LoginTestCase(TestCase):
|
||||||
def test_login(self):
|
# def test_login(self):
|
||||||
url = reverse('login_glarus')
|
# url = reverse('login_glarus')
|
||||||
res = self.client.post(url, data={'email': 'test@gmail.com', 'password': 'test', 'name': 'test'})
|
# res = self.client.post(
|
||||||
self.assertContains(res, "You\'re successfully registered!", 1, 200)
|
# url,
|
||||||
self.assertEqual(len(mail.outbox), 1)
|
# data={
|
||||||
|
# 'email': 'test@gmail.com',
|
||||||
validation_url = re.findall(r"http://.*?(/.*)", mail.outbox[0].body)
|
# 'password': 'test', 'name':
|
||||||
res1 = self.client.get(validation_url[0] + '/')
|
# 'test'}
|
||||||
self.assertContains(res1, "Email verified!", 1, 200)
|
# )
|
||||||
|
# self.assertContains(res, "You\'re successfully registered!", 1, 200)
|
||||||
res2 = self.client.post(url, data={'email': 'test@gmail.com', 'password': 'test'})
|
# self.assertEqual(len(mail.outbox), 1)
|
||||||
self.assertEqual(res2.status_code, 302)
|
#
|
||||||
redirect_location = res2.get('Location')
|
# validation_url = re.findall(r"http://.*?(/.*)", mail.outbox[0].body)
|
||||||
|
# res1 = self.client.get(validation_url[0] + '/')
|
||||||
res3 = self.client.get(redirect_location)
|
# self.assertContains(res1, "Email verified!", 1, 200)
|
||||||
self.assertContains(res3, 'Pick coworking date.', 1, 200)
|
#
|
||||||
|
# res2 = self.client.post(
|
||||||
# check fail login
|
# url, data={'email': 'test@gmail.com', 'password': 'test'}
|
||||||
|
# )
|
||||||
res4 = self.client.post(url, data={'email': 'test@gmail.com', 'password': 'falsepassword'})
|
# self.assertEqual(res2.status_code, 302)
|
||||||
self.assertContains(res4, 'Sorry, that login was invalid.', 1, 200)
|
# redirect_location = res2.get('Location')
|
||||||
|
#
|
||||||
|
# res3 = self.client.get(redirect_location)
|
||||||
|
# self.assertContains(res3, 'Pick coworking date.', 1, 200)
|
||||||
|
#
|
||||||
|
# # check fail login
|
||||||
|
#
|
||||||
|
# res4 = self.client.post(
|
||||||
|
# url, data={
|
||||||
|
# 'email': 'test@gmail.com', 'password': 'falsepassword'
|
||||||
|
# }
|
||||||
|
# )
|
||||||
|
# self.assertContains(res4, 'Sorry, that login was invalid.', 1, 200)
|
||||||
|
|
|
@ -1,13 +1,21 @@
|
||||||
import random
|
import random
|
||||||
import string
|
import string
|
||||||
|
|
||||||
|
from django.conf import settings
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
from unittest import skipIf
|
||||||
|
|
||||||
from .models import OpenNebulaManager
|
from .models import OpenNebulaManager
|
||||||
from .serializers import VirtualMachineSerializer
|
from .serializers import VirtualMachineSerializer
|
||||||
from utils.models import CustomUser
|
from utils.models import CustomUser
|
||||||
|
|
||||||
|
|
||||||
|
@skipIf(
|
||||||
|
settings.OPENNEBULA_DOMAIN is None or
|
||||||
|
settings.OPENNEBULA_DOMAIN == "test_domain",
|
||||||
|
"""OpenNebula details unavailable, so skipping
|
||||||
|
OpenNebulaManagerTestCases"""
|
||||||
|
)
|
||||||
class OpenNebulaManagerTestCases(TestCase):
|
class OpenNebulaManagerTestCases(TestCase):
|
||||||
"""This class defines the test suite for the opennebula manager model."""
|
"""This class defines the test suite for the opennebula manager model."""
|
||||||
|
|
||||||
|
@ -120,13 +128,20 @@ class OpenNebulaManagerTestCases(TestCase):
|
||||||
creating a new vm"""
|
creating a new vm"""
|
||||||
|
|
||||||
|
|
||||||
|
@skipIf(
|
||||||
|
settings.OPENNEBULA_DOMAIN is None or
|
||||||
|
settings.OPENNEBULA_DOMAIN == "test_domain",
|
||||||
|
"""OpenNebula details unavailable, so skipping
|
||||||
|
VirtualMachineSerializerTestCase"""
|
||||||
|
)
|
||||||
class VirtualMachineSerializerTestCase(TestCase):
|
class VirtualMachineSerializerTestCase(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
"""Define the test client and other test variables."""
|
"""Define the test client and other test variables."""
|
||||||
self.manager = OpenNebulaManager(email=None, password=None)
|
self.manager = OpenNebulaManager(email=None, password=None)
|
||||||
|
|
||||||
def test_serializer_strips_of_public(self):
|
def test_serializer_strips_of_public(self):
|
||||||
""" Test the serialized virtual machine object contains no 'public-'."""
|
""" Test the serialized virtual machine object contains no
|
||||||
|
'public-'."""
|
||||||
|
|
||||||
for vm in self.manager.get_vms():
|
for vm in self.manager.get_vms():
|
||||||
serialized = VirtualMachineSerializer(vm)
|
serialized = VirtualMachineSerializer(vm)
|
||||||
|
|
|
@ -13,7 +13,8 @@ class GlasfaserMenu(CMSAttachMenu):
|
||||||
def get_nodes(self, request):
|
def get_nodes(self, request):
|
||||||
nodes = []
|
nodes = []
|
||||||
glasfaser_cms = 'ungleich_page/glasfaser_cms_page.html'
|
glasfaser_cms = 'ungleich_page/glasfaser_cms_page.html'
|
||||||
if request and request.current_page.get_template() == glasfaser_cms:
|
if (request and request.current_page and
|
||||||
|
request.current_page.get_template() == glasfaser_cms):
|
||||||
template_context = {
|
template_context = {
|
||||||
"request": request,
|
"request": request,
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,9 @@ from cms.plugin_pool import plugin_pool
|
||||||
|
|
||||||
from .models import (
|
from .models import (
|
||||||
UngelichContactUsSection, UngelichTextSection, Service, ServiceItem,
|
UngelichContactUsSection, UngelichTextSection, Service, ServiceItem,
|
||||||
About, AboutItem, SectionWithImage
|
About, AboutItem, SectionWithImage, UngleichServiceItem, UngleichHeader,
|
||||||
|
UngleichHeaderItem, UngleichProductItem, UngleichProduct, UngleichCustomer,
|
||||||
|
UngleichCustomerItem, UngleichHTMLOnly, UngleichSimpleHeader
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@ -145,3 +147,157 @@ class GlasfaserAboutItemPlugin(CMSPluginBase):
|
||||||
)
|
)
|
||||||
context['instance'] = instance
|
context['instance'] = instance
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
@plugin_pool.register_plugin
|
||||||
|
class UngleichServicesPlugin(CMSPluginBase):
|
||||||
|
name = "ungleich Services Plugin"
|
||||||
|
model = Service
|
||||||
|
render_template = "ungleich_page/ungleich/section_services.html"
|
||||||
|
cache = False
|
||||||
|
allow_children = True
|
||||||
|
child_classes = ['UngleichServicesItemPlugin']
|
||||||
|
|
||||||
|
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 UngleichServicesItemPlugin(CMSPluginBase):
|
||||||
|
name = "ungleich Service Item Plugin"
|
||||||
|
model = UngleichServiceItem
|
||||||
|
render_template = "ungleich_page/ungleich/_services_item.html"
|
||||||
|
cache = False
|
||||||
|
require_parent = True
|
||||||
|
parent_classes = ['UngleichServicesPlugin']
|
||||||
|
|
||||||
|
def render(self, context, instance, placeholder):
|
||||||
|
context = super(UngleichServicesItemPlugin, self).render(
|
||||||
|
context, instance, placeholder
|
||||||
|
)
|
||||||
|
context['instance'] = instance
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
@plugin_pool.register_plugin
|
||||||
|
class UngleichHeaderWithTextAndImagePlugin(CMSPluginBase):
|
||||||
|
name = "ungleich Header with Text and Image Plugin"
|
||||||
|
model = UngleichSimpleHeader
|
||||||
|
render_template = "ungleich_page/ungleich/header.html"
|
||||||
|
cache = False
|
||||||
|
|
||||||
|
def render(self, context, instance, placeholder):
|
||||||
|
context['instance'] = instance
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
@plugin_pool.register_plugin
|
||||||
|
class UngleichHeaderWithTextAndImageSliderPlugin(CMSPluginBase):
|
||||||
|
name = "ungleich Header with Text and Image Slider Plugin"
|
||||||
|
model = UngleichHeader
|
||||||
|
render_template = "ungleich_page/ungleich/header_with_slider.html"
|
||||||
|
cache = False
|
||||||
|
allow_children = True
|
||||||
|
child_classes = ['UngleichHeaderItemPlugin']
|
||||||
|
|
||||||
|
def render(self, context, instance, placeholder):
|
||||||
|
context['instance'] = instance
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
@plugin_pool.register_plugin
|
||||||
|
class UngleichHeaderItemPlugin(CMSPluginBase):
|
||||||
|
name = "ungleich Header Item Plugin"
|
||||||
|
model = UngleichHeaderItem
|
||||||
|
render_template = "ungleich_page/ungleich/_header_item.html"
|
||||||
|
cache = False
|
||||||
|
require_parent = True
|
||||||
|
parent_classes = ['UngleichHeaderWithTextAndImageSliderPlugin']
|
||||||
|
|
||||||
|
def render(self, context, instance, placeholder):
|
||||||
|
context = super(UngleichHeaderItemPlugin, self).render(
|
||||||
|
context, instance, placeholder
|
||||||
|
)
|
||||||
|
context['instance'] = instance
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
@plugin_pool.register_plugin
|
||||||
|
class UngleichProductsPlugin(CMSPluginBase):
|
||||||
|
name = "ungleich Products Plugin"
|
||||||
|
model = UngleichProduct
|
||||||
|
render_template = "ungleich_page/ungleich/section_products.html"
|
||||||
|
cache = False
|
||||||
|
allow_children = True
|
||||||
|
child_classes = ['UngleichProductsItemPlugin']
|
||||||
|
|
||||||
|
def render(self, context, instance, placeholder):
|
||||||
|
context['product_instance'] = instance
|
||||||
|
context['section_id'] = get_section_id(instance, 'products')
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
@plugin_pool.register_plugin
|
||||||
|
class UngleichProductsItemPlugin(CMSPluginBase):
|
||||||
|
name = "ungleich Product Item Plugin"
|
||||||
|
model = UngleichProductItem
|
||||||
|
render_template = "ungleich_page/ungleich/_products_item.html"
|
||||||
|
cache = False
|
||||||
|
require_parent = True
|
||||||
|
parent_classes = ['UngleichProductsPlugin']
|
||||||
|
|
||||||
|
def render(self, context, instance, placeholder):
|
||||||
|
context = super(UngleichProductsItemPlugin, self).render(
|
||||||
|
context, instance, placeholder
|
||||||
|
)
|
||||||
|
context['instance'] = instance
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
@plugin_pool.register_plugin
|
||||||
|
class UngleichCustomerSectionPlugin(CMSPluginBase):
|
||||||
|
name = "ungleich Customer Section Plugin"
|
||||||
|
model = UngleichCustomer
|
||||||
|
render_template = "ungleich_page/ungleich/section_customers.html"
|
||||||
|
cache = False
|
||||||
|
allow_children = True
|
||||||
|
child_classes = ['UngleichCustomerItemPlugin']
|
||||||
|
|
||||||
|
def render(self, context, instance, placeholder):
|
||||||
|
context['customer_instance'] = instance
|
||||||
|
context['section_id'] = get_section_id(instance, 'customer')
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
@plugin_pool.register_plugin
|
||||||
|
class UngleichCustomerItemPlugin(CMSPluginBase):
|
||||||
|
name = "ungleich Customer Item Plugin"
|
||||||
|
model = UngleichCustomerItem
|
||||||
|
render_template = "ungleich_page/ungleich/_customer_item.html"
|
||||||
|
cache = False
|
||||||
|
require_parent = True
|
||||||
|
parent_classes = ['UngleichCustomerSectionPlugin']
|
||||||
|
|
||||||
|
def render(self, context, instance, placeholder):
|
||||||
|
context = super(UngleichCustomerItemPlugin, self).render(
|
||||||
|
context, instance, placeholder
|
||||||
|
)
|
||||||
|
context['instance'] = instance
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
@plugin_pool.register_plugin
|
||||||
|
class UngleichHTMLPlugin(CMSPluginBase):
|
||||||
|
name = "ungleich HTML Plugin"
|
||||||
|
model = UngleichHTMLOnly
|
||||||
|
render_template = "ungleich_page/ungleich/html_block.html"
|
||||||
|
cache = False
|
||||||
|
|
||||||
|
def render(self, context, instance, placeholder):
|
||||||
|
context = super(UngleichHTMLPlugin, self).render(
|
||||||
|
context, instance, placeholder
|
||||||
|
)
|
||||||
|
context['instance'] = instance
|
||||||
|
return context
|
||||||
|
|
21
ungleich_page/migrations/0007_auto_20171117_1011.py
Normal file
21
ungleich_page/migrations/0007_auto_20171117_1011.py
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2017-11-17 10:11
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
import djangocms_text_ckeditor.fields
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ungleich_page', '0006_aboutitem_link_url'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='ungelichpicture',
|
||||||
|
name='title',
|
||||||
|
field=djangocms_text_ckeditor.fields.HTMLField(),
|
||||||
|
),
|
||||||
|
]
|
29
ungleich_page/migrations/0008_ungleichserviceitem.py
Normal file
29
ungleich_page/migrations/0008_ungleichserviceitem.py
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2017-11-17 18:49
|
||||||
|
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', '0007_auto_20171117_1011'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='UngleichServiceItem',
|
||||||
|
fields=[
|
||||||
|
('serviceitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='ungleich_page.ServiceItem')),
|
||||||
|
('data_replaced_image', filer.fields.image.FilerImageField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='service_item_data_replaced_image', to='filer.Image')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=('ungleich_page.serviceitem',),
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,44 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2017-11-19 11:28
|
||||||
|
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):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('filer', '0004_auto_20160328_1434'),
|
||||||
|
('cms', '0014_auto_20160404_1908'),
|
||||||
|
('ungleich_page', '0008_ungleichserviceitem'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='UngleichHeader',
|
||||||
|
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')),
|
||||||
|
('carousel_data_interval', models.IntegerField(default=5000)),
|
||||||
|
('background_image', filer.fields.image.FilerImageField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ungleich_header_background_image', to='filer.Image')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=('cms.cmsplugin',),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='UngleichHeaderItem',
|
||||||
|
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')),
|
||||||
|
('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='ungleich_header_item_image', to='filer.Image')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=('cms.cmsplugin',),
|
||||||
|
),
|
||||||
|
]
|
21
ungleich_page/migrations/0010_auto_20171119_1404.py
Normal file
21
ungleich_page/migrations/0010_auto_20171119_1404.py
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2017-11-19 14:04
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
import djangocms_text_ckeditor.fields
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ungleich_page', '0009_ungleichheader_ungleichheaderitem'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='service',
|
||||||
|
name='sub_title',
|
||||||
|
field=djangocms_text_ckeditor.fields.HTMLField(),
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,38 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2017-11-21 19:04
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ungleich_page', '0010_auto_20171119_1404'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='UngleichProduct',
|
||||||
|
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')),
|
||||||
|
('section_class', models.CharField(blank=True, default='', max_length=100)),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=('ungleich_page.service',),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='UngleichProductItem',
|
||||||
|
fields=[
|
||||||
|
('serviceitem_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='ungleich_page.ServiceItem')),
|
||||||
|
('url', models.URLField(blank=True, default='', max_length=300)),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=('ungleich_page.serviceitem',),
|
||||||
|
),
|
||||||
|
]
|
|
@ -0,0 +1,46 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2017-11-23 08:11
|
||||||
|
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):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('filer', '0004_auto_20160328_1434'),
|
||||||
|
('cms', '0014_auto_20160404_1908'),
|
||||||
|
('ungleich_page', '0011_ungleichproduct_ungleichproductitem'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='UngleichCustomer',
|
||||||
|
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')),
|
||||||
|
('section_class', models.CharField(blank=True, default='', max_length=100)),
|
||||||
|
('carousel_data_interval', models.IntegerField(default=3000)),
|
||||||
|
('bottom_text', djangocms_text_ckeditor.fields.HTMLField(default='<h3 class="section-subheading text-muted">*ungleich means not equal to (≠) U+2260.</h3>')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=('ungleich_page.service',),
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='UngleichCustomerItem',
|
||||||
|
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')),
|
||||||
|
('url', models.URLField(blank=True, default='', max_length=300)),
|
||||||
|
('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='customer_item_image', to='filer.Image')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=('cms.cmsplugin',),
|
||||||
|
),
|
||||||
|
]
|
29
ungleich_page/migrations/0013_ungleichhtmlonly.py
Normal file
29
ungleich_page/migrations/0013_ungleichhtmlonly.py
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2017-11-23 11:49
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
import djangocms_text_ckeditor.fields
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('cms', '0014_auto_20160404_1908'),
|
||||||
|
('ungleich_page', '0012_ungleichcustomer_ungleichcustomeritem'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='UngleichHTMLOnly',
|
||||||
|
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')),
|
||||||
|
('HTML', djangocms_text_ckeditor.fields.HTMLField()),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=('cms.cmsplugin',),
|
||||||
|
),
|
||||||
|
]
|
20
ungleich_page/migrations/0014_ungleichhtmlonly_name.py
Normal file
20
ungleich_page/migrations/0014_ungleichhtmlonly_name.py
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2017-11-24 07:00
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('ungleich_page', '0013_ungleichhtmlonly'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='ungleichhtmlonly',
|
||||||
|
name='name',
|
||||||
|
field=models.CharField(blank=True, default='', max_length=50),
|
||||||
|
),
|
||||||
|
]
|
33
ungleich_page/migrations/0015_ungleichsimpleheader.py
Normal file
33
ungleich_page/migrations/0015_ungleichsimpleheader.py
Normal file
|
@ -0,0 +1,33 @@
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
# Generated by Django 1.9.4 on 2017-11-24 19:12
|
||||||
|
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):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('filer', '0004_auto_20160328_1434'),
|
||||||
|
('cms', '0014_auto_20160404_1908'),
|
||||||
|
('ungleich_page', '0014_ungleichhtmlonly_name'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='UngleichSimpleHeader',
|
||||||
|
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')),
|
||||||
|
('text', djangocms_text_ckeditor.fields.HTMLField()),
|
||||||
|
('background_image', filer.fields.image.FilerImageField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ungleich_simple_header_background_image', to='filer.Image')),
|
||||||
|
('image', filer.fields.image.FilerImageField(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='ungleich_simple_header_image', to='filer.Image')),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
'abstract': False,
|
||||||
|
},
|
||||||
|
bases=('cms.cmsplugin',),
|
||||||
|
),
|
||||||
|
]
|
|
@ -11,7 +11,7 @@ class UngelichPicture(CMSPlugin):
|
||||||
related_name="image",
|
related_name="image",
|
||||||
on_delete=models.SET_NULL
|
on_delete=models.SET_NULL
|
||||||
)
|
)
|
||||||
title = models.CharField(max_length=400)
|
title = HTMLField()
|
||||||
|
|
||||||
|
|
||||||
class SectionWithImage(UngelichPicture):
|
class SectionWithImage(UngelichPicture):
|
||||||
|
@ -54,7 +54,7 @@ class UngelichTextSection(CMSPlugin):
|
||||||
class Service(CMSPlugin):
|
class Service(CMSPlugin):
|
||||||
menu_text = models.CharField(max_length=100, default="", blank=True)
|
menu_text = models.CharField(max_length=100, default="", blank=True)
|
||||||
title = models.CharField(max_length=200)
|
title = models.CharField(max_length=200)
|
||||||
sub_title = models.CharField(max_length=200)
|
sub_title = HTMLField()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return self.title
|
return self.title
|
||||||
|
@ -87,3 +87,84 @@ class AboutItem(UngelichPicture):
|
||||||
return "{alignment} - {title}".format(
|
return "{alignment} - {title}".format(
|
||||||
alignment=alignment, title=self.title
|
alignment=alignment, title=self.title
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class UngleichServiceItem(ServiceItem):
|
||||||
|
data_replaced_image = FilerImageField(
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
related_name="service_item_data_replaced_image",
|
||||||
|
on_delete=models.SET_NULL
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class UngleichSimpleHeader(CMSPlugin):
|
||||||
|
background_image = FilerImageField(
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
related_name="ungleich_simple_header_background_image",
|
||||||
|
on_delete=models.SET_NULL
|
||||||
|
)
|
||||||
|
image = FilerImageField(
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
related_name="ungleich_simple_header_image",
|
||||||
|
on_delete=models.SET_NULL
|
||||||
|
)
|
||||||
|
text = HTMLField()
|
||||||
|
|
||||||
|
|
||||||
|
class UngleichHeader(CMSPlugin):
|
||||||
|
background_image = FilerImageField(
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
related_name="ungleich_header_background_image",
|
||||||
|
on_delete=models.SET_NULL
|
||||||
|
)
|
||||||
|
carousel_data_interval = models.IntegerField(default=5000)
|
||||||
|
|
||||||
|
|
||||||
|
class UngleichHeaderItem(CMSPlugin):
|
||||||
|
image = FilerImageField(
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
related_name="ungleich_header_item_image",
|
||||||
|
on_delete=models.SET_NULL
|
||||||
|
)
|
||||||
|
description = HTMLField()
|
||||||
|
|
||||||
|
|
||||||
|
class UngleichProductItem(ServiceItem):
|
||||||
|
url = models.URLField(max_length=300, default="", blank=True)
|
||||||
|
|
||||||
|
|
||||||
|
class UngleichProduct(Service):
|
||||||
|
section_class = models.CharField(max_length=100, default="", blank=True)
|
||||||
|
|
||||||
|
|
||||||
|
class UngleichCustomer(Service):
|
||||||
|
section_class = models.CharField(max_length=100, default="", blank=True)
|
||||||
|
carousel_data_interval = models.IntegerField(default=3000)
|
||||||
|
bottom_text = HTMLField(
|
||||||
|
default='<h3 class="section-subheading text-muted">*ungleich means '
|
||||||
|
'not equal to (≠) U+2260.</h3>'
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class UngleichCustomerItem(CMSPlugin):
|
||||||
|
image = FilerImageField(
|
||||||
|
null=True,
|
||||||
|
blank=True,
|
||||||
|
related_name="customer_item_image",
|
||||||
|
on_delete=models.SET_NULL
|
||||||
|
)
|
||||||
|
url = models.URLField(max_length=300, default="", blank=True)
|
||||||
|
description = HTMLField()
|
||||||
|
|
||||||
|
|
||||||
|
class UngleichHTMLOnly(CMSPlugin):
|
||||||
|
name = models.CharField(max_length=50, default="", blank=True)
|
||||||
|
HTML = HTMLField()
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return self.name
|
||||||
|
|
|
@ -7,6 +7,17 @@
|
||||||
color: #494949;
|
color: #494949;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.header-vh {
|
||||||
|
height: 30px;
|
||||||
|
}
|
||||||
|
.intro-cap-sans-transform p {
|
||||||
|
font-family: 'Raleway', 'Helvetica Neue', 'Open Sans Bold', Helvetica, Arial, 'Arial Bold', sans-serif;
|
||||||
|
font-size: 26px;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 200;
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
|
||||||
.intro-cap {
|
.intro-cap {
|
||||||
margin-top: 25px;
|
margin-top: 25px;
|
||||||
margin-bottom: 25px;
|
margin-bottom: 25px;
|
||||||
|
@ -144,3 +155,36 @@
|
||||||
background-size: cover;
|
background-size: cover;
|
||||||
background-position: center;
|
background-position: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.timeline>li .timeline-panel {
|
||||||
|
display: flex;
|
||||||
|
min-height: 80px;
|
||||||
|
align-items: center;
|
||||||
|
padding-bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-justify-content-end{
|
||||||
|
justify-content: flex-end;
|
||||||
|
}
|
||||||
|
|
||||||
|
.flex-justify-content-start{
|
||||||
|
justify-content: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.timeline>li.timeline-inverted>.timeline-panel {
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@media (min-width: 768px) and (max-width: 991px) {
|
||||||
|
.timeline>li .timeline-panel {
|
||||||
|
min-height: 100px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (min-width: 992px) {
|
||||||
|
.timeline>li .timeline-panel {
|
||||||
|
min-height: 170px;
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,7 +4,7 @@
|
||||||
<img class="img-circle img-responsive" src="{{ instance.image.url }}" alt="">
|
<img class="img-circle img-responsive" src="{{ instance.image.url }}" alt="">
|
||||||
</div>
|
</div>
|
||||||
{% if instance.link_url %}</a>{% endif %}
|
{% if instance.link_url %}</a>{% endif %}
|
||||||
<div class="timeline-panel wow {% if instance.inverted %}slideInRight{% else %}slideInLeft{% endif %}">
|
<div class="timeline-panel wow {% if instance.inverted %}slideInRight flex-justify-content-start {% else %}slideInLeft flex-justify-content-end{% endif %}">
|
||||||
<div class="timeline-body">
|
<div class="timeline-body">
|
||||||
<p>{{ instance.title }}</p>
|
<p>{{ instance.title }}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -11,7 +11,6 @@
|
||||||
{% render_plugin plugin %}
|
{% render_plugin plugin %}
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</section>
|
</section>
|
|
@ -0,0 +1,2 @@
|
||||||
|
<a href="{{ instance.url }}"><img class="center-block img-client img-responsive" src="{{ instance.image.url}}"></a>
|
||||||
|
<p class="carousel-text text-muted text-center">{{ instance.description }}</p>
|
|
@ -0,0 +1,14 @@
|
||||||
|
<div class="container">
|
||||||
|
<div>
|
||||||
|
{% if instance.image %}
|
||||||
|
<img src="{{ instance.image.url }}" alt=""
|
||||||
|
class="logo-image" img-responsive="" width="300"/>
|
||||||
|
<div class="header-vh"></div>
|
||||||
|
{% endif %}
|
||||||
|
<div>
|
||||||
|
<span class="intro-cap-sans-transform">
|
||||||
|
{{ instance.description }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<a href="{{ instance.url }}"><img src="{{ instance.image.url}}" class="img-responsive inline-block" alt=""></a>
|
||||||
|
<div class="portfolio-caption inline-block">
|
||||||
|
<h4>{{ instance.title }}</h4>
|
||||||
|
<p> </p>
|
||||||
|
<p class="text-muted">{{ instance.description }}</p>
|
||||||
|
</div>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<div class="team-member wow fadeInUp" data-wow-delay="0.25s">
|
||||||
|
<img src="{{ instance.image.url }}" data-replaced="{{ instance.data_replaced_image.url }}" class="img-responsive img-circle img-toggle" alt="">
|
||||||
|
<div class="team-member-caption inline-block">
|
||||||
|
<h4 class="portfolio-caption">{{ instance.title }}</h4>
|
||||||
|
<p> </p>
|
||||||
|
<p><span class="text-muted">{{ instance.description }}</span></p>
|
||||||
|
</div>
|
||||||
|
</div>
|
15
ungleich_page/templates/ungleich_page/ungleich/header.html
Normal file
15
ungleich_page/templates/ungleich_page/ungleich/header.html
Normal file
|
@ -0,0 +1,15 @@
|
||||||
|
{% load cms_tags %}
|
||||||
|
<!-- Header -->
|
||||||
|
<header style="background-image: url({{ instance.background_image.url }})">
|
||||||
|
<div class="container">
|
||||||
|
<div class="intro-text">
|
||||||
|
<img src="{{ instance.image.url }}" alt="" class="logo-image" img-responsive="" width="300" />
|
||||||
|
<p></p><p></p><br>
|
||||||
|
<div class="intro-cap">
|
||||||
|
<span class="intro-cap">
|
||||||
|
{{ instance.text }}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
|
@ -0,0 +1,21 @@
|
||||||
|
{% load cms_tags %}
|
||||||
|
<header class="header_slider" style="background-image: url({{ instance.background_image.url }})">
|
||||||
|
<div id="carousel-header-ungleich" class="carousel slide" data-ride="carousel" data-interval="{{ instance.carousel_data_interval}}">
|
||||||
|
<!-- Indicators -->
|
||||||
|
{% if instance.child_plugin_instances|length > 1 %}
|
||||||
|
<ol class="carousel-indicators">
|
||||||
|
{% for plugin in instance.child_plugin_instances %}
|
||||||
|
<li data-target="#carousel-header-ungleich" data-slide-to="{{forloop.counter0}}" {% if forloop.counter0 == 0 %}class="active" {% endif %}></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ol>
|
||||||
|
{% endif %}
|
||||||
|
<!-- Wrapper for slides -->
|
||||||
|
<div class="carousel-inner" role="listbox">
|
||||||
|
{% for plugin in instance.child_plugin_instances %}
|
||||||
|
<div class="item {% if forloop.counter0 == 0 %}active{% endif %}">
|
||||||
|
{% render_plugin plugin %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</header>
|
|
@ -0,0 +1,5 @@
|
||||||
|
{% load cms_tags static %}
|
||||||
|
{{instance.HTML}}
|
||||||
|
{% for plugin in instance.child_plugin_instances %}
|
||||||
|
{% render_plugin plugin %}
|
||||||
|
{% endfor %}
|
|
@ -0,0 +1,35 @@
|
||||||
|
{% load cms_tags custom_tags %}
|
||||||
|
<section id="{{section_id}}" class="{% if customer_instance.section_class %}{{ customer_instance.section_class }}{% else %}bg-light-gray{% endif %}">
|
||||||
|
<div class="container">
|
||||||
|
<div class="text-center wow fadeInDown" style="visibility: visible; animation-name: fadeInDown;">
|
||||||
|
<h2 class="section-heading">{{ customer_instance.title }}</h2>
|
||||||
|
<h3 class="text-muted">{{ customer_instance.sub_title }}</h3>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-sm-10 col-sm-offset-1 wow fadeInDown" style="visibility: visible; animation-name: fadeInDown;">
|
||||||
|
<!-- start:recommendationSlider -->
|
||||||
|
<div id="carousel-recommendation-ungleich" class="carousel slide ungleich ungleich-gallery ungleich-gallery-text-carousel" data-ride="carousel" data-interval="{{ customer_instance.carousel_data_interval}}">
|
||||||
|
<!-- Indicators -->
|
||||||
|
<ol class="carousel-indicators">
|
||||||
|
{% for plugin in customer_instance.child_plugin_instances %}
|
||||||
|
<li data-target="#carousel-recommendation-ungleich" data-slide-to="{{forloop.counter0}}" {% if forloop.counter0 == 0 %}class="active" {% endif %}></li>
|
||||||
|
{% endfor %}
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<!-- Wrapper for slides -->
|
||||||
|
<div class="carousel-inner" role="listbox">
|
||||||
|
{% for plugin in customer_instance.child_plugin_instances %}
|
||||||
|
<div class="item {% if forloop.counter0 == 0 %}active{% endif %}">
|
||||||
|
{% render_plugin plugin %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<!-- end:recommendationSlider -->
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="text-center">
|
||||||
|
{{customer_instance.bottom_text}}
|
||||||
|
</div>
|
||||||
|
</section>
|
|
@ -0,0 +1,20 @@
|
||||||
|
{% load cms_tags custom_tags %}
|
||||||
|
<section id="{{section_id}}" class="products-section {% if product_instance.section_class %}{{ product_instance.section_class }}{% else %}bg-light-gray{% endif %}">
|
||||||
|
<div id="portfolio">
|
||||||
|
<div class="container">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-lg-12 text-center wow fadeInDown" style="visibility: visible; animation-name: fadeInDown;">
|
||||||
|
<h2 class="section-heading">{{ product_instance.title }}</h2>
|
||||||
|
{{ product_instance.sub_title }}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
{% for plugin in product_instance.child_plugin_instances %}
|
||||||
|
<div class="col-md-4 col-sm-6 portfolio-item wow fadeInUp" data-wow-delay="{{ forloop.counter|multiply:0.25 }}s" style="visibility: visible; animation-delay: {{ forloop.counter|multiply:0.25 }}s; animation-name: fadeInUp;">
|
||||||
|
{% render_plugin plugin %}
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</section>
|
|
@ -0,0 +1,16 @@
|
||||||
|
{% load cms_tags %}
|
||||||
|
<section id="{{section_id}}">
|
||||||
|
<div class="container">
|
||||||
|
<div class="text-center wow fadeInDown">
|
||||||
|
<h2 class="section-heading">{{ service_instance.title }}</h2>
|
||||||
|
{{ service_instance.sub_title }}
|
||||||
|
</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>
|
75
ungleich_page/templates/ungleich_page/ungleich_cms_page.html
Normal file
75
ungleich_page/templates/ungleich_page/ungleich_cms_page.html
Normal file
|
@ -0,0 +1,75 @@
|
||||||
|
{% load static i18n cms_tags sekizai_tags %}
|
||||||
|
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<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="description" content="">
|
||||||
|
<meta name="author" content="">
|
||||||
|
|
||||||
|
<title>{% page_attribute "page_title" %}</title>
|
||||||
|
|
||||||
|
<!-- Bootstrap Core CSS -->
|
||||||
|
<link href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
|
||||||
|
<link href="{% static 'ungleich_page/css/lib/animate.min.css' %}" rel="stylesheet">
|
||||||
|
<link href="//fonts.googleapis.com/css?family=Raleway|Montserrat:400,700|Droid+Serif:400,700,400italic,700italic|Roboto+Slab:400,100,300,700" rel="stylesheet" type="text/css">
|
||||||
|
|
||||||
|
<!-- 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]-->
|
||||||
|
|
||||||
|
<!-- Custom CSS -->
|
||||||
|
<link href="{% static 'ungleich_page/css/agency.css' %}" rel="stylesheet">
|
||||||
|
<link href="{% static 'ungleich_page/css/ungleich.css' %}" rel="stylesheet">
|
||||||
|
{% 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 %}
|
||||||
|
{% placeholder 'Ungleich Page Contents' %}
|
||||||
|
|
||||||
|
<!-- Footer -->
|
||||||
|
{% include "ungleich_page/includes/_footer.html" %}
|
||||||
|
|
||||||
|
<!-- jQuery -->
|
||||||
|
<script src="{% static 'ungleich_page/js/jquery.js' %}" type="text/javascript"></script>
|
||||||
|
<script type="text/javascript">
|
||||||
|
$(document).ready(function () {
|
||||||
|
if ($(".has-error").length != 0) {
|
||||||
|
window.location = window.location.pathname + "#contact"
|
||||||
|
}
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<!-- Bootstrap Core JavaScript -->
|
||||||
|
<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/jquery-easing/1.3/jquery.easing.min.js" type="text/javascript"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/classie/1.0.1/classie.min.js" type="text/javascript"></script>
|
||||||
|
<script src="{% static 'ungleich_page/js/cbpAnimatedHeader.js' %}" type="text/javascript"></script>
|
||||||
|
|
||||||
|
<!-- Contact Form JavaScript -->
|
||||||
|
<script src="{% static 'ungleich_page/js/jqBootstrapValidation.js' %}" type="text/javascript"></script>
|
||||||
|
<!-- <script src="{% static 'ungleich_page/js/contact_me.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>
|
||||||
|
|
||||||
|
<!-- Custom Fonts -->
|
||||||
|
<link href="//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" type="text/css">
|
||||||
|
</body>
|
||||||
|
</html>
|
|
@ -75,6 +75,7 @@ class BillingAddressFormTest(TestCase):
|
||||||
|
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.completed_data = {
|
self.completed_data = {
|
||||||
|
'cardholder_name': 'test',
|
||||||
'street_address': 'street name',
|
'street_address': 'street name',
|
||||||
'city': 'MyCity',
|
'city': 'MyCity',
|
||||||
'postal_code': '32123123123123',
|
'postal_code': '32123123123123',
|
||||||
|
|
|
@ -28,8 +28,8 @@ class BaseTestCase(TestCase):
|
||||||
|
|
||||||
# Users
|
# Users
|
||||||
self.customer, self.another_customer = mommy.make(
|
self.customer, self.another_customer = mommy.make(
|
||||||
'membership.CustomUser',
|
'membership.CustomUser', validated=1, _quantity=2
|
||||||
_quantity=2)
|
)
|
||||||
self.customer.set_password(self.dummy_password)
|
self.customer.set_password(self.dummy_password)
|
||||||
self.customer.save()
|
self.customer.save()
|
||||||
self.another_customer.set_password(self.dummy_password)
|
self.another_customer.set_password(self.dummy_password)
|
||||||
|
@ -97,6 +97,9 @@ class BaseTestCase(TestCase):
|
||||||
return view
|
return view
|
||||||
|
|
||||||
|
|
||||||
|
@skipIf(settings.STRIPE_API_PRIVATE_KEY_TEST is None or
|
||||||
|
settings.STRIPE_API_PRIVATE_KEY_TEST is "",
|
||||||
|
"""Skip because STRIPE_API_PRIVATE_KEY_TEST is not set""")
|
||||||
class TestStripeCustomerDescription(TestCase):
|
class TestStripeCustomerDescription(TestCase):
|
||||||
"""
|
"""
|
||||||
A class to test setting the description field of the stripe customer
|
A class to test setting the description field of the stripe customer
|
||||||
|
@ -139,6 +142,10 @@ class TestStripeCustomerDescription(TestCase):
|
||||||
self.assertEqual(customer_data.description, self.customer_name)
|
self.assertEqual(customer_data.description, self.customer_name)
|
||||||
|
|
||||||
|
|
||||||
|
@skipIf(settings.STRIPE_API_PRIVATE_KEY_TEST == "" or
|
||||||
|
settings.TEST_MANAGE_SSH_KEY_HOST == "",
|
||||||
|
"""Skipping test_save_ssh_key_add because either host
|
||||||
|
or public key were not specified or were empty""")
|
||||||
class StripePlanTestCase(TestStripeCustomerDescription):
|
class StripePlanTestCase(TestStripeCustomerDescription):
|
||||||
"""
|
"""
|
||||||
A class to test Stripe plans
|
A class to test Stripe plans
|
||||||
|
@ -161,6 +168,10 @@ class StripePlanTestCase(TestStripeCustomerDescription):
|
||||||
self.assertIsNone(stripe_plan.get('error'))
|
self.assertIsNone(stripe_plan.get('error'))
|
||||||
self.assertIsInstance(stripe_plan.get('response_object'), StripePlan)
|
self.assertIsInstance(stripe_plan.get('response_object'), StripePlan)
|
||||||
|
|
||||||
|
@skipIf(settings.TEST_MANAGE_SSH_KEY_PUBKEY == "" or
|
||||||
|
settings.TEST_MANAGE_SSH_KEY_HOST == "",
|
||||||
|
"""Skipping test_save_ssh_key_add because either host
|
||||||
|
or public key were not specified or were empty""")
|
||||||
@patch('utils.stripe_utils.logger')
|
@patch('utils.stripe_utils.logger')
|
||||||
def test_create_duplicate_plans_error_handling(self, mock_logger):
|
def test_create_duplicate_plans_error_handling(self, mock_logger):
|
||||||
"""
|
"""
|
||||||
|
@ -254,10 +265,10 @@ class SaveSSHKeyTestCase(TestCase):
|
||||||
self.public_key = settings.TEST_MANAGE_SSH_KEY_PUBKEY
|
self.public_key = settings.TEST_MANAGE_SSH_KEY_PUBKEY
|
||||||
self.hosts = settings.TEST_MANAGE_SSH_KEY_HOST
|
self.hosts = settings.TEST_MANAGE_SSH_KEY_HOST
|
||||||
|
|
||||||
@skipIf(settings.TEST_MANAGE_SSH_KEY_PUBKEY is None or
|
@skipIf(settings.TEST_MANAGE_SSH_KEY_PUBKEY is "" or
|
||||||
settings.TEST_MANAGE_SSH_KEY_PUBKEY == "" or
|
settings.TEST_MANAGE_SSH_KEY_PUBKEY is None or
|
||||||
settings.TEST_MANAGE_SSH_KEY_HOST is None or
|
settings.TEST_MANAGE_SSH_KEY_HOST is "" or
|
||||||
settings.TEST_MANAGE_SSH_KEY_HOST is "",
|
settings.TEST_MANAGE_SSH_KEY_HOST is None,
|
||||||
"""Skipping test_save_ssh_key_add because either host
|
"""Skipping test_save_ssh_key_add because either host
|
||||||
or public key were not specified or were empty""")
|
or public key were not specified or were empty""")
|
||||||
def test_save_ssh_key_add(self):
|
def test_save_ssh_key_add(self):
|
||||||
|
|
Loading…
Reference in a new issue