From 878b3c6fe8d6add1982a8725e44e2937345c5435 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Mon, 12 Apr 2021 10:13:38 -0700 Subject: [PATCH] Only reactivate appropriate users when undoing domain block --- .../0066_user_deactivation_reason.py | 17 +++-- bookwyrm/models/federated_server.py | 9 ++- .../tests/models/test_federated_server.py | 67 +++++++++++++++++++ 3 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 bookwyrm/tests/models/test_federated_server.py diff --git a/bookwyrm/migrations/0066_user_deactivation_reason.py b/bookwyrm/migrations/0066_user_deactivation_reason.py index 292f8306..bb3173a7 100644 --- a/bookwyrm/migrations/0066_user_deactivation_reason.py +++ b/bookwyrm/migrations/0066_user_deactivation_reason.py @@ -6,13 +6,22 @@ from django.db import migrations, models class Migration(migrations.Migration): dependencies = [ - ('bookwyrm', '0065_merge_20210411_1702'), + ("bookwyrm", "0065_merge_20210411_1702"), ] operations = [ migrations.AddField( - model_name='user', - name='deactivation_reason', - field=models.CharField(blank=True, choices=[('self_deletion', 'Self Deletion'), ('moderator_deletion', 'Moderator Deletion'), ('domain_block', 'Domain Block')], max_length=255, null=True), + model_name="user", + name="deactivation_reason", + field=models.CharField( + blank=True, + choices=[ + ("self_deletion", "Self Deletion"), + ("moderator_deletion", "Moderator Deletion"), + ("domain_block", "Domain Block"), + ], + max_length=255, + null=True, + ), ), ] diff --git a/bookwyrm/models/federated_server.py b/bookwyrm/models/federated_server.py index d2b82355..aa2b2f6a 100644 --- a/bookwyrm/models/federated_server.py +++ b/bookwyrm/models/federated_server.py @@ -30,15 +30,18 @@ class FederatedServer(BookWyrmModel): self.save() # deactivate all associated users - self.user_set.update(is_active=False) + self.user_set.filter(is_active=True).update( + is_active=False, deactivation_reason="domain_block" + ) def unblock(self): """ unblock a server """ self.status = "federated" self.save() - # TODO: only reactivate users as appropriate - self.user_set.update(is_active=True) + self.user_set.filter(deactivation_reason="domain_block").update( + is_active=True, deactivation_reason=None + ) @classmethod def is_blocked(cls, url): diff --git a/bookwyrm/tests/models/test_federated_server.py b/bookwyrm/tests/models/test_federated_server.py new file mode 100644 index 00000000..4e9e8b68 --- /dev/null +++ b/bookwyrm/tests/models/test_federated_server.py @@ -0,0 +1,67 @@ +""" testing models """ +from unittest.mock import patch +from django.test import TestCase + +from bookwyrm import models + + +class FederatedServer(TestCase): + """ federate server management """ + + def setUp(self): + """ we'll need a user """ + self.server = models.FederatedServer.objects.create(server_name="test.server") + with patch("bookwyrm.models.user.set_remote_server.delay"): + self.remote_user = models.User.objects.create_user( + "rat", + "rat@rat.com", + "ratword", + federated_server=self.server, + local=False, + remote_id="https://example.com/users/rat", + inbox="https://example.com/users/rat/inbox", + outbox="https://example.com/users/rat/outbox", + ) + self.inactive_remote_user = models.User.objects.create_user( + "nutria", + "nutria@nutria.com", + "nutriaword", + federated_server=self.server, + local=False, + remote_id="https://example.com/users/nutria", + inbox="https://example.com/users/nutria/inbox", + outbox="https://example.com/users/nutria/outbox", + is_active=False, + deactivation_reason="self_deletion", + ) + + def test_block_unblock(self): + """ block a server and all users on it """ + self.assertEqual(self.server.status, "federated") + self.assertTrue(self.remote_user.is_active) + self.assertFalse(self.inactive_remote_user.is_active) + + self.server.block() + + self.assertEqual(self.server.status, "blocked") + self.remote_user.refresh_from_db() + self.assertFalse(self.remote_user.is_active) + self.assertEqual(self.remote_user.deactivation_reason, "domain_block") + + self.inactive_remote_user.refresh_from_db() + self.assertFalse(self.inactive_remote_user.is_active) + self.assertEqual(self.inactive_remote_user.deactivation_reason, "self_deletion") + + # UNBLOCK + self.server.unblock() + + self.assertEqual(self.server.status, "federated") + # user blocked in deactivation is reactivated + self.remote_user.refresh_from_db() + self.assertTrue(self.remote_user.is_active) + self.assertIsNone(self.remote_user.deactivation_reason) + + # deleted user remains deleted + self.inactive_remote_user.refresh_from_db() + self.assertFalse(self.inactive_remote_user.is_active) + self.assertEqual(self.inactive_remote_user.deactivation_reason, "self_deletion")