diff --git a/docs/changelog.rst b/docs/changelog.rst index c35b573..e3fca35 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -1,6 +1,7 @@ Changelog ========= +* :feature:`-` implement password change functionality for mailboxes * :feature:`-` implement creation of new mailboxes for hosting packages * :support:`-` move common form code to new module gvawebcore.forms * :feature:`-` make it possible to assign domains to a customer diff --git a/gnuviechadmin/locale/de/LC_MESSAGES/django.po b/gnuviechadmin/locale/de/LC_MESSAGES/django.po index 8056f97..d9a7e5a 100644 --- a/gnuviechadmin/locale/de/LC_MESSAGES/django.po +++ b/gnuviechadmin/locale/de/LC_MESSAGES/django.po @@ -7,8 +7,8 @@ msgid "" msgstr "" "Project-Id-Version: gnuviechadmin\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2015-01-25 12:04+0100\n" -"PO-Revision-Date: 2015-01-25 12:06+0100\n" +"POT-Creation-Date: 2015-01-25 12:46+0100\n" +"PO-Revision-Date: 2015-01-25 12:49+0100\n" "Last-Translator: Jan Dittberner \n" "Language-Team: Jan Dittberner \n" "Language: de\n" @@ -814,6 +814,26 @@ msgstr "Bitte geben Sie das Passwort für Ihr neues Postfach ein." msgid "Please specify the password for the new mailbox." msgstr "Bitte geben Sie das Passwort für das neue Postfach ein." +#: templates/managemails/mailbox_setpassword.html:6 +#: templates/managemails/mailbox_setpassword.html:15 +#, python-format +msgid "Set Password for Mailbox %(mailbox)s" +msgstr "Passwort für Postfach %(mailbox)s setzen" + +#: templates/managemails/mailbox_setpassword.html:8 +#: templates/managemails/mailbox_setpassword.html:17 +#, python-format +msgid "Set Password for Mailbox %(mailbox)s of Customer %(full_name)s" +msgstr "Passwort für Postfach %(mailbox)s des Kunden %(full_name)s setzen" + +#: templates/managemails/mailbox_setpassword.html:23 +msgid "Please specify the new password for your mailbox." +msgstr "Bitte geben Sie das neue Passwort für Ihr Postfach ein." + +#: templates/managemails/mailbox_setpassword.html:23 +msgid "Please specify the new password for the mailbox." +msgstr "Bitte geben Sie das neue Passwort für das Postfach ein." + #: templates/osusers/user_setpassword.html:5 #: templates/osusers/user_setpassword.html:13 #, python-format diff --git a/gnuviechadmin/managemails/forms.py b/gnuviechadmin/managemails/forms.py index 00c309f..04829f8 100644 --- a/gnuviechadmin/managemails/forms.py +++ b/gnuviechadmin/managemails/forms.py @@ -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) diff --git a/gnuviechadmin/managemails/locale/de/LC_MESSAGES/django.po b/gnuviechadmin/managemails/locale/de/LC_MESSAGES/django.po index 818ecd3..449ad57 100644 --- a/gnuviechadmin/managemails/locale/de/LC_MESSAGES/django.po +++ b/gnuviechadmin/managemails/locale/de/LC_MESSAGES/django.po @@ -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 \n" "Language-Team: Jan Dittberner \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." diff --git a/gnuviechadmin/managemails/urls.py b/gnuviechadmin/managemails/urls.py index 6695cd2..5e942d2 100644 --- a/gnuviechadmin/managemails/urls.py +++ b/gnuviechadmin/managemails/urls.py @@ -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\d+)/mailbox/create$', CreateMailbox.as_view(), name='create_mailbox'), + url(r'^(?P\d+)/mailbox/(?P[\w0-9]+)/setpassword$', + ChangeMailboxPassword.as_view(), name='change_mailbox_password'), ) diff --git a/gnuviechadmin/managemails/views.py b/gnuviechadmin/managemails/views.py index c53cca8..837edd4 100644 --- a/gnuviechadmin/managemails/views.py +++ b/gnuviechadmin/managemails/views.py @@ -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()) diff --git a/gnuviechadmin/templates/hostingpackages/customerhostingpackage_detail.html b/gnuviechadmin/templates/hostingpackages/customerhostingpackage_detail.html index 338622c..25c2e3f 100644 --- a/gnuviechadmin/templates/hostingpackages/customerhostingpackage_detail.html +++ b/gnuviechadmin/templates/hostingpackages/customerhostingpackage_detail.html @@ -131,7 +131,7 @@ {{ mailbox.mailaddresses|join:", " }} {% if mailbox.active %}{% trans "Active" %}{% else %}{% trans "inactive" %}{% endif %} - {% trans "Set mailbox password" %} + {% trans "Set mailbox password" %} {% endfor %} diff --git a/gnuviechadmin/templates/managemails/mailbox_setpassword.html b/gnuviechadmin/templates/managemails/mailbox_setpassword.html new file mode 100644 index 0000000..10829b5 --- /dev/null +++ b/gnuviechadmin/templates/managemails/mailbox_setpassword.html @@ -0,0 +1,34 @@ +{% extends "managemails/base.html" %} +{% load i18n crispy_forms_tags %} +{% block title %}{{ block.user }} - {% spaceless %} +{% with full_name=customer.get_full_name mailbox=mailbox.username %} +{% if customer == user %} +{% blocktrans %}Set Password for Mailbox {{ mailbox }}{% endblocktrans %} +{% else %} +{% blocktrans %}Set Password for Mailbox {{ mailbox }} of Customer {{ full_name }}{% endblocktrans %} +{% endif %} +{% endwith %} +{% endspaceless %}{% endblock title %} +{% block page_title %}{% spaceless %} +{% with full_name=customer.get_full_name mailbox=mailbox.username %} +{% if customer == user %} +{% blocktrans %}Set Password for Mailbox {{ mailbox }}{% endblocktrans %} +{% else %} +{% blocktrans %}Set Password for Mailbox {{ mailbox }} of Customer {{ full_name }}{% endblocktrans %} +{% endif %} +{% endwith %} +{% endspaceless %}{% endblock page_title %} + +{% block content %} +

{% if customer == user %}{% trans "Please specify the new password for your mailbox." %}{% else %}{% trans "Please specify the new password for the mailbox." %}{% endif %}

+{% crispy form %} +{% endblock content %} + +{% block extra_js %} + +{% endblock extra_js %}