Merge branch 'master' into tiwariav-task/3756/landing_billing_page

This commit is contained in:
PCoder 2017-09-26 12:20:56 +05:30
commit e33e9cd1ae
11 changed files with 198 additions and 64 deletions

View file

@ -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
* #3731: [dcl, hosting] Added cdist ssh key handler
* #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
* #3728: [hosting] VM Termination animation added
* #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
* Bugfix: [dcl, hosting] added host to celery error mails
* Bugfix: [ungleich] Fixed wrong subdomain digitalglarus.ungleich.ch

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -28,10 +28,10 @@ msgid "User does not exist"
msgstr "Der Benutzer existiert nicht"
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"
msgstr "Gebe deinem SSH-Key einen Name"
msgstr "Gebe Deinem SSH-Key einen Name"
msgid "Key name"
msgstr "Key-Name"
@ -156,10 +156,10 @@ msgid "Upload"
msgstr "Hochladen"
msgid "Your VM hosted in Switzerland"
msgstr "deine VM in der Schweiz"
msgstr "Deine VM in der Schweiz"
msgid "Set your new password"
msgstr "Setze dein neues Passwort"
msgstr "Setze Dein neues Passwort"
msgid "Reset"
msgstr "Zurücksetzen"
@ -180,7 +180,7 @@ msgid "My VMs"
msgstr "Meine VMs"
msgid "My SSH Keys"
msgstr "Meine SSH Keys"
msgstr "Meine SSH-Keys"
msgid "My Bills"
msgstr "Meine Rechnungen"
@ -229,10 +229,10 @@ msgid ""
"Thank you!\n"
msgstr ""
"\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"
"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"
"Dankeschön!\n"
@ -245,10 +245,10 @@ msgid ""
"If you didn't request a new password, ignore this e-mail.\n"
"Thank you!\n"
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"
"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"
"Dankeschön!\n"
@ -260,11 +260,11 @@ msgid ""
"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"
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"
"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 "
"tun, indem du <a href=\"%(base_url)s%(my_virtual_machines_url)s\">diesen "
"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 "
"tun, indem Du <a href=\"%(base_url)s%(my_virtual_machines_url)s\">diesen "
"Link klickst</a>.<br/>\n"
msgid "My VM page"
@ -280,12 +280,12 @@ msgid ""
"link.\n"
"%(base_url)s%(my_virtual_machines_url)s\n"
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"
"Um deinen Auftragsstatus zu sehen, klicke hier.\n"
"Um Deinen Auftragsstatus zu sehen, klicke hier.\n"
"%(base_url)s%(vm_order_url)s\n"
"Falls du eine neue virtuelle Maschine bestellen möchtest, kannst du dies "
"tun, indem du diesen Link klickst.\n"
"Falls Du eine neue virtuelle Maschine bestellen möchtest, kannst Du dies "
"tun, indem Du diesen Link klickst.\n"
"%(base_url)s%(my_virtual_machines_url)s\n"
msgid "Toggle navigation"
@ -306,6 +306,9 @@ msgstr "Registrieren"
msgid "Forgot your password ? "
msgstr "Passwort vergessen?"
msgid "Resend activation link"
msgstr "Aktivierungslink noch einmal senden"
msgid "Notifications"
msgstr "Benachrichtigungen"
@ -353,7 +356,7 @@ msgid "Order summary"
msgstr "Bestellungsübersicht"
msgid "Product"
msgstr ""
msgstr "Produkt"
msgid "Cores"
msgstr "Prozessorkerne"
@ -588,7 +591,7 @@ msgid "We are here to help you!"
msgstr "Wir sind hier, um Dir zu helfen!"
msgid "CONTACT"
msgstr "KONTACT"
msgstr "KONTAKT"
msgid "Terminate your Virtual Machine"
msgstr "Deine Virtuelle Maschine beenden"
@ -601,8 +604,11 @@ msgstr ""
#, python-format
msgid ""
"Your Virtual Machine %(virtual_machine.name)s is successfully terminated!"
msgstr "Deine Virtuelle Machine (VM) %(virtual_machine.name)s wurde erfolgreich beendet!"
"Your Virtual Machine <strong>%(machine_name)s</strong> is successfully "
"terminated!"
msgstr ""
"Deine Virtuelle Machine (VM) <strong>%(machine_name)s</strong> wurde erfolgreich "
"beendet!"
msgid "Virtual Machines"
msgstr "Virtuelle Maschinen"
@ -644,13 +650,13 @@ msgid "Sorry. Your request is invalid."
msgstr "Entschuldigung, deine Anfrage ist ungültig."
msgid "Password has been reset."
msgstr ""
msgstr "Dein Passwort wurde erfolgreich zurückgesetzt."
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."
msgstr ""
msgstr "Der Link zum Zurücksetzen Deines Passwortes ist nicht mehr gültig."
msgid "Invalid credit card"
msgstr "Ungültige Kreditkarte"
@ -707,7 +713,7 @@ msgstr "VM Kündigung"
#~ msgstr "VM %(VM_ID)s erfolgreich beendet"
#~ msgid "days"
#~ msgstr "tage"
#~ msgstr "Tage"
#~ msgid "New Virtual Machine"
#~ msgstr "Neue virtuelle Maschine"
@ -740,7 +746,7 @@ msgstr "VM Kündigung"
#~ msgstr "Meine Bestellungen"
#~ msgid "SSH Keys"
#~ msgstr "SSH Key"
#~ msgstr "SSH Keys"
#~ msgid "Notifications "
#~ msgstr "Benachrichtigungen"
@ -788,19 +794,19 @@ msgstr "VM Kündigung"
#~ msgstr "Hinzufügen"
#~ msgid "Keys"
#~ msgstr "Schlüssel"
#~ msgstr "Keys"
#~ msgid "Log in"
#~ msgstr "Anmelden"
#~ msgid "You haven been logged out"
#~ msgstr "Sie wurden abgmeldet"
#~ msgstr "Du wurdest abgemeldet"
#~ msgid "How it works"
#~ msgstr "So funktioniert es"
#~ msgid "Your infrastructure"
#~ msgstr "deine Infrastruktur"
#~ msgstr "Deine Infrastruktur"
#~ msgid "Our inftrastructure"
#~ msgstr "Unsere Infrastruktur"
@ -809,10 +815,10 @@ msgstr "VM Kündigung"
#~ msgstr "Preise"
#~ msgid "Access Key"
#~ msgstr "Zugriffsschlüssel"
#~ msgstr "SSH Key"
#~ msgid "Upload your own key. "
#~ msgstr "Lade deinen Key hoch"
#~ msgstr "Lade Deinen Key hoch"
#~ msgid "Generate Key Pair"
#~ msgstr "Schlüsselpaar generieren"
@ -836,5 +842,5 @@ msgstr "VM Kündigung"
#~ "Your SSH private key was already generated and downloaded, if you lost "
#~ "it, contact us. "
#~ msgstr ""
#~ "Dein privater SSH Schlüssel wurde bereits generiert und heruntergeladen. "
#~ "Falls du ihn verloren hast, kontaktiere uns."
#~ "Dein privater SSH Key wurde bereits generiert und heruntergeladen. "
#~ "Falls Du ihn verloren hast, kontaktiere uns."

