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 = { | ||||||
|  | #         #     'cores': 2, | ||||||
|  | #         #     'memory': 10, | ||||||
|  | #         #     'disk_size': 100 | ||||||
|  | #         # } | ||||||
|  | #         # vm_type = VirtualMachineType.objects.get(hosting_company=self.HETZNER_NUG_NAME) | ||||||
|  | #         # calculated_price = vm_type.calculate_price(specifications) | ||||||
|  | #         # self.assertEqual(calculated_price, self.HETZNER_NUG_EXPECTED_PRICE) | ||||||
|  | # | ||||||
|  | #         # 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_NUG_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_NUG_EXPECTED_PRICE) | #         self.assertEqual(calculated_price, self.HETZNER_EXPECTED_PRICE) | ||||||
| 
 | # | ||||||
|         # hetzner | #         # 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_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_EXPECTED_PRICE) | #         # self.assertEqual(calculated_price, self.HETZNER_RAID6_EXPECTED_PRICE) | ||||||
| 
 | # | ||||||
|         # hetzner_raid6 | #         # hetzner_glusterfs | ||||||
|  | #         # specifications = { | ||||||
|  | #         #     'cores': 2, | ||||||
|  | #         #     'memory': 10, | ||||||
|  | #         #     'disk_size': 100 | ||||||
|  | #         # } | ||||||
|  | #         # vm_type = VirtualMachineType.objects.get(hosting_company=self.HETZNER_GLUSTERFS_NAME) | ||||||
|  | #         # calculated_price = vm_type.calculate_price(specifications) | ||||||
|  | #         # self.assertEqual(calculated_price, self.HETZNER_GLUSTERFS_EXPECTED_PRICE) | ||||||
|  | # | ||||||
|  | #         # 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.HETZNER_RAID6_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.HETZNER_RAID6_EXPECTED_PRICE) | #         self.assertEqual(calculated_price, self.BERN_EXPECTED_PRICE) | ||||||
| 
 |  | ||||||
|         # hetzner_glusterfs |  | ||||||
|         # specifications = { |  | ||||||
|         #     'cores': 2, |  | ||||||
|         #     'memory': 10, |  | ||||||
|         #     'disk_size': 100 |  | ||||||
|         # } |  | ||||||
|         # vm_type = VirtualMachineType.objects.get(hosting_company=self.HETZNER_GLUSTERFS_NAME) |  | ||||||
|         # calculated_price = vm_type.calculate_price(specifications) |  | ||||||
|         # self.assertEqual(calculated_price, self.HETZNER_GLUSTERFS_EXPECTED_PRICE) |  | ||||||
| 
 |  | ||||||
|         # bern |  | ||||||
|         specifications = { |  | ||||||
|             'cores': 2, |  | ||||||
|             'memory': 10, |  | ||||||
|             'disk_size': 100 |  | ||||||
|         } |  | ||||||
|         vm_type = VirtualMachineType.objects.get(hosting_company=self.BERN_NAME) |  | ||||||
|         calculated_price = vm_type.calculate_price(specifications) |  | ||||||
|         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…
	
	Add table
		Add a link
		
	
		Reference in a new issue