Merge pull request #599 from tiwariav/task/4315/cms_navbar_to_static
Task/4315/cms navbar and footer integration to application pages
This commit is contained in:
		
				commit
				
					
						033e542cbc
					
				
			
		
					 10 changed files with 147 additions and 78 deletions
				
			
		
							
								
								
									
										10
									
								
								datacenterlight/admin.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								datacenterlight/admin.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,10 @@
 | 
			
		|||
from django.contrib import admin
 | 
			
		||||
from cms.admin.placeholderadmin import PlaceholderAdminMixin
 | 
			
		||||
from .cms_models import CMSIntegration
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CMSIntegrationAdmin(PlaceholderAdminMixin, admin.ModelAdmin):
 | 
			
		||||
    pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
admin.site.register(CMSIntegration, CMSIntegrationAdmin)
 | 
			
		||||
| 
						 | 
				
			
			@ -3,6 +3,23 @@ from django.db import models
 | 
			
		|||
from django.utils.safestring import mark_safe
 | 
			
		||||
from djangocms_text_ckeditor.fields import HTMLField
 | 
			
		||||
from filer.fields.image import FilerImageField
 | 
			
		||||
from cms.models.fields import PlaceholderField
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class CMSIntegration(models.Model):
 | 
			
		||||
    name = models.CharField(
 | 
			
		||||
        max_length=100, unique=True, default='default',
 | 
			
		||||
        help_text=(
 | 
			
		||||
            'A unique name for the Integration. This name will be used to '
 | 
			
		||||
            'fetch the Integration into pages'
 | 
			
		||||
        )
 | 
			
		||||
    )
 | 
			
		||||
    footer_placeholder = PlaceholderField('datacenterlight_footer')
 | 
			
		||||
    navbar_placeholder = PlaceholderField('datacenterlight_navbar')
 | 
			
		||||
 | 
			
		||||
    def __str__(self):
 | 
			
		||||
        return self.name
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
# Models for CMS Plugins
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										13
									
								
								datacenterlight/management/commands/cmsintegrate.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								datacenterlight/management/commands/cmsintegrate.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,13 @@
 | 
			
		|||
from django.core.management.base import BaseCommand
 | 
			
		||||
from datacenterlight.cms_models import CMSIntegration
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Command(BaseCommand):
 | 
			
		||||
    help = '''Creates cms integration objects for datacenterlight'''
 | 
			
		||||
 | 
			
		||||
    def handle(self, *args, **options):
 | 
			
		||||
        obj, created = CMSIntegration.objects.get_or_create(name='default')
 | 
			
		||||
        if created:
 | 
			
		||||
            print('created the default CMSIntegration object')
 | 
			
		||||
        else:
 | 
			
		||||
            print('default CMSIntegration object already exists')
 | 
			
		||||
							
								
								
									
										31
									
								
								datacenterlight/migrations/0016_cmsintegration.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										31
									
								
								datacenterlight/migrations/0016_cmsintegration.py
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,31 @@
 | 
			
		|||
# -*- coding: utf-8 -*-
 | 
			
		||||
# Generated by Django 1.9.4 on 2018-03-27 15:31
 | 
			
		||||
from __future__ import unicode_literals
 | 
			
		||||
 | 
			
		||||
import cms.models.fields
 | 
			
		||||
from django.db import migrations, models
 | 
			
		||||
import django.db.models.deletion
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Migration(migrations.Migration):
 | 
			
		||||
 | 
			
		||||
    dependencies = [
 | 
			
		||||
        ('datacenterlight', '0015_auto_20180323_0011'),
 | 
			
		||||
        ('cms', '0014_auto_20160404_1908'),
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    operations = [
 | 
			
		||||
        migrations.CreateModel(
 | 
			
		||||
            name='CMSIntegration',
 | 
			
		||||
            fields=[
 | 
			
		||||
                ('id', models.AutoField(auto_created=True,
 | 
			
		||||
                                        primary_key=True, serialize=False, verbose_name='ID')),
 | 
			
		||||
                ('navbar_placeholder', cms.models.fields.PlaceholderField(editable=False, null=True,
 | 
			
		||||
                                                                          on_delete=django.db.models.deletion.CASCADE, slotname='datacenterlight_navbar', to='cms.Placeholder')),
 | 
			
		||||
                ('footer_placeholder', cms.models.fields.PlaceholderField(editable=False, null=True,
 | 
			
		||||
                                                                          on_delete=django.db.models.deletion.CASCADE, slotname='datacenterlight_footer', to='cms.Placeholder')),
 | 
			
		||||
                ('name', models.CharField(default='default',
 | 
			
		||||
                                          help_text='A unique name for the Integration. This name will be used to fetch the Integration into pages', max_length=100, unique=True)),
 | 
			
		||||
            ],
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
| 
						 | 
				
			
			@ -1,7 +1,7 @@
 | 
			
		|||
body,
 | 
			
		||||
html {
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  min-height: 100%;
 | 
			
		||||
  height: 100%;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
body,
 | 
			
		||||
| 
						 | 
				
			
			@ -84,8 +84,24 @@ a.list-group-item-danger.active:focus {
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar .dcl-link {
 | 
			
		||||
  display: block;
 | 
			
		||||
  padding: 15px;
 | 
			
		||||
  color: #777;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar .dcl-link:focus,
 | 
			
		||||
.navbar .dcl-link:active,
 | 
			
		||||
.navbar .dcl-link:hover {
 | 
			
		||||
  text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar .dropdown-menu .dcl-link {
 | 
			
		||||
  padding: 1px 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
p.copyright {
 | 
			
		||||
  margin: 15px 0 0;
 | 
			
		||||
  margin: 15px 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
footer {
 | 
			
		||||
| 
						 | 
				
			
			@ -95,4 +111,23 @@ footer {
 | 
			
		|||
 | 
			
		||||
footer a {
 | 
			
		||||
  color: #777;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
footer .dcl-link-separator {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  padding-left: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
footer .dcl-link-separator::before {
 | 
			
		||||
  content: "";
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
  top: 9px;
 | 
			
		||||
  bottom: 0;
 | 
			
		||||
  left: -2px;
 | 
			
		||||
  right: 0;
 | 
			
		||||
  width: 2px;
 | 
			
		||||
  height: 2px;
 | 
			
		||||
  border-radius: 100%;
 | 
			
		||||
  background: #777;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -15,8 +15,8 @@
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
@media(min-width: 768px) {
 | 
			
		||||
  .navbar-default .navbar-nav>li>a,
 | 
			
		||||
  .navbar-right .highlights-dropdown .dropdown-menu>li>a {
 | 
			
		||||
  .navbar-default .navbar-nav>li a,
 | 
			
		||||
  .navbar-right .highlights-dropdown .dropdown-menu>li a {
 | 
			
		||||
    font-weight: 300;
 | 
			
		||||
  }
 | 
			
		||||
  .navbar-right .highlights-dropdown .dropdown-menu {
 | 
			
		||||
| 
						 | 
				
			
			@ -26,7 +26,7 @@
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar-right .highlights-dropdown .dropdown-menu>li>a {
 | 
			
		||||
.navbar-right .highlights-dropdown .dropdown-menu>li a {
 | 
			
		||||
  font-size: 13px;
 | 
			
		||||
  font-family: 'Lato', sans-serif;
 | 
			
		||||
  padding: 1px 10px 1px 18px !important;
 | 
			
		||||
| 
						 | 
				
			
			@ -34,9 +34,9 @@
 | 
			
		|||
  color: #333;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar-right .highlights-dropdown .dropdown-menu>li>a:hover,
 | 
			
		||||
.navbar-right .highlights-dropdown .dropdown-menu>li>a:focus,
 | 
			
		||||
.navbar-right .highlights-dropdown .dropdown-menu>li>a:active {
 | 
			
		||||
.navbar-right .highlights-dropdown .dropdown-menu>li a:hover,
 | 
			
		||||
.navbar-right .highlights-dropdown .dropdown-menu>li a:focus,
 | 
			
		||||
.navbar-right .highlights-dropdown .dropdown-menu>li a:active {
 | 
			
		||||
  background: transparent;
 | 
			
		||||
  text-decoration: underline !important;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -144,9 +144,9 @@
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
@media (max-width: 767px) {
 | 
			
		||||
  .navbar-default .navbar-nav .open .dropdown-menu>.active>a,
 | 
			
		||||
  .navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,
 | 
			
		||||
  .navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover {
 | 
			
		||||
  .navbar-default .navbar-nav .open .dropdown-menu>.active a,
 | 
			
		||||
  .navbar-default .navbar-nav .open .dropdown-menu>.active a:focus,
 | 
			
		||||
  .navbar-default .navbar-nav .open .dropdown-menu>.active a:hover {
 | 
			
		||||
    background-color: transparent;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -163,7 +163,7 @@
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
.content-dashboard {
 | 
			
		||||
  min-height: calc(100vh - 60px);
 | 
			
		||||
  min-height: calc(100vh - 86px);
 | 
			
		||||
  width: 100%;
 | 
			
		||||
  margin: 0 auto;
 | 
			
		||||
  max-width: 1120px;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -99,15 +99,13 @@ textarea {
 | 
			
		|||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar-transparent .navbar-nav>li a,
 | 
			
		||||
.navbar-transparent .navbar-nav>.open>a,
 | 
			
		||||
.navbar-transparent .navbar-nav>.open>a:focus,
 | 
			
		||||
.navbar-transparent .navbar-nav>.open>a:hover {
 | 
			
		||||
  color: #fff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar-transparent .navbar-nav>li a {
 | 
			
		||||
  color: #fff;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar-transparent .navbar-nav>li a:focus,
 | 
			
		||||
.navbar-transparent .navbar-nav>li a:active,
 | 
			
		||||
| 
						 | 
				
			
			@ -123,22 +121,6 @@ textarea {
 | 
			
		|||
  background: transparent;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar .dcl-link {
 | 
			
		||||
  display: block;
 | 
			
		||||
  padding: 15px;
 | 
			
		||||
  color: #777;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar .dcl-link:focus,
 | 
			
		||||
.navbar .dcl-link:active,
 | 
			
		||||
.navbar .dcl-link:hover {
 | 
			
		||||
  text-decoration: none;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar .dropdown-menu .dcl-link {
 | 
			
		||||
  padding: 1px 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.navbar-transparent .navbar-nav>li>.on-hover-border {
 | 
			
		||||
  transition: all 0.3s linear;
 | 
			
		||||
  box-shadow: none;
 | 
			
		||||
| 
						 | 
				
			
			@ -1233,24 +1215,6 @@ footer {
 | 
			
		|||
  transform: rotate(45deg);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
footer .dcl-link-separator {
 | 
			
		||||
  position: relative;
 | 
			
		||||
  padding-left: 10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
footer .dcl-link-separator::before {
 | 
			
		||||
  content: "";
 | 
			
		||||
  position: absolute;
 | 
			
		||||
  display: inline-block;
 | 
			
		||||
  top: 9px;
 | 
			
		||||
  bottom: 0;
 | 
			
		||||
  left: -2px;
 | 
			
		||||
  right: 0;
 | 
			
		||||
  width: 2px;
 | 
			
		||||
  height: 2px;
 | 
			
		||||
  border-radius: 100%;
 | 
			
		||||
  background: #777;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/* new styles for whydcl section cms plugin (to replace older style) */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,4 +1,4 @@
 | 
			
		|||
{% load staticfiles i18n %}
 | 
			
		||||
{% load staticfiles i18n cms_tags sekizai_tags %}
 | 
			
		||||
{% get_current_language as LANGUAGE_CODE %}
 | 
			
		||||
 | 
			
		||||
<!DOCTYPE html>
 | 
			
		||||
| 
						 | 
				
			
			@ -23,9 +23,15 @@
 | 
			
		|||
    <!-- Custom CSS -->
 | 
			
		||||
    <link href="{% static 'datacenterlight/css/common.css' %}" rel="stylesheet">
 | 
			
		||||
    <link href="{% static 'datacenterlight/css/hosting.css' %}" rel="stylesheet">
 | 
			
		||||
    {% if request.toolbar.edit_mode %}
 | 
			
		||||
        <link href="{% static 'datacenterlight/css/cms.css' %}" rel="stylesheet">
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    {% block css_extra %}
 | 
			
		||||
    {% endblock css_extra %}
 | 
			
		||||
 | 
			
		||||
    {% render_block "css" postprocessor "compressor.contrib.sekizai.compress" %}
 | 
			
		||||
    {% render_block "js" postprocessor "compressor.contrib.sekizai.compress" %}
 | 
			
		||||
 | 
			
		||||
    <!-- External Fonts -->
 | 
			
		||||
 | 
			
		||||
    <link rel="shortcut icon" href="{% static 'datacenterlight/img/favicon.ico' %}" type="image/x-icon">
 | 
			
		||||
| 
						 | 
				
			
			@ -43,28 +49,17 @@
 | 
			
		|||
</head>
 | 
			
		||||
 | 
			
		||||
<body>
 | 
			
		||||
    {% cms_toolbar %}
 | 
			
		||||
 | 
			
		||||
    {% block navbar %}
 | 
			
		||||
        {% include "hosting/includes/_navbar_user.html" %}
 | 
			
		||||
    {% endblock navbar %}
 | 
			
		||||
    {% render_placeholder cms_integration.navbar_placeholder %}
 | 
			
		||||
 | 
			
		||||
    <div class="{% if request.user.is_authenticated %}content-dashboard{% endif %}">
 | 
			
		||||
        {% block content %}
 | 
			
		||||
        {% endblock %}
 | 
			
		||||
    </div>
 | 
			
		||||
 | 
			
		||||
    <!-- Footer -->
 | 
			
		||||
    {% if request.user.is_authenticated %}
 | 
			
		||||
        <footer class="footer-vm">
 | 
			
		||||
            <div class="container">
 | 
			
		||||
                <p class="copyright text-muted small">Copyright © ungleich GmbH {% now "Y" %}. {% trans "All Rights Reserved" %}</p>
 | 
			
		||||
            </div>
 | 
			
		||||
        </footer>
 | 
			
		||||
    {% else %}
 | 
			
		||||
        <div class="footer-vm">
 | 
			
		||||
            {% include "datacenterlight/includes/_footer.html" %}
 | 
			
		||||
        </div>
 | 
			
		||||
    {% endif %}
 | 
			
		||||
    {% render_placeholder cms_integration.footer_placeholder %}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    <!-- Moment -->
 | 
			
		||||
    <script type="text/javascript" src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.18.1/moment.min.js"></script>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
{% extends "datacenterlight/base_hosting.html" %}
 | 
			
		||||
{% load staticfiles bootstrap3 i18n humanize %}
 | 
			
		||||
{% load staticfiles bootstrap3 i18n cms_tags humanize %}
 | 
			
		||||
 | 
			
		||||
{% block css_extra %}
 | 
			
		||||
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/paymentfont/1.1.2/css/paymentfont.min.css"/>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,14 +18,13 @@ from hosting.forms import HostingUserLoginForm
 | 
			
		|||
from hosting.models import HostingOrder
 | 
			
		||||
from membership.models import CustomUser, StripeCustomer
 | 
			
		||||
from opennebula_api.serializers import VMTemplateSerializer
 | 
			
		||||
from utils.forms import (
 | 
			
		||||
    BillingAddressForm, BillingAddressFormSignup
 | 
			
		||||
)
 | 
			
		||||
from utils.forms import BillingAddressForm, BillingAddressFormSignup
 | 
			
		||||
from utils.hosting_utils import get_vm_price
 | 
			
		||||
from utils.stripe_utils import StripeUtils
 | 
			
		||||
from utils.tasks import send_plain_email_task
 | 
			
		||||
from .forms import ContactForm
 | 
			
		||||
from .models import VMTemplate
 | 
			
		||||
from .cms_models import CMSIntegration
 | 
			
		||||
 | 
			
		||||
logger = logging.getLogger(__name__)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -42,9 +41,10 @@ class ContactUsView(FormView):
 | 
			
		|||
            return self.render_to_response(
 | 
			
		||||
                self.get_context_data(contact_form=form))
 | 
			
		||||
        else:
 | 
			
		||||
            return render(self.request,
 | 
			
		||||
                          'datacenterlight/index.html',
 | 
			
		||||
                          self.get_context_data(contact_form=form))
 | 
			
		||||
            return render(
 | 
			
		||||
                self.request, 'datacenterlight/index.html',
 | 
			
		||||
                self.get_context_data(contact_form=form)
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
    def form_valid(self, form):
 | 
			
		||||
        form.save()
 | 
			
		||||
| 
						 | 
				
			
			@ -68,10 +68,10 @@ class ContactUsView(FormView):
 | 
			
		|||
            return self.render_to_response(
 | 
			
		||||
                self.get_context_data(success=True, contact_form=form))
 | 
			
		||||
        else:
 | 
			
		||||
            return render(self.request,
 | 
			
		||||
                          'datacenterlight/index.html',
 | 
			
		||||
                          self.get_context_data(success=True,
 | 
			
		||||
                                                contact_form=form))
 | 
			
		||||
            return render(
 | 
			
		||||
                self.request, 'datacenterlight/index.html',
 | 
			
		||||
                self.get_context_data(success=True, contact_form=form)
 | 
			
		||||
            )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class IndexView(CreateView):
 | 
			
		||||
| 
						 | 
				
			
			@ -219,7 +219,8 @@ class PaymentOrderView(FormView):
 | 
			
		|||
            'stripe_key': settings.STRIPE_API_PUBLIC_KEY,
 | 
			
		||||
            'site_url': reverse('datacenterlight:index'),
 | 
			
		||||
            'login_form': HostingUserLoginForm(prefix='login_form'),
 | 
			
		||||
            'billing_address_form': billing_address_form
 | 
			
		||||
            'billing_address_form': billing_address_form,
 | 
			
		||||
            'cms_integration': CMSIntegration.objects.get(name='default')
 | 
			
		||||
        })
 | 
			
		||||
        return context
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -354,7 +355,10 @@ class OrderConfirmationView(DetailView):
 | 
			
		|||
            'cc_brand': card_details.get('response_object').get('brand'),
 | 
			
		||||
            'vm': request.session.get('specs'),
 | 
			
		||||
            'page_header_text': _('Confirm Order'),
 | 
			
		||||
            'billing_address_data': request.session.get('billing_address_data')
 | 
			
		||||
            'billing_address_data': (
 | 
			
		||||
                request.session.get('billing_address_data')
 | 
			
		||||
            ),
 | 
			
		||||
            'cms_integration': CMSIntegration.objects.get(name='default')
 | 
			
		||||
        }
 | 
			
		||||
        return render(request, self.template_name, context)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue