mirror of
https://github.com/freedombox/FreedomBox.git
synced 2026-08-19 12:36:06 +00:00
firstboot: Minor Danube PageKite fixes
- Fix message internationalization with formatting and laziness. - Styling fixes. - Simplify Subdomain widget. - Update messages for grammer and consistency.
This commit is contained in:
parent
435f980c6f
commit
c3c44ab379
@ -27,7 +27,7 @@ from django import forms
|
||||
from django.contrib import auth
|
||||
from django.contrib import messages
|
||||
from django.core.exceptions import ValidationError
|
||||
from django.utils.translation import ugettext as _
|
||||
from django.utils.translation import ugettext as _, ugettext_lazy
|
||||
|
||||
from plinth import actions
|
||||
from plinth import cfg
|
||||
@ -35,18 +35,19 @@ from plinth.errors import ActionError, DomainRegistrationError
|
||||
from plinth.modules.pagekite.utils import PREDEFINED_SERVICES, run
|
||||
from plinth.modules.users.forms import GROUP_CHOICES
|
||||
from plinth.utils import format_lazy
|
||||
LOGGER = logging.getLogger(__name__)
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class State1Form(auth.forms.UserCreationForm):
|
||||
"""Firstboot state 1: create a new user."""
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.request = kwargs.pop('request')
|
||||
super(State1Form, self).__init__(*args, **kwargs)
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
def save(self, commit=True):
|
||||
"""Create and log the user in."""
|
||||
user = super(State1Form, self).save(commit=commit)
|
||||
user = super().save(commit=commit)
|
||||
if commit:
|
||||
try:
|
||||
actions.superuser_run(
|
||||
@ -91,27 +92,35 @@ class State1Form(auth.forms.UserCreationForm):
|
||||
|
||||
class SubdomainWidget(forms.widgets.TextInput):
|
||||
"""Append the domain to the subdomain bootstrap input field"""
|
||||
def __init__(self, domain, *args, **kwargs):
|
||||
"""Intialize the widget by storing the domain value."""
|
||||
super().__init__(*args, **kwargs)
|
||||
self.domain = domain
|
||||
|
||||
def render(self, *args, **kwargs):
|
||||
inputfield = super(SubdomainWidget, self).render(*args, **kwargs)
|
||||
domain = State5Form.DOMAIN_APPENDIX
|
||||
"""Return the HTML for the widget."""
|
||||
inputfield = super().render(*args, **kwargs)
|
||||
return """<div class="input-group">
|
||||
{0}
|
||||
<span class="input-group-addon">{1}</span>
|
||||
</div>""".format(inputfield, domain)
|
||||
</div>""".format(inputfield, self.domain)
|
||||
|
||||
|
||||
class State5Form(forms.Form):
|
||||
"""Set up freedombox.me pagekite subdomain"""
|
||||
DOMAIN_APPENDIX = ".freedombox.me"
|
||||
# webservice url for domain validation and registration
|
||||
service_url = "http://freedombox.me/cgi-bin/freedomkite.pl"
|
||||
code_help_text = _("The voucher you received with your {box_name} Danube "
|
||||
"Edition")
|
||||
code = forms.CharField(help_text=format_lazy(code_help_text,
|
||||
box_name=_(cfg.box_name)))
|
||||
domain = forms.SlugField(label=_("Subdomain"),
|
||||
widget=SubdomainWidget,
|
||||
help_text=_("The subdomain you want to register"))
|
||||
DOMAIN_APPENDIX = '.freedombox.me'
|
||||
# Webservice url for domain validation and registration
|
||||
service_url = 'http://freedombox.me/cgi-bin/freedomkite.pl'
|
||||
|
||||
code_help_text = format_lazy(
|
||||
ugettext_lazy('The voucher you received with your {box_name} Danube '
|
||||
'Edition'), box_name=ugettext_lazy(cfg.box_name))
|
||||
|
||||
code = forms.CharField(help_text=code_help_text)
|
||||
|
||||
domain = forms.SlugField(label=_('Subdomain'),
|
||||
widget=SubdomainWidget(domain=DOMAIN_APPENDIX),
|
||||
help_text=_('The subdomain you want to register'))
|
||||
|
||||
def clean_domain(self):
|
||||
"""Append the domain to the users' subdomain"""
|
||||
@ -119,61 +128,66 @@ class State5Form(forms.Form):
|
||||
|
||||
def clean(self):
|
||||
"""Validate user input (subdomain and code)"""
|
||||
cleaned_data = super(State5Form, self).clean()
|
||||
# if the subdomain is wrong don't look if the domain is available
|
||||
cleaned_data = super().clean()
|
||||
|
||||
# If the subdomain is wrong, don't look if the domain is
|
||||
# available
|
||||
if self.errors:
|
||||
return cleaned_data
|
||||
|
||||
self.domain_already_registered = False
|
||||
code = cleaned_data.get("code")
|
||||
domain = cleaned_data.get("domain")
|
||||
code = cleaned_data.get('code')
|
||||
domain = cleaned_data.get('domain')
|
||||
|
||||
response = requests.get(self.service_url, params={'code': code}).json()
|
||||
# The validation response looks like:
|
||||
# 1. code invalid: {}
|
||||
|
||||
# 1. Code is invalid: {}
|
||||
if 'domain' not in response:
|
||||
raise ValidationError(_('This code is not valid'), code='invalid')
|
||||
# 2. code valid, domain registered: {'domain': 'xx.freedombox.me'}
|
||||
# 2. Code is valid, domain registered: {'domain': 'xx.freedombox.me'}
|
||||
elif response['domain']:
|
||||
if response['domain'] == domain:
|
||||
self.domain_already_registered = True
|
||||
else:
|
||||
msg = _('This code is bound to the domain %s' %
|
||||
response['domain'])
|
||||
raise ValidationError(msg, code='invalid')
|
||||
# 3. code valid, no domain registered: {'domain': None}
|
||||
message = _('This code is bound to the domain {domain}.') \
|
||||
.format(domain=response['domain'])
|
||||
raise ValidationError(message, code='invalid')
|
||||
# 3. Code is valid, no domain registered: {'domain': None}
|
||||
elif response['domain'] is None:
|
||||
# make sure that the desired domain is available
|
||||
# Make sure that the desired domain is available
|
||||
data = {'domain': domain}
|
||||
domain_response = requests.get(self.service_url, params=data)
|
||||
registered_domain = domain_response.json()['domain']
|
||||
if registered_domain is not None:
|
||||
msg = _('The requested Domain is already registered')
|
||||
raise ValidationError(msg, code='invalid')
|
||||
message = _('The requested domain is already registered.')
|
||||
raise ValidationError(message, code='invalid')
|
||||
|
||||
return cleaned_data
|
||||
|
||||
def register_domain(self):
|
||||
"""Register a domain (only if it's not already registered)"""
|
||||
if not self.domain_already_registered:
|
||||
data = {'domain': self.cleaned_data['domain'],
|
||||
'code': self.cleaned_data['code']}
|
||||
response = requests.post(self.service_url, data)
|
||||
if not response.ok:
|
||||
msg = "Domain registration failed: %s" % response.text
|
||||
LOGGER.error(msg)
|
||||
raise DomainRegistrationError(msg)
|
||||
if self.domain_already_registered:
|
||||
return
|
||||
|
||||
data = {'domain': self.cleaned_data['domain'],
|
||||
'code': self.cleaned_data['code']}
|
||||
response = requests.post(self.service_url, data)
|
||||
if not response.ok:
|
||||
message = _('Domain registration failed: {response}.').format(
|
||||
response=response.text)
|
||||
logger.error(message)
|
||||
raise DomainRegistrationError(message)
|
||||
|
||||
def setup_pagekite(self):
|
||||
"""Configure pagekite and enable the pagekite service"""
|
||||
# set kite name and secret
|
||||
"""Configure and enable PageKite service."""
|
||||
# Set kite name and secret
|
||||
run(['set-kite', '--kite-name', self.cleaned_data['domain']],
|
||||
input=self.cleaned_data['code'].encode())
|
||||
|
||||
# set frontend
|
||||
# Set frontend
|
||||
run(['set-frontend', '%s:80' % self.cleaned_data['domain']])
|
||||
|
||||
# enable pagekite http+https service
|
||||
# Enable PageKite HTTP + HTTPS service
|
||||
for service_name in ['http', 'https']:
|
||||
service = PREDEFINED_SERVICES[service_name]['params']
|
||||
try:
|
||||
|
||||
@ -24,43 +24,45 @@
|
||||
|
||||
{% block content %}
|
||||
|
||||
<h3>{% trans "Set up a freedombox.me subdomain with your voucher" %}</h3>
|
||||
<h2>{% trans "Setup a freedombox.me subdomain with your voucher" %}</h2>
|
||||
|
||||
<p>
|
||||
{% url 'first_boot:state10' as finish_firstboot_url %}
|
||||
{% blocktrans trimmed %}
|
||||
<a href="{{ finish_firstboot_url }}">Skip the setup</a> if you do not have a
|
||||
voucher or want to configure pagekite without using a freedombox.me subdomain.
|
||||
{% endblocktrans %}
|
||||
</p>
|
||||
<p>
|
||||
{% url 'first_boot:state10' as finish_firstboot_url %}
|
||||
{% blocktrans trimmed %}
|
||||
<a href="{{ finish_firstboot_url }}">Skip this step</a> if you
|
||||
do not have a voucher or want to configure PageKite later with a
|
||||
different domain or credentials.
|
||||
{% endblocktrans %}
|
||||
</p>
|
||||
|
||||
<p>
|
||||
{% blocktrans trimmed %}
|
||||
You can use a redeemed voucher but it will only work with the initially
|
||||
registered subdomain.
|
||||
{% endblocktrans %}
|
||||
</p>
|
||||
<p>
|
||||
{% blocktrans trimmed %}
|
||||
You can use an already redeemed voucher but it will only work
|
||||
with the initially registered subdomain.
|
||||
{% endblocktrans %}
|
||||
</p>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<form class='firstboot form-horizontal' role="form" action="" method="post">
|
||||
{% csrf_token %}
|
||||
{{ form|bootstrap_horizontal:'col-lg-3' }}
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-3 col-sm-9">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{% trans "Register" %}
|
||||
</button>
|
||||
<a href="{% url 'first_boot:state10' %}" class="btn btn-primary"
|
||||
role="button">
|
||||
{% trans "Skip Registration" %}
|
||||
</a>
|
||||
<div class="row">
|
||||
<div class="col-md-8">
|
||||
<form class='firstboot form-horizontal' role="form" action=""
|
||||
method="post">
|
||||
{% csrf_token %}
|
||||
|
||||
{{ form|bootstrap_horizontal:'col-lg-3' }}
|
||||
<div class="form-group">
|
||||
<div class="col-sm-offset-3 col-sm-9">
|
||||
<button type="submit" class="btn btn-primary">
|
||||
{% trans "Register" %}
|
||||
</button>
|
||||
<a href="{% url 'first_boot:state10' %}" class="btn btn-default"
|
||||
role="button">
|
||||
{% trans "Skip Registration" %}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</form>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block page_js %}
|
||||
|
||||
@ -43,8 +43,10 @@ class State1View(CreateView):
|
||||
success_url = reverse_lazy('first_boot:state10')
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
"""Initialize the view object."""
|
||||
if cfg.danube_edition:
|
||||
self.success_url = reverse_lazy('first_boot:state5')
|
||||
|
||||
return super(State1View, self).__init__(*args, **kwargs)
|
||||
|
||||
def get_form_kwargs(self):
|
||||
@ -72,26 +74,26 @@ def state10(request):
|
||||
|
||||
|
||||
class State5View(FormView):
|
||||
"""
|
||||
State 5 is is the (optional) setup of the pagekite freedombox.me subdomain
|
||||
"""
|
||||
"""State 5 is the (optional) setup of the Pagekite subdomain."""
|
||||
template_name = 'firstboot_state5.html'
|
||||
form_class = State5Form
|
||||
success_url = reverse_lazy('first_boot:state10')
|
||||
|
||||
def get(self, *args, **kwargs):
|
||||
"""Respond to GET request."""
|
||||
kvstore.set('firstboot_state', 5)
|
||||
return super(State5View, self).get(*args, **kwargs)
|
||||
|
||||
def form_valid(self, form):
|
||||
"""Act on valid form submission."""
|
||||
try:
|
||||
form.register_domain()
|
||||
except DomainRegistrationError as err:
|
||||
messages.error(self.request, err)
|
||||
except DomainRegistrationError as error:
|
||||
messages.error(self.request, error)
|
||||
return HttpResponseRedirect(reverse_lazy('first_boot:state5'))
|
||||
else:
|
||||
form.setup_pagekite()
|
||||
msg = _("Pagekite setup finished. The HTTP and HTTPS services \
|
||||
are activated now.")
|
||||
messages.success(self.request, msg)
|
||||
message = _('Pagekite setup finished. The HTTP and HTTPS services '
|
||||
'are activated now.')
|
||||
messages.success(self.request, message)
|
||||
return super(State5View, self).form_valid(form)
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user