implement password change for mailboxes

- implement managemails.forms.ChangeMailboxPasswordForm
- extract code for determining hosting package and customer from URL into
  HostingPackageAndCustomerMixin
- implement managemails.views.ChangeMailboxPassword
- add new URL pattern 'change_mailbox_password' to managemails.urls
- add template managemails/mailbox_setpassword.html
- link from template hostingpackages/customerhostingpackage_detail.html to
  change_mailbox_password
- add german translation for new strings
- document new feature in changelog
This commit is contained in:
Jan Dittberner 2015-01-25 12:49:31 +01:00
parent d1119331d8
commit 2e4efe7839
8 changed files with 178 additions and 21 deletions

View file

@ -46,3 +46,36 @@ class CreateMailboxForm(PasswordModelFormMixin, forms.ModelForm):
self.instance.username = Mailbox.objects.get_next_mailbox_name(osuser)
self.instance.set_password(self.cleaned_data['password1'])
return super(CreateMailboxForm, self).save(commit=commit)
class ChangeMailboxPasswordForm(PasswordModelFormMixin, forms.ModelForm):
"""
This form is used to set a new password for an existing mailbox.
"""
class Meta:
model = Mailbox
fields = []
def __init__(self, *args, **kwargs):
self.hosting_package = kwargs.pop('hostingpackage')
super(ChangeMailboxPasswordForm, self).__init__(*args, **kwargs)
self.helper = FormHelper()
self.helper.form_action = reverse(
'change_mailbox_password', kwargs={
'package': self.hosting_package.id,
'slug': self.instance.username,
})
self.helper.add_input(Submit('submit', _('Set password')))
def save(self, commit=True):
"""
Set the mailbox password.
:param boolean commit: whether to save the mailbox instance
:return: mailbox instance
:rtype: :py:class:`managemails.models.Mailbox`
"""
self.instance.set_password(self.cleaned_data['password1'])
return super(ChangeMailboxPasswordForm, self).save(commit=commit)

View file

@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: managemails\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2015-01-25 12:04+0100\n"
"PO-Revision-Date: 2015-01-25 12:07+0100\n"
"POT-Creation-Date: 2015-01-25 12:46+0100\n"
"PO-Revision-Date: 2015-01-25 12:47+0100\n"
"Last-Translator: Jan Dittberner <jan@dittberner.info>\n"
"Language-Team: Jan Dittberner <jan@dittberner.info>\n"
"Language: de\n"
@ -51,6 +51,10 @@ msgstr "Postfächer und E-Mailadressen"
msgid "Create mailbox"
msgstr "Postfach anlegen"
#: managemails/forms.py:69
msgid "Set password"
msgstr "Passwort setzen"
#: managemails/models.py:79
msgid "Mailbox"
msgstr "Postfach"
@ -75,11 +79,17 @@ msgstr "E-Mailadresse"
msgid "mailbox"
msgstr "Postfach"
#: managemails/views.py:35
#: managemails/views.py:63
msgid "You are not allowed to add more mailboxes to this hosting package"
msgstr "Sie können keine weiteren Postfächer zu diesem Hostingpaket hinzufügen"
#: managemails/views.py:61
#: managemails/views.py:82
#, python-brace-format
msgid "Mailbox {mailbox} created successfully."
msgstr "Postfach {mailbox} erfolgreich angelegt."
#: managemails/views.py:117
#, python-brace-format
msgid "Successfully set new password for mailbox {mailbox}."
msgstr ""
"Für das Postfach {mailbox} wurde erfolgreich ein neues Passwort gesetzt."

View file

@ -8,6 +8,7 @@ from __future__ import absolute_import, unicode_literals
from django.conf.urls import patterns, url
from .views import (
ChangeMailboxPassword,
CreateMailbox,
)
@ -15,4 +16,6 @@ urlpatterns = patterns(
'',
url(r'^(?P<package>\d+)/mailbox/create$',
CreateMailbox.as_view(), name='create_mailbox'),
url(r'^(?P<package>\d+)/mailbox/(?P<slug>[\w0-9]+)/setpassword$',
ChangeMailboxPassword.as_view(), name='change_mailbox_password'),
)

View file

@ -7,18 +7,46 @@ from __future__ import absolute_import, unicode_literals
from django.http import HttpResponseForbidden
from django.shortcuts import get_object_or_404, redirect
from django.utils.translation import ugettext as _
from django.views.generic.edit import CreateView
from django.views.generic.edit import (
CreateView,
UpdateView,
)
from django.contrib import messages
from gvacommon.viewmixins import StaffOrSelfLoginRequiredMixin
from hostingpackages.models import CustomerHostingPackage
from .forms import CreateMailboxForm
from .forms import (
CreateMailboxForm,
ChangeMailboxPasswordForm,
)
from .models import Mailbox
class CreateMailbox(StaffOrSelfLoginRequiredMixin, CreateView):
class HostingPackageAndCustomerMixin(object):
"""
Mixin for views that gets the hosting package instance from the URL
keyword argument 'package'.
"""
hosting_package_kwarg = 'package'
"""Keyword argument used to find the hosting package in the URL."""
def get_hosting_package(self):
return get_object_or_404(
CustomerHostingPackage,
pk=int(self.kwargs[self.hosting_package_kwarg]))
def get_customer_object(self):
return self.get_hosting_package().customer
class CreateMailbox(
HostingPackageAndCustomerMixin, StaffOrSelfLoginRequiredMixin, CreateView
):
"""
This view is used to setup new mailboxes for a customer hosting package.
@ -30,28 +58,21 @@ class CreateMailbox(StaffOrSelfLoginRequiredMixin, CreateView):
def dispatch(self, request, *args, **kwargs):
resp = super(CreateMailbox, self).dispatch(request, *args, **kwargs)
if not self._get_hosting_package().may_add_mailbox():
if not self.get_hosting_package().may_add_mailbox():
resp = HttpResponseForbidden(
_('You are not allowed to add more mailboxes to this'
' hosting package'))
return resp
def _get_hosting_package(self):
return get_object_or_404(
CustomerHostingPackage, pk=int(self.kwargs['package']))
def get_customer_object(self):
return self._get_hosting_package().customer
def get_context_data(self, **kwargs):
context = super(CreateMailbox, self).get_context_data(**kwargs)
context['hostingpackage'] = self._get_hosting_package()
context['hostingpackage'] = self.get_hosting_package()
context['customer'] = self.get_customer_object()
return context
def get_form_kwargs(self):
kwargs = super(CreateMailbox, self).get_form_kwargs()
kwargs['hostingpackage'] = self._get_hosting_package()
kwargs['hostingpackage'] = self.get_hosting_package()
return kwargs
def form_valid(self, form):
@ -62,4 +83,39 @@ class CreateMailbox(StaffOrSelfLoginRequiredMixin, CreateView):
mailbox=mailbox.username
)
)
return redirect(self._get_hosting_package().get_absolute_url())
return redirect(self.get_hosting_package())
class ChangeMailboxPassword(
HostingPackageAndCustomerMixin, StaffOrSelfLoginRequiredMixin, UpdateView
):
"""
This view is used to set a new password for an existing mailbox.
"""
context_object_name = 'mailbox'
form_class = ChangeMailboxPasswordForm
model = Mailbox
slug_field = 'username'
template_name_suffix = '_setpassword'
def get_context_data(self, **kwargs):
context = super(ChangeMailboxPassword, self).get_context_data(**kwargs)
context['hostingpackage'] = self.get_hosting_package()
context['customer'] = self.get_customer_object()
return context
def get_form_kwargs(self):
kwargs = super(ChangeMailboxPassword, self).get_form_kwargs()
kwargs['hostingpackage'] = self.get_hosting_package()
return kwargs
def form_valid(self, form):
mailbox = form.save()
messages.success(
self.request,
_('Successfully set new password for mailbox {mailbox}.').format(
mailbox=mailbox.username
)
)
return redirect(self.get_hosting_package())