View file

@ -44,6 +44,8 @@
<a class="unlink" href="{% url 'hosting:signup' %}">{% trans "Sign up"%}</a>
<span class="text"> or </span>
<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>

View 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 %}

View file

@ -8,8 +8,7 @@ from .views import (
MarkAsReadNotificationView, PasswordResetView, PasswordResetConfirmView,
HostingPricingView, CreateVirtualMachinesView, HostingBillListView,
HostingBillDetailView, SSHKeyDeleteView, SSHKeyCreateView, SSHKeyListView,
SSHKeyChoiceView, DashboardView, SettingsView)
SSHKeyChoiceView, DashboardView, SettingsView, ResendActivationEmailView)
urlpatterns = [
url(r'index/?$', IndexView.as_view(), name='index'),
@ -52,6 +51,8 @@ urlpatterns = [
url(r'signup/?$', SignupView.as_view(), name='signup'),
url(r'signup-validate/?$', SignupValidateView.as_view(),
name='signup-validate'),
url(r'resend-activation-link/?$', ResendActivationEmailView.as_view(),
name='resend_activation_link'),
url(r'reset-password/?$', PasswordResetView.as_view(),
name='reset_password'),
url(r'reset-password-confirm/(?P<uidb64>[0-9A-Za-z]+)-(?P<token>.+)/$',

View file

@ -33,12 +33,15 @@ from membership.models import CustomUser, StripeCustomer
from opennebula_api.models import OpenNebulaManager
from opennebula_api.serializers import VirtualMachineSerializer, \
VirtualMachineTemplateSerializer, VMTemplateSerializer
from utils.forms import BillingAddressForm, PasswordResetRequestForm, \
UserBillingAddressForm
from utils.forms import (
BillingAddressForm, PasswordResetRequestForm, UserBillingAddressForm,
ResendActivationEmailForm
)
from utils.mailer import BaseEmail
from utils.stripe_utils import StripeUtils
from utils.views import (
PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin
PasswordResetViewMixin, PasswordResetConfirmViewMixin, LoginViewMixin,
ResendActivationLinkViewMixin
)
from .forms import HostingUserSignupForm, HostingUserLoginForm, \
UserHostingKeyForm, generate_ssh_key_name
@ -282,6 +285,14 @@ class SignupValidatedView(SignupValidateView):
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):
site = 'dcl'
template_name = 'hosting/reset_password.html'
@ -319,7 +330,7 @@ class PasswordResetConfirmView(PasswordResetConfirmViewMixin):
messages.success(request, _('Password has been reset.'))
# Change opennebula password
opennebula_client.change_user_password(new_password)
opennebula_client.change_user_password(user.password)
return self.form_valid(form)
else:

View file

@ -438,11 +438,11 @@ class OpenNebulaManager():
self.oneadmin_client.call(oca.VmTemplate.METHODS[
'delete'], template_id, False)
def change_user_password(self, new_password):
def change_user_password(self, passwd_hash):
self.oneadmin_client.call(
oca.User.METHODS['passwd'],
self.opennebula_user.id,
new_password
passwd_hash
)
def add_public_key(self, user, public_key='', merge=False):

View file

@ -96,5 +96,4 @@ pyflakes==1.5.0
billiard==3.5.0.3
amqp==2.2.1
vine==1.1.4
#git+https://github.com/ungleich/cdist.git#egg=cdist
file:///home/app/cdist#egg=cdist
cdist==4.7.0

View file

@ -18,7 +18,8 @@ class SignupFormMixin(forms.ModelForm):
model = CustomUser
fields = ['name', 'email', 'password']
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):
@ -42,7 +43,7 @@ class LoginFormMixin(forms.Form):
is_auth = authenticate(email=email, password=password)
if not is_auth:
raise forms.ValidationError(
"Your username and/or password were incorrect.")
_("Your username and/or password were incorrect."))
return self.cleaned_data
def clean_email(self):
@ -51,7 +52,24 @@ class LoginFormMixin(forms.Form):
CustomUser.objects.get(email=email)
return email
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):
@ -66,7 +84,7 @@ class PasswordResetRequestForm(forms.Form):
CustomUser.objects.get(email=email)
return email
except CustomUser.DoesNotExist:
raise forms.ValidationError("User does not exist")
raise forms.ValidationError(_("User does not exist"))
class SetPasswordForm(forms.Form):
@ -75,11 +93,11 @@ class SetPasswordForm(forms.Form):
password
"""
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)
new_password2 = forms.CharField(label=("New password confirmation"),
new_password2 = forms.CharField(label=_("New password confirmation"),
widget=forms.PasswordInput)
def clean_new_password2(self):

View file

@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\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"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@ -738,6 +738,24 @@ msgstr ""
msgid "Enter your name or company name"
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"
msgstr "Name des Kartenbesitzer"
@ -768,17 +786,25 @@ msgstr "Telefon"
msgid "Message"
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"
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"
msgstr ""
msgstr "Passwort zurücksetzen"
msgid "Password has been reset."
msgstr "Das Passwort wurde zur?ckgesetzt."
msgstr "Das Passwort wurde zurückgesetzt."
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."
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."

View file

@ -2,6 +2,7 @@ from django.conf import settings
from django.contrib import messages
from django.contrib.auth import authenticate, login
from django.contrib.auth.tokens import default_token_generator
from django.core.urlresolvers import reverse_lazy
from django.http import HttpResponseRedirect
from django.utils.encoding import force_bytes
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)
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):
# template_name = 'hosting/reset_password.html'
# form_class = PasswordResetRequestForm
success_message = _(
"The link to reset your email has been sent to your email")
site = ''
@ -78,7 +115,6 @@ class PasswordResetViewMixin(FormView):
'site_name': 'ungleich' if self.site != 'dcl' else settings.DCL_TEXT,
'base_url': "{0}://{1}".format(self.request.scheme,
self.request.get_host())
}
return context
@ -104,11 +140,8 @@ class PasswordResetViewMixin(FormView):
class PasswordResetConfirmViewMixin(FormView):
# template_name = 'hosting/confirm_reset_password.html'
form_class = SetPasswordForm
# success_url = reverse_lazy('hosting:login')
def post(self, request, uidb64=None, token=None, *arg, **kwargs):
try:
uid = urlsafe_base64_decode(uidb64)