diff --git a/h/accounts/views.py b/h/accounts/views.py index 1b6a8a58b59..9f479903df8 100644 --- a/h/accounts/views.py +++ b/h/accounts/views.py @@ -219,7 +219,7 @@ def post(self): self._send_forgot_password_email(user) return httpexceptions.HTTPFound( - self.request.route_path('reset_password')) + self.request.route_path('account_reset')) def _redirect_if_logged_in(self): if self.request.authenticated_userid is not None: @@ -229,14 +229,14 @@ def _send_forgot_password_email(self, user): serializer = self.request.registry.password_reset_serializer code = serializer.dumps(user.username) - link = reset_password_link(self.request, code) - message = reset_password_email(user, code, link) + link = account_reset_link(self.request, code) + message = account_reset_email(user, code, link) mailer.send.delay(**message) -@view_defaults(route_name='reset_password', - renderer='h:templates/accounts/reset_password.html.jinja2') -class ResetPasswordController(object): +@view_defaults(route_name='account_reset', + renderer='h:templates/accounts/reset.html.jinja2') +class ResetController(object): """Controller for handling password reset forms.""" @@ -245,7 +245,7 @@ def __init__(self, request): self.schema = schemas.ResetPasswordSchema().bind(request=self.request) self.form = request.create_form( schema=self.schema, - action=self.request.route_path('reset_password'), + action=self.request.route_path('account_reset'), buttons=(_('Save'),)) @view_config(request_method='GET') @@ -253,7 +253,7 @@ def get(self): """Render the reset password form.""" return {'form': self.form.render(), 'has_code': False} - @view_config(route_name='reset_password_with_code', + @view_config(route_name='account_reset_with_code', request_method='GET') def get_with_prefilled_code(self): """Render the reset password form with a prefilled code.""" @@ -310,9 +310,9 @@ def _reset_password(self, user, password): self.request.registry.notify(PasswordResetEvent(self.request, user)) -@view_defaults(route_name='register', - renderer='h:templates/accounts/register.html.jinja2') -class RegisterController(object): +@view_defaults(route_name='signup', + renderer='h:templates/accounts/signup.html.jinja2') +class SignupController(object): def __init__(self, request): tos_link = ('' + @@ -353,7 +353,7 @@ def post(self): except deform.ValidationFailure: return {'form': self.form.render()} - self._register(username=appstruct['username'], + self._signup(username=appstruct['username'], email=appstruct['email'], password=appstruct['password']) @@ -364,7 +364,7 @@ def _redirect_if_logged_in(self): if self.request.authenticated_userid is not None: raise httpexceptions.HTTPFound(self.request.route_url('stream')) - def _register(self, username, email, password): + def _signup(self, username, email, password): user = User(username=username, email=email, password=password) self.request.db.add(user) @@ -624,7 +624,7 @@ def activation_email(request, user): } -def reset_password_email(user, reset_code, reset_link): +def account_reset_email(user, reset_code, reset_link): """Return the data for a 'reset your password' email for the given user. :rtype: dict @@ -649,9 +649,9 @@ def reset_password_email(user, reset_code, reset_link): } -def reset_password_link(request, reset_code): - """Transform an activation code into a password reset link.""" - return request.route_url('reset_password_with_code', code=reset_code) +def account_reset_link(request, reset_code): + """Transform an activation code into an account reset link.""" + return request.route_url('account_reset_with_code', code=reset_code) # TODO: This can be removed after October 2016, which will be >1 year from the @@ -680,11 +680,11 @@ def dismiss_sidebar_tutorial(request): def includeme(config): config.add_route('login', '/login') config.add_route('logout', '/logout') - config.add_route('register', '/register') + config.add_route('signup', '/signup') config.add_route('activate', '/activate/{id}/{code}') - config.add_route('forgot_password', '/forgot_password') - config.add_route('reset_password', '/reset_password') - config.add_route('reset_password_with_code', '/reset_password/{code}') + config.add_route('forgot_password', '/forgot-password') + config.add_route('account_reset', '/account/reset') + config.add_route('account_reset_with_code', '/account/reset/{code}') config.add_route('account', '/account/settings') config.add_route( 'account_notifications', '/account/settings/notifications') diff --git a/h/templates/accounts/forgot_password.html.jinja2 b/h/templates/accounts/forgot_password.html.jinja2 index 333686bb675..b63b298ebc0 100644 --- a/h/templates/accounts/forgot_password.html.jinja2 +++ b/h/templates/accounts/forgot_password.html.jinja2 @@ -29,7 +29,7 @@ Password reset
{{ form }} diff --git a/h/templates/accounts/login.html.jinja2 b/h/templates/accounts/login.html.jinja2 index 717f4c8a603..c7b17347f13 100644 --- a/h/templates/accounts/login.html.jinja2 +++ b/h/templates/accounts/login.html.jinja2 @@ -14,7 +14,7 @@ {{ form }}
{% else %} @@ -23,7 +23,7 @@
{{ form }}
diff --git a/h/templates/accounts/reset_password.html.jinja2 b/h/templates/accounts/reset.html.jinja2 similarity index 95% rename from h/templates/accounts/reset_password.html.jinja2 rename to h/templates/accounts/reset.html.jinja2 index 118e0a076fd..9bd85493827 100644 --- a/h/templates/accounts/reset_password.html.jinja2 +++ b/h/templates/accounts/reset.html.jinja2 @@ -37,7 +37,7 @@ Password reset
{% if not has_code %} diff --git a/h/templates/accounts/register.html.jinja2 b/h/templates/accounts/signup.html.jinja2 similarity index 91% rename from h/templates/accounts/register.html.jinja2 rename to h/templates/accounts/signup.html.jinja2 index 7c6f66ba3fd..65adc95edab 100644 --- a/h/templates/accounts/register.html.jinja2 +++ b/h/templates/accounts/signup.html.jinja2 @@ -29,7 +29,7 @@ Create account
{{ form }}
diff --git a/h/templates/home.html.jinja2 b/h/templates/home.html.jinja2 index da3507b6b88..95f3978cb5e 100644 --- a/h/templates/home.html.jinja2 +++ b/h/templates/home.html.jinja2 @@ -73,7 +73,7 @@
  • Log out
  • {% else %}
  • Log in
  • -
  • Create an account
  • +
  • Create an account
  • {% endif %} diff --git a/h/tweens.py b/h/tweens.py index 592b49bb03c..5745b85b4b6 100644 --- a/h/tweens.py +++ b/h/tweens.py @@ -102,7 +102,9 @@ def content_security_policy_tween(request): REDIRECTS = { '/profile': 'account', '/profile/notifications': 'account_notifications', - '/profile/developer': 'account_developer' + '/profile/developer': 'account_developer', + '/register': 'signup', + '/forgot_password': 'forgot_password' } diff --git a/tests/h/accounts/views_test.py b/tests/h/accounts/views_test.py index b0058a4c6dc..50afc41db04 100644 --- a/tests/h/accounts/views_test.py +++ b/tests/h/accounts/views_test.py @@ -291,7 +291,7 @@ def test_post_creates_no_activations_when_validation_fails(self, assert activation_model.call_count == 0 - @mock.patch('h.accounts.views.reset_password_link') + @mock.patch('h.accounts.views.account_reset_link') def test_post_generates_reset_link(self, reset_link, pyramid_request): pyramid_request.registry.password_reset_serializer = FakeSerializer() user = FakeUser(username='giraffe', email='giraffe@thezoo.org') @@ -302,8 +302,8 @@ def test_post_generates_reset_link(self, reset_link, pyramid_request): reset_link.assert_called_with(pyramid_request, "faketoken") - @mock.patch('h.accounts.views.reset_password_email') - @mock.patch('h.accounts.views.reset_password_link') + @mock.patch('h.accounts.views.account_reset_email') + @mock.patch('h.accounts.views.account_reset_link') def test_post_generates_mail(self, reset_link, reset_mail, @@ -324,7 +324,7 @@ def test_post_generates_mail(self, reset_mail.assert_called_with(user, "faketoken", "http://example.com") - @mock.patch('h.accounts.views.reset_password_email') + @mock.patch('h.accounts.views.account_reset_email') def test_post_sends_mail(self, reset_mail, mailer, pyramid_request): pyramid_request.registry.password_reset_serializer = FakeSerializer() user = FakeUser(username='giraffe', email='giraffe@thezoo.org') @@ -361,15 +361,15 @@ def test_get_redirects_when_logged_in(self, pyramid_config, pyramid_request): @pytest.fixture def routes(self, pyramid_config): pyramid_config.add_route('index', '/index') - pyramid_config.add_route('reset_password', '/reset') - pyramid_config.add_route('reset_password_with_code', '/reset-with-code') + pyramid_config.add_route('account_reset', '/account/reset') + pyramid_config.add_route('account_reset_with_code', '/account/reset-with-code') @pytest.mark.usefixtures('routes') -class TestResetPasswordController(object): +class TestResetController(object): def test_post_returns_form_when_validation_fails(self, pyramid_request): - controller = views.ResetPasswordController(pyramid_request) + controller = views.ResetController(pyramid_request) controller.form = invalid_form() result = controller.post() @@ -378,7 +378,7 @@ def test_post_returns_form_when_validation_fails(self, pyramid_request): def test_post_sets_user_password_from_form(self, pyramid_request): elephant = FakeUser(password='password1') - controller = views.ResetPasswordController(pyramid_request) + controller = views.ResetController(pyramid_request) controller.form = form_validating_to({'user': elephant, 'password': 's3cure!'}) @@ -389,7 +389,7 @@ def test_post_sets_user_password_from_form(self, pyramid_request): @mock.patch('h.accounts.views.PasswordResetEvent', autospec=True) def test_post_emits_event(self, event, notify, pyramid_request): user = FakeUser(password='password1') - controller = views.ResetPasswordController(pyramid_request) + controller = views.ResetController(pyramid_request) controller.form = form_validating_to({'user': user, 'password': 's3cure!'}) @@ -400,7 +400,7 @@ def test_post_emits_event(self, event, notify, pyramid_request): def test_post_redirects_on_success(self, pyramid_request): user = FakeUser(password='password1') - controller = views.ResetPasswordController(pyramid_request) + controller = views.ResetController(pyramid_request) controller.form = form_validating_to({'user': user, 'password': 's3cure!'}) @@ -412,8 +412,8 @@ def test_post_redirects_on_success(self, pyramid_request): def routes(self, pyramid_config): pyramid_config.add_route('index', '/index') pyramid_config.add_route('login', '/login') - pyramid_config.add_route('reset_password', '/reset') - pyramid_config.add_route('reset_password_with_code', '/reset-with-code') + pyramid_config.add_route('account_reset', '/reset') + pyramid_config.add_route('account_reset_with_code', '/reset-with-code') @pytest.mark.usefixtures('activation_model', @@ -422,10 +422,10 @@ def routes(self, pyramid_config): 'notify', 'routes', 'user_model') -class TestRegisterController(object): +class TestSignupController(object): def test_post_returns_errors_when_validation_fails(self, pyramid_request): - controller = views.RegisterController(pyramid_request) + controller = views.SignupController(pyramid_request) controller.form = invalid_form() result = controller.post() @@ -433,7 +433,7 @@ def test_post_returns_errors_when_validation_fails(self, pyramid_request): assert result == {"form": "invalid form"} def test_post_creates_user_from_form_data(self, pyramid_request, user_model): - controller = views.RegisterController(pyramid_request) + controller = views.SignupController(pyramid_request) controller.form = form_validating_to({ "username": "bob", "email": "bob@example.com", @@ -448,7 +448,7 @@ def test_post_creates_user_from_form_data(self, pyramid_request, user_model): password="s3crets") def test_post_adds_new_user_to_session(self, pyramid_request, user_model): - controller = views.RegisterController(pyramid_request) + controller = views.SignupController(pyramid_request) controller.form = form_validating_to({ "username": "bob", "email": "bob@example.com", @@ -460,7 +460,7 @@ def test_post_adds_new_user_to_session(self, pyramid_request, user_model): assert user_model.return_value in pyramid_request.db.added def test_post_creates_new_activation(self, activation_model, pyramid_request, user_model): - controller = views.RegisterController(pyramid_request) + controller = views.SignupController(pyramid_request) controller.form = form_validating_to({ "username": "bob", "email": "bob@example.com", @@ -477,7 +477,7 @@ def test_post_generates_activation_email_from_user(self, activation_email, pyramid_request, user_model): - controller = views.RegisterController(pyramid_request) + controller = views.SignupController(pyramid_request) controller.form = form_validating_to({ "username": "bob", "email": "bob@example.com", @@ -496,7 +496,7 @@ def test_post_generates_activation_email_from_user(self, @mock.patch('h.accounts.views.activation_email') def test_post_sends_email(self, activation_email, mailer, pyramid_request): - controller = views.RegisterController(pyramid_request) + controller = views.SignupController(pyramid_request) controller.form = form_validating_to({ "username": "bob", "email": "bob@example.com", @@ -516,7 +516,7 @@ def test_post_sends_email(self, activation_email, mailer, pyramid_request): @mock.patch('h.accounts.views.RegistrationEvent') def test_post_no_event_when_validation_fails(self, event, notify, pyramid_request): - controller = views.RegisterController(pyramid_request) + controller = views.SignupController(pyramid_request) controller.form = invalid_form() controller.post() @@ -530,7 +530,7 @@ def test_post_event_when_validation_succeeds(self, notify, pyramid_request, user_model): - controller = views.RegisterController(pyramid_request) + controller = views.SignupController(pyramid_request) controller.form = form_validating_to({ "username": "bob", "email": "bob@example.com", @@ -544,7 +544,7 @@ def test_post_event_when_validation_succeeds(self, notify.assert_called_with(event.return_value) def test_post_event_redirects_on_success(self, pyramid_request): - controller = views.RegisterController(pyramid_request) + controller = views.SignupController(pyramid_request) controller.form = form_validating_to({ "username": "bob", "email": "bob@example.com", @@ -557,7 +557,7 @@ def test_post_event_redirects_on_success(self, pyramid_request): def test_get_redirects_when_logged_in(self, pyramid_config, pyramid_request): pyramid_config.testing_securitypolicy("acct:jane@doe.org") - controller = views.RegisterController(pyramid_request) + controller = views.SignupController(pyramid_request) with pytest.raises(httpexceptions.HTTPRedirection): controller.get()