Merge master into task/3730/refactor_price_parameter
This commit is contained in:
commit
c17604e5c1
11 changed files with 199 additions and 64 deletions
|
@ -1,4 +1,4 @@
|
||||||
Pre-changelog: 1.2.3 2017-09-20
|
1.2.3: 2017-09-25
|
||||||
* #3484: [dcl, hosting] Refactored account activation, password reset, VM order and cancellation email
|
* #3484: [dcl, hosting] Refactored account activation, password reset, VM order and cancellation email
|
||||||
* #3731: [dcl, hosting] Added cdist ssh key handler
|
* #3731: [dcl, hosting] Added cdist ssh key handler
|
||||||
* #3628: [dcl] on hosting, VM is created at credit card info submit
|
* #3628: [dcl] on hosting, VM is created at credit card info submit
|
||||||
|
@ -6,6 +6,8 @@ Pre-changelog: 1.2.3 2017-09-20
|
||||||
* #3786: [hosting] Redesigned the hosting invoice and order-confirmation page
|
* #3786: [hosting] Redesigned the hosting invoice and order-confirmation page
|
||||||
* #3728: [hosting] VM Termination animation added
|
* #3728: [hosting] VM Termination animation added
|
||||||
* #3777: [hosting] Create new VM calculator added like dcl landing
|
* #3777: [hosting] Create new VM calculator added like dcl landing
|
||||||
|
* #3781: [hosting] Resend activation mail
|
||||||
|
* #3806: [hosting] Fix can not create VMs after password reset
|
||||||
* Feature: [cms, blog] Added /cms prefix for all the django-cms generated urls
|
* Feature: [cms, blog] Added /cms prefix for all the django-cms generated urls
|
||||||
* Bugfix: [dcl, hosting] added host to celery error mails
|
* Bugfix: [dcl, hosting] added host to celery error mails
|
||||||
* Bugfix: [ungleich] Fixed wrong subdomain digitalglarus.ungleich.ch
|
* Bugfix: [ungleich] Fixed wrong subdomain digitalglarus.ungleich.ch
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2017-09-23 19:00+0530\n"
|
"POT-Creation-Date: 2017-09-24 12:34+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -28,10 +28,10 @@ msgid "User does not exist"
|
||||||
msgstr "Der Benutzer existiert nicht"
|
msgstr "Der Benutzer existiert nicht"
|
||||||
|
|
||||||
msgid "Paste here your public key"
|
msgid "Paste here your public key"
|
||||||
msgstr "Füge deinen Public Key ein"
|
msgstr "Füge Deinen Public Key ein"
|
||||||
|
|
||||||
msgid "Give a name to your key"
|
msgid "Give a name to your key"
|
||||||
msgstr "Gebe deinem SSH-Key einen Name"
|
msgstr "Gebe Deinem SSH-Key einen Name"
|
||||||
|
|
||||||
msgid "Key name"
|
msgid "Key name"
|
||||||
msgstr "Key-Name"
|
msgstr "Key-Name"
|
||||||
|
@ -156,10 +156,10 @@ msgid "Upload"
|
||||||
msgstr "Hochladen"
|
msgstr "Hochladen"
|
||||||
|
|
||||||
msgid "Your VM hosted in Switzerland"
|
msgid "Your VM hosted in Switzerland"
|
||||||
msgstr "deine VM in der Schweiz"
|
msgstr "Deine VM in der Schweiz"
|
||||||
|
|
||||||
msgid "Set your new password"
|
msgid "Set your new password"
|
||||||
msgstr "Setze dein neues Passwort"
|
msgstr "Setze Dein neues Passwort"
|
||||||
|
|
||||||
msgid "Reset"
|
msgid "Reset"
|
||||||
msgstr "Zurücksetzen"
|
msgstr "Zurücksetzen"
|
||||||
|
@ -180,7 +180,7 @@ msgid "My VMs"
|
||||||
msgstr "Meine VMs"
|
msgstr "Meine VMs"
|
||||||
|
|
||||||
msgid "My SSH Keys"
|
msgid "My SSH Keys"
|
||||||
msgstr "Meine SSH Keys"
|
msgstr "Meine SSH-Keys"
|
||||||
|
|
||||||
msgid "My Bills"
|
msgid "My Bills"
|
||||||
msgstr "Meine Rechnungen"
|
msgstr "Meine Rechnungen"
|
||||||
|
@ -229,10 +229,10 @@ msgid ""
|
||||||
"Thank you!\n"
|
"Thank you!\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"\n"
|
"\n"
|
||||||
"Du erhälst diese E-Mail da du dein Passwort für deinen Account bei "
|
"Du erhälst diese E-Mail da Du Dein Passwort für Deinen Account bei "
|
||||||
"%(site_name)s zurücksetzen möchtest.<br/>\n"
|
"%(site_name)s zurücksetzen möchtest.<br/>\n"
|
||||||
"Bitte folge diesem Link und wähle ein neues Passwort: %(base_url)s"
|
"Bitte folge diesem Link und wähle ein neues Passwort: %(base_url)s"
|
||||||
"%(password_reset_url)s Solltest du kein neues Passwort angefordert haben, "
|
"%(password_reset_url)s Solltest Du kein neues Passwort angefordert haben, "
|
||||||
"dann ignoriere diese E-Mail.<br/>\n"
|
"dann ignoriere diese E-Mail.<br/>\n"
|
||||||
"Dankeschön!\n"
|
"Dankeschön!\n"
|
||||||
|
|
||||||
|
@ -245,10 +245,10 @@ msgid ""
|
||||||
"If you didn't request a new password, ignore this e-mail.\n"
|
"If you didn't request a new password, ignore this e-mail.\n"
|
||||||
"Thank you!\n"
|
"Thank you!\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Du erhälst diese E-Mail da du dein Passwort für deinen Account bei "
|
"Du erhälst diese E-Mail da Du Dein Passwort für Deinen Account bei "
|
||||||
"%(site_name)s zurücksetzen möchtest.\n"
|
"%(site_name)s zurücksetzen möchtest.\n"
|
||||||
"Bitte folge diesem Link und wähle ein neues Passwort: %(base_url)s"
|
"Bitte folge diesem Link und wähle ein neues Passwort: %(base_url)s"
|
||||||
"%(password_reset_url)s Solltest du kein neues Passwort angefordert haben, "
|
"%(password_reset_url)s Solltest Du kein neues Passwort angefordert haben, "
|
||||||
"dann ignoriere diese E-Mail.\n"
|
"dann ignoriere diese E-Mail.\n"
|
||||||
"Dankeschön!\n"
|
"Dankeschön!\n"
|
||||||
|
|
||||||
|
@ -260,11 +260,11 @@ msgid ""
|
||||||
"If you want to order a new virtual machine, you can do it by clicking <a "
|
"If you want to order a new virtual machine, you can do it by clicking <a "
|
||||||
"href=\"%(base_url)s%(my_virtual_machines_url)s\">this link</a>.<br/>\n"
|
"href=\"%(base_url)s%(my_virtual_machines_url)s\">this link</a>.<br/>\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Du erhälst diese E-Mail, da deine virtuelle Maschine [%(vm_name)s] gekündigt "
|
"Du erhälst diese E-Mail, Da Deine virtuelle Maschine [%(vm_name)s] gekündigt "
|
||||||
"wurde.<br/>\n"
|
"wurde.<br/>\n"
|
||||||
"Um deinen Auftragsstatus zu sehen, klicke auf die [my VM page] unten.<br/>\n"
|
"Um Deinen Auftragsstatus zu sehen, klicke auf die [my VM page] unten.<br/>\n"
|
||||||
"Falls du eine neue virtuelle Maschine bestellen möchtest, kannst du dies "
|
"Falls Du eine neue virtuelle Maschine bestellen möchtest, kannst Du dies "
|
||||||
"tun, indem du <a href=\"%(base_url)s%(my_virtual_machines_url)s\">diesen "
|
"tun, indem Du <a href=\"%(base_url)s%(my_virtual_machines_url)s\">diesen "
|
||||||
"Link klickst</a>.<br/>\n"
|
"Link klickst</a>.<br/>\n"
|
||||||
|
|
||||||
msgid "My VM page"
|
msgid "My VM page"
|
||||||
|
@ -280,12 +280,12 @@ msgid ""
|
||||||
"link.\n"
|
"link.\n"
|
||||||
"%(base_url)s%(my_virtual_machines_url)s\n"
|
"%(base_url)s%(my_virtual_machines_url)s\n"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Du erhälst diese E-Mail, da deine virtuelle Maschine [%(vm_name)s] gekündigt "
|
"Du erhälst diese E-Mail, da Deine virtuelle Maschine [%(vm_name)s] gekündigt "
|
||||||
"wurde.\n"
|
"wurde.\n"
|
||||||
"Um deinen Auftragsstatus zu sehen, klicke hier.\n"
|
"Um Deinen Auftragsstatus zu sehen, klicke hier.\n"
|
||||||
"%(base_url)s%(vm_order_url)s\n"
|
"%(base_url)s%(vm_order_url)s\n"
|
||||||
"Falls du eine neue virtuelle Maschine bestellen möchtest, kannst du dies "
|
"Falls Du eine neue virtuelle Maschine bestellen möchtest, kannst Du dies "
|
||||||
"tun, indem du diesen Link klickst.\n"
|
"tun, indem Du diesen Link klickst.\n"
|
||||||
"%(base_url)s%(my_virtual_machines_url)s\n"
|
"%(base_url)s%(my_virtual_machines_url)s\n"
|
||||||
|
|
||||||
msgid "Toggle navigation"
|
msgid "Toggle navigation"
|
||||||
|
@ -306,6 +306,9 @@ msgstr "Registrieren"
|
||||||
msgid "Forgot your password ? "
|
msgid "Forgot your password ? "
|
||||||
msgstr "Passwort vergessen?"
|
msgstr "Passwort vergessen?"
|
||||||
|
|
||||||
|
msgid "Resend activation link"
|
||||||
|
msgstr "Aktivierungslink noch einmal senden"
|
||||||
|
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "Benachrichtigungen"
|
msgstr "Benachrichtigungen"
|
||||||
|
|
||||||
|
@ -353,7 +356,7 @@ msgid "Order summary"
|
||||||
msgstr "Bestellungsübersicht"
|
msgstr "Bestellungsübersicht"
|
||||||
|
|
||||||
msgid "Product"
|
msgid "Product"
|
||||||
msgstr ""
|
msgstr "Produkt"
|
||||||
|
|
||||||
msgid "Cores"
|
msgid "Cores"
|
||||||
msgstr "Prozessorkerne"
|
msgstr "Prozessorkerne"
|
||||||
|
@ -588,7 +591,7 @@ msgid "We are here to help you!"
|
||||||
msgstr "Wir sind hier, um Dir zu helfen!"
|
msgstr "Wir sind hier, um Dir zu helfen!"
|
||||||
|
|
||||||
msgid "CONTACT"
|
msgid "CONTACT"
|
||||||
msgstr "KONTACT"
|
msgstr "KONTAKT"
|
||||||
|
|
||||||
msgid "Terminate your Virtual Machine"
|
msgid "Terminate your Virtual Machine"
|
||||||
msgstr "Deine Virtuelle Maschine beenden"
|
msgstr "Deine Virtuelle Maschine beenden"
|
||||||
|
@ -601,8 +604,11 @@ msgstr ""
|
||||||
|
|
||||||
#, python-format
|
#, python-format
|
||||||
msgid ""
|
msgid ""
|
||||||
"Your Virtual Machine %(virtual_machine.name)s is successfully terminated!"
|
"Your Virtual Machine <strong>%(machine_name)s</strong> is successfully "
|
||||||
msgstr "Deine Virtuelle Machine (VM) %(virtual_machine.name)s wurde erfolgreich beendet!"
|
"terminated!"
|
||||||
|
msgstr ""
|
||||||
|
"Deine Virtuelle Machine (VM) <strong>%(machine_name)s</strong> wurde erfolgreich "
|
||||||
|
"beendet!"
|
||||||
|
|
||||||
msgid "Virtual Machines"
|
msgid "Virtual Machines"
|
||||||
msgstr "Virtuelle Maschinen"
|
msgstr "Virtuelle Maschinen"
|
||||||
|
@ -644,13 +650,13 @@ msgid "Sorry. Your request is invalid."
|
||||||
msgstr "Entschuldigung, deine Anfrage ist ungültig."
|
msgstr "Entschuldigung, deine Anfrage ist ungültig."
|
||||||
|
|
||||||
msgid "Password has been reset."
|
msgid "Password has been reset."
|
||||||
msgstr ""
|
msgstr "Dein Passwort wurde erfolgreich zurückgesetzt."
|
||||||
|
|
||||||
msgid "Password reset has not been successful."
|
msgid "Password reset has not been successful."
|
||||||
msgstr ""
|
msgstr "Dein Passwort konnte nicht zurückgesetzt werden."
|
||||||
|
|
||||||
msgid "The reset password link is no longer valid."
|
msgid "The reset password link is no longer valid."
|
||||||
msgstr ""
|
msgstr "Der Link zum Zurücksetzen Deines Passwortes ist nicht mehr gültig."
|
||||||
|
|
||||||
msgid "Invalid credit card"
|
msgid "Invalid credit card"
|
||||||
msgstr "Ungültige Kreditkarte"
|
msgstr "Ungültige Kreditkarte"
|
||||||
|
@ -707,7 +713,7 @@ msgstr "VM Kündigung"
|
||||||
#~ msgstr "VM %(VM_ID)s erfolgreich beendet"
|
#~ msgstr "VM %(VM_ID)s erfolgreich beendet"
|
||||||
|
|
||||||
#~ msgid "days"
|
#~ msgid "days"
|
||||||
#~ msgstr "tage"
|
#~ msgstr "Tage"
|
||||||
|
|
||||||
#~ msgid "New Virtual Machine"
|
#~ msgid "New Virtual Machine"
|
||||||
#~ msgstr "Neue virtuelle Maschine"
|
#~ msgstr "Neue virtuelle Maschine"
|
||||||
|
@ -740,7 +746,7 @@ msgstr "VM Kündigung"
|
||||||
#~ msgstr "Meine Bestellungen"
|
#~ msgstr "Meine Bestellungen"
|
||||||
|
|
||||||
#~ msgid "SSH Keys"
|
#~ msgid "SSH Keys"
|
||||||
#~ msgstr "SSH Key"
|
#~ msgstr "SSH Keys"
|
||||||
|
|
||||||
#~ msgid "Notifications "
|
#~ msgid "Notifications "
|
||||||
#~ msgstr "Benachrichtigungen"
|
#~ msgstr "Benachrichtigungen"
|
||||||
|
@ -788,19 +794,19 @@ msgstr "VM Kündigung"
|
||||||
#~ msgstr "Hinzufügen"
|
#~ msgstr "Hinzufügen"
|
||||||
|
|
||||||
#~ msgid "Keys"
|
#~ msgid "Keys"
|
||||||
#~ msgstr "Schlüssel"
|
#~ msgstr "Keys"
|
||||||
|
|
||||||
#~ msgid "Log in"
|
#~ msgid "Log in"
|
||||||
#~ msgstr "Anmelden"
|
#~ msgstr "Anmelden"
|
||||||
|
|
||||||
#~ msgid "You haven been logged out"
|
#~ msgid "You haven been logged out"
|
||||||
#~ msgstr "Sie wurden abgmeldet"
|
#~ msgstr "Du wurdest abgemeldet"
|
||||||
|
|
||||||
#~ msgid "How it works"
|
#~ msgid "How it works"
|
||||||
#~ msgstr "So funktioniert es"
|
#~ msgstr "So funktioniert es"
|
||||||
|
|
||||||
#~ msgid "Your infrastructure"
|
#~ msgid "Your infrastructure"
|
||||||
#~ msgstr "deine Infrastruktur"
|
#~ msgstr "Deine Infrastruktur"
|
||||||
|
|
||||||
#~ msgid "Our inftrastructure"
|
#~ msgid "Our inftrastructure"
|
||||||
#~ msgstr "Unsere Infrastruktur"
|
#~ msgstr "Unsere Infrastruktur"
|
||||||
|
@ -809,10 +815,10 @@ msgstr "VM Kündigung"
|
||||||
#~ msgstr "Preise"
|
#~ msgstr "Preise"
|
||||||
|
|
||||||
#~ msgid "Access Key"
|
#~ msgid "Access Key"
|
||||||
#~ msgstr "Zugriffsschlüssel"
|
#~ msgstr "SSH Key"
|
||||||
|
|
||||||
#~ msgid "Upload your own key. "
|
#~ msgid "Upload your own key. "
|
||||||
#~ msgstr "Lade deinen Key hoch"
|
#~ msgstr "Lade Deinen Key hoch"
|
||||||
|
|
||||||
#~ msgid "Generate Key Pair"
|
#~ msgid "Generate Key Pair"
|
||||||
#~ msgstr "Schlüsselpaar generieren"
|
#~ msgstr "Schlüsselpaar generieren"
|
||||||
|
@ -836,5 +842,5 @@ msgstr "VM Kündigung"
|
||||||
#~ "Your SSH private key was already generated and downloaded, if you lost "
|
#~ "Your SSH private key was already generated and downloaded, if you lost "
|
||||||
#~ "it, contact us. "
|
#~ "it, contact us. "
|
||||||
#~ msgstr ""
|
#~ msgstr ""
|
||||||
#~ "Dein privater SSH Schlüssel wurde bereits generiert und heruntergeladen. "
|
#~ "Dein privater SSH Key wurde bereits generiert und heruntergeladen. "
|
||||||
#~ "Falls du ihn verloren hast, kontaktiere uns."
|
#~ "Falls Du ihn verloren hast, kontaktiere uns."
|
||||||
|
|
|
@ -44,6 +44,8 @@
|
||||||
<a class="unlink" href="{% url 'hosting:signup' %}">{% trans "Sign up"%}</a>
|
<a class="unlink" href="{% url 'hosting:signup' %}">{% trans "Sign up"%}</a>
|
||||||
<span class="text"> or </span>
|
<span class="text"> or </span>
|
||||||
<a class="unlink" href="{% url 'hosting:reset_password' %}">{% trans "Forgot your password ? "%}</a>
|
<a class="unlink" href="{% url 'hosting:reset_password' %}">{% trans "Forgot your password ? "%}</a>
|
||||||
|
<span class="text"> or </span><br/>
|
||||||
|
<a class="unlink" href="{% url 'hosting:resend_activation_link' %}">{% trans "Resend activation link"%}</a>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
36
hosting/templates/hosting/resend_activation_link.html
Normal file
36
hosting/templates/hosting/resend_activation_link.html
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
{% extends "hosting/base_short.html" %}
|
||||||
|
{% load staticfiles bootstrap3%}
|
||||||
|
{% load i18n %}
|
||||||
|
|
||||||
|
{% block navbar %}
|
||||||
|
{% include 'hosting/includes/_navbar_transparent.html' %}
|
||||||
|
{% endblock navbar %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
<div class="auth-container">
|
||||||
|
<div class="auth-bg"></div>
|
||||||
|
<div class="auth-center">
|
||||||
|
<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">{% trans "Resend activation link"%}</h2>
|
||||||
|
<form action="{% url 'hosting:resend_activation_link' %}" method="post" class="form" novalidate>
|
||||||
|
{% csrf_token %}
|
||||||
|
{% for field in form %}
|
||||||
|
{% bootstrap_field field show_label=False %}
|
||||||
|
{% endfor %}
|
||||||
|
{% buttons %}
|
||||||
|
<button type="submit" class="btn btn-block btn-success">
|
||||||
|
{% trans "Submit"%}
|
||||||
|
</button>
|
||||||
|
{% endbuttons %}
|
||||||
|
</form>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -8,8 +8,7 @@ from .views import (
|
||||||
MarkAsReadNotificationView, PasswordResetView, PasswordResetConfirmView,
|
MarkAsReadNotificationView, PasswordResetView, PasswordResetConfirmView,
|
||||||
HostingPricingView, CreateVirtualMachinesView, HostingBillListView,
|
HostingPricingView, CreateVirtualMachinesView, HostingBillListView,
|
||||||
HostingBillDetailView, SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView,
|
HostingBillDetailView, SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView,
|
||||||
SSHKeyChoiceView, DashboardView, SettingsView)
|
SSHKeyChoiceView, DashboardView, SettingsView, ResendActivationEmailView)
|
||||||
|
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
url(r'index/?$', IndexView.as_view(), name='index'),
|
url(r'index/?$', IndexView.as_view(), name='index'),
|
||||||
|
@ -52,6 +51,8 @@ urlpatterns = [
|
||||||
url(r'signup/?$', SignupView.as_view(), name='signup'),
|
url(r'signup/?$', SignupView.as_view(), name='signup'),
|
||||||
url(r'signup-validate/?$', SignupValidateView.as_view(),
|
url(r'signup-validate/?$', SignupValidateView.as_view(),
|
||||||
name='signup-validate'),
|
name='signup-validate'),
|
||||||
|
url(r'resend-activation-link/?$', ResendActivationEmailView.as_view(),
|
||||||
|
name='resend_activation_link'),
|
||||||
url(r'reset-password/?$', PasswordResetView.as_view(),
|
url(r'reset-password/?$', PasswordResetView.as_view(),
|
||||||
name='reset_password'),
|
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>.+)/$',
|
||||||
|
|
|
@ -33,13 +33,16 @@ from membership.models import CustomUser, StripeCustomer
|
||||||
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, VMTemplateSerializer
|
VirtualMachineTemplateSerializer, VMTemplateSerializer
|
||||||
from utils.forms import BillingAddressForm, PasswordResetRequestForm, \
|
from utils.forms import (
|
||||||
UserBillingAddressForm
|
BillingAddressForm, PasswordResetRequestForm, UserBillingAddressForm,
|
||||||
|
ResendActivationEmailForm
|
||||||
|
)
|
||||||
from utils.hosting_utils import get_vm_price
|
from utils.hosting_utils import get_vm_price
|
||||||
from utils.mailer import BaseEmail
|
from utils.mailer import BaseEmail
|
||||||
from utils.stripe_utils import StripeUtils
|
from utils.stripe_utils import StripeUtils
|
||||||
from utils.views import (
|
from utils.views import (
|
||||||
PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin
|
PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin,
|
||||||
|
ResendActivationLinkViewMixin
|
||||||
)
|
)
|
||||||
from .forms import HostingUserSignupForm, HostingUserLoginForm, \
|
from .forms import HostingUserSignupForm, HostingUserLoginForm, \
|
||||||
UserHostingKeyForm, generate_ssh_key_name
|
UserHostingKeyForm, generate_ssh_key_name
|
||||||
|
@ -47,6 +50,7 @@ from .mixins import ProcessVMSelectionMixin
|
||||||
from .models import HostingOrder, HostingBill, HostingPlan, UserHostingKey
|
from .models import HostingOrder, HostingBill, HostingPlan, UserHostingKey
|
||||||
from datacenterlight.models import VMTemplate
|
from datacenterlight.models import VMTemplate
|
||||||
|
|
||||||
|
|
||||||
logger = logging.getLogger(__name__)
|
logger = logging.getLogger(__name__)
|
||||||
|
|
||||||
CONNECTION_ERROR = "Your VMs cannot be displayed at the moment due to a \
|
CONNECTION_ERROR = "Your VMs cannot be displayed at the moment due to a \
|
||||||
|
@ -282,6 +286,14 @@ class SignupValidatedView(SignupValidateView):
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
class ResendActivationEmailView(ResendActivationLinkViewMixin):
|
||||||
|
template_name = 'hosting/resend_activation_link.html'
|
||||||
|
form_class = ResendActivationEmailForm
|
||||||
|
success_url = reverse_lazy('hosting:login')
|
||||||
|
email_template_path = 'datacenterlight/emails/'
|
||||||
|
email_template_name = 'user_activation'
|
||||||
|
|
||||||
|
|
||||||
class PasswordResetView(PasswordResetViewMixin):
|
class PasswordResetView(PasswordResetViewMixin):
|
||||||
site = 'dcl'
|
site = 'dcl'
|
||||||
template_name = 'hosting/reset_password.html'
|
template_name = 'hosting/reset_password.html'
|
||||||
|
@ -319,7 +331,7 @@ class PasswordResetConfirmView(PasswordResetConfirmViewMixin):
|
||||||
messages.success(request, _('Password has been reset.'))
|
messages.success(request, _('Password has been reset.'))
|
||||||
|
|
||||||
# Change opennebula password
|
# Change opennebula password
|
||||||
opennebula_client.change_user_password(new_password)
|
opennebula_client.change_user_password(user.password)
|
||||||
|
|
||||||
return self.form_valid(form)
|
return self.form_valid(form)
|
||||||
else:
|
else:
|
||||||
|
|
|
@ -438,11 +438,11 @@ class OpenNebulaManager():
|
||||||
self.oneadmin_client.call(oca.VmTemplate.METHODS[
|
self.oneadmin_client.call(oca.VmTemplate.METHODS[
|
||||||
'delete'], template_id, False)
|
'delete'], template_id, False)
|
||||||
|
|
||||||
def change_user_password(self, new_password):
|
def change_user_password(self, passwd_hash):
|
||||||
self.oneadmin_client.call(
|
self.oneadmin_client.call(
|
||||||
oca.User.METHODS['passwd'],
|
oca.User.METHODS['passwd'],
|
||||||
self.opennebula_user.id,
|
self.opennebula_user.id,
|
||||||
new_password
|
passwd_hash
|
||||||
)
|
)
|
||||||
|
|
||||||
def add_public_key(self, user, public_key='', merge=False):
|
def add_public_key(self, user, public_key='', merge=False):
|
||||||
|
|
|
@ -96,5 +96,4 @@ pyflakes==1.5.0
|
||||||
billiard==3.5.0.3
|
billiard==3.5.0.3
|
||||||
amqp==2.2.1
|
amqp==2.2.1
|
||||||
vine==1.1.4
|
vine==1.1.4
|
||||||
#git+https://github.com/ungleich/cdist.git#egg=cdist
|
cdist==4.7.0
|
||||||
file:///home/app/cdist#egg=cdist
|
|
||||||
|
|
|
@ -18,7 +18,8 @@ class SignupFormMixin(forms.ModelForm):
|
||||||
model = CustomUser
|
model = CustomUser
|
||||||
fields = ['name', 'email', 'password']
|
fields = ['name', 'email', 'password']
|
||||||
widgets = {
|
widgets = {
|
||||||
'name': forms.TextInput(attrs={'placeholder': _('Enter your name or company name')}),
|
'name': forms.TextInput(
|
||||||
|
attrs={'placeholder': _('Enter your name or company name')}),
|
||||||
}
|
}
|
||||||
|
|
||||||
def clean_confirm_password(self):
|
def clean_confirm_password(self):
|
||||||
|
@ -42,7 +43,7 @@ class LoginFormMixin(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(
|
raise forms.ValidationError(
|
||||||
"Your username and/or password were incorrect.")
|
_("Your username and/or password were incorrect."))
|
||||||
return self.cleaned_data
|
return self.cleaned_data
|
||||||
|
|
||||||
def clean_email(self):
|
def clean_email(self):
|
||||||
|
@ -51,7 +52,24 @@ class LoginFormMixin(forms.Form):
|
||||||
CustomUser.objects.get(email=email)
|
CustomUser.objects.get(email=email)
|
||||||
return email
|
return email
|
||||||
except CustomUser.DoesNotExist:
|
except CustomUser.DoesNotExist:
|
||||||
raise forms.ValidationError("User does not exist")
|
raise forms.ValidationError(_("User does not exist"))
|
||||||
|
|
||||||
|
|
||||||
|
class ResendActivationEmailForm(forms.Form):
|
||||||
|
email = forms.CharField(widget=forms.EmailInput())
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
fields = ['email']
|
||||||
|
|
||||||
|
def clean_email(self):
|
||||||
|
email = self.cleaned_data.get('email')
|
||||||
|
try:
|
||||||
|
c = CustomUser.objects.get(email=email)
|
||||||
|
if c.validated == 1:
|
||||||
|
raise forms.ValidationError(_("The account is already active."))
|
||||||
|
return email
|
||||||
|
except CustomUser.DoesNotExist:
|
||||||
|
raise forms.ValidationError(_("User does not exist"))
|
||||||
|
|
||||||
|
|
||||||
class PasswordResetRequestForm(forms.Form):
|
class PasswordResetRequestForm(forms.Form):
|
||||||
|
@ -66,7 +84,7 @@ class PasswordResetRequestForm(forms.Form):
|
||||||
CustomUser.objects.get(email=email)
|
CustomUser.objects.get(email=email)
|
||||||
return email
|
return email
|
||||||
except CustomUser.DoesNotExist:
|
except CustomUser.DoesNotExist:
|
||||||
raise forms.ValidationError("User does not exist")
|
raise forms.ValidationError(_("User does not exist"))
|
||||||
|
|
||||||
|
|
||||||
class SetPasswordForm(forms.Form):
|
class SetPasswordForm(forms.Form):
|
||||||
|
@ -75,11 +93,11 @@ class SetPasswordForm(forms.Form):
|
||||||
password
|
password
|
||||||
"""
|
"""
|
||||||
error_messages = {
|
error_messages = {
|
||||||
'password_mismatch': ("The two password fields didn't match."),
|
'password_mismatch': _("The two password fields didn't match."),
|
||||||
}
|
}
|
||||||
new_password1 = forms.CharField(label=("New password"),
|
new_password1 = forms.CharField(label=_("New password"),
|
||||||
widget=forms.PasswordInput)
|
widget=forms.PasswordInput)
|
||||||
new_password2 = forms.CharField(label=("New password confirmation"),
|
new_password2 = forms.CharField(label=_("New password confirmation"),
|
||||||
widget=forms.PasswordInput)
|
widget=forms.PasswordInput)
|
||||||
|
|
||||||
def clean_new_password2(self):
|
def clean_new_password2(self):
|
||||||
|
|
|
@ -8,7 +8,7 @@ msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: PACKAGE VERSION\n"
|
"Project-Id-Version: PACKAGE VERSION\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2017-09-02 11:50+0000\n"
|
"POT-Creation-Date: 2017-09-25 20:11+0000\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||||
|
@ -738,6 +738,24 @@ msgstr ""
|
||||||
msgid "Enter your name or company name"
|
msgid "Enter your name or company name"
|
||||||
msgstr "Geben Sie Ihren Namen oder der Ihrer Firma ein"
|
msgstr "Geben Sie Ihren Namen oder der Ihrer Firma ein"
|
||||||
|
|
||||||
|
msgid "Your username and/or password were incorrect."
|
||||||
|
msgstr "Dein Benutzername und/oder Dein Passwort ist falsch."
|
||||||
|
|
||||||
|
msgid "User does not exist"
|
||||||
|
msgstr "Der Benutzer existiert nicht"
|
||||||
|
|
||||||
|
msgid "The account is already active."
|
||||||
|
msgstr "Das Benutzerkonto ist bereits aktiv."
|
||||||
|
|
||||||
|
msgid "The two password fields didn't match."
|
||||||
|
msgstr "Die beiden Passwörter stimmen nicht überein."
|
||||||
|
|
||||||
|
msgid "New password"
|
||||||
|
msgstr "Neues Passwort"
|
||||||
|
|
||||||
|
msgid "New password confirmation"
|
||||||
|
msgstr "Neues Passwort Bestätigung"
|
||||||
|
|
||||||
msgid "Cardholder Name"
|
msgid "Cardholder Name"
|
||||||
msgstr "Name des Kartenbesitzer"
|
msgstr "Name des Kartenbesitzer"
|
||||||
|
|
||||||
|
@ -768,17 +786,25 @@ msgstr "Telefon"
|
||||||
msgid "Message"
|
msgid "Message"
|
||||||
msgstr "Nachricht"
|
msgstr "Nachricht"
|
||||||
|
|
||||||
|
msgid "An email with the activation link has been sent to your email"
|
||||||
|
msgstr ""
|
||||||
|
"Der Link zum Zurücksetzen deines Passwortes wurde an deine E-Mail gesendet"
|
||||||
|
|
||||||
|
msgid "Account Activation"
|
||||||
|
msgstr "Accountaktivierung"
|
||||||
|
|
||||||
msgid "The link to reset your email has been sent to your email"
|
msgid "The link to reset your email has been sent to your email"
|
||||||
msgstr "Der Link zum Zur?cksetzen deines Passwortes wurde an deine E-Mail gesendet"
|
msgstr ""
|
||||||
|
"Der Link zum Zurücksetzen deines Passwortes wurde an deine E-Mail gesendet"
|
||||||
|
|
||||||
msgid "Password Reset"
|
msgid "Password Reset"
|
||||||
msgstr ""
|
msgstr "Passwort zurücksetzen"
|
||||||
|
|
||||||
msgid "Password has been reset."
|
msgid "Password has been reset."
|
||||||
msgstr "Das Passwort wurde zur?ckgesetzt."
|
msgstr "Das Passwort wurde zurückgesetzt."
|
||||||
|
|
||||||
msgid "Password reset has not been successful."
|
msgid "Password reset has not been successful."
|
||||||
msgstr "Das Zur?cksetzen war nicht erfolgreich."
|
msgstr "Das Zurücksetzen war nicht erfolgreich."
|
||||||
|
|
||||||
msgid "The reset password link is no longer valid."
|
msgid "The reset password link is no longer valid."
|
||||||
msgstr "Der Link zum Zur?cksetzen deines Passwortes ist nicht l?nger g?ltig."
|
msgstr "Der Link zum Zurücksetzen Deines Passwortes ist nicht länger gültig."
|
||||||
|
|
|
@ -2,6 +2,7 @@ from django.conf import settings
|
||||||
from django.contrib import messages
|
from django.contrib import messages
|
||||||
from django.contrib.auth import authenticate, login
|
from django.contrib.auth import authenticate, login
|
||||||
from django.contrib.auth.tokens import default_token_generator
|
from django.contrib.auth.tokens import default_token_generator
|
||||||
|
from django.core.urlresolvers import reverse_lazy
|
||||||
from django.http import HttpResponseRedirect
|
from django.http import HttpResponseRedirect
|
||||||
from django.utils.encoding import force_bytes
|
from django.utils.encoding import force_bytes
|
||||||
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
|
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
|
||||||
|
@ -63,9 +64,45 @@ class LoginViewMixin(FormView):
|
||||||
return super(LoginViewMixin, self).get(request, *args, **kwargs)
|
return super(LoginViewMixin, self).get(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
class ResendActivationLinkViewMixin(FormView):
|
||||||
|
success_message = _(
|
||||||
|
"An email with the activation link has been sent to your email")
|
||||||
|
|
||||||
|
def generate_email_context(self, user):
|
||||||
|
context = {
|
||||||
|
'base_url': "{0}://{1}".format(self.request.scheme,
|
||||||
|
self.request.get_host()),
|
||||||
|
'activation_link': reverse_lazy(
|
||||||
|
'hosting:validate',
|
||||||
|
kwargs={'validate_slug': user.validation_slug}
|
||||||
|
),
|
||||||
|
'dcl_text': settings.DCL_TEXT,
|
||||||
|
}
|
||||||
|
return context
|
||||||
|
|
||||||
|
def form_valid(self, form):
|
||||||
|
email = form.cleaned_data.get('email')
|
||||||
|
user = CustomUser.objects.get(email=email)
|
||||||
|
messages.add_message(self.request, messages.SUCCESS,
|
||||||
|
self.success_message)
|
||||||
|
context = self.generate_email_context(user)
|
||||||
|
email_data = {
|
||||||
|
'subject': '{dcl_text} {account_activation}'.format(
|
||||||
|
dcl_text=settings.DCL_TEXT,
|
||||||
|
account_activation=_('Account Activation')
|
||||||
|
),
|
||||||
|
'to': email,
|
||||||
|
'context': context,
|
||||||
|
'template_name': self.email_template_name,
|
||||||
|
'template_path': self.email_template_path,
|
||||||
|
'from_address': settings.DCL_SUPPORT_FROM_ADDRESS
|
||||||
|
}
|
||||||
|
email = BaseEmail(**email_data)
|
||||||
|
email.send()
|
||||||
|
return HttpResponseRedirect(self.get_success_url())
|
||||||
|
|
||||||
|
|
||||||
class PasswordResetViewMixin(FormView):
|
class PasswordResetViewMixin(FormView):
|
||||||
# template_name = 'hosting/reset_password.html'
|
|
||||||
# form_class = PasswordResetRequestForm
|
|
||||||
success_message = _(
|
success_message = _(
|
||||||
"The link to reset your email has been sent to your email")
|
"The link to reset your email has been sent to your email")
|
||||||
site = ''
|
site = ''
|
||||||
|
@ -78,7 +115,6 @@ class PasswordResetViewMixin(FormView):
|
||||||
'site_name': 'ungleich' if self.site != 'dcl' else settings.DCL_TEXT,
|
'site_name': 'ungleich' if self.site != 'dcl' else settings.DCL_TEXT,
|
||||||
'base_url': "{0}://{1}".format(self.request.scheme,
|
'base_url': "{0}://{1}".format(self.request.scheme,
|
||||||
self.request.get_host())
|
self.request.get_host())
|
||||||
|
|
||||||
}
|
}
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
@ -104,11 +140,8 @@ class PasswordResetViewMixin(FormView):
|
||||||
|
|
||||||
|
|
||||||
class PasswordResetConfirmViewMixin(FormView):
|
class PasswordResetConfirmViewMixin(FormView):
|
||||||
# template_name = 'hosting/confirm_reset_password.html'
|
|
||||||
form_class = SetPasswordForm
|
form_class = SetPasswordForm
|
||||||
|
|
||||||
# success_url = reverse_lazy('hosting:login')
|
|
||||||
|
|
||||||
def post(self, request, uidb64=None, token=None, *arg, **kwargs):
|
def post(self, request, uidb64=None, token=None, *arg, **kwargs):
|
||||||
try:
|
try:
|
||||||
uid = urlsafe_base64_decode(uidb64)
|
uid = urlsafe_base64_decode(uidb64)
|
||||||
|
|
Loading…
Reference in a new issue