kopia lustrzana https://github.com/snarfed/bridgy-fed
Protocol.receive: resume existing create if it's not complete
rodzic
95cbfba31c
commit
414fa5f197
27
protocol.py
27
protocol.py
|
|
@ -648,28 +648,31 @@ class Protocol:
|
|||
},
|
||||
}
|
||||
logger.info(f'Wrapping in update: {json_dumps(update_as1, indent=2)}')
|
||||
obj = Object(id=id, our_as1=update_as1,
|
||||
source_protocol=obj.source_protocol)
|
||||
return Object(id=id, our_as1=update_as1,
|
||||
source_protocol=obj.source_protocol)
|
||||
|
||||
# HACK: 'force' in request.form here is specific to webmention
|
||||
elif obj.new or 'force' in request.form:
|
||||
logger.info(f'New Object {obj.key.id()}')
|
||||
id = f'{obj.key.id()}#bridgy-fed-create'
|
||||
create_id = f'{obj.key.id()}#bridgy-fed-create'
|
||||
create = cls.load(create_id, remote=False)
|
||||
if (obj.new or not create or create.status != 'complete'
|
||||
# HACK: force query param here is specific to webmention
|
||||
or 'force' in request.form):
|
||||
if create:
|
||||
logger.info(f'Existing create {create.key} status {create.status}')
|
||||
else:
|
||||
logger.info(f'No existing create activity')
|
||||
create_as1 = {
|
||||
'objectType': 'activity',
|
||||
'verb': 'post',
|
||||
'id': id,
|
||||
'id': create_id,
|
||||
'actor': obj_actor,
|
||||
'object': obj.as1,
|
||||
'published': now,
|
||||
}
|
||||
logger.info(f'Wrapping in post: {json_dumps(create_as1, indent=2)}')
|
||||
obj = Object.get_or_create(id, our_as1=create_as1,
|
||||
source_protocol=obj.source_protocol)
|
||||
else:
|
||||
error(f'{obj.key.id()} is unchanged, nothing to do', status=204)
|
||||
return Object.get_or_create(create_id, our_as1=create_as1,
|
||||
source_protocol=obj.source_protocol)
|
||||
|
||||
return obj
|
||||
error(f'{obj.key.id()} is unchanged, nothing to do', status=204)
|
||||
|
||||
@classmethod
|
||||
def _deliver(cls, obj):
|
||||
|
|
|
|||
|
|
@ -359,6 +359,51 @@ class ProtocolReceiveTest(TestCase):
|
|||
|
||||
self.assertEqual([(obj, 'shared:target')], Fake.sent)
|
||||
|
||||
def test_create_post_bare_object_existing_failed_create(self):
|
||||
self.make_followers()
|
||||
|
||||
post_as1 = {
|
||||
'id': 'fake:post',
|
||||
'objectType': 'note',
|
||||
'author': 'fake:user',
|
||||
}
|
||||
self.store_object(id='fake:post', our_as1=post_as1)
|
||||
self.store_object(id='fake:post#bridgy-fed-create', status='failed')
|
||||
|
||||
self.assertEqual('OK', Fake.receive(post_as1))
|
||||
|
||||
obj = self.assert_object('fake:post#bridgy-fed-create',
|
||||
status='complete',
|
||||
delivered=['shared:target'],
|
||||
type='post',
|
||||
users=[g.user.key],
|
||||
ignore=['our_as1'],
|
||||
)
|
||||
|
||||
self.assertEqual([(obj, 'shared:target')], Fake.sent)
|
||||
|
||||
def test_create_post_bare_object_no_existing_create(self):
|
||||
self.make_followers()
|
||||
|
||||
post_as1 = {
|
||||
'id': 'fake:post',
|
||||
'objectType': 'note',
|
||||
'author': 'fake:user',
|
||||
}
|
||||
self.store_object(id='fake:post', our_as1=post_as1)
|
||||
|
||||
self.assertEqual('OK', Fake.receive(post_as1))
|
||||
|
||||
obj = self.assert_object('fake:post#bridgy-fed-create',
|
||||
status='complete',
|
||||
delivered=['shared:target'],
|
||||
type='post',
|
||||
users=[g.user.key],
|
||||
ignore=['our_as1'],
|
||||
)
|
||||
|
||||
self.assertEqual([(obj, 'shared:target')], Fake.sent)
|
||||
|
||||
def test_update_post(self):
|
||||
self.make_followers()
|
||||
|
||||
|
|
@ -549,46 +594,6 @@ class ProtocolReceiveTest(TestCase):
|
|||
)
|
||||
self.assertEqual([(obj, 'fake:post:target')], Fake.sent)
|
||||
|
||||
# TODO: revisit? remove?
|
||||
# def test_reply_not_feed_not_notification(self):
|
||||
# Follower.get_or_create(to=g.user, from_=self.alice)
|
||||
# g.user = None
|
||||
|
||||
# Fake.fetchable['fake:post'] = {
|
||||
# 'objectType': 'note',
|
||||
# 'id': 'fake:post',
|
||||
# 'author': 'fake:eve', # we have no user for this id
|
||||
# }
|
||||
# reply_as1 = {
|
||||
# 'objectType': 'comment',
|
||||
# 'id': 'fake:reply',
|
||||
# 'author': 'fake:bob',
|
||||
# 'content': 'A ☕ reply',
|
||||
# 'inReplyTo': 'fake:post',
|
||||
# }
|
||||
# create_as1 = {
|
||||
# 'objectType': 'post',
|
||||
# 'id': 'fake:create',
|
||||
# 'object': reply_as1,
|
||||
# }
|
||||
# Fake.receive(create_as1)
|
||||
|
||||
# self.assert_object('fake:reply',
|
||||
# our_as1=reply_as1,
|
||||
# type='comment',
|
||||
# )
|
||||
# self.assert_object('fake:create',
|
||||
# our_as1=create_as1,
|
||||
# type='post',
|
||||
# users=[Fake(id='fake:eve').key],
|
||||
# # not feed since it's a reply
|
||||
# # not notification since it doesn't involve the user
|
||||
# delivered=['fake:post:target'],
|
||||
# status='complete',
|
||||
# )
|
||||
|
||||
# self.assertEqual([(obj, 'fake:post:target')], Fake.sent)
|
||||
|
||||
def test_repost(self):
|
||||
self.make_followers()
|
||||
|
||||
|
|
|
|||
|
|
@ -780,7 +780,9 @@ class WebTest(TestCase):
|
|||
|
||||
def test_skip_update_if_content_unchanged(self, mock_get, mock_post):
|
||||
"""https://github.com/snarfed/bridgy-fed/issues/78"""
|
||||
Object(id='https://user.com/reply', mf2=REPLY_MF2).put()
|
||||
self.store_object(id='https://user.com/reply', mf2=REPLY_MF2)
|
||||
self.store_object(id='https://user.com/reply#bridgy-fed-create',
|
||||
status='complete')
|
||||
|
||||
mock_get.side_effect = ACTIVITYPUB_GETS
|
||||
|
||||
|
|
|
|||
|
|
@ -261,7 +261,7 @@ class TestCase(unittest.TestCase, testutil.Asserts):
|
|||
def store_object(**kwargs):
|
||||
obj = Object(**kwargs)
|
||||
obj.put()
|
||||
del protocol.objects_cache[obj.key.id()]
|
||||
protocol.objects_cache.pop(obj.key.id(), None)
|
||||
return obj
|
||||
|
||||
@staticmethod
|
||||
|
|
|
|||
Ładowanie…
Reference in New Issue