As an admin I can change the VM ip using admin panel ,Fixed notification view count label, Fixed hosting company name on payment view, Added configuration in VM hosting page, Admin can changes the VM configuration using admin panel

This commit is contained in:
Levi 2016-06-07 00:29:22 -05:00
parent a6eba4f536
commit 82ca7da20a
18 changed files with 165 additions and 18 deletions

View file

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2016-06-07 00:52
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('hosting', '0021_auto_20160526_0445'),
]
operations = [
migrations.AddField(
model_name='virtualmachineplan',
name='ip',
field=models.CharField(default='127.0.0.1', max_length=50),
preserve_default=False,
),
]

View file

@ -0,0 +1,21 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2016-06-07 02:13
from __future__ import unicode_literals
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('hosting', '0022_virtualmachineplan_ip'),
]
operations = [
migrations.AddField(
model_name='virtualmachineplan',
name='configutarion',
field=models.CharField(choices=[('django', 'Ubuntu 14.04, Django'), ('rails', 'Ubuntu 14.04, Rails'), ('nodejs', 'Debian, NodeJS')], default='django', max_length=20),
preserve_default=False,
),
]

View file

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Generated by Django 1.9.4 on 2016-06-07 02:31
from __future__ import unicode_literals
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('hosting', '0023_virtualmachineplan_configutarion'),
]
operations = [
migrations.RenameField(
model_name='virtualmachineplan',
old_name='configutarion',
new_name='configuration',
),
]

View file

@ -10,7 +10,9 @@ class ProcessVMSelectionMixin(object):
'memory': request.POST.get('memory'), 'memory': request.POST.get('memory'),
'disk_size': request.POST.get('disk_space'), 'disk_size': request.POST.get('disk_space'),
'hosting_company': request.POST.get('hosting_company'), 'hosting_company': request.POST.get('hosting_company'),
'hosting_company_name': request.POST.get('hosting_company_name'), 'location_code': request.POST.get('location_code'),
'configuration': request.POST.get('configuration'),
'configuration_detail': request.POST.get('configuration_detail'),
'final_price': request.POST.get('final_price') 'final_price': request.POST.get('final_price')
} }
request.session['vm_specs'] = vm_specs request.session['vm_specs'] = vm_specs

View file

@ -35,6 +35,7 @@ class VirtualMachineType(models.Model):
(DE_LOCATION, 'Germany'), (DE_LOCATION, 'Germany'),
(CH_LOCATION, 'Switzerland'), (CH_LOCATION, 'Switzerland'),
) )
description = models.TextField() description = models.TextField()
base_price = models.FloatField() base_price = models.FloatField()
memory_price = models.FloatField() memory_price = models.FloatField()
@ -93,13 +94,25 @@ class VirtualMachinePlan(models.Model):
(CANCELED_STATUS, 'Canceled') (CANCELED_STATUS, 'Canceled')
) )
DJANGO = 'django'
RAILS = 'rails'
NODEJS = 'nodejs'
VM_CONFIGURATION = (
(DJANGO, 'Ubuntu 14.04, Django'),
(RAILS, 'Ubuntu 14.04, Rails'),
(NODEJS, 'Debian, NodeJS'),
)
cores = models.IntegerField() cores = models.IntegerField()
memory = models.IntegerField() memory = models.IntegerField()
disk_size = models.IntegerField() disk_size = models.IntegerField()
vm_type = models.ForeignKey(VirtualMachineType) vm_type = models.ForeignKey(VirtualMachineType)
price = models.FloatField() price = models.FloatField()
public_key = models.TextField() public_key = models.TextField(blank=True)
status = models.CharField(max_length=20, choices=VM_STATUS_CHOICES, default=PENDING_STATUS) status = models.CharField(max_length=20, choices=VM_STATUS_CHOICES, default=PENDING_STATUS)
ip = models.CharField(max_length=50, blank=True)
configuration = models.CharField(max_length=20, choices=VM_CONFIGURATION)
objects = VMPlansManager() objects = VMPlansManager()

