Merge branch 'develop' of https://github.com/ungleich/dynamicweb/
This commit is contained in:
		
				commit
				
					
						1ff411e426
					
				
			
		
					 9 changed files with 228 additions and 135 deletions
				
			
		
										
											Binary file not shown.
										
									
								
							| 
						 | 
				
			
			@ -8,7 +8,7 @@ msgid ""
 | 
			
		|||
msgstr ""
 | 
			
		||||
"Project-Id-Version: PACKAGE VERSION\n"
 | 
			
		||||
"Report-Msgid-Bugs-To: \n"
 | 
			
		||||
"POT-Creation-Date: 2017-05-20 11:12-0500\n"
 | 
			
		||||
"POT-Creation-Date: 2017-05-23 17:26-0500\n"
 | 
			
		||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 | 
			
		||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 | 
			
		||||
"Language-Team: LANGUAGE <LL@li.org>\n"
 | 
			
		||||
| 
						 | 
				
			
			@ -18,6 +18,20 @@ msgstr ""
 | 
			
		|||
"Content-Transfer-Encoding: 8bit\n"
 | 
			
		||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/beta_access.html:21
 | 
			
		||||
msgid "Request Beta Access"
 | 
			
		||||
msgstr "Beantrage Beta-Zugang"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/beta_success.html:9
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#| msgid "Request Beta Access"
 | 
			
		||||
msgid "Request Sent"
 | 
			
		||||
msgstr "Anfrage verschickt"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/beta_success.html:12
 | 
			
		||||
msgid "Thank you, we will contact you as soon as possible"
 | 
			
		||||
msgstr "Vielen Dank, wir werden Sie sobald als möglich kontaktieren."
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/emails/request_access_confirmation.html:99
 | 
			
		||||
#: templates/datacenterlight/emails/request_access_confirmation.txt:99
 | 
			
		||||
msgid "Thank you for your request."
 | 
			
		||||
| 
						 | 
				
			
			@ -52,27 +66,35 @@ msgid "Thank you!"
 | 
			
		|||
msgstr "Vielen Dank!"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:62
 | 
			
		||||
#: templates/datacenterlight/pricing.html:62
 | 
			
		||||
msgid "What is it"
 | 
			
		||||
msgstr "Was ist es?"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:65
 | 
			
		||||
#: templates/datacenterlight/index.html:171
 | 
			
		||||
#: templates/datacenterlight/index.html:362
 | 
			
		||||
#: templates/datacenterlight/index.html:331
 | 
			
		||||
#: templates/datacenterlight/pricing.html:65
 | 
			
		||||
#: templates/datacenterlight/pricing.html:188
 | 
			
		||||
msgid "Scale out"
 | 
			
		||||
msgstr "Skalierung"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:68
 | 
			
		||||
#: templates/datacenterlight/index.html:197
 | 
			
		||||
#: templates/datacenterlight/index.html:365
 | 
			
		||||
#: templates/datacenterlight/index.html:334
 | 
			
		||||
#: templates/datacenterlight/pricing.html:68
 | 
			
		||||
#: templates/datacenterlight/pricing.html:191
 | 
			
		||||
msgid "Reliable and light"
 | 
			
		||||
msgstr "Zuverlässig und leicht"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:71
 | 
			
		||||
#: templates/datacenterlight/pricing.html:71
 | 
			
		||||
msgid "Buy VM"
 | 
			
		||||
msgstr "VM Kaufen"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:74
 | 
			
		||||
#: templates/datacenterlight/index.html:372
 | 
			
		||||
#: templates/datacenterlight/index.html:341
 | 
			
		||||
#: templates/datacenterlight/pricing.html:74
 | 
			
		||||
#: templates/datacenterlight/pricing.html:198
 | 
			
		||||
msgid "Contact"
 | 
			
		||||
msgstr "Kontakt"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -89,7 +111,8 @@ msgid "I want it!"
 | 
			
		|||
msgstr "Das will ich haben!"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:142
 | 
			
		||||
#: templates/datacenterlight/index.html:359
 | 
			
		||||
#: templates/datacenterlight/index.html:328
 | 
			
		||||
