From acfc865d4ef1b7d65e5bb2f8b36f7c1056e22055 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Tue, 26 Jan 2021 09:56:01 -0800 Subject: [PATCH] Adds blocked users view also refactors the setting view --- bookwyrm/templates/blocks.html | 21 +++ bookwyrm/templates/change_password.html | 19 +++ bookwyrm/templates/edit_user.html | 112 ++++++--------- bookwyrm/templates/preferences_layout.html | 31 ++++ bookwyrm/templates/snippets/block_button.html | 4 +- bookwyrm/tests/views/test_authentication.py | 103 ------------- bookwyrm/tests/views/test_password.py | 136 ++++++++++++++++++ bookwyrm/urls.py | 3 +- bookwyrm/views/block.py | 5 +- bookwyrm/views/password.py | 8 ++ bookwyrm/views/user.py | 9 +- 11 files changed, 273 insertions(+), 178 deletions(-) create mode 100644 bookwyrm/templates/blocks.html create mode 100644 bookwyrm/templates/change_password.html create mode 100644 bookwyrm/templates/preferences_layout.html create mode 100644 bookwyrm/tests/views/test_password.py diff --git a/bookwyrm/templates/blocks.html b/bookwyrm/templates/blocks.html new file mode 100644 index 00000000..0e725e4b --- /dev/null +++ b/bookwyrm/templates/blocks.html @@ -0,0 +1,21 @@ +{% extends 'preferences_layout.html' %} + +{% block header %} +Blocked Users +{% endblock %} + +{% block panel %} + +{% endblock %} + diff --git a/bookwyrm/templates/change_password.html b/bookwyrm/templates/change_password.html new file mode 100644 index 00000000..c373dfc8 --- /dev/null +++ b/bookwyrm/templates/change_password.html @@ -0,0 +1,19 @@ +{% extends 'preferences_layout.html' %} +{% block header %} +Change Password +{% endblock %} + +{% block panel %} +
+ {% csrf_token %} +
+ + +
+
+ + +
+ +
+{% endblock %} diff --git a/bookwyrm/templates/edit_user.html b/bookwyrm/templates/edit_user.html index 413f2cae..ee9ddb22 100644 --- a/bookwyrm/templates/edit_user.html +++ b/bookwyrm/templates/edit_user.html @@ -1,66 +1,48 @@ -{% extends 'layout.html' %} -{% block content %} -
-
-

Profile

- {% if form.non_field_errors %} -

{{ form.non_field_errors }}

- {% endif %} -
- {% csrf_token %} -
- - {{ form.avatar }} - {% for error in form.avatar.errors %} -

{{ error | escape }}

- {% endfor %} -
-
- - {{ form.name }} - {% for error in form.name.errors %} -

{{ error | escape }}

- {% endfor %} -
-
- - {{ form.summary }} - {% for error in form.summary.errors %} -

{{ error | escape }}

- {% endfor %} -
-
- - {{ form.email }} - {% for error in form.email.errors %} -

{{ error | escape }}

- {% endfor %} -
-
- -
- -
-
-
-
-

Change password

-
- {% csrf_token %} -
- - -
-
- - -
- -
-
-
-
+{% extends 'preferences_layout.html' %} +{% block header %} +Edit Profile +{% endblock %} + +{% block panel %} +{% if form.non_field_errors %} +

{{ form.non_field_errors }}

+{% endif %} +
+ {% csrf_token %} +
+ + {{ form.avatar }} + {% for error in form.avatar.errors %} +

{{ error | escape }}

+ {% endfor %} +
+
+ + {{ form.name }} + {% for error in form.name.errors %} +

{{ error | escape }}

+ {% endfor %} +
+
+ + {{ form.summary }} + {% for error in form.summary.errors %} +

{{ error | escape }}

+ {% endfor %} +
+
+ + {{ form.email }} + {% for error in form.email.errors %} +

{{ error | escape }}

+ {% endfor %} +
+
+ +
+ +
{% endblock %} diff --git a/bookwyrm/templates/preferences_layout.html b/bookwyrm/templates/preferences_layout.html new file mode 100644 index 00000000..de2fe0df --- /dev/null +++ b/bookwyrm/templates/preferences_layout.html @@ -0,0 +1,31 @@ +{% extends 'layout.html' %} +{% block content %} + +
+

