Added VM detail page, Added VM setting page, Added VM pricing page,Added VM orders page, Added VM status page
This commit is contained in:
		
					parent
					
						
							
								bbddb48ecc
							
						
					
				
			
			
				commit
				
					
						1486843af0
					
				
			
		
					 9 changed files with 226 additions and 20 deletions
				
			
		|  | @ -90,6 +90,15 @@ class VirtualMachinePlan(models.Model): | ||||||
|     def hosting_company_name(self): |     def hosting_company_name(self): | ||||||
|         return self.vm_type.get_hosting_company_display() |         return self.vm_type.get_hosting_company_display() | ||||||
| 
 | 
 | ||||||
|  |     @cached_property | ||||||
|  |     def name(self): | ||||||
|  |         name = 'vm-%s' % self.id | ||||||
|  |         return name | ||||||
|  | 
 | ||||||
|  |     @cached_property | ||||||
|  |     def orders(self): | ||||||
|  |         return [self.hostingorder] | ||||||
|  | 
 | ||||||
|     @classmethod |     @classmethod | ||||||
|     def create(cls, data, user): |     def create(cls, data, user): | ||||||
|         instance = cls.objects.create(**data) |         instance = cls.objects.create(**data) | ||||||
|  |  | ||||||
|  | @ -13,3 +13,8 @@ | ||||||
|     display: block; |     display: block; | ||||||
|     color: transparent; |     color: transparent; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | .inline-headers h3, .inline-headers h4 { | ||||||
|  |   display: inline-block; | ||||||
|  |   vertical-align: baseline; | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										42
									
								
								hosting/static/hosting/css/virtual-machine.css
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								hosting/static/hosting/css/virtual-machine.css
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,42 @@ | ||||||
|  | .virtual-machine-container .tabs-left, .virtual-machine-container .tabs-right { | ||||||
|  |   border-bottom: none; | ||||||
|  |   padding-top: 2px; | ||||||
|  | } | ||||||
|  | .virtual-machine-container .tabs-left { | ||||||
|  |   border-right: 1px solid #ddd; | ||||||
|  | } | ||||||
|  | .virtual-machine-container .tabs-right { | ||||||
|  |   border-left: 1px solid #ddd; | ||||||
|  | } | ||||||
|  | .virtual-machine-container .tabs-left>li, .virtual-machine-container .tabs-right>li { | ||||||
|  |   float: none; | ||||||
|  |   margin-bottom: 2px; | ||||||
|  | } | ||||||
|  | .virtual-machine-container .tabs-left>li { | ||||||
|  |   margin-right: -1px; | ||||||
|  | } | ||||||
|  | .virtual-machine-container .tabs-right>li { | ||||||
|  |   margin-left: -1px; | ||||||
|  | } | ||||||
|  | .virtual-machine-container .tabs-left>li.active>a, | ||||||
|  | .virtual-machine-container .tabs-left>li.active>a:hover, | ||||||
|  | .virtual-machine-container .tabs-left>li.active>a:focus { | ||||||
|  |   border-bottom-color: #ddd; | ||||||
|  |   border-right-color: transparent; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .virtual-machine-container .tabs-right>li.active>a, | ||||||
|  | .virtual-machine-container .tabs-right>li.active>a:hover, | ||||||
|  | .virtual-machine-container .tabs-right>li.active>a:focus { | ||||||
|  |   border-bottom: 1px solid #ddd; | ||||||
|  |   border-left-color: transparent; | ||||||
|  | } | ||||||
|  | .virtual-machine-container .tabs-left>li>a { | ||||||
|  |   border-radius: 4px 0 0 4px; | ||||||
|  |   margin-right: 0; | ||||||
|  |   display:block; | ||||||
|  | } | ||||||
|  | .virtual-machine-container .tabs-right>li>a { | ||||||
|  |   border-radius: 0 4px 4px 0; | ||||||
|  |   margin-right: 0; | ||||||
|  | } | ||||||
|  | @ -18,9 +18,10 @@ | ||||||
|     <!-- Custom CSS --> |     <!-- Custom CSS --> | ||||||
|     <link href="{% static 'hosting/css/landing-page.css' %}" rel="stylesheet"> |     <link href="{% static 'hosting/css/landing-page.css' %}" rel="stylesheet"> | ||||||
|     <link href="{% static 'hosting/css/payment.css' %}" rel="stylesheet"> |     <link href="{% static 'hosting/css/payment.css' %}" rel="stylesheet"> | ||||||
|     <link href="{% static 'hosting/css/orders.css' %}" rel="stylesheet"> |     <link href="{% static 'hosting/css/order.css' %}" rel="stylesheet"> | ||||||
|     <link href="{% static 'hosting/css/orders.css' %}" rel="stylesheet"> |     <link href="{% static 'hosting/css/orders.css' %}" rel="stylesheet"> | ||||||
|     <link href="{% static 'hosting/css/commons.css' %}" rel="stylesheet"> |     <link href="{% static 'hosting/css/commons.css' %}" rel="stylesheet"> | ||||||
|  |     <link href="{% static 'hosting/css/virtual-machine.css' %}" rel="stylesheet"> | ||||||
| 
 | 
 | ||||||
|     <!-- Custom Fonts --> |     <!-- Custom Fonts --> | ||||||
|     <link href='http://fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'> |     <link href='http://fonts.googleapis.com/css?family=Raleway' rel='stylesheet' type='text/css'> | ||||||
|  |  | ||||||
|  | @ -2,22 +2,6 @@ | ||||||
| {% load staticfiles bootstrap3 %} | {% load staticfiles bootstrap3 %} | ||||||
| {% block content %}  | {% block content %}  | ||||||
| 
 | 
 | ||||||
| <style type="text/css"> |  | ||||||
| 	 |  | ||||||
| .borderless td { |  | ||||||
|     border: none !important; |  | ||||||
| } |  | ||||||
| .borderless thead { |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .borderless tbody:before { |  | ||||||
|     content: "-"; |  | ||||||
|     display: block; |  | ||||||
|     color: transparent; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| </style> |  | ||||||
| 
 |  | ||||||
| <div> | <div> | ||||||
| 	<div class="container orders-container"> | 	<div class="container orders-container"> | ||||||
| 		<div class="row"> | 		<div class="row"> | ||||||
|  |  | ||||||
							
								
								
									
										155
									
								
								hosting/templates/hosting/virtual_machine_detail.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										155
									
								
								hosting/templates/hosting/virtual_machine_detail.html
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,155 @@ | ||||||
|  | {% extends "hosting/base_short.html" %} | ||||||
|  | {% load staticfiles bootstrap3 %} | ||||||
|  | {% block content %}  | ||||||
|  | <div> | ||||||
|  | 	<div class="container virtual-machine-container dashboard-container "> | ||||||
|  | 		<div class="row"> | ||||||
|  | 			<div class="col-md-9 col-md-offset-2"> | ||||||
|  | 				 <div  class="col-sm-12"> | ||||||
|  | 				        <h3><i class="fa fa-cloud" aria-hidden="true"></i> {{virtual_machine.name}}</h3> | ||||||
|  | 				        <hr/> | ||||||
|  | 				        <div class="col-md-3"> <!-- required for floating --> | ||||||
|  | 				          <!-- Nav tabs --> | ||||||
|  | 				          <ul class="nav nav-tabs tabs-left sideways"> | ||||||
|  | 				            <li class="active"> | ||||||
|  | 				            	<a href="#settings-v" data-toggle="tab"> | ||||||
|  | 				            		<i class="fa fa-cogs" aria-hidden="true"></i> | ||||||
|  | 				            		Settings | ||||||
|  | 				            	</a> | ||||||
|  | 				            </li> | ||||||
|  | 				            <li> | ||||||
|  | 				            	<a href="#billing-v" data-toggle="tab"> | ||||||
|  | 				            		<i class="fa fa-money" aria-hidden="true"></i> | ||||||
|  | 				            		Billing | ||||||
|  | 				            	</a> | ||||||
|  | 				            </li> | ||||||
|  | 				            <li> | ||||||
|  | 				            	<a href="#orders-v" data-toggle="tab"> | ||||||
|  | 				            		<i class="fa fa-credit-card"></i>  | ||||||
|  | 				            		Orders | ||||||
|  | 				            	</a> | ||||||
|  | 				            </li> | ||||||
|  | 				            <li> | ||||||
|  | 				            	<a href="#status-v" data-toggle="tab"> | ||||||
|  | 				            		<i class="fa fa-signal" aria-hidden="true"></i> Status | ||||||
|  | 				            	</a> | ||||||
|  | 				            </li> | ||||||
|  | 				          </ul> | ||||||
|  | 				        </div> | ||||||
|  | 
 | ||||||
|  | 				        <div class="col-md-9"> | ||||||
|  | 				          <!-- Tab panes --> | ||||||
|  | 				          <div class="tab-content"> | ||||||
|  | 				            <div class="tab-pane active" id="settings-v"> | ||||||
|  | 				            	<div class="row"> | ||||||
|  | 									<div class="col-md-12"> | ||||||
|  | 									<h3>{{virtual_machine.hosting_company_name}}</h3> | ||||||
|  | 									<hr> | ||||||
|  | 									</div> | ||||||
|  | 				            	</div> | ||||||
|  | 								<div class="row"> | ||||||
|  | 								  <div class="col-md-12"> | ||||||
|  | 								    <div class="row"> | ||||||
|  | 								      <div class="col-md-3"> | ||||||
|  | 								        <div class="well text-center"> | ||||||
|  | 								        	<i class="fa fa-cubes" aria-hidden="true"></i> Cores <br/> | ||||||
|  | 								        	<span class="label label-success">{{virtual_machine.cores}}</span> | ||||||
|  | 								        </div> | ||||||
|  | 								      </div> | ||||||
|  | 								      <div class="col-md-3"> | ||||||
|  | 								        <div class="well text-center"> | ||||||
|  | 								        	<i class="fa fa-tachometer" aria-hidden="true"></i> Memory <br/> | ||||||
|  | 								        	<span class="label label-success">{{virtual_machine.memory}} GiB</span> | ||||||
|  | 								        </div> | ||||||
|  | 								      </div> | ||||||
|  | 								      <div class="col-md-3"> | ||||||
|  | 								        <div class="well text-center"> | ||||||
|  | 								        	<i class="fa fa-hdd-o" aria-hidden="true"></i> Disk <br/> | ||||||
|  | 								        	<span class="label label-success">{{virtual_machine.disk_size}} GiB</span> | ||||||
|  | 								        </div> | ||||||
|  | 								      </div> | ||||||
|  | 								    </div><!--/row-->     | ||||||
|  | 								  </div><!--/col-12--> | ||||||
|  | 								</div><!--/row--> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 				            </div> | ||||||
|  | 				            <div class="tab-pane" id="billing-v"> | ||||||
|  | 
 | ||||||
|  | 				            	<div class="row "> | ||||||
|  | 									<div class="col-md-12 inline-headers"> | ||||||
|  | 										<h3>Current pricing</h3> | ||||||
|  | 										<span class="h3 pull-right"><strong>{{virtual_machine.price|floatformat}} CHF</strong>/mo</span>  | ||||||
|  | 										<hr> | ||||||
|  | 									</div> | ||||||
|  | 				            	</div> | ||||||
|  | 				            </div> | ||||||
|  | 				            <div class="tab-pane" id="orders-v"> | ||||||
|  | 								<div class="row"> | ||||||
|  | 								  <div class="col-md-12"> | ||||||
|  | 									<table class="table borderless table-hover">  | ||||||
|  | 										<h3>Orders</h3>  | ||||||
|  | 										<br/> | ||||||
|  | 										<thead>  | ||||||
|  | 										<tr>  | ||||||
|  | 											<th>#</th> | ||||||
|  | 											<th>Date</th> | ||||||
|  | 											<th>Amount</th> | ||||||
|  | 											<th>Status</th> | ||||||
|  | 											<th></th> | ||||||
|  | 										</tr>  | ||||||
|  | 										</thead>  | ||||||
|  | 										<tbody>  | ||||||
|  | 											{% for order in virtual_machine.orders %} | ||||||
|  | 											<tr>  | ||||||
|  | 												<td scope="row">{{order.id}}</td>  | ||||||
|  | 												<td>{{order.created_at}}</td>  | ||||||
|  | 												<td>{{order.VMPlan.price}} CHF</td>  | ||||||
|  | 												<td>{% if order.approved %} | ||||||
|  | 														<span class="text-success strong">Approved</span> | ||||||
|  | 													{% else%}  | ||||||
|  | 														<span class="text-danger strong">Declined</span> | ||||||
|  | 													{% endif%} | ||||||
|  | 												</td>  | ||||||
|  | 												<td> | ||||||
|  | 													<button type="button" class="btn btn-default"><a href="{% url 'hosting:orders' order.id %}">View Detail</a></button> | ||||||
|  | 												</td> | ||||||
|  | 											</tr> | ||||||
|  | 											{% endfor %} | ||||||
|  | 										</tbody>  | ||||||
|  | 									</table> | ||||||
|  | 								  </div><!--/col-12--> | ||||||
|  | 								</div><!--/row--> | ||||||
|  | 				            </div> | ||||||
|  | 				            <div class="tab-pane" id="status-v"> | ||||||
|  | 
 | ||||||
|  | 				            	<div class="row "> | ||||||
|  | 									<div class="col-md-12 inline-headers"> | ||||||
|  | 										<h3>Current status</h3> | ||||||
|  | 										<span class="h3 pull-right label label-success"><strong>Online</strong></span>  | ||||||
|  | 										<hr> | ||||||
|  | 									</div> | ||||||
|  | 				            	</div> | ||||||
|  | 				            </div> | ||||||
|  | 				          </div> | ||||||
|  | 				        </div> | ||||||
|  | 
 | ||||||
|  | 				        <div class="clearfix"></div> | ||||||
|  | 				</div> | ||||||
|  | 			</div> | ||||||
|  | 
 | ||||||
|  | 	    </div> | ||||||
|  | 	</div> | ||||||
|  | 
 | ||||||
|  | </div> | ||||||
|  | 
 | ||||||
|  | {%endblock%} | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | @ -19,11 +19,11 @@ | ||||||
| 				<tbody>  | 				<tbody>  | ||||||
| 					{% for vm in vms %} | 					{% for vm in vms %} | ||||||
| 					<tr>  | 					<tr>  | ||||||
| 						<td scope="row">{{vm.id}}</td>  | 						<td scope="row">{{vm.name}}</td>  | ||||||
| 						<td>{{vm.hosting_company_name}}</td>  | 						<td>{{vm.hosting_company_name}}</td>  | ||||||
| 						<td>{{vm.price}} CHF</td>  | 						<td>{{vm.price}} CHF</td>  | ||||||
| 						<td> | 						<td> | ||||||
| 							<button type="button" class="btn btn-default"><a href="">View Detail</a></button> | 							<button type="button" class="btn btn-default"><a href="{% url 'hosting:virtual_machines' vm.id %}">View Detail</a></button> | ||||||
| 						</td> | 						</td> | ||||||
| 					</tr> | 					</tr> | ||||||
| 					{% endfor %} | 					{% endfor %} | ||||||
|  |  | ||||||
|  | @ -2,7 +2,8 @@ from django.conf.urls import url | ||||||
| 
 | 
 | ||||||
| from .views import DjangoHostingView, RailsHostingView, PaymentVMView, \ | from .views import DjangoHostingView, RailsHostingView, PaymentVMView, \ | ||||||
|     NodeJSHostingView, LoginView, SignupView, IndexView, \ |     NodeJSHostingView, LoginView, SignupView, IndexView, \ | ||||||
|     OrdersHostingListView, OrdersHostingDetailView, VirtualMachinesPlanListView |     OrdersHostingListView, OrdersHostingDetailView, VirtualMachinesPlanListView,\ | ||||||
|  |     VirtualMachineDetailListView | ||||||
| 
 | 
 | ||||||
| urlpatterns = [ | urlpatterns = [ | ||||||
|     url(r'index/?$', IndexView.as_view(), name='index'), |     url(r'index/?$', IndexView.as_view(), name='index'), | ||||||
|  | @ -13,6 +14,8 @@ urlpatterns = [ | ||||||
|     url(r'orders/?$', OrdersHostingListView.as_view(), name='orders'), |     url(r'orders/?$', OrdersHostingListView.as_view(), name='orders'), | ||||||
|     url(r'orders/(?P<pk>\d+)/?$', OrdersHostingDetailView.as_view(), name='orders'), |     url(r'orders/(?P<pk>\d+)/?$', OrdersHostingDetailView.as_view(), name='orders'), | ||||||
|     url(r'my-virtual-machines/?$', VirtualMachinesPlanListView.as_view(), name='virtual_machines'), |     url(r'my-virtual-machines/?$', VirtualMachinesPlanListView.as_view(), name='virtual_machines'), | ||||||
|  |     url(r'my-virtual-machines/(?P<pk>\d+)/?$', VirtualMachineDetailListView.as_view(), | ||||||
|  |         name='virtual_machines'), | ||||||
|     url(r'login/?$', LoginView.as_view(), name='login'), |     url(r'login/?$', LoginView.as_view(), name='login'), | ||||||
|     url(r'signup/?$', SignupView.as_view(), name='signup'), |     url(r'signup/?$', SignupView.as_view(), name='signup'), | ||||||
|     url(r'^logout/?$', 'django.contrib.auth.views.logout', |     url(r'^logout/?$', 'django.contrib.auth.views.logout', | ||||||
|  |  | ||||||
|  | @ -247,3 +247,10 @@ class VirtualMachinesPlanListView(LoginRequiredMixin, ListView): | ||||||
|         user = self.request.user |         user = self.request.user | ||||||
|         self.queryset = VirtualMachinePlan.objects.active(user) |         self.queryset = VirtualMachinePlan.objects.active(user) | ||||||
|         return super(VirtualMachinesPlanListView, self).get_queryset() |         return super(VirtualMachinesPlanListView, self).get_queryset() | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | class VirtualMachineDetailListView(LoginRequiredMixin, DetailView): | ||||||
|  |     template_name = "hosting/virtual_machine_detail.html" | ||||||
|  |     login_url = reverse_lazy('hosting:login') | ||||||
|  |     model = VirtualMachinePlan | ||||||
|  |     context_object_name = "virtual_machine" | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue