As an user I want to be able to cancel my VM Plan subscription. As an user I want to be able to receive an email each time that my VM status changes.
This commit is contained in:
		
					parent
					
						
							
								1d83d4de79
							
						
					
				
			
			
				commit
				
					
						fd83ad4ffc
					
				
			
		
					 13 changed files with 380 additions and 41 deletions
				
			
		|  | @ -73,7 +73,7 @@ class VirtualMachinePlanAdmin(admin.ModelAdmin): | ||||||
| 
 | 
 | ||||||
|     def save_model(self, request, obj, form, change): |     def save_model(self, request, obj, form, change): | ||||||
|         email = self.email(obj) |         email = self.email(obj) | ||||||
|         if 'status' in form.changed_data and obj.status == VirtualMachinePlan.ONLINE_STATUS: |         if 'status' in form.changed_data: | ||||||
|             context = { |             context = { | ||||||
|                 'vm': obj |                 'vm': obj | ||||||
|             } |             } | ||||||
|  | @ -81,7 +81,7 @@ class VirtualMachinePlanAdmin(admin.ModelAdmin): | ||||||
|                 'subject': 'Your VM has been activated', |                 'subject': 'Your VM has been activated', | ||||||
|                 'to': email, |                 'to': email, | ||||||
|                 'context': context, |                 'context': context, | ||||||
|                 'template_name': 'vm_activated', |                 'template_name': 'vm_status_changed', | ||||||
|                 'template_path': 'emails/' |                 'template_path': 'emails/' | ||||||
|             } |             } | ||||||
|             email = BaseEmail(**email_data) |             email = BaseEmail(**email_data) | ||||||
|  |  | ||||||
|  | @ -162,6 +162,10 @@ class VirtualMachinePlan(models.Model): | ||||||
|         self.save(update_fields=['public_key']) |         self.save(update_fields=['public_key']) | ||||||
|         return private_key |         return private_key | ||||||
| 
 | 
 | ||||||
