diff --git a/src/authentic2/manager/templates/authentic2/manager/user_edit.html b/src/authentic2/manager/templates/authentic2/manager/user_edit.html index 3f9a4a6b6..25f548906 100644 --- a/src/authentic2/manager/templates/authentic2/manager/user_edit.html +++ b/src/authentic2/manager/templates/authentic2/manager/user_edit.html @@ -7,3 +7,8 @@ {{ object.get_full_name }} {% trans "Edit" %} {% endblock %} + +{% block hidden_inputs %} + {{ block.super }} + {% if next %}{% endif %} +{% endblock %} diff --git a/src/authentic2/manager/user_views.py b/src/authentic2/manager/user_views.py index 276b97e47..d15bbd408 100644 --- a/src/authentic2/manager/user_views.py +++ b/src/authentic2/manager/user_views.py @@ -22,7 +22,7 @@ import tablib from authentic2.constants import SWITCH_USER_SESSION_KEY from authentic2.models import Attribute, AttributeValue, PasswordReset -from authentic2.utils import switch_user, send_password_reset_mail, redirect, send_email_change_email +from authentic2.utils import switch_user, send_password_reset_mail, redirect, select_next_url from authentic2.a2_rbac.utils import get_default_ou from authentic2 import hooks from django_rbac.utils import get_role_model, get_role_parenting_model, get_ou_model @@ -295,7 +295,6 @@ class UserEditView(OtherActionsMixin, ActionMixin, BaseEditView): form_class = UserEditForm permissions = ['custom_user.change_user'] fields = ['username', 'ou', 'first_name', 'last_name'] - success_url = '..' slug_field = 'uuid' action = _('Change') title = _('Edit user') @@ -311,6 +310,22 @@ class UserEditView(OtherActionsMixin, ActionMixin, BaseEditView): fields.append('is_superuser') return fields + def _get_next_url(self): + return select_next_url( + self.request, + default=reverse('a2-manager-user-detail', kwargs={'pk': self.object.pk}), + include_post=True) + + def get_context_data(self, **kwargs): + context = super(UserEditView, self).get_context_data(**kwargs) + next_url = self._get_next_url() + context['next'] = next_url + context['cancel_url'] = next_url + return context + + def get_success_url(self): + return self._get_next_url() + def form_valid(self, form): response = super(UserEditView, self).form_valid(form) hooks.call_hooks('event', name='manager-edit-user', user=self.request.user, diff --git a/tests/test_manager.py b/tests/test_manager.py index c6af5cf23..7aa0375d8 100644 --- a/tests/test_manager.py +++ b/tests/test_manager.py @@ -780,3 +780,28 @@ def test_manager_add_user_querystring(superuser_or_admin, app, ou1): response = app.get(url) assert querystring in response.location + + +def test_manager_edit_user_next(app, simple_user, superuser_or_admin): + next_url = u'/example.nowhere.null/' + url = u'/manage/users/%s/edit/?next=%s' % (simple_user.pk, next_url) + login(app, superuser_or_admin, '/manage/') + response = app.get(url) + + # cancel if not handled through form submission + assert response.pyquery.remove_namespaces()('a.cancel').attr('href') == next_url + + form = response.form + form.set('last_name', 'New name') + assert urlparse(form.submit().location).path == next_url + + +def test_manager_edit_user_next_form_error(superuser_or_admin, app, ou1, simple_user): + next_url = u'/example.nowhere.null/' + url = u'/manage/users/%s/edit/?next=%s' % (simple_user.pk, next_url) + login(app, superuser_or_admin, '/manage/') + response = app.get(url) + form = response.form + form.set('email', 'jd') # erroneous + resp = form.submit() + assert '' % next_url in resp.ubody