diff --git a/bookwyrm/tests/views/admin/test_user_admin.py b/bookwyrm/tests/views/admin/test_user_admin.py index 3f480d990..1d11c7338 100644 --- a/bookwyrm/tests/views/admin/test_user_admin.py +++ b/bookwyrm/tests/views/admin/test_user_admin.py @@ -7,6 +7,7 @@ from django.test import TestCase from django.test.client import RequestFactory from bookwyrm import models, views +from bookwyrm.models.report import USER_PERMS from bookwyrm.management.commands import initdb from bookwyrm.tests.validate_html import validate_html @@ -79,3 +80,37 @@ class UserAdminViews(TestCase): self.assertEqual( list(self.local_user.groups.values_list("name", flat=True)), ["editor"] ) + + @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay") + @patch("bookwyrm.activitystreams.populate_stream_task.delay") + @patch("bookwyrm.suggested_users.remove_user_task.delay") + def test_user_admin_page_post_with_report(self, *_): + """set the user's group""" + group = Group.objects.get(name="editor") + self.assertEqual( + list(self.local_user.groups.values_list("name", flat=True)), ["moderator"] + ) + + report = models.Report.objects.create( + user=self.local_user, reporter=self.local_user + ) + + view = views.UserAdmin.as_view() + request = self.factory.post("", {"groups": [group.id]}) + request.user = self.local_user + + with patch("bookwyrm.models.activitypub_mixin.broadcast_task.apply_async"): + result = view(request, self.local_user.id, report.id) + + self.assertIsInstance(result, TemplateResponse) + validate_html(result.render()) + + self.assertEqual( + list(self.local_user.groups.values_list("name", flat=True)), ["editor"] + ) + # make sure a report action was created + self.assertTrue( + models.ReportAction.objects.filter( + report=report, action_type=USER_PERMS + ).exists() + ) diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index eb8727abb..0ebd7925c 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -141,12 +141,12 @@ urlpatterns = [ name="settings-users", ), re_path( - r"^settings/users/(?P\d+)/(?P\d+)?$", + r"^settings/users/(?P\d+)/(?P\d+)?$", views.UserAdmin.as_view(), name="settings-user", ), re_path( - r"^settings/users/(?P\d+)/activate/?$", + r"^settings/users/(?P\d+)/activate/?$", views.ActivateUserAdmin.as_view(), name="settings-activate-user", ), diff --git a/bookwyrm/views/admin/user_admin.py b/bookwyrm/views/admin/user_admin.py index c793d3bff..974910183 100644 --- a/bookwyrm/views/admin/user_admin.py +++ b/bookwyrm/views/admin/user_admin.py @@ -7,6 +7,7 @@ from django.utils.decorators import method_decorator from django.views import View from bookwyrm import forms, models +from bookwyrm.models.report import USER_PERMS from bookwyrm.settings import PAGE_LENGTH @@ -76,15 +77,16 @@ class UserAdminList(View): class UserAdmin(View): """moderate an individual user""" - def get(self, request, user): + # pylint: disable=unused-argument + def get(self, request, user_id, report_id=None): """user view""" - user = get_object_or_404(models.User, id=user) + user = get_object_or_404(models.User, id=user_id) data = {"user": user, "group_form": forms.UserGroupForm()} return TemplateResponse(request, "settings/users/user.html", data) - def post(self, request, user): + def post(self, request, user_id, report_id=None): """update user group""" - user = get_object_or_404(models.User, id=user) + user = get_object_or_404(models.User, id=user_id) if request.POST.get("groups") == "": user.groups.set([]) @@ -93,6 +95,10 @@ class UserAdmin(View): form = forms.UserGroupForm(request.POST, instance=user) if form.is_valid(): form.save(request) + + if report_id: + models.Report.record_action(report_id, USER_PERMS, request.user) + data = {"user": user, "group_form": form} return TemplateResponse(request, "settings/users/user.html", data) @@ -106,8 +112,8 @@ class ActivateUserAdmin(View): """activate a user manually""" # pylint: disable=unused-argument - def post(self, request, user): + def post(self, request, user_id): """activate user""" - user = get_object_or_404(models.User, id=user) + user = get_object_or_404(models.User, id=user_id) user.reactivate() return redirect("settings-user", user.id)