|  |     def cancel_plan(self): | ||||||
|  |         self.status = self.CANCELED_STATUS | ||||||
|  |         self.save(update_fields=['status']) | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| class HostingOrder(models.Model): | class HostingOrder(models.Model): | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -18,3 +18,11 @@ | ||||||
|   display: inline-block; |   display: inline-block; | ||||||
|   vertical-align: baseline; |   vertical-align: baseline; | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | .space-above { | ||||||
|  | 	margin-top: 4%; | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | .space-above-big { | ||||||
|  | 	margin-top: 20%; | ||||||
|  | } | ||||||
|  |  | ||||||
							
								
								
									
										18
									
								
								hosting/static/hosting/js/virtual_machine_detail.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								hosting/static/hosting/js/virtual_machine_detail.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,18 @@ | ||||||
|  | 
 | ||||||
|  | $( document ).ready(function() { | ||||||
|  | 
 | ||||||
|  | 	$('#confirm-cancel').on('click', '.btn-ok', function(e) { | ||||||
|  | 		$('#virtual_machine_cancel_form').trigger('submit'); | ||||||
|  | 	}); | ||||||
|  | 
 | ||||||
|  |   var hash = window.location.hash; | ||||||
|  |   hash && $('ul.nav a[href="' + hash + '"]').tab('show'); | ||||||
|  | 
 | ||||||
|  |   $('.nav-tabs a').click(function (e) { | ||||||
|  |     $(this).tab('show'); | ||||||
|  |     var scrollmem = $('body').scrollTop() || $('html').scrollTop(); | ||||||
|  |     window.location.hash = this.hash; | ||||||
|  |     $('html,body').scrollTop(scrollmem); | ||||||
|  |   }); | ||||||
|  | 
 | ||||||
|  | }); | ||||||
|  | @ -1,13 +0,0 @@ | ||||||
| 
 |  | ||||||
| {% load staticfiles bootstrap3%} |  | ||||||
| <!DOCTYPE html> |  | ||||||
| <html> |  | ||||||
| <head> |  | ||||||
| 	<title></title> |  | ||||||
| </head> |  | ||||||
| <body> |  | ||||||
| 
 |  | ||||||
|  You virtual machine {{vm.name}} has been activated. You can manage your vm on this <a href="{{request.HOS}}{% url 'hosting:virtual_machines' vm.id %}"> link </a> |  | ||||||
| 
 |  | ||||||
| </body> |  | ||||||
| </html> |  | ||||||
|  | @ -1,15 +0,0 @@ | ||||||
| 
 |  | ||||||
| {% load staticfiles bootstrap3%} |  | ||||||
| <!DOCTYPE html> |  | ||||||
| <html> |  | ||||||
| <head> |  | ||||||
| 	<title></title> |  | ||||||
| </head> |  | ||||||
| <body> |  | ||||||
| 
 |  | ||||||
|  You virtual machine {{vm.name}} has been activated. You can manage your vm in this <a href="{% url 'hosting:virtual_machines' vm.id %}"> link </a> |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| </body> |  | ||||||
| </html> |  | ||||||
							
								
								
									
										136
									
								
								hosting/templates/emails/vm_status_changed.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								hosting/templates/emails/vm_status_changed.html
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,136 @@ | ||||||
|  | 
 | ||||||
|  | <!-- Inliner Build Version 4380b7741bb759d6cb997545f3add21ad48f010b --> | ||||||
|  | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> | ||||||
|  | <html xmlns="http://www.w3.org/1999/xhtml" style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <head> | ||||||
|  | <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | ||||||
|  | <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
|  | <title>Oxygen Invoice</title> | ||||||
|  | </head> | ||||||
|  | <body bgcolor="#f7f7f7" style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; width: 100% !important; height: 100%; color: white; margin: 0;"> | ||||||
|  | <style type="text/css"> | ||||||
|  | @media only screen and (max-width: 480px) { | ||||||
|  |   table[class*="container-for-gmail-android"] { | ||||||
|  |     min-width: 290px !important; width: 100% !important; | ||||||
|  |   } | ||||||
|  |   img[class="force-width-gmail"] { | ||||||
|  |     display: none !important; width: 0 !important; height: 0 !important; | ||||||
|  |   } | ||||||
|  |   table[class="w320"] { | ||||||
|  |     width: 320px !important; | ||||||
|  |   } | ||||||
|  |   td[class*="mobile-header-padding-left"] { | ||||||
|  |     width: 160px !important; padding-left: 0 !important; | ||||||
|  |   } | ||||||
|  |   td[class*="mobile-header-padding-right"] { | ||||||
|  |     width: 160px !important; padding-right: 0 !important; | ||||||
|  |   } | ||||||
|  |   td[class="header-lg"] { | ||||||
|  |     font-size: 24px !important; padding-bottom: 5px !important; | ||||||
|  |   } | ||||||
|  |   td[class="content-padding"] { | ||||||
|  |     padding: 5px 0 5px !important; | ||||||
|  |   } | ||||||
|  |   td[class="button"] { | ||||||
|  |     padding: 5px 5px 30px !important; | ||||||
|  |   } | ||||||
|  |   td[class*="free-text"] { | ||||||
|  |     padding: 10px 18px 30px !important; | ||||||
|  |   } | ||||||
|  |   td[class~="mobile-hide-img"] { | ||||||
|  |     display: none !important; height: 0 !important; width: 0 !important; line-height: 0 !important; | ||||||
|  |   } | ||||||
|  |   td[class~="item"] { | ||||||
|  |     width: 140px !important; vertical-align: top !important; | ||||||
|  |   } | ||||||
|  |   td[class~="quantity"] { | ||||||
|  |     width: 50px !important; | ||||||
|  |   } | ||||||
|  |   td[class~="price"] { | ||||||
|  |     width: 90px !important; | ||||||
|  |   } | ||||||
|  |   td[class="item-table"] { | ||||||
|  |     padding: 30px 20px !important; | ||||||
|  |   } | ||||||
|  |   td[class="mini-container-left"] { | ||||||
|  |     padding: 0 15px 15px !important; display: block !important; width: 290px !important; | ||||||
|  |   } | ||||||
|  |   td[class="mini-container-right"] { | ||||||
|  |     padding: 0 15px 15px !important; display: block !important; width: 290px !important; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </style> | ||||||
|  | <table align="center" cellpadding="0" cellspacing="0" class="container-for-gmail-android" width="100%" style="border-collapse: collapse !important; min-width: 600px; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td align="left" valign="top" width="100%" style="border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #f7f7f7 url(http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg) repeat-x;" bgcolor="#ffffff"> | ||||||
|  |       <center style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  |       <img src="http://s3.amazonaws.com/swu-filepicker/SBb2fQPrQ5ezxmqUTgCr_transparent.png" class="force-width-gmail" style="max-width: 600px; outline: none; text-decoration: none; -ms-interpolation-mode: bicubic; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; min-width: 600px; height: 0px !important; line-height: 1px !important; font-size: 1px !important;"><table cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" background="http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg" style="border-collapse: collapse !important; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; background: transparent;"><tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td width="100%" height="80" valign="top" style="text-align: center; vertical-align: middle; border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; line-height: 21px;" align="center"> | ||||||
|  |             <!--[if gte mso 9]> | ||||||
|  |             <v:rect xmlns:v="urn:schemas-microsoft-com:vml" fill="true" stroke="false" style="mso-width-percent:1000;height:80px; v-text-anchor:middle;"> | ||||||
|  |               <v:fill type="tile" src="http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg" color="#ffffff" /> | ||||||
|  |               <v:textbox inset="0,0,0,0"> | ||||||
|  |             <![endif]--> | ||||||
|  |               <center style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  |                 <table cellpadding="0" cellspacing="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"><tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td class="pull-left mobile-header-padding-left" style="vertical-align: middle; border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: left; line-height: 21px; width: 290px; padding-left: 10px;" align="left" valign="middle"> | ||||||
|  |                       <a href="" style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; color: #676767; text-decoration: none !important;"><img width="137" height="47" src="https://dynamicweb.ungleich.ch/static/hosting/img/logo_black.svg" alt="logo" style="max-width: 600px; outline: none; text-decoration: none; -ms-interpolation-mode: bicubic; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; border: none;"></a> | ||||||
|  |                     </td> | ||||||
|  |                     <td class="pull-right mobile-header-padding-right" style="color: #4d4d4d; border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; text-align: right; line-height: 21px; width: 290px; padding-left: 10px;" align="right"> | ||||||
|  |                     </td> | ||||||
|  |                   </tr></table> | ||||||
|  | </center> | ||||||
|  |               <!--[if gte mso 9]> | ||||||
|  |               </v:textbox> | ||||||
|  |             </v:rect> | ||||||
|  |             <![endif]--> | ||||||
|  |             </td> | ||||||
|  |           </tr></table> | ||||||
|  | </center> | ||||||
|  |     </td> | ||||||
|  |   </tr> | ||||||
|  | <tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td align="center" valign="top" width="100%" style="border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #f7f7f7; padding: 20px 0 5px;" class="content-padding" bgcolor="#f7f7f7"> | ||||||
|  |       <center style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  |         <table cellspacing="0" cellpadding="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td class="header-lg" style="border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 32px; color: #4d4d4d; text-align: center; line-height: normal; font-weight: 700; padding: 35px 0 0;" align="center"> | ||||||
|  |                Your virtual machine {{vm.name}} status has been updated to {{vm.get_status_display}} | ||||||
|  |             </td> | ||||||
|  |           </tr> | ||||||
|  | <tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td class="free-text" style="border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; width: 100% !important; padding: 10px 60px 0px;" align="center"> | ||||||
|  |               You can manage your vm clicking on the button below | ||||||
|  |             </td> | ||||||
|  |           </tr> | ||||||
|  | <tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td class="button" style="border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; padding: 30px 0;" align="center"> | ||||||
|  |               <div style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <!--[if mso]> | ||||||
|  |                 <v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="http://" style="height:45px;v-text-anchor:middle;width:155px;" arcsize="15%" strokecolor="#ffffff" fillcolor="#ff6f6f"> | ||||||
|  |                   <w:anchorlock/> | ||||||
|  |                   <center style="color:#ffffff;font-family:Helvetica, Arial, sans-serif;font-size:14px;font-weight:regular;">My Account</center> | ||||||
|  |                 </v:roundrect> | ||||||
|  |               <![endif]--><a href="{{request.HOS}}{% url 'hosting:virtual_machines' vm.id %}" style="border-radius: 5px; color: #ffffff; display: inline-block; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; font-weight: regular; line-height: 45px; text-align: center; text-decoration: none !important; width: 155px; -webkit-text-size-adjust: none; mso-hide: all; background: #ff6f6f;">VM Dashboard</a> | ||||||
|  | </div> | ||||||
|  |             </td> | ||||||
|  |           </tr> | ||||||
|  | </table> | ||||||
|  | </center> | ||||||
|  |     </td> | ||||||
|  |   </tr> | ||||||
|  | <tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td align="center" valign="top" width="100%" style="height: 100px; border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #f7f7f7;" bgcolor="#f7f7f7"> | ||||||
|  |       <center style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  |         <table cellspacing="0" cellpadding="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"><tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td style="border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; padding: 25px 0;" align="center"> | ||||||
|  |               <strong style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">ungleich</strong><br style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | </td> | ||||||
|  |           </tr></table> | ||||||
|  | </center> | ||||||
|  |     </td> | ||||||
|  |   </tr> | ||||||
|  | </table> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
|  | 
 | ||||||
							
								
								
									
										136
									
								
								hosting/templates/emails/vm_status_changed.txt
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										136
									
								
								hosting/templates/emails/vm_status_changed.txt
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,136 @@ | ||||||
|  | 
 | ||||||
|  | <!-- Inliner Build Version 4380b7741bb759d6cb997545f3add21ad48f010b --> | ||||||
|  | <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> | ||||||
|  | <html xmlns="http://www.w3.org/1999/xhtml" style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <head> | ||||||
|  | <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> | ||||||
|  | <meta name="viewport" content="width=device-width, initial-scale=1"> | ||||||
|  | <title>Oxygen Invoice</title> | ||||||
|  | </head> | ||||||
|  | <body bgcolor="#f7f7f7" style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; -webkit-font-smoothing: antialiased; -webkit-text-size-adjust: none; width: 100% !important; height: 100%; color: white; margin: 0;"> | ||||||
|  | <style type="text/css"> | ||||||
|  | @media only screen and (max-width: 480px) { | ||||||
|  |   table[class*="container-for-gmail-android"] { | ||||||
|  |     min-width: 290px !important; width: 100% !important; | ||||||
|  |   } | ||||||
|  |   img[class="force-width-gmail"] { | ||||||
|  |     display: none !important; width: 0 !important; height: 0 !important; | ||||||
|  |   } | ||||||
|  |   table[class="w320"] { | ||||||
|  |     width: 320px !important; | ||||||
|  |   } | ||||||
|  |   td[class*="mobile-header-padding-left"] { | ||||||
|  |     width: 160px !important; padding-left: 0 !important; | ||||||
|  |   } | ||||||
|  |   td[class*="mobile-header-padding-right"] { | ||||||
|  |     width: 160px !important; padding-right: 0 !important; | ||||||
|  |   } | ||||||
|  |   td[class="header-lg"] { | ||||||
|  |     font-size: 24px !important; padding-bottom: 5px !important; | ||||||
|  |   } | ||||||
|  |   td[class="content-padding"] { | ||||||
|  |     padding: 5px 0 5px !important; | ||||||
|  |   } | ||||||
|  |   td[class="button"] { | ||||||
|  |     padding: 5px 5px 30px !important; | ||||||
|  |   } | ||||||
|  |   td[class*="free-text"] { | ||||||
|  |     padding: 10px 18px 30px !important; | ||||||
|  |   } | ||||||
|  |   td[class~="mobile-hide-img"] { | ||||||
|  |     display: none !important; height: 0 !important; width: 0 !important; line-height: 0 !important; | ||||||
|  |   } | ||||||
|  |   td[class~="item"] { | ||||||
|  |     width: 140px !important; vertical-align: top !important; | ||||||
|  |   } | ||||||
|  |   td[class~="quantity"] { | ||||||
|  |     width: 50px !important; | ||||||
|  |   } | ||||||
|  |   td[class~="price"] { | ||||||
|  |     width: 90px !important; | ||||||
|  |   } | ||||||
|  |   td[class="item-table"] { | ||||||
|  |     padding: 30px 20px !important; | ||||||
|  |   } | ||||||
|  |   td[class="mini-container-left"] { | ||||||
|  |     padding: 0 15px 15px !important; display: block !important; width: 290px !important; | ||||||
|  |   } | ||||||
|  |   td[class="mini-container-right"] { | ||||||
|  |     padding: 0 15px 15px !important; display: block !important; width: 290px !important; | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | </style> | ||||||
|  | <table align="center" cellpadding="0" cellspacing="0" class="container-for-gmail-android" width="100%" style="border-collapse: collapse !important; min-width: 600px; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td align="left" valign="top" width="100%" style="border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #f7f7f7 url(http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg) repeat-x;" bgcolor="#ffffff"> | ||||||
|  |       <center style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  |       <img src="http://s3.amazonaws.com/swu-filepicker/SBb2fQPrQ5ezxmqUTgCr_transparent.png" class="force-width-gmail" style="max-width: 600px; outline: none; text-decoration: none; -ms-interpolation-mode: bicubic; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; min-width: 600px; height: 0px !important; line-height: 1px !important; font-size: 1px !important;"><table cellspacing="0" cellpadding="0" width="100%" bgcolor="#ffffff" background="http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg" style="border-collapse: collapse !important; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; background: transparent;"><tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td width="100%" height="80" valign="top" style="text-align: center; vertical-align: middle; border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; line-height: 21px;" align="center"> | ||||||
|  |             <!--[if gte mso 9]> | ||||||
|  |             <v:rect xmlns:v="urn:schemas-microsoft-com:vml" fill="true" stroke="false" style="mso-width-percent:1000;height:80px; v-text-anchor:middle;"> | ||||||
|  |               <v:fill type="tile" src="http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg" color="#ffffff" /> | ||||||
|  |               <v:textbox inset="0,0,0,0"> | ||||||
|  |             <![endif]--> | ||||||
|  |               <center style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  |                 <table cellpadding="0" cellspacing="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"><tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td class="pull-left mobile-header-padding-left" style="vertical-align: middle; border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: left; line-height: 21px; width: 290px; padding-left: 10px;" align="left" valign="middle"> | ||||||
|  |                       <a href="" style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; color: #676767; text-decoration: none !important;"><img width="137" height="47" src="https://dynamicweb.ungleich.ch/static/hosting/img/logo_black.svg" alt="logo" style="max-width: 600px; outline: none; text-decoration: none; -ms-interpolation-mode: bicubic; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; border: none;"></a> | ||||||
|  |                     </td> | ||||||
|  |                     <td class="pull-right mobile-header-padding-right" style="color: #4d4d4d; border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; text-align: right; line-height: 21px; width: 290px; padding-left: 10px;" align="right"> | ||||||
|  |                     </td> | ||||||
|  |                   </tr></table> | ||||||
|  | </center> | ||||||
|  |               <!--[if gte mso 9]> | ||||||
|  |               </v:textbox> | ||||||
|  |             </v:rect> | ||||||
|  |             <![endif]--> | ||||||
|  |             </td> | ||||||
|  |           </tr></table> | ||||||
|  | </center> | ||||||
|  |     </td> | ||||||
|  |   </tr> | ||||||
|  | <tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td align="center" valign="top" width="100%" style="border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #f7f7f7; padding: 20px 0 5px;" class="content-padding" bgcolor="#f7f7f7"> | ||||||
|  |       <center style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  |         <table cellspacing="0" cellpadding="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td class="header-lg" style="border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 32px; color: #4d4d4d; text-align: center; line-height: normal; font-weight: 700; padding: 35px 0 0;" align="center"> | ||||||
|  |                Your virtual machine {{vm.name}} status has been updated to {{vm.get_status_display}} | ||||||
|  |             </td> | ||||||
|  |           </tr> | ||||||
|  | <tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td class="free-text" style="border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; width: 100% !important; padding: 10px 60px 0px;" align="center"> | ||||||
|  |               You can manage your vm clicking on the button below | ||||||
|  |             </td> | ||||||
|  |           </tr> | ||||||
|  | <tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td class="button" style="border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; padding: 30px 0;" align="center"> | ||||||
|  |               <div style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <!--[if mso]> | ||||||
|  |                 <v:roundrect xmlns:v="urn:schemas-microsoft-com:vml" xmlns:w="urn:schemas-microsoft-com:office:word" href="http://" style="height:45px;v-text-anchor:middle;width:155px;" arcsize="15%" strokecolor="#ffffff" fillcolor="#ff6f6f"> | ||||||
|  |                   <w:anchorlock/> | ||||||
|  |                   <center style="color:#ffffff;font-family:Helvetica, Arial, sans-serif;font-size:14px;font-weight:regular;">My Account</center> | ||||||
|  |                 </v:roundrect> | ||||||
|  |               <![endif]--><a href="{{request.HOS}}{% url 'hosting:virtual_machines' vm.id %}" style="border-radius: 5px; color: #ffffff; display: inline-block; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; font-weight: regular; line-height: 45px; text-align: center; text-decoration: none !important; width: 155px; -webkit-text-size-adjust: none; mso-hide: all; background: #ff6f6f;">VM Dashboard</a> | ||||||
|  | </div> | ||||||
|  |             </td> | ||||||
|  |           </tr> | ||||||
|  | </table> | ||||||
|  | </center> | ||||||
|  |     </td> | ||||||
|  |   </tr> | ||||||
|  | <tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td align="center" valign="top" width="100%" style="height: 100px; border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #f7f7f7;" bgcolor="#f7f7f7"> | ||||||
|  |       <center style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  |         <table cellspacing="0" cellpadding="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"><tr style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | <td style="border-collapse: collapse; font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; padding: 25px 0;" align="center"> | ||||||
|  |               <strong style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">ungleich</strong><br style="font-family: 'Oxygen', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"> | ||||||
|  | </td> | ||||||
|  |           </tr></table> | ||||||
|  | </center> | ||||||
|  |     </td> | ||||||
|  |   </tr> | ||||||
|  | </table> | ||||||
|  | </body> | ||||||
|  | </html> | ||||||
|  | 
 | ||||||
|  | @ -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> | ||||||
| 
 | 
 | ||||||
|  |     <!-- Virtual Machine Detail Javascript --> | ||||||
|  |     <script src="{% static 'hosting/js/virtual_machine_detail.js' %}"></script> | ||||||
|  | 
 | ||||||
|     <!-- Init JavaScript --> |     <!-- Init JavaScript --> | ||||||
|     <script src="{% static 'hosting/js/initial.js' %}"></script> |     <script src="{% static 'hosting/js/initial.js' %}"></script> | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -143,15 +143,49 @@ | ||||||
| 				            	<div class="row "> | 				            	<div class="row "> | ||||||
| 									<div class="col-md-12 inline-headers"> | 									<div class="col-md-12 inline-headers"> | ||||||
| 										<h3>Current status</h3> | 										<h3>Current status</h3> | ||||||
| 										{% if virtual_machine.status == 'pending' %} | 										<div  class="pull-right space-above"> | ||||||
| 											<span class="h3 pull-right label label-warning"><strong>{{virtual_machine.get_status_display}}</strong></span> | 											{% if virtual_machine.status == 'pending' %} | ||||||
| 										{% elif  virtual_machine.status == 'online' %} | 												<span class="label label-warning"><strong>{{virtual_machine.get_status_display}}</strong></span> | ||||||
| 											<span class="h3 pull-right label label-success"><strong>{{virtual_machine.get_status_display}}</strong></span> | 											{% elif  virtual_machine.status == 'online' %} | ||||||
| 										{% else %} | 												<span class="label label-success"><strong>{{virtual_machine.get_status_display}}</strong></span> | ||||||
| 											<span class="h3 pull-right label label-error"><strong>{{virtual_machine.get_status_display}}</strong></span> | 											{% elif  virtual_machine.status == 'canceled'%} | ||||||
| 										{% endif %}    | 												<span class="label label-danger"><strong>{{virtual_machine.get_status_display}}</strong></span> | ||||||
|  | 											{% endif %} | ||||||
|  | 										</div> | ||||||
| 									</div> | 									</div> | ||||||
| 				            	</div> | 				            	</div> | ||||||
|  | 				            	{% if not virtual_machine.status == 'canceled' %} | ||||||
|  | 				            	<div class="row"> | ||||||
|  | 									<div class="col-md-12 space-above-big"> | ||||||
|  | 										<div class="pull-right"> | ||||||
|  | 											<form method="POST" id="virtual_machine_cancel_form" class="cancel-form" action="{% url 'hosting:virtual_machines' virtual_machine.id %}"> | ||||||
|  | 											{% csrf_token %}  | ||||||
|  | 											</form>	 | ||||||
|  | 												 | ||||||
|  | 												<button type="text" data-href="{% url 'hosting:virtual_machines' virtual_machine.id %}" data-toggle="modal" data-target="#confirm-cancel" class="btn btn-danger">Cancel Virtual Machine</button> | ||||||
|  | 																						 | ||||||
|  | 										</div> | ||||||
|  | 									</div> | ||||||
|  | 									<!-- Cancel Modal --> | ||||||
|  | 									<div class="modal fade" id="confirm-cancel" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" aria-hidden="true"> | ||||||
|  | 									    <div class="modal-dialog"> | ||||||
|  | 									        <div class="modal-content"> | ||||||
|  | 									            <div class="modal-header"> | ||||||
|  | 									                Cancel your Virtual Machine | ||||||
|  | 									            </div> | ||||||
|  | 									            <div class="modal-body"> | ||||||
|  | 									                Are you sure do you want to cancel your Virtual Machine {{vm.virtual_machine}} plan? | ||||||
|  | 									            </div> | ||||||
|  | 									            <div class="modal-footer"> | ||||||
|  | 									                <button type="button" class="btn btn-default" data-dismiss="modal">Cancel</button> | ||||||
|  | 									                <a class="btn btn-danger btn-ok">Delete</a> | ||||||
|  | 									            </div> | ||||||
|  | 									        </div> | ||||||
|  | 									    </div> | ||||||
|  | 									</div> | ||||||
|  | 									<!-- / Cancel Modal --> | ||||||
|  | 				            	</div> | ||||||
|  | 				            	{% endif %} | ||||||
| 				            </div> | 				            </div> | ||||||
| 				          </div> | 				          </div> | ||||||
| 				        </div> | 				        </div> | ||||||
|  |  | ||||||
|  | @ -30,7 +30,7 @@ | ||||||
| 							{% elif  vm.status == 'online' %} | 							{% elif  vm.status == 'online' %} | ||||||
| 								<span class="h3 label label-success"><strong>{{vm.get_status_display}}</strong></span> | 								<span class="h3 label label-success"><strong>{{vm.get_status_display}}</strong></span> | ||||||
| 							{% else %} | 							{% else %} | ||||||
| 								<span class="h3 label label-error"><strong>{{vm.get_status_display}}</strong></span> | 								<span class="h3 label label-danger"><strong>{{vm.get_status_display}}</strong></span> | ||||||
| 							{% endif %}   | 							{% endif %}   | ||||||
| 
 | 
 | ||||||
| 						</td>  | 						</td>  | ||||||
|  |  | ||||||
|  | @ -3,7 +3,7 @@ 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,\ | ||||||
|     VirtualMachineDetailView, GenerateVMSSHKeysView, OrdersHostingDeleteView, NotificationsView, \ |     VirtualMachineView, GenerateVMSSHKeysView, OrdersHostingDeleteView, NotificationsView, \ | ||||||
|     MarkAsReadNotificationView |     MarkAsReadNotificationView | ||||||
| 
 | 
 | ||||||
| urlpatterns = [ | urlpatterns = [ | ||||||
|  | @ -16,8 +16,10 @@ urlpatterns = [ | ||||||
|     url(r'orders/(?P<pk>\d+)/?$', OrdersHostingDetailView.as_view(), name='orders'), |     url(r'orders/(?P<pk>\d+)/?$', OrdersHostingDetailView.as_view(), name='orders'), | ||||||
|     url(r'cancel_order/(?P<pk>\d+)/?$', OrdersHostingDeleteView.as_view(), name='delete_order'), |     url(r'cancel_order/(?P<pk>\d+)/?$', OrdersHostingDeleteView.as_view(), name='delete_order'), | ||||||
|     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+)/?$', VirtualMachineDetailView.as_view(), |     url(r'my-virtual-machines/(?P<pk>\d+)/?$', VirtualMachineView.as_view(), | ||||||
|         name='virtual_machines'), |         name='virtual_machines'), | ||||||
|  |     # url(r'my-virtual-machines/(?P<pk>\d+)/delete/?$', VirtualMachineCancelView.as_view(), | ||||||
|  |         # name='virtual_machines_cancel'), | ||||||
|     url(r'my-virtual-machines/(?P<pk>\d+)/key/?$', GenerateVMSSHKeysView.as_view(), |     url(r'my-virtual-machines/(?P<pk>\d+)/key/?$', GenerateVMSSHKeysView.as_view(), | ||||||
|         name='virtual_machine_key'), |         name='virtual_machine_key'), | ||||||
|     url(r'^notifications/$', NotificationsView.as_view(), name='notifications'), |     url(r'^notifications/$', NotificationsView.as_view(), name='notifications'), | ||||||
|  |  | ||||||
|  | @ -350,8 +350,34 @@ class VirtualMachinesPlanListView(LoginRequiredMixin, ListView): | ||||||
|         return super(VirtualMachinesPlanListView, self).get_queryset() |         return super(VirtualMachinesPlanListView, self).get_queryset() | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| class VirtualMachineDetailView(LoginRequiredMixin, DetailView): | class VirtualMachineView(LoginRequiredMixin, UpdateView): | ||||||
|     template_name = "hosting/virtual_machine_detail.html" |     template_name = "hosting/virtual_machine_detail.html" | ||||||
|     login_url = reverse_lazy('hosting:login') |     login_url = reverse_lazy('hosting:login') | ||||||
|     model = VirtualMachinePlan |     model = VirtualMachinePlan | ||||||
|     context_object_name = "virtual_machine" |     context_object_name = "virtual_machine" | ||||||
|  |     fields = '__all__' | ||||||
|  | 
 | ||||||
|  |     def get_success_url(self): | ||||||
|  |         vm = self.get_object() | ||||||
|  |         final_url = "%s%s" % (reverse('hosting:virtual_machines', kwargs={'pk': vm.id}), | ||||||
|  |                               '#status-v') | ||||||
|  |         return final_url | ||||||
|  | 
 | ||||||
|  |     def post(self, *args, **kwargs): | ||||||
|  |         vm = self.get_object() | ||||||
|  |         vm.cancel_plan() | ||||||
|  | 
 | ||||||
|  |         context = { | ||||||
|  |             'vm': vm | ||||||
|  |         } | ||||||
|  |         email_data = { | ||||||
|  |             'subject': 'Virtual machine plan canceled', | ||||||
|  |             'to': self.request.user.email, | ||||||
|  |             'context': context, | ||||||
|  |             'template_name': 'vm_status_changed', | ||||||
|  |             'template_path': 'emails/' | ||||||
|  |         } | ||||||
|  |         email = BaseEmail(**email_data) | ||||||
|  |         email.send() | ||||||
|  | 
 | ||||||
|  |         return HttpResponseRedirect(self.get_success_url()) | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue