Object.get_or_create: merge repeated fields instead of overwriting

pull/1707/head
Ryan Barrett 2025-01-15 16:55:33 -08:00
rodzic 525a26f7b6
commit 8796b9edcd
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
3 zmienionych plików z 24 dodań i 3 usunięć

Wyświetl plik

@ -1132,6 +1132,11 @@ class Object(StringIdModel):
if set(props.keys()) & set(('as2', 'bsky', 'mf2', 'raw')):
obj.clear()
# merge repeated fields
for field in 'feed', 'copies', 'labels', 'notify', 'users':
getattr(obj, field).extend(props.pop(field, []))
obj.populate(**{
k: v for k, v in props.items()
if v and not isinstance(getattr(Object, k), ndb.ComputedProperty)

Wyświetl plik

@ -933,7 +933,11 @@ class Protocol:
error(f'Actor {actor} is opted out or blocked', status=204)
# write Object to datastore
orig_props = obj.to_dict()
orig_props = {
**obj.to_dict(),
# structured properties
'copies': obj.copies,
}
obj = Object.get_or_create(id, new=obj.new, changed=obj.changed,
authed_as=actor, **orig_props)

Wyświetl plik

@ -637,11 +637,23 @@ class ObjectTest(TestCase):
obj7 = Object.get_or_create('http://b.ee/ff', as2={'a': 'b'}, mf2={'c': 'd'},
source_protocol='web')
Object.get_or_create('http://b.ee/ff', authed_as='http://b.ee/ff',
users=[ndb.Key(Web, 'me')])
users=[ndb.Key(Web, 'me')], labels=['feed'],
copies=[Target(protocol='ui', uri='http://foo')])
self.assert_object('http://b.ee/ff', as2={'a': 'b'}, mf2={'c': 'd'},
users=[ndb.Key(Web, 'me')],
users=[ndb.Key(Web, 'me')], labels=['feed'],
copies=[Target(protocol='ui', uri='http://foo')],
source_protocol='web')
# repeated properties should merge, not overwrite
Object.get_or_create('http://b.ee/ff', authed_as='http://b.ee/ff',
users=[ndb.Key(Web, 'you')], labels=['user'],
copies=[Target(protocol='ui', uri='http://bar')])
self.assert_object('http://b.ee/ff', as2={'a': 'b'}, mf2={'c': 'd'},
users=[ndb.Key(Web, 'me'), ndb.Key(Web, 'you')],
labels=['feed', 'user'], source_protocol='web',
copies=[Target(protocol='ui', uri='http://foo'),
Target(protocol='ui', uri='http://bar')])
def test_get_or_create_auth_check(self):
Object(id='fake:foo', our_as1={'author': 'fake:alice'},
source_protocol='fake').put()