Merge pull request #324 from pcoder/feature/3296/confirm_emails
Feature/3296/confirm emails
This commit is contained in:
		
				commit
				
					
						5271591cf3
					
				
			
		
					 8 changed files with 348 additions and 14 deletions
				
			
		| 
						 | 
					@ -0,0 +1,129 @@
 | 
				
			||||||
 | 
					{% load static from staticfiles %}
 | 
				
			||||||
 | 
					<!-- 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: 'Raleway', '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="#ffffff" style="font-family: 'Raleway', '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: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td align="left" valign="top" width="100%" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #ffffff url(http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg) repeat-x;" bgcolor="#ffffff">
 | 
				
			||||||
 | 
					      <center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !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: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; background: transparent;"><tr style="font-family: 'Raleway', '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: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; line-height: 21px; background-color: #ffffff" 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: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					                <table cellpadding="0" cellspacing="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"><tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td class="pull-left mobile-header-padding-left" style="vertical-align: middle; border-collapse: collapse; font-family: 'Raleway', '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="{{base_url}}" style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; color: #676767; text-decoration: none !important;"><img width="137" src="{{base_url}}{% static 'datacenterlight/img/datacenterlight.png' %}" alt="logo" style="max-width: 600px; outline: none; text-decoration: none; -ms-interpolation-mode: bicubic; font-family: 'Raleway', '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: 'Raleway', '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: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td align="center" valign="top" width="100%" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #ffffff; padding: 20px 0 5px;" class="content-padding" bgcolor="#f7f7f7">
 | 
				
			||||||
 | 
					      <center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					        <table cellspacing="0" cellpadding="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td class="header-lg" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 32px; color: #4d4d4d; text-align: left; line-height: normal; font-weight: 400; padding: 35px 5 0;" align="center">
 | 
				
			||||||
 | 
					              Datacenterlight user activation
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					          </tr>
 | 
				
			||||||
 | 
					<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td class="free-text" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: left; line-height: 21px; width: 100% !important; padding: 40px 7px 20px;" align="center">
 | 
				
			||||||
 | 
					             <p>
 | 
				
			||||||
 | 
					                You can activate your datacenterlight account by <a href="{{base_url}}{{activation_link}}">clicking here</a>.</br></br>
 | 
				
			||||||
 | 
					                You can also copy and paste the following link into the address bar of your browser and follow the link in order to activate your datacenterlight account.</br>
 | 
				
			||||||
 | 
					                {{base_url}}{{activation_link}}             
 | 
				
			||||||
 | 
					             </p></td>
 | 
				
			||||||
 | 
					          </tr>
 | 
				
			||||||
 | 
					<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td class="button" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; padding: 0;" align="center"> </td>
 | 
				
			||||||
 | 
					          </tr>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					</center>
 | 
				
			||||||
 | 
					    </td>
 | 
				
			||||||
 | 
					  </tr>
 | 
				
			||||||
 | 
					<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td align="center" valign="top" width="100%" style="height: 100px; border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #ffffff;" bgcolor="#ffffff">
 | 
				
			||||||
 | 
					      <center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					        <table cellspacing="0" cellpadding="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"><tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; font-weight: 600; color: #7293de; padding: 25px 9px 0px;text-align: left; line-height: 21px;;" align="left">Your data center light team<br style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					</td>
 | 
				
			||||||
 | 
					          </tr></table>
 | 
				
			||||||
 | 
					</center>
 | 
				
			||||||
 | 
					    </td>
 | 
				
			||||||
 | 
					  </tr>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,129 @@
 | 
				
			||||||
 | 
					{% load static from staticfiles %}
 | 
				
			||||||
 | 
					<!-- 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: 'Raleway', '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="#ffffff" style="font-family: 'Raleway', '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: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td align="left" valign="top" width="100%" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #ffffff url(http://s3.amazonaws.com/swu-filepicker/4E687TRe69Ld95IDWyEg_bg_top_02.jpg) repeat-x;" bgcolor="#ffffff">
 | 
				
			||||||
 | 
					      <center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !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: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; background: transparent;"><tr style="font-family: 'Raleway', '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: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; line-height: 21px; background-color: #ffffff" 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: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					                <table cellpadding="0" cellspacing="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"><tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td class="pull-left mobile-header-padding-left" style="vertical-align: middle; border-collapse: collapse; font-family: 'Raleway', '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="{{base_url}}" style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; color: #676767; text-decoration: none !important;"><img width="137" src="{{base_url}}{% static 'datacenterlight/img/datacenterlight.png' %}" alt="logo" style="max-width: 600px; outline: none; text-decoration: none; -ms-interpolation-mode: bicubic; font-family: 'Raleway', '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: 'Raleway', '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: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td align="center" valign="top" width="100%" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #ffffff; padding: 20px 0 5px;" class="content-padding" bgcolor="#f7f7f7">
 | 
				
			||||||
 | 
					      <center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					        <table cellspacing="0" cellpadding="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td class="header-lg" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 32px; color: #4d4d4d; text-align: left; line-height: normal; font-weight: 400; padding: 35px 5 0;" align="center">
 | 
				
			||||||
 | 
					              Datacenterlight user activation
 | 
				
			||||||
 | 
					            </td>
 | 
				
			||||||
 | 
					          </tr>
 | 
				
			||||||
 | 
					<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td class="free-text" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: left; line-height: 21px; width: 100% !important; padding: 40px 7px 20px;" align="center">
 | 
				
			||||||
 | 
					             <p>
 | 
				
			||||||
 | 
					                You can activate your datacenterlight account by <a href="{{base_url}}{{activation_link}}">clicking here</a>.</br></br>
 | 
				
			||||||
 | 
					                You can also copy and paste the following link into the address bar of your browser and follow the link in order to activate your datacenterlight account.</br>
 | 
				
			||||||
 | 
					                {{base_url}}{{activation_link}}             
 | 
				
			||||||
 | 
					             </p></td>
 | 
				
			||||||
 | 
					          </tr>
 | 
				
			||||||
 | 
					<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td class="button" style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; padding: 0;" align="center"> </td>
 | 
				
			||||||
 | 
					          </tr>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					</center>
 | 
				
			||||||
 | 
					    </td>
 | 
				
			||||||
 | 
					  </tr>
 | 
				
			||||||
 | 
					<tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td align="center" valign="top" width="100%" style="height: 100px; border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; color: #777777; text-align: center; line-height: 21px; background: #ffffff;" bgcolor="#ffffff">
 | 
				
			||||||
 | 
					      <center style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					        <table cellspacing="0" cellpadding="0" width="600" class="w320" style="border-collapse: collapse !important; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;"><tr style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					<td style="border-collapse: collapse; font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important; font-size: 14px; font-weight: 600; color: #7293de; padding: 25px 9px 0px;text-align: left; line-height: 21px;;" align="left">Your data center light team<br style="font-family: 'Raleway', 'Helvetica Neue', 'Arial', 'sans-serif' !important;">
 | 
				
			||||||
 | 
					</td>
 | 
				
			||||||
 | 
					          </tr></table>
 | 
				
			||||||
 | 
					</center>
 | 
				
			||||||
 | 
					    </td>
 | 
				
			||||||
 | 
					  </tr>
 | 
				
			||||||
 | 
					</table>
 | 
				
			||||||
 | 
					</body>
 | 
				
			||||||
 | 
					</html>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,6 +24,8 @@ class HostingUserLoginForm(forms.Form):
 | 
				
			||||||
        is_auth = authenticate(email=email, password=password)
 | 
					        is_auth = authenticate(email=email, password=password)
 | 
				
			||||||
        if not is_auth:
 | 
					        if not is_auth:
 | 
				
			||||||
            raise forms.ValidationError("Your username and/or password were incorrect.")
 | 
					            raise forms.ValidationError("Your username and/or password were incorrect.")
 | 
				
			||||||
 | 
					        elif is_auth.validated == 0:
 | 
				
			||||||
 | 
					            raise forms.ValidationError(_("Your account is not activated yet."))
 | 
				
			||||||
        return self.cleaned_data
 | 
					        return self.cleaned_data
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    def clean_email(self):
 | 
					    def clean_email(self):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -318,6 +318,17 @@ h6 {
 | 
				
			||||||
    padding: 15px 20px 0 20px;
 | 
					    padding: 15px 20px 0 20px;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.sign-up-message {
 | 
				
			||||||
 | 
					    padding: 25px 30px 25px 30px;
 | 
				
			||||||
 | 
					    text-align: justify;
 | 
				
			||||||
 | 
					    font-size: 18px;
 | 
				
			||||||
 | 
					    line-height: 30px;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					.sign-up-message a {
 | 
				
			||||||
 | 
					    font-size: 18px;
 | 
				
			||||||
 | 
					    color: #1e94cc !important;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@media (max-width: 1199px) {
 | 
					@media (max-width: 1199px) {
 | 
				
			||||||
    ul.banner-social-buttons {
 | 
					    ul.banner-social-buttons {
 | 
				
			||||||
        float: left;
 | 
					        float: left;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										21
									
								
								hosting/templates/hosting/signup_validate.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								hosting/templates/hosting/signup_validate.html
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					{% extends "hosting/base_short.html" %}
 | 
				
			||||||
 | 
					{% load staticfiles bootstrap3 i18n %}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					{% block content %}
 | 
				
			||||||
 | 
					<div class="auth-container">
 | 
				
			||||||
 | 
					   <div class="auth-bg"></div>
 | 
				
			||||||
 | 
					    <div class="container">
 | 
				
			||||||
 | 
					            <div class="auth-title">
 | 
				
			||||||
 | 
					                <h2>{% trans "Your VM hosted in Switzerland"%}</h2>
 | 
				
			||||||
 | 
					            </div>
 | 
				
			||||||
 | 
					            <div class="auth-content">
 | 
				
			||||||
 | 
					                <div class="intro-message auth-box sign-up">
 | 
				
			||||||
 | 
					                    <h2  class="section-heading">{{section_title}}</h2>
 | 
				
			||||||
 | 
					                    <div class="sign-up-message">
 | 
				
			||||||
 | 
					                         {{message}}
 | 
				
			||||||
 | 
					                    </div>
 | 
				
			||||||
 | 
					                </div>
 | 
				
			||||||
 | 
					        </div>
 | 
				
			||||||
 | 
					    </div>
 | 
				
			||||||
 | 
					</div>
 | 
				
			||||||
 | 
					{% endblock %}
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
from django.conf.urls import url
 | 
					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, SignupValidateView, SignupValidatedView, IndexView, \
 | 
				
			||||||
    OrdersHostingListView, OrdersHostingDetailView, VirtualMachinesPlanListView,\
 | 
					    OrdersHostingListView, OrdersHostingDetailView, VirtualMachinesPlanListView,\
 | 
				
			||||||
    VirtualMachineView, OrdersHostingDeleteView, NotificationsView, \
 | 
					    VirtualMachineView, OrdersHostingDeleteView, NotificationsView, \
 | 
				
			||||||
    MarkAsReadNotificationView, PasswordResetView, PasswordResetConfirmView, HostingPricingView,\
 | 
					    MarkAsReadNotificationView, PasswordResetView, PasswordResetConfirmView, HostingPricingView,\
 | 
				
			||||||
| 
						 | 
					@ -35,9 +35,11 @@ urlpatterns = [
 | 
				
			||||||
        name='read_notification'),
 | 
					        name='read_notification'),
 | 
				
			||||||
    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'signup-validate/?$', SignupValidateView.as_view(), name='signup-validate'),
 | 
				
			||||||
    url(r'reset-password/?$', PasswordResetView.as_view(), name='reset_password'),
 | 
					    url(r'reset-password/?$', PasswordResetView.as_view(), name='reset_password'),
 | 
				
			||||||
    url(r'reset-password-confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',
 | 
					    url(r'reset-password-confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',
 | 
				
			||||||
        PasswordResetConfirmView.as_view(), name='reset_password_confirm'),
 | 
					        PasswordResetConfirmView.as_view(), name='reset_password_confirm'),
 | 
				
			||||||
    url(r'^logout/?$', 'django.contrib.auth.views.logout',
 | 
					    url(r'^logout/?$', 'django.contrib.auth.views.logout',
 | 
				
			||||||
        {'next_page': '/hosting/login?logged_out=true'}, name='logout')
 | 
					        {'next_page': '/hosting/login?logged_out=true'}, name='logout'),
 | 
				
			||||||
 | 
					    url(r'^validate/(?P<validate_slug>.*)/$', SignupValidatedView.as_view(), name='validate')
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@ from guardian.mixins import PermissionRequiredMixin
 | 
				
			||||||
from stored_messages.settings import stored_messages_settings
 | 
					from stored_messages.settings import stored_messages_settings
 | 
				
			||||||
from stored_messages.models import Message
 | 
					from stored_messages.models import Message
 | 
				
			||||||
from stored_messages.api import mark_read
 | 
					from stored_messages.api import mark_read
 | 
				
			||||||
 | 
					from django.utils.safestring import mark_safe
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from membership.models import CustomUser, StripeCustomer
 | 
					from membership.models import CustomUser, StripeCustomer
 | 
				
			||||||
from utils.stripe_utils import StripeUtils
 | 
					from utils.stripe_utils import StripeUtils
 | 
				
			||||||
| 
						 | 
					@ -32,6 +32,7 @@ from .mixins import ProcessVMSelectionMixin
 | 
				
			||||||
from opennebula_api.models import OpenNebulaManager
 | 
					from opennebula_api.models import OpenNebulaManager
 | 
				
			||||||
from opennebula_api.serializers import VirtualMachineSerializer,\
 | 
					from opennebula_api.serializers import VirtualMachineSerializer,\
 | 
				
			||||||
    VirtualMachineTemplateSerializer
 | 
					    VirtualMachineTemplateSerializer
 | 
				
			||||||
 | 
					from django.utils.translation import ugettext_lazy as _
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from oca.exceptions import OpenNebulaException
 | 
					from oca.exceptions import OpenNebulaException
 | 
				
			||||||
| 
						 | 
					@ -199,12 +200,39 @@ class SignupView(CreateView):
 | 
				
			||||||
        name = form.cleaned_data.get('name')
 | 
					        name = form.cleaned_data.get('name')
 | 
				
			||||||
        email = form.cleaned_data.get('email')
 | 
					        email = form.cleaned_data.get('email')
 | 
				
			||||||
        password = form.cleaned_data.get('password')
 | 
					        password = form.cleaned_data.get('password')
 | 
				
			||||||
 | 
					        this_base_url = "{0}://{1}".format(self.request.scheme, self.request.get_host())
 | 
				
			||||||
 | 
					        CustomUser.register(name, password, email, app='dcl', base_url=this_base_url)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        CustomUser.register(name, password, email)
 | 
					        return HttpResponseRedirect(reverse_lazy('hosting:signup-validate'))
 | 
				
			||||||
        auth_user = authenticate(email=email, password=password)
 | 
					 | 
				
			||||||
        login(self.request, auth_user)
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return HttpResponseRedirect(self.get_success_url())
 | 
					class SignupValidateView(TemplateView):
 | 
				
			||||||
 | 
					    template_name = "hosting/signup_validate.html"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def get_context_data(self, **kwargs):
 | 
				
			||||||
 | 
					        context = super(SignupValidateView, self).get_context_data(**kwargs)
 | 
				
			||||||
 | 
					        login_url = reverse('hosting:login')
 | 
				
			||||||
 | 
					        message= _("Thank you for signing up. We have sent an email to you. Please follow the instructions in it to activate your account. Once activated, you can login using ") + '<a href="' + login_url +'">login</a>'
 | 
				
			||||||
 | 
					        section_title='Sign up'
 | 
				
			||||||
 | 
					        context['message'] = mark_safe(message)
 | 
				
			||||||
 | 
					        context['section_title'] = section_title
 | 
				
			||||||
 | 
					        return context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class SignupValidatedView(SignupValidateView):
 | 
				
			||||||
 | 
					    template_name = "hosting/signup_validate.html"
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    def get_context_data(self, **kwargs):
 | 
				
			||||||
 | 
					        context = super(SignupValidateView, self).get_context_data(**kwargs)
 | 
				
			||||||
 | 
					        validated = CustomUser.validate_url(self.kwargs['validate_slug'])
 | 
				
			||||||
 | 
					        login_url = reverse('hosting:login')
 | 
				
			||||||
 | 
					        if validated:
 | 
				
			||||||
 | 
					            message= _("Your account has been activated. You can now ") + '<a href="' + login_url +'">login</a>'
 | 
				
			||||||
 | 
					            section_title=_('Account activation')
 | 
				
			||||||
 | 
					        else:
 | 
				
			||||||
 | 
					            message= _("Sorry. Your request is invalid.") + '<a href="' + login_url +'">login</a>'
 | 
				
			||||||
 | 
					            section_title=_('Account activation')
 | 
				
			||||||
 | 
					        context['message'] = mark_safe(message)
 | 
				
			||||||
 | 
					        context['section_title'] = section_title
 | 
				
			||||||
 | 
					        return context
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class PasswordResetView(PasswordResetViewMixin):
 | 
					class PasswordResetView(PasswordResetViewMixin):
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,8 +1,4 @@
 | 
				
			||||||
from datetime import datetime
 | 
					from datetime import datetime
 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
from django.db import models
 | 
					from django.db import models
 | 
				
			||||||
from django.utils.translation import ugettext_lazy as _
 | 
					from django.utils.translation import ugettext_lazy as _
 | 
				
			||||||
from django.contrib.auth.models import User, AbstractBaseUser, BaseUserManager, AbstractUser, PermissionsMixin
 | 
					from django.contrib.auth.models import User, AbstractBaseUser, BaseUserManager, AbstractUser, PermissionsMixin
 | 
				
			||||||
| 
						 | 
					@ -13,6 +9,8 @@ from django.contrib.sites.models import Site
 | 
				
			||||||
 | 
					
 | 
				
			||||||
from utils.stripe_utils import StripeUtils
 | 
					from utils.stripe_utils import StripeUtils
 | 
				
			||||||
from utils.mailer import DigitalGlarusRegistrationMailer
 | 
					from utils.mailer import DigitalGlarusRegistrationMailer
 | 
				
			||||||
 | 
					from django.core.urlresolvers import reverse
 | 
				
			||||||
 | 
					from utils.mailer import BaseEmail
 | 
				
			||||||
 | 
					
 | 
				
			||||||
REGISTRATION_MESSAGE = {'subject': "Validation mail",
 | 
					REGISTRATION_MESSAGE = {'subject': "Validation mail",
 | 
				
			||||||
                        'message': 'Please validate Your account under this link http://localhost:8000/en-us/digitalglarus/login/validate/{}',
 | 
					                        'message': 'Please validate Your account under this link http://localhost:8000/en-us/digitalglarus/login/validate/{}',
 | 
				
			||||||
| 
						 | 
					@ -75,13 +73,27 @@ class CustomUser(AbstractBaseUser, PermissionsMixin):
 | 
				
			||||||
    REQUIRED_FIELDS = ['name', 'password']
 | 
					    REQUIRED_FIELDS = ['name', 'password']
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    @classmethod
 | 
					    @classmethod
 | 
				
			||||||
    def register(cls, name, password, email):
 | 
					    def register(cls, name, password, email, app='digital_glarus', base_url=None):
 | 
				
			||||||
        user = cls.objects.filter(email=email).first()
 | 
					        user = cls.objects.filter(email=email).first()
 | 
				
			||||||
        if not user:
 | 
					        if not user:
 | 
				
			||||||
            user = cls.objects.create_user(name=name, email=email, password=password)
 | 
					            user = cls.objects.create_user(name=name, email=email, password=password)
 | 
				
			||||||
            if user:
 | 
					            if user:
 | 
				
			||||||
 | 
					                if app == 'digital_glarus':
 | 
				
			||||||
                    dg = DigitalGlarusRegistrationMailer(user.validation_slug)
 | 
					                    dg = DigitalGlarusRegistrationMailer(user.validation_slug)
 | 
				
			||||||
                    dg.send_mail(to=user.email)
 | 
					                    dg.send_mail(to=user.email)
 | 
				
			||||||
 | 
					                elif app == 'dcl':
 | 
				
			||||||
 | 
					                    user.is_active = False
 | 
				
			||||||
 | 
					                    email_data = {
 | 
				
			||||||
 | 
					                        'subject': _('Activate your Data Center Light account'),
 | 
				
			||||||
 | 
					                        'from_address': '(Data Center Light) Data Center Light Support <support@datacenterlight.ch>',
 | 
				
			||||||
 | 
					                        'to': user.email,
 | 
				
			||||||
 | 
					                        'context': {'base_url'  : base_url, 
 | 
				
			||||||
 | 
					                                    'activation_link' : reverse('hosting:validate', kwargs={'validate_slug': user.validation_slug})},
 | 
				
			||||||
 | 
					                        'template_name': 'user_activation',
 | 
				
			||||||
 | 
					                        'template_path': 'datacenterlight/emails/'
 | 
				
			||||||
 | 
					                    }
 | 
				
			||||||
 | 
					                    email = BaseEmail(**email_data)
 | 
				
			||||||
 | 
					                    email.send()
 | 
				
			||||||
                return user
 | 
					                return user
 | 
				
			||||||
            else:
 | 
					            else:
 | 
				
			||||||
                return None
 | 
					                return None
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue