forked from mirrors/bookwyrm
Fixes how inboxes are initialized and updates user model tests
This commit is contained in:
parent
b01a64d560
commit
94ce426617
3 changed files with 30 additions and 19 deletions
|
@ -28,12 +28,6 @@ class ActorModel(BookWyrmModel):
|
||||||
blank=True,
|
blank=True,
|
||||||
)
|
)
|
||||||
inbox = fields.RemoteIdField(unique=True)
|
inbox = fields.RemoteIdField(unique=True)
|
||||||
shared_inbox = fields.RemoteIdField(
|
|
||||||
activitypub_field="sharedInbox",
|
|
||||||
activitypub_wrapper="endpoints",
|
|
||||||
deduplication_field=False,
|
|
||||||
null=True,
|
|
||||||
)
|
|
||||||
local = models.BooleanField(default=False)
|
local = models.BooleanField(default=False)
|
||||||
discoverable = fields.BooleanField(default=False)
|
discoverable = fields.BooleanField(default=False)
|
||||||
default_post_privacy = models.CharField(
|
default_post_privacy = models.CharField(
|
||||||
|
@ -53,7 +47,9 @@ class ActorModel(BookWyrmModel):
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
"""set fields"""
|
"""set fields"""
|
||||||
|
print('at the parent')
|
||||||
created = not bool(self.id)
|
created = not bool(self.id)
|
||||||
|
print('parent created', created)
|
||||||
if not created:
|
if not created:
|
||||||
super().save(*args, **kwargs)
|
super().save(*args, **kwargs)
|
||||||
return
|
return
|
||||||
|
@ -62,9 +58,12 @@ class ActorModel(BookWyrmModel):
|
||||||
# this is a new remote obj, we need to set their remote server field
|
# this is a new remote obj, we need to set their remote server field
|
||||||
if not self.local:
|
if not self.local:
|
||||||
super().save(*args, **kwargs)
|
super().save(*args, **kwargs)
|
||||||
# TODO transaction.on_commit(lambda: set_remote_server.delay(self.id))
|
transaction.on_commit(lambda: set_remote_server.delay(self.id))
|
||||||
return
|
return
|
||||||
|
|
||||||
|
self.followers_url = f"{self.remote_id}/followers"
|
||||||
|
self.inbox = f"{self.remote_id}/inbox"
|
||||||
|
self.outbox = f"{self.remote_id}/outbox"
|
||||||
super().save(*args, **kwargs)
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
# create keys and shelves for new local users
|
# create keys and shelves for new local users
|
||||||
|
|
|
@ -43,6 +43,12 @@ class User(OrderedCollectionPageMixin, AbstractUser, ActorModel):
|
||||||
unique=True,
|
unique=True,
|
||||||
validators=[fields.validate_localname],
|
validators=[fields.validate_localname],
|
||||||
)
|
)
|
||||||
|
shared_inbox = fields.RemoteIdField(
|
||||||
|
activitypub_field="sharedInbox",
|
||||||
|
activitypub_wrapper="endpoints",
|
||||||
|
deduplication_field=False,
|
||||||
|
null=True,
|
||||||
|
)
|
||||||
# name is your display name, which you can change at will
|
# name is your display name, which you can change at will
|
||||||
name = fields.CharField(max_length=100, null=True, blank=True)
|
name = fields.CharField(max_length=100, null=True, blank=True)
|
||||||
avatar = fields.ImageField(
|
avatar = fields.ImageField(
|
||||||
|
@ -231,14 +237,17 @@ class User(OrderedCollectionPageMixin, AbstractUser, ActorModel):
|
||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
"""populate fields for new local users"""
|
"""populate fields for new local users"""
|
||||||
|
print('hi')
|
||||||
created = not bool(self.id)
|
created = not bool(self.id)
|
||||||
|
print('created', created)
|
||||||
if not self.local and not re.match(regex.FULL_USERNAME, self.username):
|
if not self.local and not re.match(regex.FULL_USERNAME, self.username):
|
||||||
# generate a username that uses the domain (webfinger format)
|
# parse out the username that uses the domain (webfinger format)
|
||||||
actor_parts = urlparse(self.remote_id)
|
actor_parts = urlparse(self.remote_id)
|
||||||
self.username = f"{self.username}@{actor_parts.netloc}"
|
self.username = f"{self.username}@{actor_parts.netloc}"
|
||||||
|
|
||||||
# this user already exists, no need to populate fields
|
# this user already exists, no need to populate fields
|
||||||
if not created:
|
if not created:
|
||||||
|
# make sure the deactivation state is correct in case it was updated
|
||||||
if self.is_active:
|
if self.is_active:
|
||||||
self.deactivation_date = None
|
self.deactivation_date = None
|
||||||
elif not self.deactivation_date:
|
elif not self.deactivation_date:
|
||||||
|
@ -250,8 +259,11 @@ class User(OrderedCollectionPageMixin, AbstractUser, ActorModel):
|
||||||
with transaction.atomic():
|
with transaction.atomic():
|
||||||
# populate fields for local users
|
# populate fields for local users
|
||||||
link = site_link()
|
link = site_link()
|
||||||
|
print('link', link)
|
||||||
self.remote_id = f"{link}/user/{self.localname}"
|
self.remote_id = f"{link}/user/{self.localname}"
|
||||||
|
self.shared_inbox = f"{link}/inbox"
|
||||||
# an id needs to be set before we can proceed with related models
|
# an id needs to be set before we can proceed with related models
|
||||||
|
print('heading to the parent')
|
||||||
super().save(*args, **kwargs)
|
super().save(*args, **kwargs)
|
||||||
|
|
||||||
# make users editors by default
|
# make users editors by default
|
||||||
|
|
|
@ -17,7 +17,7 @@ class User(TestCase):
|
||||||
"bookwyrm.activitystreams.populate_stream_task.delay"
|
"bookwyrm.activitystreams.populate_stream_task.delay"
|
||||||
):
|
):
|
||||||
self.user = models.User.objects.create_user(
|
self.user = models.User.objects.create_user(
|
||||||
"mouse@%s" % DOMAIN,
|
f"mouse@{DOMAIN}",
|
||||||
"mouse@mouse.mouse",
|
"mouse@mouse.mouse",
|
||||||
"mouseword",
|
"mouseword",
|
||||||
local=True,
|
local=True,
|
||||||
|
@ -40,7 +40,7 @@ class User(TestCase):
|
||||||
self.assertIsNotNone(self.user.key_pair.public_key)
|
self.assertIsNotNone(self.user.key_pair.public_key)
|
||||||
|
|
||||||
def test_remote_user(self):
|
def test_remote_user(self):
|
||||||
with patch("bookwyrm.models.user.set_remote_server.delay"):
|
with patch("bookwyrm.models.actor.set_remote_server.delay"):
|
||||||
user = models.User.objects.create_user(
|
user = models.User.objects.create_user(
|
||||||
"rat",
|
"rat",
|
||||||
"rat@rat.rat",
|
"rat@rat.rat",
|
||||||
|
@ -98,7 +98,7 @@ class User(TestCase):
|
||||||
server_name=DOMAIN, application_type="test type", application_version=3
|
server_name=DOMAIN, application_type="test type", application_version=3
|
||||||
)
|
)
|
||||||
|
|
||||||
models.user.set_remote_server(self.user.id)
|
models.actor.set_remote_server(self.user.id)
|
||||||
self.user.refresh_from_db()
|
self.user.refresh_from_db()
|
||||||
|
|
||||||
self.assertEqual(self.user.federated_server, server)
|
self.assertEqual(self.user.federated_server, server)
|
||||||
|
@ -107,7 +107,7 @@ class User(TestCase):
|
||||||
def test_get_or_create_remote_server(self):
|
def test_get_or_create_remote_server(self):
|
||||||
responses.add(
|
responses.add(
|
||||||
responses.GET,
|
responses.GET,
|
||||||
"https://%s/.well-known/nodeinfo" % DOMAIN,
|
f"https://{DOMAIN}/.well-known/nodeinfo",
|
||||||
json={"links": [{"href": "http://www.example.com"}, {}]},
|
json={"links": [{"href": "http://www.example.com"}, {}]},
|
||||||
)
|
)
|
||||||
responses.add(
|
responses.add(
|
||||||
|
@ -116,7 +116,7 @@ class User(TestCase):
|
||||||
json={"software": {"name": "hi", "version": "2"}},
|
json={"software": {"name": "hi", "version": "2"}},
|
||||||
)
|
)
|
||||||
|
|
||||||
server = models.user.get_or_create_remote_server(DOMAIN)
|
server = models.actor.get_or_create_remote_server(DOMAIN)
|
||||||
self.assertEqual(server.server_name, DOMAIN)
|
self.assertEqual(server.server_name, DOMAIN)
|
||||||
self.assertEqual(server.application_type, "hi")
|
self.assertEqual(server.application_type, "hi")
|
||||||
self.assertEqual(server.application_version, "2")
|
self.assertEqual(server.application_version, "2")
|
||||||
|
@ -124,10 +124,10 @@ class User(TestCase):
|
||||||
@responses.activate
|
@responses.activate
|
||||||
def test_get_or_create_remote_server_no_wellknown(self):
|
def test_get_or_create_remote_server_no_wellknown(self):
|
||||||
responses.add(
|
responses.add(
|
||||||
responses.GET, "https://%s/.well-known/nodeinfo" % DOMAIN, status=404
|
responses.GET, f"https://{DOMAIN}/.well-known/nodeinfo", status=404
|
||||||
)
|
)
|
||||||
|
|
||||||
server = models.user.get_or_create_remote_server(DOMAIN)
|
server = models.actor.get_or_create_remote_server(DOMAIN)
|
||||||
self.assertEqual(server.server_name, DOMAIN)
|
self.assertEqual(server.server_name, DOMAIN)
|
||||||
self.assertIsNone(server.application_type)
|
self.assertIsNone(server.application_type)
|
||||||
self.assertIsNone(server.application_version)
|
self.assertIsNone(server.application_version)
|
||||||
|
@ -136,12 +136,12 @@ class User(TestCase):
|
||||||
def test_get_or_create_remote_server_no_links(self):
|
def test_get_or_create_remote_server_no_links(self):
|
||||||
responses.add(
|
responses.add(
|
||||||
responses.GET,
|
responses.GET,
|
||||||
"https://%s/.well-known/nodeinfo" % DOMAIN,
|
f"https://{DOMAIN}/.well-known/nodeinfo",
|
||||||
json={"links": [{"href": "http://www.example.com"}, {}]},
|
json={"links": [{"href": "http://www.example.com"}, {}]},
|
||||||
)
|
)
|
||||||
responses.add(responses.GET, "http://www.example.com", status=404)
|
responses.add(responses.GET, "http://www.example.com", status=404)
|
||||||
|
|
||||||
server = models.user.get_or_create_remote_server(DOMAIN)
|
server = models.actor.get_or_create_remote_server(DOMAIN)
|
||||||
self.assertEqual(server.server_name, DOMAIN)
|
self.assertEqual(server.server_name, DOMAIN)
|
||||||
self.assertIsNone(server.application_type)
|
self.assertIsNone(server.application_type)
|
||||||
self.assertIsNone(server.application_version)
|
self.assertIsNone(server.application_version)
|
||||||
|
@ -150,12 +150,12 @@ class User(TestCase):
|
||||||
def test_get_or_create_remote_server_unknown_format(self):
|
def test_get_or_create_remote_server_unknown_format(self):
|
||||||
responses.add(
|
responses.add(
|
||||||
responses.GET,
|
responses.GET,
|
||||||
"https://%s/.well-known/nodeinfo" % DOMAIN,
|
f"https://{DOMAIN}/.well-known/nodeinfo",
|
||||||
json={"links": [{"href": "http://www.example.com"}, {}]},
|
json={"links": [{"href": "http://www.example.com"}, {}]},
|
||||||
)
|
)
|
||||||
responses.add(responses.GET, "http://www.example.com", json={"fish": "salmon"})
|
responses.add(responses.GET, "http://www.example.com", json={"fish": "salmon"})
|
||||||
|
|
||||||
server = models.user.get_or_create_remote_server(DOMAIN)
|
server = models.actor.get_or_create_remote_server(DOMAIN)
|
||||||
self.assertEqual(server.server_name, DOMAIN)
|
self.assertEqual(server.server_name, DOMAIN)
|
||||||
self.assertIsNone(server.application_type)
|
self.assertIsNone(server.application_type)
|
||||||
self.assertIsNone(server.application_version)
|
self.assertIsNone(server.application_version)
|
||||||
|
|
Loading…
Reference in a new issue