Merge pull request #85 from levivm/develop
As an admin I can change the VM ip using admin panel ,Fixed notificat…
This commit is contained in:
		
				commit
				
					
						b76c015cec
					
				
			
		
					 18 changed files with 165 additions and 18 deletions
				
			
		
							
								
								
									
										21
									
								
								hosting/migrations/0022_virtualmachineplan_ip.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								hosting/migrations/0022_virtualmachineplan_ip.py
									
										
									
									
									
										Normal 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,
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
							
								
								
									
										21
									
								
								hosting/migrations/0023_virtualmachineplan_configutarion.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								hosting/migrations/0023_virtualmachineplan_configutarion.py
									
										
									
									
									
										Normal 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,
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
							
								
								
									
										20
									
								
								hosting/migrations/0024_auto_20160607_0231.py
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										20
									
								
								hosting/migrations/0024_auto_20160607_0231.py
									
										
									
									
									
										Normal 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',
 | 
			
		||||
        ),
 | 
			
		||||
    ]
 | 
			
		||||
| 
						 | 
				
			
			@ -10,7 +10,9 @@ class ProcessVMSelectionMixin(object):
 | 
			
		|||
            'memory': request.POST.get('memory'),
 | 
			
		||||
            'disk_size': request.POST.get('disk_space'),
 | 
			
		||||
            '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')
 | 
			
		||||
        }
 | 
			
		||||
        request.session['vm_specs'] = vm_specs
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -35,6 +35,7 @@ class VirtualMachineType(models.Model):
 | 
			
		|||
        (DE_LOCATION, 'Germany'),
 | 
			
		||||
        (CH_LOCATION, 'Switzerland'),
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    description = models.TextField()
 | 
			
		||||
    base_price = models.FloatField()
 | 
			
		||||
    memory_price = models.FloatField()
 | 
			
		||||
| 
						 | 
				
			
			@ -93,13 +94,25 @@ class VirtualMachinePlan(models.Model):
 | 
			
		|||
        (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()
 | 
			
		||||
    memory = models.IntegerField()
 | 
			
		||||
    disk_size = models.IntegerField()
 | 
			
		||||
    vm_type = models.ForeignKey(VirtualMachineType)
 | 
			
		||||
    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)
 | 
			
		||||
    ip = models.CharField(max_length=50, blank=True)
 | 
			
		||||
    configuration = models.CharField(max_length=20, choices=VM_CONFIGURATION)
 | 
			
		||||
 | 
			
		||||
    objects = VMPlansManager()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,3 +40,7 @@
 | 
			
		|||
  border-radius: 0 4px 4px 0;
 | 
			
		||||
  margin-right: 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
