forked from mirrors/bookwyrm
Fixes error on deletion requests for unknown users
This commit is contained in:
parent
53e11051d4
commit
5df2ac676b
2 changed files with 52 additions and 9 deletions
|
@ -16,11 +16,10 @@ class Verb(ActivityObject):
|
||||||
|
|
||||||
def action(self):
|
def action(self):
|
||||||
""" usually we just want to update and save """
|
""" usually we just want to update and save """
|
||||||
obj = self.object
|
# self.object may return None if the object is invalid in an expected way
|
||||||
# it may return None if the object is invalid in an expected way
|
|
||||||
# ie, Question type
|
# ie, Question type
|
||||||
if obj:
|
if self.object:
|
||||||
obj.to_model()
|
self.object.to_model()
|
||||||
|
|
||||||
|
|
||||||
@dataclass(init=False)
|
@dataclass(init=False)
|
||||||
|
@ -43,7 +42,16 @@ class Delete(Verb):
|
||||||
|
|
||||||
def action(self):
|
def action(self):
|
||||||
""" find and delete the activity object """
|
""" find and delete the activity object """
|
||||||
obj = self.object.to_model(save=False, allow_create=False)
|
if not self.object:
|
||||||
|
return
|
||||||
|
|
||||||
|
if isinstance(self.object, str):
|
||||||
|
# Deleted users are passed as strings. Not wild about this fix
|
||||||
|
model = apps.get_model("bookwyrm.User")
|
||||||
|
obj = model.find_existing_by_remote_id(self.object)
|
||||||
|
else:
|
||||||
|
obj = self.object.to_model(save=False, allow_create=False)
|
||||||
|
|
||||||
if obj:
|
if obj:
|
||||||
obj.delete()
|
obj.delete()
|
||||||
# if we can't find it, we don't need to delete it because we don't have it
|
# if we can't find it, we don't need to delete it because we don't have it
|
||||||
|
@ -58,8 +66,7 @@ class Update(Verb):
|
||||||
|
|
||||||
def action(self):
|
def action(self):
|
||||||
""" update a model instance from the dataclass """
|
""" update a model instance from the dataclass """
|
||||||
obj = self.object
|
if self.object:
|
||||||
if obj:
|
|
||||||
self.object.to_model(allow_create=False)
|
self.object.to_model(allow_create=False)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ class InboxActivities(TestCase):
|
||||||
}
|
}
|
||||||
models.SiteSettings.objects.create()
|
models.SiteSettings.objects.create()
|
||||||
|
|
||||||
def test_handle_delete_status(self):
|
def test_delete_status(self):
|
||||||
""" remove a status """
|
""" remove a status """
|
||||||
self.assertFalse(self.status.deleted)
|
self.assertFalse(self.status.deleted)
|
||||||
activity = {
|
activity = {
|
||||||
|
@ -70,7 +70,7 @@ class InboxActivities(TestCase):
|
||||||
self.assertTrue(status.deleted)
|
self.assertTrue(status.deleted)
|
||||||
self.assertIsInstance(status.deleted_date, datetime)
|
self.assertIsInstance(status.deleted_date, datetime)
|
||||||
|
|
||||||
def test_handle_delete_status_notifications(self):
|
def test_delete_status_notifications(self):
|
||||||
""" remove a status with related notifications """
|
""" remove a status with related notifications """
|
||||||
models.Notification.objects.create(
|
models.Notification.objects.create(
|
||||||
related_status=self.status,
|
related_status=self.status,
|
||||||
|
@ -104,3 +104,39 @@ class InboxActivities(TestCase):
|
||||||
# notifications should be truly deleted
|
# notifications should be truly deleted
|
||||||
self.assertEqual(models.Notification.objects.count(), 1)
|
self.assertEqual(models.Notification.objects.count(), 1)
|
||||||
self.assertEqual(models.Notification.objects.get(), notif)
|
self.assertEqual(models.Notification.objects.get(), notif)
|
||||||
|
|
||||||
|
def test_delete_user(self):
|
||||||
|
""" delete a user """
|
||||||
|
self.assertTrue(
|
||||||
|
models.User.objects.get(username="rat@example.com").is_active
|
||||||
|
)
|
||||||
|
activity = {
|
||||||
|
'@context': 'https://www.w3.org/ns/activitystreams',
|
||||||
|
'id': 'https://example.com/users/test-user#delete',
|
||||||
|
'type': 'Delete',
|
||||||
|
'actor': 'https://example.com/users/test-user',
|
||||||
|
'to': ['https://www.w3.org/ns/activitystreams#Public'],
|
||||||
|
'object': 'https://example.com/users/test-user',
|
||||||
|
}
|
||||||
|
|
||||||
|
views.inbox.activity_task(activity)
|
||||||
|
self.assertFalse(
|
||||||
|
models.User.objects.get(username="rat@example.com").is_active
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def test_delete_user_unknown(self):
|
||||||
|
""" don't worry about it if we don't know the user """
|
||||||
|
self.assertEqual(models.User.objects.filter(is_active=True).count(), 2)
|
||||||
|
activity = {
|
||||||
|
'@context': 'https://www.w3.org/ns/activitystreams',
|
||||||
|
'id': 'https://example.com/users/test-user#delete',
|
||||||
|
'type': 'Delete',
|
||||||
|
'actor': 'https://example.com/users/test-user',
|
||||||
|
'to': ['https://www.w3.org/ns/activitystreams#Public'],
|
||||||
|
'object': 'https://example.com/users/test-user',
|
||||||
|
}
|
||||||
|
|
||||||
|
# nothing happens.
|
||||||
|
views.inbox.activity_task(activity)
|
||||||
|
self.assertEqual(models.User.objects.filter(is_active=True).count(), 2)
|
||||||
|
|
Loading…
Reference in a new issue