merging receive: Object.as1: postprocess mf2, if no id, use url

for #529
merge-web-protocol-receive
Ryan Barrett 2023-07-09 16:29:22 -07:00
rodzic 9c9f30113d
commit ad6387fea2
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
2 zmienionych plików z 32 dodań i 4 usunięć

Wyświetl plik

@ -405,6 +405,12 @@ class Object(StringIdModel):
elif self.mf2:
obj = microformats2.json_to_object(self.mf2,
rel_urls=self.mf2.get('rel-urls'))
# postprocess: if no id, use url
if url := util.get_url(obj):
obj.setdefault('id', url)
for field in 'author', 'actor', 'object': # None is obj itself
if url := util.get_url(obj, field):
as1.get_object(obj, field).setdefault('id', url)
else:
return None

Wyświetl plik

@ -174,7 +174,7 @@ class ObjectTest(TestCase):
self.assertTrue(obj.new)
self.assertIsNone(obj.changed)
self.assertEqual('foo', obj.key.id())
self.assertEqual({'content': 'foo'}, obj.as1)
self.assertEqual({'content': 'foo', 'id': 'foo'}, obj.as1)
self.assertEqual('ui', obj.source_protocol)
self.assertEqual(['notification'], obj.labels)
@ -188,7 +188,7 @@ class ObjectTest(TestCase):
obj3 = Object.get_or_create('foo', our_as1={'content': 'bar'},
source_protocol=None, labels=[])
self.assertEqual('foo', obj3.key.id())
self.assertEqual({'content': 'bar'}, obj3.as1)
self.assertEqual({'content': 'bar', 'id': 'foo'}, obj3.as1)
self.assertEqual('ui', obj3.source_protocol)
self.assertEqual(['notification'], obj3.labels)
self.assertFalse(obj3.new)
@ -197,7 +197,7 @@ class ObjectTest(TestCase):
check(obj3, Object.get_by_id('foo'))
obj4 = Object.get_or_create('foo', our_as1={'content': 'bar'})
self.assertEqual({'content': 'bar'}, obj4.as1)
self.assertEqual({'content': 'bar', 'id': 'foo'}, obj4.as1)
self.assertFalse(obj4.new)
self.assertFalse(obj4.changed)
check(obj4, Object.get_by_id('foo'))
@ -356,7 +356,7 @@ class ObjectTest(TestCase):
self.assertEqual(['user'], obj.labels)
def test_as_as2(self):
obj = Object(id='foo')
obj = Object()
self.assertEqual({}, obj.as_as2())
obj.our_as1 = {}
@ -388,6 +388,28 @@ class ObjectTest(TestCase):
self.assertEqual({'id': 'x', 'foo': 'bar'},
Object(id='x', our_as1={'foo': 'bar'}).as1)
def test_as1_from_mf2_uses_url_as_id(self):
obj = Object(mf2={
'properties': {
'url': ['x', 'y'],
'author': [{'properties': {'url': ['a', 'b']}}],
'repost-of': [{'properties': {'url': ['c', 'd']}}],
},
})
self.assertEqual('x', obj.as1['id'])
self.assertEqual('a', obj.as1['actor']['id'])
self.assertEqual('c', obj.as1['object']['id'])
obj = Object(mf2={
'properties': {
'author': ['a', 'b'],
'repost-of': ['c', 'd'],
},
})
self.assertNotIn('id', obj.as1)
self.assertNotIn('id', obj.as1['actor'])
self.assertEqual(['c', 'd'], obj.as1['object'])
class FollowerTest(TestCase):