.virtual-machine-container .right-place{
 | 
			
		||||
  margin-top: 15px;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -29,7 +29,7 @@ $( document ).ready(function() {
 | 
			
		|||
 | 
			
		||||
	$('[data-toggle="tooltip"]').tooltip();
 | 
			
		||||
 | 
			
		||||
	var clipboard = new Clipboard('#copy_to_clipboard');
 | 
			
		||||
	var clipboard = new Clipboard('.to_copy');
 | 
			
		||||
 | 
			
		||||
    clipboard.on('success', function(e) {
 | 
			
		||||
        var selector = "#";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										16
									
								
								hosting/static/hosting/js/initial.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								hosting/static/hosting/js/initial.js
									
										
									
									
									
										Normal 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);
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			@ -53,7 +53,7 @@
 | 
			
		|||
                    <span class="icon-bar"></span>
 | 
			
		||||
                    <span class="icon-bar"></span>
 | 
			
		||||
                </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>
 | 
			
		||||
            <!-- Collect the nav links, forms, and other content for toggling -->
 | 
			
		||||
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
 | 
			
		||||
| 
						 | 
				
			
			@ -161,6 +161,9 @@
 | 
			
		|||
    <!-- Bootstrap Core JavaScript -->
 | 
			
		||||
    <script src="{% static 'hosting/js/bootstrap.min.js' %}"></script>
 | 
			
		||||
 | 
			
		||||
    <!-- Init JavaScript -->
 | 
			
		||||
    <script src="{% static 'hosting/js/initial.js' %}"></script>
 | 
			
		||||
 | 
			
		||||
    <!-- Stripe Lib -->
 | 
			
		||||
    <script type="text/javascript" src="//js.stripe.com/v2/"></script>
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -11,7 +11,7 @@
 | 
			
		|||
                <span class="icon-bar"></span>
 | 
			
		||||
                <span class="icon-bar"></span>
 | 
			
		||||
            </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>
 | 
			
		||||
        <!-- Collect the nav links, forms, and other content for toggling -->
 | 
			
		||||
        <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -23,7 +23,9 @@
 | 
			
		|||
              <form class="form-inline" method="POST" action="{{request.path}}">
 | 
			
		||||
                {% csrf_token %}
 | 
			
		||||
                <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' %}">
 | 
			
		||||
| 
						 | 
				
			
			@ -43,6 +45,15 @@
 | 
			
		|||
                      </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                  </li>
 | 
			
		||||
                  <li>
 | 
			
		||||
                    <!-- Single button -->
 | 
			
		||||
                    <div class="btn-group">
 | 
			
		||||
                      <div class="form-group">
 | 
			
		||||
                        <label for="cores">Configuration: </label>
 | 
			
		||||
                        {{configuration_detail}}
 | 
			
		||||
                      </div>
 | 
			
		||||
                    </div>
 | 
			
		||||
                  </li>
 | 
			
		||||
                  <li>
 | 
			
		||||
                    <!-- Single button -->
 | 
			
		||||
                    <div class="btn-group">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -13,7 +13,12 @@
 | 
			
		|||
				          <ul class="nav nav-tabs tabs-left sideways">
 | 
			
		||||
				            <li  class="active">
 | 
			
		||||
				            	<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>
 | 
			
		||||
				            </li>
 | 
			
		||||
				            <li>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -50,6 +50,8 @@
 | 
			
		|||
            <div class="content">
 | 
			
		||||
                <p><b>Type</b> <span class="pull-right">{{order.vm_plan.hosting_company_name}}</span></p>
 | 
			
		||||
                <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>
 | 
			
		||||
                <hr>
 | 
			
		||||
                <p><b>Memory</b> <span class="pull-right">{{order.vm_plan.memory}} GiB</span></p>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -86,10 +86,12 @@
 | 
			
		|||
							<h3><b>Billing Amount</b></h3>
 | 
			
		||||
							<hr>
 | 
			
		||||
							<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>
 | 
			
		||||
								<p><b>Cores</b> <span class="pull-right">{{request.session.vm_specs.cores}}</span></p>
 | 
			
		||||
								<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>
 | 
			
		||||
								<hr>
 | 
			
		||||
								<p><b>Disk space</b> <span class="pull-right">{{request.session.vm_specs.disk_size}} GiB</span></p>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,9 +42,27 @@
 | 
			
		|||
				          <div class="tab-content">
 | 
			
		||||
				            <div class="tab-pane active" id="settings-v">
 | 
			
		||||
				            	<div class="row">
 | 
			
		||||
									<div class="col-md-12">
 | 
			
		||||
									<div class="col-md-12 inline-headers">
 | 
			
		||||
									<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>
 | 
			
		||||
 | 
			
		||||
									</div>
 | 
			
		||||
				            	</div>
 | 
			
		||||
								<div class="row">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,6 @@ from .views import DjangoHostingView, RailsHostingView, PaymentVMView,\
 | 
			
		|||
    MarkAsReadNotificationView
 | 
			
		||||
 | 
			
		||||
urlpatterns = [
 | 
			
		||||
    # url(r'pricing/?$', VMPricingView.as_view(), name='pricing'),
 | 
			
		||||
    url(r'index/?$', IndexView.as_view(), name='index'),
 | 
			
		||||
    url(r'django/?$', DjangoHostingView.as_view(), name='djangohosting'),
 | 
			
		||||
    url(r'nodejs/?$', NodeJSHostingView.as_view(), name='nodejshosting'),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,9 +27,12 @@ class DjangoHostingView(ProcessVMSelectionMixin, View):
 | 
			
		|||
    template_name = "hosting/django.html"
 | 
			
		||||
 | 
			
		||||
    def get_context_data(self, **kwargs):
 | 
			
		||||
        HOSTING = 'django'
 | 
			
		||||
        configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
 | 
			
		||||
        context = {
 | 
			
		||||
            'hosting': "django",
 | 
			
		||||
            'hosting': HOSTING,
 | 
			
		||||
            'hosting_long': "Django",
 | 
			
		||||
            'configuration_detail': configuration_detail,
 | 
			
		||||
            'domain': "django-hosting.ch",
 | 
			
		||||
            'google_analytics': "UA-62285904-6",
 | 
			
		||||
            'email': "info@django-hosting.ch",
 | 
			
		||||
| 
						 | 
				
			
			@ -49,8 +52,11 @@ class RailsHostingView(ProcessVMSelectionMixin, View):
 | 
			
		|||
    template_name = "hosting/rails.html"
 | 
			
		||||
 | 
			
		||||
    def get_context_data(self, **kwargs):
 | 
			
		||||
        HOSTING = 'rails'
 | 
			
		||||
        configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
 | 
			
		||||
        context = {
 | 
			
		||||
            'hosting': "rails",
 | 
			
		||||
            'hosting': HOSTING,
 | 
			
		||||
            'configuration_detail': configuration_detail,
 | 
			
		||||
            'hosting_long': "Ruby On Rails",
 | 
			
		||||
            'domain': "rails-hosting.ch",
 | 
			
		||||
            'google_analytics': "UA-62285904-5",
 | 
			
		||||
| 
						 | 
				
			
			@ -69,9 +75,12 @@ class NodeJSHostingView(ProcessVMSelectionMixin, View):
 | 
			
		|||
    template_name = "hosting/nodejs.html"
 | 
			
		||||
 | 
			
		||||
    def get_context_data(self, **kwargs):
 | 
			
		||||
        HOSTING = 'nodejs'
 | 
			
		||||
        configuration_detail = dict(VirtualMachinePlan.VM_CONFIGURATION).get(HOSTING)
 | 
			
		||||
        context = {
 | 
			
		||||
            'hosting': "nodejs",
 | 
			
		||||
            'hosting_long': "NodeJS",
 | 
			
		||||
            'configuration_detail': configuration_detail,
 | 
			
		||||
            'domain': "node-hosting.ch",
 | 
			
		||||
            'google_analytics': "UA-62285904-7",
 | 
			
		||||
            'email': "info@node-hosting.ch",
 | 
			
		||||
| 
						 | 
				
			
			@ -230,6 +239,7 @@ class PaymentVMView(LoginRequiredMixin, FormView):
 | 
			
		|||
                'cores': specifications.get('cores'),
 | 
			
		||||
                'memory': specifications.get('memory'),
 | 
			
		||||
                'disk_size': specifications.get('disk_size'),
 | 
			
		||||
                'configuration': specifications.get('configuration'),
 | 
			
		||||
                'price': final_price
 | 
			
		||||
            }
 | 
			
		||||
            token = form.cleaned_data.get('token')
 | 
			
		||||
| 
						 | 
				
			
			@ -289,11 +299,11 @@ class PaymentVMView(LoginRequiredMixin, FormView):
 | 
			
		|||
            email = BaseEmail(**email_data)
 | 
			
		||||
            email.send()
 | 
			
		||||
 | 
			
		||||
            request.session.update({
 | 
			
		||||
                'charge': charge,
 | 
			
		||||
                'order': order.id,
 | 
			
		||||
                'billing_address': billing_address.id
 | 
			
		||||
            })
 | 
			
		||||
            # request.session.update({
 | 
			
		||||
            #     'charge': charge,
 | 
			
		||||
            #     'order': order.id,
 | 
			
		||||
            #     'billing_address': billing_address.id
 | 
			
		||||
            # })
 | 
			
		||||
            return HttpResponseRedirect(reverse('hosting:orders', kwargs={'pk': order.id}))
 | 
			
		||||
        else:
 | 
			
		||||
            return self.form_invalid(form)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -4,6 +4,6 @@ from django.utils.translation import ugettext_lazy as _
 | 
			
		|||
 | 
			
		||||
urlpatterns = [
 | 
			
		||||
    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'),
 | 
			
		||||
]
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue