From dd62f472da4115fd30e4f1e155253911fc6d92ee Mon Sep 17 00:00:00 2001 From: Ryan Barrett Date: Mon, 27 Nov 2023 06:50:09 -0800 Subject: [PATCH] User.get_or_create: return None if opted out --- models.py | 5 +++++ tests/test_models.py | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/models.py b/models.py index 75b94a2..51da47d 100644 --- a/models.py +++ b/models.py @@ -199,10 +199,15 @@ class User(StringIdModel, metaclass=ProtocolUserMeta): Args: propagate (bool): whether to create copies of this user in push-based protocols, eg ATProto and Nostr. + + Returns: + User: existing or new user, or None if the user is opted out """ assert cls != User user = cls.get_by_id(id) if user: + if user.status == 'opt-out': + return None # override direct from False => True if set # TODO: propagate more props into user? direct = kwargs.get('direct') diff --git a/tests/test_models.py b/tests/test_models.py index 77d373e..0c75c2b 100644 --- a/tests/test_models.py +++ b/tests/test_models.py @@ -99,6 +99,11 @@ class UserTest(TestCase): self.assertEqual('y.z', Fake.get_or_create('a.b').key.id()) + def test_get_or_create_opted_out(self): + user = self.make_user('fake:user', cls=Fake, + obj_as1 = {'summary': '#nobridge'}) + self.assertIsNone(Fake.get_or_create('fake:user')) + def test_public_pem(self): pem = self.user.public_pem() self.assertTrue(pem.decode().startswith('-----BEGIN PUBLIC KEY-----\n'), pem)