#: templates/datacenterlight/pricing.html:185
 | 
			
		||||
msgid "How it works"
 | 
			
		||||
msgstr "Wie es funktioniert"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -132,6 +155,7 @@ msgstr ""
 | 
			
		|||
"Angebot ist aufgrund unserer leichten Infrastruktur überaus kostengünstig."
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:218
 | 
			
		||||
#: templates/datacenterlight/pricing.html:101
 | 
			
		||||
msgid "We are cutting down the costs significantly!"
 | 
			
		||||
msgstr "Wir sorgen dafür, dass die Kosten für Sie signifikant abnehmen"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -143,60 +167,70 @@ msgstr "Bezahlbares VM Hosting in der Schweiz"
 | 
			
		|||
msgid "More Info"
 | 
			
		||||
msgstr "Weitere Informationen"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:226
 | 
			
		||||
#: templates/datacenterlight/index.html:227
 | 
			
		||||
#: templates/datacenterlight/pricing.html:114
 | 
			
		||||
msgid "VM hosting"
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:233
 | 
			
		||||
#: templates/datacenterlight/index.html:234
 | 
			
		||||
msgid "Based in Switzerland"
 | 
			
		||||
msgstr "Standort des Datacenters ist in der Schweiz"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:242
 | 
			
		||||
msgid "15 GiB storage(SSD)"
 | 
			
		||||
msgstr ""
 | 
			
		||||
#: templates/datacenterlight/index.html:243
 | 
			
		||||
msgid "15 GB Storage (SSD)"
 | 
			
		||||
msgstr "15 GB Storage (SSD)"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:245
 | 
			
		||||
msgid "Buy Now!"
 | 
			
		||||
msgstr "Kaufe jetzt!"
 | 
			
		||||
#: templates/datacenterlight/index.html:246
 | 
			
		||||
#: templates/datacenterlight/pricing.html:156
 | 
			
		||||
msgid "Order Now!"
 | 
			
		||||
msgstr "Bestelle jetzt!"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:259
 | 
			
		||||
msgid "I want to try!"
 | 
			
		||||
msgstr "Das möchte ich haben"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:281
 | 
			
		||||
msgid "Request Beta Access"
 | 
			
		||||
msgstr "Beantrage Beta-Zugang"
 | 
			
		||||
#: templates/datacenterlight/index.html:262
 | 
			
		||||
msgid "Want to know more? Subscribe to our newsletter!"
 | 
			
		||||
msgstr "Willst du mehr wissen? Abonniere unseren Newsletter!"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:289
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#| msgid "Request Beta Access"
 | 
			
		||||
msgid "Request Sent"
 | 
			
		||||
msgstr "Anfrage verschickt"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:292
 | 
			
		||||
msgid "Thank you, we will contact you as soon as possible"
 | 
			
		||||
msgstr "Vielen Dank, wir werden Sie sobald als möglich kontaktieren."
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:320
 | 
			
		||||
msgid "Switzerland "
 | 
			
		||||
msgstr "Schweiz"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:337
 | 
			
		||||
#: templates/datacenterlight/index.html:306
 | 
			
		||||
msgid "Questions?"
 | 
			
		||||
msgstr "Fragen?"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:337
 | 
			
		||||
#: templates/datacenterlight/index.html:306
 | 
			
		||||
msgid "Contact us!"
 | 
			
		||||
msgstr "Kontaktiere uns!"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:355
 | 
			
		||||
#: templates/datacenterlight/index.html:324
 | 
			
		||||
#: templates/datacenterlight/pricing.html:181
 | 
			
		||||
msgid "Home"
 | 
			
		||||
msgstr "Home"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/index.html:368
 | 
			
		||||
#: templates/datacenterlight/index.html:337
 | 
			
		||||
#: templates/datacenterlight/pricing.html:194
 | 
			
		||||
msgid "Pricing"
 | 
			
		||||
msgstr "Preise"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/pricing.html:122
 | 
			
		||||
#, fuzzy
 | 
			
		||||
#| msgid "Based in Switzerland"
 | 
			
		||||
msgid "Hosted in Switzerland"
 | 
			
		||||
msgstr "Standort des Datacenters ist in der Schweiz"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/pricing.html:136
 | 
			
		||||