{% block header %}{% endblock %}

+
+ +
+ +
+ {% block panel %}{% endblock %} +
+
+ +{% endblock %} diff --git a/bookwyrm/templates/snippets/block_button.html b/bookwyrm/templates/snippets/block_button.html index ed9bb551..9e49254d 100644 --- a/bookwyrm/templates/snippets/block_button.html +++ b/bookwyrm/templates/snippets/block_button.html @@ -1,11 +1,11 @@ {% if not user in request.user.blocks.all %}
{% csrf_token %} - +
{% else %}
{% csrf_token %} - +
{% endif %} diff --git a/bookwyrm/tests/views/test_authentication.py b/bookwyrm/tests/views/test_authentication.py index b0d09983..65577208 100644 --- a/bookwyrm/tests/views/test_authentication.py +++ b/bookwyrm/tests/views/test_authentication.py @@ -42,83 +42,6 @@ class AuthenticationViews(TestCase): self.assertEqual(result.status_code, 302) - def test_password_reset_request(self): - ''' there are so many views, this just makes sure it LOADS ''' - view = views.PasswordResetRequest.as_view() - request = self.factory.get('') - request.user = self.local_user - - result = view(request) - self.assertIsInstance(result, TemplateResponse) - self.assertEqual(result.template_name, 'password_reset_request.html') - self.assertEqual(result.status_code, 200) - - - def test_password_reset_request_post(self): - ''' send 'em an email ''' - request = self.factory.post('', {'email': 'aa@bb.ccc'}) - view = views.PasswordResetRequest.as_view() - resp = view(request) - self.assertEqual(resp.status_code, 302) - - request = self.factory.post('', {'email': 'mouse@mouse.com'}) - with patch('bookwyrm.emailing.send_email.delay'): - resp = view(request) - self.assertEqual(resp.template_name, 'password_reset_request.html') - - self.assertEqual( - models.PasswordReset.objects.get().user, self.local_user) - - def test_password_reset(self): - ''' there are so many views, this just makes sure it LOADS ''' - view = views.PasswordReset.as_view() - code = models.PasswordReset.objects.create(user=self.local_user) - request = self.factory.get('') - request.user = self.anonymous_user - result = view(request, code.code) - self.assertIsInstance(result, TemplateResponse) - self.assertEqual(result.template_name, 'password_reset.html') - self.assertEqual(result.status_code, 200) - - - def test_password_reset_post(self): - ''' reset from code ''' - view = views.PasswordReset.as_view() - code = models.PasswordReset.objects.create(user=self.local_user) - request = self.factory.post('', { - 'password': 'hi', - 'confirm-password': 'hi' - }) - with patch('bookwyrm.views.password.login'): - resp = view(request, code.code) - self.assertEqual(resp.status_code, 302) - self.assertFalse(models.PasswordReset.objects.exists()) - - def test_password_reset_wrong_code(self): - ''' reset from code ''' - view = views.PasswordReset.as_view() - models.PasswordReset.objects.create(user=self.local_user) - request = self.factory.post('', { - 'password': 'hi', - 'confirm-password': 'hi' - }) - resp = view(request, 'jhgdkfjgdf') - self.assertEqual(resp.template_name, 'password_reset.html') - self.assertTrue(models.PasswordReset.objects.exists()) - - def test_password_reset_mismatch(self): - ''' reset from code ''' - view = views.PasswordReset.as_view() - code = models.PasswordReset.objects.create(user=self.local_user) - request = self.factory.post('', { - 'password': 'hi', - 'confirm-password': 'hihi' - }) - resp = view(request, code.code) - self.assertEqual(resp.template_name, 'password_reset.html') - self.assertTrue(models.PasswordReset.objects.exists()) - - def test_register(self): ''' create a user ''' view = views.Register.as_view() @@ -274,29 +197,3 @@ class AuthenticationViews(TestCase): with self.assertRaises(Http404): response = view(request) self.assertEqual(models.User.objects.count(), 2) - - - def test_password_change(self): - ''' change password ''' - view = views.ChangePassword.as_view() - password_hash = self.local_user.password - request = self.factory.post('', { - 'password': 'hi', - 'confirm-password': 'hi' - }) - request.user = self.local_user - with patch('bookwyrm.views.password.login'): - view(request) - self.assertNotEqual(self.local_user.password, password_hash) - - def test_password_change_mismatch(self): - ''' change password ''' - view = views.ChangePassword.as_view() - password_hash = self.local_user.password - request = self.factory.post('', { - 'password': 'hi', - 'confirm-password': 'hihi' - }) - request.user = self.local_user - view(request) - self.assertEqual(self.local_user.password, password_hash) diff --git a/bookwyrm/tests/views/test_password.py b/bookwyrm/tests/views/test_password.py new file mode 100644 index 00000000..0f9c8988 --- /dev/null +++ b/bookwyrm/tests/views/test_password.py @@ -0,0 +1,136 @@ +''' test for app action functionality ''' +from unittest.mock import patch + +from django.contrib.auth.models import AnonymousUser +from django.template.response import TemplateResponse +from django.test import TestCase +from django.test.client import RequestFactory + +from bookwyrm import models, views + + +class PasswordViews(TestCase): + ''' view user and edit profile ''' + def setUp(self): + ''' we need basic test data and mocks ''' + self.factory = RequestFactory() + self.local_user = models.User.objects.create_user( + 'mouse@local.com', 'mouse@mouse.com', 'password', + local=True, localname='mouse') + self.anonymous_user = AnonymousUser + self.anonymous_user.is_authenticated = False + + + def test_password_reset_request(self): + ''' there are so many views, this just makes sure it LOADS ''' + view = views.PasswordResetRequest.as_view() + request = self.factory.get('') + request.user = self.local_user + + result = view(request) + self.assertIsInstance(result, TemplateResponse) + self.assertEqual(result.template_name, 'password_reset_request.html') + self.assertEqual(result.status_code, 200) + + + def test_password_reset_request_post(self): + ''' send 'em an email ''' + request = self.factory.post('', {'email': 'aa@bb.ccc'}) + view = views.PasswordResetRequest.as_view() + resp = view(request) + self.assertEqual(resp.status_code, 302) + + request = self.factory.post('', {'email': 'mouse@mouse.com'}) + with patch('bookwyrm.emailing.send_email.delay'): + resp = view(request) + self.assertEqual(resp.template_name, 'password_reset_request.html') + + self.assertEqual( + models.PasswordReset.objects.get().user, self.local_user) + + def test_password_reset(self): + ''' there are so many views, this just makes sure it LOADS ''' + view = views.PasswordReset.as_view() + code = models.PasswordReset.objects.create(user=self.local_user) + request = self.factory.get('') + request.user = self.anonymous_user + result = view(request, code.code) + self.assertIsInstance(result, TemplateResponse) + self.assertEqual(result.template_name, 'password_reset.html') + self.assertEqual(result.status_code, 200) + + + def test_password_reset_post(self): + ''' reset from code ''' + view = views.PasswordReset.as_view() + code = models.PasswordReset.objects.create(user=self.local_user) + request = self.factory.post('', { + 'password': 'hi', + 'confirm-password': 'hi' + }) + with patch('bookwyrm.views.password.login'): + resp = view(request, code.code) + self.assertEqual(resp.status_code, 302) + self.assertFalse(models.PasswordReset.objects.exists()) + + def test_password_reset_wrong_code(self): + ''' reset from code ''' + view = views.PasswordReset.as_view() + models.PasswordReset.objects.create(user=self.local_user) + request = self.factory.post('', { + 'password': 'hi', + 'confirm-password': 'hi' + }) + resp = view(request, 'jhgdkfjgdf') + self.assertEqual(resp.template_name, 'password_reset.html') + self.assertTrue(models.PasswordReset.objects.exists()) + + def test_password_reset_mismatch(self): + ''' reset from code ''' + view = views.PasswordReset.as_view() + code = models.PasswordReset.objects.create(user=self.local_user) + request = self.factory.post('', { + 'password': 'hi', + 'confirm-password': 'hihi' + }) + resp = view(request, code.code) + self.assertEqual(resp.template_name, 'password_reset.html') + self.assertTrue(models.PasswordReset.objects.exists()) + + + def test_password_change_get(self): + ''' there are so many views, this just makes sure it LOADS ''' + view = views.ChangePassword.as_view() + request = self.factory.get('') + request.user = self.local_user + + result = view(request) + self.assertIsInstance(result, TemplateResponse) + self.assertEqual(result.template_name, 'change_password.html') + self.assertEqual(result.status_code, 200) + + + def test_password_change(self): + ''' change password ''' + view = views.ChangePassword.as_view() + password_hash = self.local_user.password + request = self.factory.post('', { + 'password': 'hi', + 'confirm-password': 'hi' + }) + request.user = self.local_user + with patch('bookwyrm.views.password.login'): + view(request) + self.assertNotEqual(self.local_user.password, password_hash) + + def test_password_change_mismatch(self): + ''' change password ''' + view = views.ChangePassword.as_view() + password_hash = self.local_user.password + request = self.factory.post('', { + 'password': 'hi', + 'confirm-password': 'hihi' + }) + request.user = self.local_user + view(request) + self.assertEqual(self.local_user.password, password_hash) diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index bfd57d0a..0569fd9c 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -47,7 +47,7 @@ urlpatterns = [ re_path(r'^password-reset/?$', views.PasswordResetRequest.as_view()), re_path(r'^password-reset/(?P[A-Za-z0-9]+)/?$', views.PasswordReset.as_view()), - re_path(r'^change-password/?$', views.ChangePassword), + re_path(r'^change-password/?$', views.ChangePassword.as_view()), # invites re_path(r'^invite/?$', views.ManageInvites.as_view()), @@ -137,5 +137,6 @@ urlpatterns = [ re_path(r'^accept-follow-request/?$', views.accept_follow_request), re_path(r'^delete-follow-request/?$', views.delete_follow_request), + re_path(r'^block/?$', views.Block.as_view()), re_path(r'^block/(?P\d+)/?$', views.Block.as_view()), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) diff --git a/bookwyrm/views/block.py b/bookwyrm/views/block.py index 36f64f73..6158f373 100644 --- a/bookwyrm/views/block.py +++ b/bookwyrm/views/block.py @@ -1,6 +1,7 @@ ''' views for actions you can take in the application ''' from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404, redirect +from django.template.response import TemplateResponse from django.utils.decorators import method_decorator from django.views import View @@ -13,6 +14,8 @@ class Block(View): ''' blocking users ''' def get(self, request): ''' list of blocked users? ''' + return TemplateResponse( + request, 'blocks.html', {'title': 'Blocked Users'}) def post(self, request, user_id): ''' block a user ''' @@ -26,4 +29,4 @@ class Block(View): privacy='direct', direct_recipients=[to_block] ) - return redirect('/blocks') + return redirect('/block') diff --git a/bookwyrm/views/password.py b/bookwyrm/views/password.py index 915659e3..06ddc1da 100644 --- a/bookwyrm/views/password.py +++ b/bookwyrm/views/password.py @@ -88,6 +88,14 @@ class PasswordReset(View): @method_decorator(login_required, name='dispatch') class ChangePassword(View): ''' change password as logged in user ''' + def get(self, request): + ''' change password page ''' + data = { + 'title': 'Change Password', + 'user': request.user, + } + return TemplateResponse(request, 'change_password.html', data) + def post(self, request): ''' allow a user to change their password ''' new_password = request.POST.get('password') diff --git a/bookwyrm/views/user.py b/bookwyrm/views/user.py index acf19c44..25515bb1 100644 --- a/bookwyrm/views/user.py +++ b/bookwyrm/views/user.py @@ -147,14 +147,11 @@ class Following(View): class EditUser(View): ''' edit user view ''' def get(self, request): - ''' profile page for a user ''' - user = request.user - - form = forms.EditUserForm(instance=request.user) + ''' edit profile page for a user ''' data = { 'title': 'Edit profile', - 'form': form, - 'user': user, + 'form': forms.EditUserForm(instance=request.user), + 'user': request.user, } return TemplateResponse(request, 'edit_user.html', data)