add a next_url parameter to edit-profile view (#21769)
This commit is contained in:
parent
8ae64236cf
commit
93cc7e363f
|
@ -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,
|
||||
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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):
|
||||
|
|
|
@ -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'
|
||||
|
|
Loading…
Reference in New Issue