View file

@ -40,3 +40,7 @@
border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0;
margin-right: 0; margin-right: 0;
} }
.virtual-machine-container .right-place{
margin-top: 15px;
}

View file

@ -29,7 +29,7 @@ $( document ).ready(function() {
$('[data-toggle="tooltip"]').tooltip(); $('[data-toggle="tooltip"]').tooltip();
var clipboard = new Clipboard('#copy_to_clipboard'); var clipboard = new Clipboard('.to_copy');
clipboard.on('success', function(e) { clipboard.on('success', function(e) {
var selector = "#"; var selector = "#";

View file

@ -0,0 +1,16 @@
$( document ).ready(function() {
$('[data-toggle="tooltip"]').tooltip();
var clipboard = new Clipboard('.to_copy');
clipboard.on('success', function(e) {
var selector = "#";
var copy_button_id = selector.concat(e.trigger.id);
setTimeout(function(){
$(copy_button_id).tooltip('hide');
}, 1000);
});
});

View file

@ -53,7 +53,7 @@
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> </button>
<a class="navbar-brand topnav" href="#"><img src="{% static 'hosting/img/logo_black.svg' %}"></a> <a class="navbar-brand topnav" href="{% url 'ungleich_page:landing' %}"><img src="{% static 'hosting/img/logo_black.svg' %}"></a>
</div> </div>
<!-- Collect the nav links, forms, and other content for toggling --> <!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
@ -161,6 +161,9 @@
<!-- Bootstrap Core JavaScript --> <!-- Bootstrap Core JavaScript -->
<script src="{% static 'hosting/js/bootstrap.min.js' %}"></script> <script src="{% static 'hosting/js/bootstrap.min.js' %}"></script>
<!-- Init JavaScript -->
<script src="{% static 'hosting/js/initial.js' %}"></script>
<!-- Stripe Lib --> <!-- Stripe Lib -->
<script type="text/javascript" src="//js.stripe.com/v2/"></script> <script type="text/javascript" src="//js.stripe.com/v2/"></script>

View file

@ -11,7 +11,7 @@
<span class="icon-bar"></span> <span class="icon-bar"></span>
<span class="icon-bar"></span> <span class="icon-bar"></span>
</button> </button>
<a class="navbar-brand topnav" href="#"><img src="{% static 'hosting/img/logo_black.svg' %}"></a> <a class="navbar-brand topnav" href="{% url 'ungleich_page:landing' %}"><img src="{% static 'hosting/img/logo_black.svg' %}"></a>
</div> </div>
<!-- Collect the nav links, forms, and other content for toggling --> <!-- Collect the nav links, forms, and other content for toggling -->
<div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">

View file

@ -23,7 +23,9 @@
<form class="form-inline" method="POST" action="{{request.path}}"> <form class="form-inline" method="POST" action="{{request.path}}">
{% csrf_token %} {% csrf_token %}
<input type="hidden" name="hosting_company" value="{{vm.hosting_company}}"> <input type="hidden" name="hosting_company" value="{{vm.hosting_company}}">
<input type="hidden" name="hosting_company_name" value="{{vm.hosting_company_name}}"> <input type="hidden" name="location_code" value="{{vm.location_code}}">
<input type="hidden" name="configuration_detail" value="{{configuration_detail}}">
<input type="hidden" name="configuration" value="{{hosting}}">
<ul class="pricing {% cycle 'p-red' 'p-black' 'p-red' 'p-yel' %}"> <ul class="pricing {% cycle 'p-red' 'p-black' 'p-red' 'p-yel' %}">
@ -43,6 +45,15 @@
</div> </div>
</div> </div>
</li> </li>
<li>
<!-- Single button -->
<div class="btn-group">
<div class="form-group">
<label for="cores">Configuration: </label>
{{configuration_detail}}
</div>
</div>
</li>
<li> <li>
<!-- Single button --> <!-- Single button -->
<div class="btn-group"> <div class="btn-group">

View file

@ -13,7 +13,12 @@
<ul class="nav nav-tabs tabs-left sideways"> <ul class="nav nav-tabs tabs-left sideways">
<li class="active"> <li class="active">
<a href="#unread-v" data-toggle="tab"> <a href="#unread-v" data-toggle="tab">
Unread <span class="badge">{{unread_notifications|length}}</span> Unread
{% if unread_notifications|length > 0%}
<span class="badge">
{{unread_notifications|length}}
</span>
{% endif %}
</a> </a>
</li> </li>
<li> <li>

View file

@ -50,6 +50,8 @@
<div class="content"> <div class="content">
<p><b>Type</b> <span class="pull-right">{{order.vm_plan.hosting_company_name}}</span></p> <p><b>Type</b> <span class="pull-right">{{order.vm_plan.hosting_company_name}}</span></p>
<hr> <hr>
<p><b>Configuration</b> <span class="pull-right">{{order.vm_plan.get_configuration_display}}</span></p>
<hr>
<p><b>Cores</b> <span class="pull-right">{{order.vm_plan.cores}}</span></p> <p><b>Cores</b> <span class="pull-right">{{order.vm_plan.cores}}</span></p>
<hr> <hr>
<p><b>Memory</b> <span class="pull-right">{{order.vm_plan.memory}} GiB</span></p> <p><b>Memory</b> <span class="pull-right">{{order.vm_plan.memory}} GiB</span></p>

View file

@ -86,10 +86,12 @@
<h3><b>Billing Amount</b></h3> <h3><b>Billing Amount</b></h3>
<hr> <hr>
<div class="content"> <div class="content">
<p><b>Type</b> <span class="pull-right">{{request.session.vm_specs.hosting_company_name}}</span></p> <p><b>Type</b> <span class="pull-right">{{request.session.vm_specs.location_code}}</span></p>
<hr> <hr>
<p><b>Cores</b> <span class="pull-right">{{request.session.vm_specs.cores}}</span></p> <p><b>Cores</b> <span class="pull-right">{{request.session.vm_specs.cores}}</span></p>
<hr> <hr>
<p><b>Configuration</b> <span class="pull-right">{{request.session.vm_specs.configuration_detail}}</span></p>
<hr>
<p><b>Memory</b> <span class="pull-right">{{request.session.vm_specs.memory}} GiB</span></p> <p><b>Memory</b> <span class="pull-right">{{request.session.vm_specs.memory}} GiB</span></p>
<hr> <hr>
<p><b>Disk space</b> <span class="pull-right">{{request.session.vm_specs.disk_size}} GiB</span></p> <p><b>Disk space</b> <span class="pull-right">{{request.session.vm_specs.disk_size}} GiB</span></p>

View file

@ -42,9 +42,27 @@
<div class="tab-content"> <div class="tab-content">
<div class="tab-pane active" id="settings-v"> <div class="tab-pane active" id="settings-v">
<div class="row"> <div class="row">
<div class="col-md-12"> <div class="col-md-12 inline-headers">
<h3>{{virtual_machine.hosting_company_name}}</h3> <h3>{{virtual_machine.hosting_company_name}}</h3>
{% if virtual_machine.ip %}
<div class="pull-right right-place">
<button type="link" data-clipboard-text="{{virtual_machine.ip}}" id="copy_vm_id" class="to_copy btn btn-link"
data-toggle="tooltip" data-placement="bottom" title="Copied" data-trigger="click">
Ip: {{virtual_machine.ip}} <i class="fa fa-files-o" aria-hidden="true"></i>
</button>
</div>
{% else %}
<div class="pull-right right-place">
<span class="label label-warning"><strong>Ip not assigned yet</strong></span>
<i data-toggle="tooltip" title="Your ip will be assigned soon" class="fa fa-info-circle" aria-hidden="true"></i>
</div>
{% endif %}
<hr> <hr>
</div> </div>
</div> </div>
<div class="row"> <div class="row">

View file

@ -7,7 +7,6 @@ from .views import DjangoHostingView, RailsHostingView, PaymentVMView,\
MarkAsReadNotificationView MarkAsReadNotificationView
urlpatterns = [ urlpatterns = [
# url(r'pricing/?$', VMPricingView.as_view(), name='pricing'),
url(r'index/?$', IndexView.as_view(), name='index'), url(r'index/?$', IndexView.as_view(), name='index'),
url(r'django/?$', DjangoHostingView.as_view(), name='djangohosting'), url(r'django/?$', DjangoHostingView.as_view(), name='djangohosting'),
url(r'nodejs/?$', NodeJSHostingView.as_view(), name='nodejshosting'), url(r'nodejs/?$', NodeJSHostingView.as_view(), name='nodejshosting'),

View file

@ -27,9 +27,12 @@ class DjangoHostingView(ProcessVMSelectionMixin, View):
template_name = "hosting/django.html" template_name = "hosting/django.html"
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
HOSTING = 'django'
configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
context = { context = {
'hosting': "django", 'hosting': HOSTING,
'hosting_long': "Django", 'hosting_long': "Django",
'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",
@ -49,8 +52,11 @@ class RailsHostingView(ProcessVMSelectionMixin, View):
template_name = "hosting/rails.html" template_name = "hosting/rails.html"
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
HOSTING = 'rails'
configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
context = { context = {
'hosting': "rails", 'hosting': HOSTING,
'configuration_detail': configuration_detail,
'hosting_long': "Ruby On Rails", 'hosting_long': "Ruby On Rails",
'domain': "rails-hosting.ch", 'domain': "rails-hosting.ch",
'google_analytics': "UA-62285904-5", 'google_analytics': "UA-62285904-5",
@ -69,9 +75,12 @@ class NodeJSHostingView(ProcessVMSelectionMixin, View):
template_name = "hosting/nodejs.html" template_name = "hosting/nodejs.html"
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
HOSTING = 'nodejs'
configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
context = { context = {
'hosting': "nodejs", 'hosting': "nodejs",
'hosting_long': "NodeJS", 'hosting_long': "NodeJS",
'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",
@ -230,6 +239,7 @@ class PaymentVMView(LoginRequiredMixin, FormView):
'cores': specifications.get('cores'), 'cores': specifications.get('cores'),
'memory': specifications.get('memory'), 'memory': specifications.get('memory'),
'disk_size': specifications.get('disk_size'), 'disk_size': specifications.get('disk_size'),
'configuration': specifications.get('configuration'),
'price': final_price 'price': final_price
} }
token = form.cleaned_data.get('token') token = form.cleaned_data.get('token')
@ -289,11 +299,11 @@ class PaymentVMView(LoginRequiredMixin, FormView):
email = BaseEmail(**email_data) email = BaseEmail(**email_data)
email.send() email.send()
request.session.update({ # request.session.update({
'charge': charge, # 'charge': charge,
'order': order.id, # 'order': order.id,
'billing_address': billing_address.id # 'billing_address': billing_address.id
}) # })
return HttpResponseRedirect(reverse('hosting:orders', kwargs={'pk': order.id})) return HttpResponseRedirect(reverse('hosting:orders', kwargs={'pk': order.id}))
else: else:
return self.form_invalid(form) return self.form_invalid(form)

View file

@ -4,6 +4,6 @@ from django.utils.translation import ugettext_lazy as _
urlpatterns = [ urlpatterns = [
url(r'^$', LandingView.as_view(), name='landing'), url(r'^$', LandingView.as_view(), name='landing'),
url(r'^ungleich_page/?$', LandingView.as_view(), name='landing'), # url(r'^ungleich_page/?$', LandingView.as_view(), name='landing'),
url(_(r'contact/$'), ContactView.as_view(), name='contact'), url(_(r'contact/$'), ContactView.as_view(), name='contact'),
] ]