add a next_url parameter to edit-profile view (#21769)

This commit is contained in:
Benjamin Dauvergne 2018-02-19 17:20:06 +01:00
parent 8ae64236cf
commit 93cc7e363f
4 changed files with 36 additions and 4 deletions

View File

@ -103,6 +103,9 @@ class BaseUserForm(forms.ModelForm):
return result
class EditProfileForm(NextUrlFormMixin, BaseUserForm):
pass
def modelform_factory(model, **kwargs):
'''Build a modelform for the given model,

View File

@ -68,7 +68,6 @@ class EditProfile(cbv.HookMixin, cbv.TemplateNamesMixin, UpdateView):
model = compat.get_user_model()
template_names = ['profiles/edit_profile.html',
'authentic2/accounts_edit.html']
success_url = '../'
@classmethod
def can_edit_profile(cls):
@ -99,7 +98,9 @@ class EditProfile(cbv.HookMixin, cbv.TemplateNamesMixin, UpdateView):
fields, labels = self.get_fields()
# Email must be edited through the change email view, as it needs validation
fields = [field for field in fields if field != 'email']
return forms.modelform_factory(compat.get_user_model(), fields=fields, labels=labels)
return forms.modelform_factory(compat.get_user_model(), fields=fields,
labels=labels,
form=forms.EditProfileForm)
def get_object(self):
return self.request.user
@ -107,11 +108,18 @@ class EditProfile(cbv.HookMixin, cbv.TemplateNamesMixin, UpdateView):
def get_form_kwargs(self, **kwargs):
kwargs = super(EditProfile, self).get_form_kwargs(**kwargs)
kwargs['prefix'] = 'edit-profile'
kwargs['next_url'] = utils.select_next_url(self.request, reverse('account_management'))
return kwargs
def get_success_url(self):
field_name = 'edit-profile-next_url'
if self.request.method == 'POST' and field_name in self.request.POST:
return self.request.POST[field_name]
return 'account_management'
def post(self, request, *args, **kwargs):
if 'cancel' in request.POST:
return utils.redirect(request, 'account_management')
return utils.redirect(request, self.get_success_url())
return super(EditProfile, self).post(request, *args, **kwargs)
def form_valid(self, form):

View File

@ -283,7 +283,7 @@ class UserProfileTests(TestCase):
password='secret'))
response = self.client.get(reverse('profile_edit'))
form = get_response_form(response)
self.assertEqual(set(form.fields), set())
self.assertEqual(set(form.fields), set(['next_url']))
class CacheTests(TestCase):

View File

@ -42,3 +42,24 @@ def test_account_edit_view(app, simple_user):
resp = app.get(url, status=200)
assert 'phone' not in resp
assert attribute.get_value(simple_user) == '0123456789'
def test_account_edit_next_url(app, simple_user, external_redirect_next_url, assert_external_redirect):
utils.login(app, simple_user)
url = reverse('profile_edit')
attribute = Attribute.objects.create(
name='phone', label='phone',
kind='string', user_visible=True,
user_editable=True)
resp = app.get(url + '?next=%s' % external_redirect_next_url, status=200)
resp.form.set('edit-profile-phone', '0123456789')
resp = resp.form.submit()
assert_external_redirect(resp, reverse('account_management'))
assert attribute.get_value(simple_user) == '0123456789'
resp = app.get(url + '?next=%s' % external_redirect_next_url, status=200)
resp.form.set('edit-profile-phone', '1234')
resp = resp.form.submit('cancel')
assert_external_redirect(resp, reverse('account_management'))
assert attribute.get_value(simple_user) == '0123456789'