Repository: bookwyrm-social/bookwyrm

Issue:
User confirmation
**Describe the bug**

When a new user has not yet confirmed their email address, if the site settings change to disable email address confirmation, the user's status stays inactive and the code doesn't work.

**To Reproduce**

1. Site settings: email confirmation ON
2. Register new user
3. Do not confirm their email with `confirmation_link` or confirmation code
4. Site settings: email confirmation OFF
5. user is inactive
6. `confirmation_link` or confirmation code seem not to work


**Expected behavior**
A clear and concise description of what you expected to happen.

User confirmation should work even when the setting for email confirmation is off



Discussion:
This would be awesome because I make this mistake every single time I am testing something on a fresh dev instance 🤣

Resolving patch:
diff --git a/bookwyrm/models/site.py b/bookwyrm/models/site.py
--- a/bookwyrm/models/site.py
+++ b/bookwyrm/models/site.py
@@ -90,6 +90,14 @@ def get_url(self, field, default_path):
             return get_absolute_url(uploaded)
         return urljoin(STATIC_FULL_URL, default_path)
 
+    def save(self, *args, **kwargs):
+        """if require_confirm_email is disabled, make sure no users are pending"""
+        if not self.require_confirm_email:
+            User.objects.filter(is_active=False, deactivation_reason="pending").update(
+                is_active=True, deactivation_reason=None
+            )
+        super().save(*args, **kwargs)
+
 
 class SiteInvite(models.Model):
     """gives someone access to create an account on the instance"""


Test patch:
diff --git a/bookwyrm/tests/models/test_site.py b/bookwyrm/tests/models/test_site.py
--- a/bookwyrm/tests/models/test_site.py
+++ b/bookwyrm/tests/models/test_site.py
@@ -93,3 +93,48 @@ def test_password_reset(self):
         token = models.PasswordReset.objects.create(user=self.local_user, code="hello")
         self.assertTrue(token.valid())
         self.assertEqual(token.link, f"https://{settings.DOMAIN}/password-reset/hello")
+
+    @patch("bookwyrm.suggested_users.rerank_suggestions_task.delay")
+    @patch("bookwyrm.suggested_users.remove_user_task.delay")
+    @patch("bookwyrm.activitystreams.populate_stream_task.delay")
+    @patch("bookwyrm.lists_stream.populate_lists_task.delay")
+    def test_change_confirmation_scheme(self, *_):
+        """Switch from requiring email confirmation to not"""
+        site = models.SiteSettings.objects.create(
+            id=1, name="Fish Town", require_confirm_email=True
+        )
+        banned_user = models.User.objects.create_user(
+            "rat@local.com",
+            "rat@rat.com",
+            "ratword",
+            local=True,
+            localname="rat",
+            remote_id="https://example.com/users/rat",
+            confirmation_code="HELLO",
+        )
+        banned_user.is_active = False
+        banned_user.deactivation_reason = "banned"
+        banned_user.save(broadcast=False)
+
+        pending_user = models.User.objects.create_user(
+            "nutria@local.com",
+            "nutria@nutria.com",
+            "nutriaword",
+            local=True,
+            localname="nutria",
+            remote_id="https://example.com/users/nutria",
+            confirmation_code="HELLO",
+        )
+        pending_user.is_active = False
+        pending_user.deactivation_reason = "pending"
+        pending_user.save(broadcast=False)
+        site.require_confirm_email = False
+        site.save()
+
+        pending_user.refresh_from_db()
+        self.assertTrue(pending_user.is_active)
+        self.assertIsNone(pending_user.deactivation_reason)
+
+        banned_user.refresh_from_db()
+        self.assertFalse(banned_user.is_active)
+        self.assertIsNotNone(banned_user.deactivation_reason)