kopia lustrzana https://github.com/snarfed/bridgy-fed
				
				
				
			Object.get_or_create: merge repeated fields instead of overwriting
							rodzic
							
								
									525a26f7b6
								
							
						
					
					
						commit
						8796b9edcd
					
				| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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()
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Ładowanie…
	
		Reference in New Issue