msgid "GB Storage (SSD)"
 | 
			
		||||
msgstr "GB Storage (SSD)"
 | 
			
		||||
 | 
			
		||||
#: templates/datacenterlight/pricing.html:163
 | 
			
		||||
msgid "Simple and affordable: Try our virtual machine with featherlight price."
 | 
			
		||||
msgstr ""
 | 
			
		||||
 | 
			
		||||
#~ msgid "Buy Now!"
 | 
			
		||||
#~ msgstr "Kaufe jetzt!"
 | 
			
		||||
 | 
			
		||||
#~ msgid "I want to try!"
 | 
			
		||||
#~ msgstr "Das möchte ich haben"
 | 
			
		||||
 | 
			
		||||
#~ msgid "How it works:"
 | 
			
		||||
#~ msgstr "Warum können wir diese Leistung so günstig anbieten:"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -123,7 +123,6 @@ h6 {
 | 
			
		|||
}
 | 
			
		||||
.navbar-transparent .navbar-nav>li>a {
 | 
			
		||||
    color: #fff;
 | 
			
		||||
    font-size: 17px;
 | 
			
		||||
    cursor: pointer;
 | 
			
		||||
}
 | 
			
		||||
.navbar-transparent .navbar-nav>li>a:hover {
 | 
			
		||||
| 
						 | 
				
			
			@ -139,6 +138,12 @@ h6 {
 | 
			
		|||
.navbar-right {
 | 
			
		||||
    margin-right: 0px;
 | 
			
		||||
}
 | 
			
		||||
.navbar-default .btn-link {
 | 
			
		||||
    color: #fff;
 | 
			
		||||
}
 | 
			
		||||
.navbar-default .btn-link:hover {
 | 
			
		||||
    color: #fff !important;
 | 
			
		||||
}
 | 
			
		||||
.intro-header {
 | 
			
		||||
    height: 100vh;
 | 
			
		||||
    text-align: center;
 | 
			
		||||
| 
						 | 
				
			
			@ -344,6 +349,13 @@ h6 {
 | 
			
		|||
    box-shadow: 0 10px 20px rgba(0,0,0,0.19), 0 6px 6px rgba(0,0,0,0.23);
 | 
			
		||||
    padding-bottom: 40px;
 | 
			
		||||
    border-radius: 7px;
 | 
			
		||||
    position: relative;
 | 
			
		||||
}
 | 
			
		||||
.pricing-section .card .img-beta{
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: 5px;
 | 
			
		||||
    width: 60px;
 | 
			
		||||
    left: 3px;
 | 
			
		||||
}
 | 
			
		||||
.pricing-section .card .title{
 | 
			
		||||
    padding: 15px 40px;
 | 
			
		||||
| 
						 | 
				
			
			@ -403,7 +415,7 @@ h6 {
 | 
			
		|||
}
 | 
			
		||||
.request-section .title h2{
 | 
			
		||||
    font-family: 'Montserrat-Bold';
 | 
			
		||||
    font-size: 65px;
 | 
			
		||||
    font-size: 45px;
 | 
			
		||||
    margin: 0;
 | 
			
		||||
    color: #fff;
 | 
			
		||||
    padding-bottom: 25px;
 | 
			
		||||
| 
						 | 
				
			
			@ -551,6 +563,13 @@ h6 {
 | 
			
		|||
    text-align: center;
 | 
			
		||||
    /* margin-right: auto; */
 | 
			
		||||
    max-width: 400px;
 | 
			
		||||
    position: relative;
 | 
			
		||||
}
 | 
			
		||||
.price-calc-section .card .img-beta{
 | 
			
		||||
    position: absolute;
 | 
			
		||||
    top: 5px;
 | 
			
		||||
    width: 60px;
 | 
			
		||||
    left: 3px;
 | 
			
		||||
}
 | 
			
		||||
.price-calc-section .card .title{
 | 
			
		||||
    padding: 15px 40px;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -9,17 +9,23 @@
 | 
			
		|||
        'cpu': {
 | 
			
		||||
            'id': 'coreValue',
 | 
			
		||||
            'value': 1,
 | 
			
		||||
            'limit': 48
 | 
			
		||||
            'min':1,
 | 
			
		||||
            'max': 48,
 | 
			
		||||
            'interval': 1
 | 
			
		||||
        },
 | 
			
		||||
        'ram': {
 | 
			
		||||
            'id': 'ramValue',
 | 
			
		||||
            'value': 1,
 | 
			
		||||
            'limit': 200
 | 
			
		||||
            'min':1,
 | 
			
		||||
            'max': 200,
 | 
			
		||||
            'interval': 1
 | 
			
		||||
        },
 | 
			
		||||
        'storage': {
 | 
			
		||||
            'id': 'storageValue',
 | 
			
		||||
            'value': 1,
 | 
			
		||||
            'limit': 500
 | 
			
		||||
            'value': 10,
 | 
			
		||||
            'min': 10,
 | 
			
		||||
            'max': 500,
 | 
			
		||||
            'interval': 10
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
    $(window).load(function(){
 | 
			
		||||
| 
						 | 
				
			
			@ -87,15 +93,15 @@
 | 
			
		|||
        $('.fa-minus-circle.left').click(function(event){
 | 
			
		||||
            var data = $(this).data('minus');
 | 
			
		||||
            
 | 
			
		||||
            if(cardPricing[data].value > 1){
 | 
			
		||||
            if(cardPricing[data].value > cardPricing[data].min){
 | 
			
		||||
                cardPricing[data].value --;
 | 
			
		||||
            }
 | 
			
		||||
            _fetchPricing();
 | 
			
		||||
        });
 | 
			
		||||
        $('.fa-plus-circle.right').click(function(event){
 | 
			
		||||
            var data = $(this).data('plus');
 | 
			
		||||
            if(cardPricing[data].value < cardPricing[data].limit){
 | 
			
		||||
                cardPricing[data].value ++;
 | 
			
		||||
            if(cardPricing[data].value < cardPricing[data].max){
 | 
			
		||||
                cardPricing[data].value = cardPricing[data].value + cardPricing[data].interval;
 | 
			
		||||
            }
 | 
			
		||||
            _fetchPricing();
 | 
			
		||||
        });
 | 
			
		||||
| 
						 | 
				
			
			@ -110,6 +116,7 @@
 | 
			
		|||
 | 
			
		||||
    function _calcPricing(){
 | 
			
		||||
        var total = (cardPricing['cpu'].value * 5) + (2* cardPricing['ram'].value) + (0.6* cardPricing['storage'].value) 
 | 
			
		||||
        total = parseFloat(total.toFixed(2));
 | 
			
		||||
 | 
			
		||||
        $("#total").text(total);
 | 
			
		||||
        $('input[name=total]').val(total);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -234,18 +234,20 @@
 | 
			
		|||
                                <p>{% trans "Based in Switzerland" %}</p>
 | 
			
		||||
                              </div>
 | 
			
		||||
                              <div class="description">
 | 
			
		||||
                                <p>1 core, </p>
 | 
			
		||||
                                <p>1 Core, </p>
 | 
			
		||||
                              </div>
 | 
			
		||||
                              <div class="description">
 | 
			
		||||
                                <p>2 GiB RAM, </p>
 | 
			
		||||
                                <p>2 GB RAM, </p>
 | 
			
		||||
                              </div>
 | 
			
		||||
                              <div class="description">
 | 
			
		||||
                                <p>{% trans "15 GiB storage(SSD)" %}</p>
 | 
			
		||||
                                <p>{% trans "15 GB Storage (SSD)" %}</p>
 | 
			
		||||
                              </div>
 | 
			
		||||
                          </div>
 | 
			
		||||
						  <a href="{% url 'datacenterlight:pricing' %}" class="btn btn-primary">{% trans "Order Now!" %}</a>
 | 
			
		||||
                      </div>
 | 
			
		||||
                      <img class="img-beta" src="{% static 'datacenterlight/img/beta.png' %}" alt="">
 | 
			
		||||
                    </div>
 | 
			
		||||
 | 
			
		||||
                </div>
 | 
			
		||||
            </div>
 | 
			
		||||
         </div>
 | 
			
		||||
| 
						 | 
				
			
			@ -257,7 +259,7 @@
 | 
			
		|||
            <div class="row">
 | 
			
		||||
                <div class="col-sm-6 col-md-6">
 | 
			
		||||
                    <div class="title">
 | 
			
		||||
                        <h2>{% trans "I want to try!" %}</h2>
 | 
			
		||||
                        <h2>{% trans "Want to know more? Subscribe to our newsletter!" %}</h2>
 | 
			
		||||
                    </div>
 | 
			
		||||
                </div>
 | 
			
		||||
                <div class="col-sm-6 col-md-6">
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -105,6 +105,7 @@
 | 
			
		|||
 | 
			
		||||
	<div class="price-calc-section">
 | 
			
		||||
		<div class="card">
 | 
			
		||||
      <img class="img-beta" src="{% static 'datacenterlight/img/beta.png' %}" alt="">
 | 
			
		||||
			 <div class="caption">
 | 
			
		||||
            <form method="POST" action="">
 | 
			
		||||
				{% csrf_token %}
 | 
			
		||||
| 
						 | 
				
			
			@ -122,7 +123,7 @@
 | 
			
		|||
                  </div>
 | 
			
		||||
                  <div class="description">
 | 
			
		||||
                     <i class="fa fa-minus-circle left" data-minus="cpu" aria-hidden="true"></i>
 | 
			
		||||
                     <span id="coreValue">1</span><span> core</span> 
 | 
			
		||||
                     <span id="coreValue">1</span><span> Core</span> 
 | 
			
		||||
                     <i class="fa fa-plus-circle right" data-plus="cpu"  aria-hidden="true"></i>
 | 
			
		||||
                  </div>
 | 
			
		||||
                  <div class="description">
 | 
			
		||||
| 
						 | 
				
			
			@ -132,14 +133,13 @@
 | 
			
		|||
                  </div>
 | 
			
		||||
                  <div class="description">
 | 
			
		||||
                  	<i class="fa fa-minus-circle left" data-minus="storage" aria-hidden="true"></i>
 | 
			
		||||
                    <span id="storageValue">15</span><span>{% trans "GiB storage(SSD)" %}</span>
 | 
			
		||||
                    <span id="storageValue">15</span><span>{% trans "GB Storage (SSD)" %}</span>
 | 
			
		||||
                     <i class="fa fa-plus-circle right" data-plus="storage"  aria-hidden="true"></i>
 | 
			
		||||
                  </div>
 | 
			
		||||
                 
 | 
			
		||||
 | 
			
		||||
                  <div class="description select-configuration">
 | 
			
		||||
                  	<select name="config" id="">
 | 
			
		||||
                  		<option value="" disabled selected>Configuration</option>
 | 
			
		||||
						{% for template in templates %}
 | 
			
		||||
                                <option value="{{template.id}}">{{template.name}} </option>
 | 
			
		||||
                        {% endfor %}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,7 +61,7 @@
 | 
			
		|||
            {% url 'hosting:payment' as payment_url %}
 | 
			
		||||
            {% if payment_url in request.META.HTTP_REFERER  %}
 | 
			
		||||
            <div class=" content pull-right">
 | 
			
		||||
                <a href="{% url 'hosting:key_pair'%}" ><button class="btn btn-info">{% trans "Finish Configuration"%}</button></a>
 | 
			
		||||
                <a href="{% url 'hosting:virtual_machines'%}" ><button class="btn btn-info">{% trans "Finish Configuration"%}</button></a>
 | 
			
		||||
            </div>
 | 
			
		||||
            {% endif %}
 | 
			
		||||
        </div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -40,6 +40,7 @@ from oca.pool import WrongNameError
 | 
			
		|||
CONNECTION_ERROR = "Your VMs cannot be displayed at the moment due to a backend \
 | 
			
		||||
                    connection error. please try again in a few minutes."
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class DjangoHostingView(ProcessVMSelectionMixin, View):
 | 
			
		||||
    template_name = "hosting/django.html"
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -187,9 +188,11 @@ class SignupView(CreateView):
 | 
			
		|||
    template_name = 'hosting/signup.html'
 | 
			
		||||
    form_class = HostingUserSignupForm
 | 
			
		||||
    model = CustomUser
 | 
			
		||||
    success_url = reverse_lazy('hosting:key_pair')
 | 
			
		||||
 | 
			
		||||
    def get_success_url(self):
 | 
			
		||||
        next_url = self.request.session.get('next', reverse_lazy('hosting:virtual_machines'))
 | 
			
		||||
        next_url = self.request.session.get(
 | 
			
		||||
            'next', self.success_url)
 | 
			
		||||
        return next_url
 | 
			
		||||
 | 
			
		||||
    def form_valid(self, form):
 | 
			
		||||
| 
						 | 
				
			
			@ -243,12 +246,14 @@ class PasswordResetConfirmView(PasswordResetConfirmViewMixin):
 | 
			
		|||
 | 
			
		||||
                return self.form_valid(form)
 | 
			
		||||
            else:
 | 
			
		||||
                messages.error(request, 'Password reset has not been successful.')
 | 
			
		||||
                messages.error(
 | 
			
		||||
                    request, 'Password reset has not been successful.')
 | 
			
		||||
                form.add_error(None, 'Password reset has not been successful.')
 | 
			
		||||
                return self.form_invalid(form)
 | 
			
		||||
 | 
			
		||||
        else:
 | 
			
		||||
            messages.error(request, 'The reset password link is no longer valid.')
 | 
			
		||||
            messages.error(
 | 
			
		||||
                request, 'The reset password link is no longer valid.')
 | 
			
		||||
            form.add_error(None, 'The reset password link is no longer valid.')
 | 
			
		||||
            return self.form_invalid(form)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -337,7 +342,20 @@ class GenerateVMSSHKeysView(LoginRequiredMixin, FormView):
 | 
			
		|||
                'form': UserHostingKeyForm(request=self.request),
 | 
			
		||||
            })
 | 
			
		||||
 | 
			
		||||
        # return HttpResponseRedirect(reverse('hosting:key_pair'))
 | 
			
		||||
        owner = self.request.user
 | 
			
		||||
        # Create OpenNebulaManager
 | 
			
		||||
        manager = OpenNebulaManager(email=owner.email,
 | 
			
		||||
                                    password=owner.password)
 | 
			
		||||
        # Get OpenNebula user id
 | 
			
		||||
        user_pool = manager._get_user_pool()
 | 
			
		||||
        opennebula_user = user_pool.get_by_name(owner.email)
 | 
			
		||||
 | 
			
		||||
        # Get user ssh key
 | 
			
		||||
        user_key = UserHostingKey.objects.get(user=owner)
 | 
			
		||||
        # Add ssh key to user
 | 
			
		||||
        manager.oneadmin_client.call('user.update', opennebula_user.id,
 | 
			
		||||
                                     '<CONTEXT><SSH_PUBLIC_KEY>{ssh_key}</SSH_PUBLIC_KEY></CONTEXT>'.format(ssh_key=user_key.public_key))
 | 
			
		||||
 | 
			
		||||
        return render(self.request, self.template_name, context)
 | 
			
		||||
 | 
			
		||||
    def post(self, request, *args, **kwargs):
 | 
			
		||||
| 
						 | 
				
			
			@ -385,9 +403,11 @@ class PaymentVMView(LoginRequiredMixin, FormView):
 | 
			
		|||
        user = self.request.user
 | 
			
		||||
 | 
			
		||||
        # Get user last order
 | 
			
		||||
        last_hosting_order = HostingOrder.objects.filter(customer__user=user).last()
 | 
			
		||||
        last_hosting_order = HostingOrder.objects.filter(
 | 
			
		||||
            customer__user=user).last()
 | 
			
		||||
 | 
			
		||||
        # If user has already an hosting order, get the credit card data from it
 | 
			
		||||
        # If user has already an hosting order, get the credit card data from
 | 
			
		||||
        # it
 | 
			
		||||
        if last_hosting_order:
 | 
			
		||||
            credit_card_data = last_hosting_order.get_cc_data()
 | 
			
		||||
            context.update({
 | 
			
		||||
| 
						 | 
				
			
			@ -476,7 +496,6 @@ class PaymentVMView(LoginRequiredMixin, FormView):
 | 
			
		|||
            except UserHostingKey.DoesNotExist:
 | 
			
		||||
                pass
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
            # Create a vm using logged user
 | 
			
		||||
            vm_id = manager.create_vm(
 | 
			
		||||
                template_id=vm_template_id,
 | 
			
		||||
| 
						 | 
				
			
			@ -494,14 +513,16 @@ class PaymentVMView(LoginRequiredMixin, FormView):
 | 
			
		|||
            )
 | 
			
		||||
 | 
			
		||||
            # Create a Hosting Bill
 | 
			
		||||
            bill = HostingBill.create(customer=customer, billing_address=billing_address)
 | 
			
		||||
            bill = HostingBill.create(
 | 
			
		||||
                customer=customer, billing_address=billing_address)
 | 
			
		||||
 | 
			
		||||
            # Create Billing Address for User if he does not have one
 | 
			
		||||
            if not customer.user.billing_addresses.count():
 | 
			
		||||
                billing_address_data.update({
 | 
			
		||||
                    'user': customer.user.id
 | 
			
		||||
                })
 | 
			
		||||
                billing_address_user_form = UserBillingAddressForm(billing_address_data)
 | 
			
		||||
                billing_address_user_form = UserBillingAddressForm(
 | 
			
		||||
                    billing_address_data)
 | 
			
		||||
                billing_address_user_form.is_valid()
 | 
			
		||||
                billing_address_user_form.save()
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -603,7 +624,6 @@ class VirtualMachinesPlanListView(LoginRequiredMixin, ListView):
 | 
			
		|||
            self.kwargs['error'] = 'connection'
 | 
			
		||||
            return []
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    def get_context_data(self, **kwargs):
 | 
			
		||||
        error = self.kwargs.get('error')
 | 
			
		||||
        if error is not None:
 | 
			
		||||
| 
						 | 
				
			
			@ -658,7 +678,8 @@ class CreateVirtualMachinesView(LoginRequiredMixin, View):
 | 
			
		|||
        template = manager.get_template(template_id)
 | 
			
		||||
        configuration_id = int(request.POST.get('configuration'))
 | 
			
		||||
        configuration = HostingPlan.objects.get(id=configuration_id)
 | 
			
		||||
        request.session['template'] = VirtualMachineTemplateSerializer(template).data
 | 
			
		||||
        request.session['template'] = VirtualMachineTemplateSerializer(
 | 
			
		||||
            template).data
 | 
			
		||||
 | 
			
		||||
        request.session['specs'] = configuration.serialize()
 | 
			
		||||
        return redirect(reverse('hosting:payment'))
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -10,6 +10,7 @@ from oca.pool import WrongNameError
 | 
			
		|||
from oca.exceptions import OpenNebulaException
 | 
			
		||||
logger = logging.getLogger(__name__)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class OpenNebulaManager():
 | 
			
		||||
    """This class represents an opennebula manager."""
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -66,6 +67,7 @@ class OpenNebulaManager():
 | 
			
		|||
                protocol=settings.OPENNEBULA_PROTOCOL)
 | 
			
		||||
            )
 | 
			
		||||
            raise ConnectionRefusedError
 | 
			
		||||
 | 
			
		||||
    def _get_user_pool(self):
 | 
			
		||||
        try:
 | 
			
		||||
            user_pool = oca.UserPool(self.oneadmin_client)
 | 
			
		||||
| 
						 | 
				
			
			@ -108,7 +110,6 @@ class OpenNebulaManager():
 | 
			
		|||
        except ConnectionRefusedError:
 | 
			
		||||
            raise ConnectionRefusedError
 | 
			
		||||
 | 
			
		||||
   
 | 
			
		||||
    def get_vm(self, vm_id):
 | 
			
		||||
        vm_id = int(vm_id)
 | 
			
		||||
        try:
 | 
			
		||||
| 
						 | 
				
			
			@ -196,12 +197,15 @@ class OpenNebulaManager():
 | 
			
		|||
                        """.format(size=1024 * int(specs['disk_size']),
 | 
			
		||||
                                   image=image,
 | 
			
		||||
                                   image_uname=image_uname)
 | 
			
		||||
        vm_id = template.instantiate(name ='',
 | 
			
		||||
                                    pending=False,
 | 
			
		||||
                                    extra_template=vm_specs,                                    )
 | 
			
		||||
        vm_id = self.client.call(oca.VmTemplate.METHODS['instantiate'],
 | 
			
		||||
                                 template.id,
 | 
			
		||||
                                 '',
 | 
			
		||||
                                 True,
 | 
			
		||||
                                 vm_specs,
 | 
			
		||||
                                 False)
 | 
			
		||||
 | 
			
		||||
        self.oneadmin_client.call(
 | 
			
		||||
            'vm.updateconf',
 | 
			
		||||
            'vm.update',
 | 
			
		||||
            vm_id,
 | 
			
		||||
            """<CONTEXT>
 | 
			
		||||
                <SSH_PUBLIC_KEY>{ssh}</SSH_PUBLIC_KEY>
 | 
			
		||||
| 
						 | 
				
			
			@ -216,7 +220,14 @@ class OpenNebulaManager():
 | 
			
		|||
                self.opennebula_user.group_ids[0]
 | 
			
		||||
            )
 | 
			
		||||
        except AttributeError:
 | 
			
		||||
            logger.info('Could not change owner for vm with id: {}.'.format(vm_id))
 | 
			
		||||
            logger.info(
 | 
			
		||||
                'Could not change owner for vm with id: {}.'.format(vm_id))
 | 
			
		||||
 | 
			
		||||
        self.oneadmin_client.call(
 | 
			
		||||
            oca.VirtualMachine.METHODS['action'],
 | 
			
		||||
            'release',
 | 
			
		||||
            vm_id
 | 
			
		||||
        )
 | 
			
		||||
        return vm_id
 | 
			
		||||
 | 
			
		||||
    def delete_vm(self, vm_id):
 | 
			
		||||
| 
						 | 
				
			
			@ -232,7 +243,8 @@ class OpenNebulaManager():
 | 
			
		|||
        except socket.timeout as socket_err:
 | 
			
		||||
            logger.info("Socket timeout error: {0}".format(socket_err))
 | 
			
		||||
        except OpenNebulaException as opennebula_err:
 | 
			
		||||
            logger.info("OpenNebulaException error: {0}".format(opennebula_err))
 | 
			
		||||
            logger.info(
 | 
			
		||||
                "OpenNebulaException error: {0}".format(opennebula_err))
 | 
			
		||||
        except OSError as os_err:
 | 
			
		||||
            logger.info("OSError : {0}".format(os_err))
 | 
			
		||||
        except ValueError as value_err:
 | 
			
		||||
| 
						 | 
				
			
			@ -254,7 +266,6 @@ class OpenNebulaManager():
 | 
			
		|||
        except:
 | 
			
		||||
            raise ConnectionRefusedError
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    def get_templates(self):
 | 
			
		||||
        try:
 | 
			
		||||
            public_templates = [
 | 
			
		||||
| 
						 | 
				
			
			@ -282,8 +293,6 @@ class OpenNebulaManager():
 | 
			
		|||
        except:
 | 
			
		||||
            raise ConnectionRefusedError
 | 
			
		||||
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
    def create_template(self, name, cores, memory, disk_size, core_price, memory_price,
 | 
			
		||||
                        disk_size_price, ssh=''):
 | 
			
		||||
        """Create and add a new template to opennebula.
 | 
			
		||||
| 
						 | 
				
			
			@ -332,7 +341,8 @@ class OpenNebulaManager():
 | 
			
		|||
        return template_id
 | 
			
		||||
 | 
			
		||||
    def delete_template(self, template_id):
 | 
			
		||||
        self.oneadmin_client.call(oca.VmTemplate.METHODS['delete'], template_id, False)
 | 
			
		||||
        self.oneadmin_client.call(oca.VmTemplate.METHODS[
 | 
			
		||||
                                  'delete'], template_id, False)
 | 
			
		||||
 | 
			
		||||
    def change_user_password(self, new_password):
 | 
			
		||||
        self.oneadmin_client.call(
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue