storage: add support for hashed indexed containing dict of lists (#55638)
This commit is contained in:
parent
a18639ae6d
commit
a1c3eb9e26
|
@ -2330,7 +2330,7 @@ def test_backoffice_handling_post_dispatch(pub):
|
|||
# emulate a dispatch (setting formdata.workflow_roles), receiver of that
|
||||
# formdata is now the local role we gave to the user.
|
||||
formdata31 = form_class.get(number31.id)
|
||||
formdata31.workflow_roles = {'_receiver': role.id}
|
||||
formdata31.workflow_roles = {'_receiver': [role.id]}
|
||||
formdata31.store()
|
||||
|
||||
# check listing is accessible, with a single item
|
||||
|
@ -4673,7 +4673,7 @@ def test_inspect_page(pub, local_user):
|
|||
|
||||
role = pub.role_class(name='plop')
|
||||
role.store()
|
||||
formdata.workflow_roles = {'_receiver': role.id}
|
||||
formdata.workflow_roles = {'_receiver': [role.id]}
|
||||
formdata.store()
|
||||
resp = login(get_app(pub)).get('%sinspect' % formdata.get_url(backoffice=True), status=200)
|
||||
assert re.findall('Recipient.*plop', resp.text)
|
||||
|
@ -4687,7 +4687,7 @@ def test_inspect_page(pub, local_user):
|
|||
resp = login(get_app(pub)).get('%sinspect' % formdata.get_url(backoffice=True), status=200)
|
||||
assert re.findall('New Function.*unset', resp.text)
|
||||
|
||||
formdata.workflow_roles = {'_receiver': role.id, '_plop': '123'}
|
||||
formdata.workflow_roles = {'_receiver': [role.id], '_plop': ['123']}
|
||||
formdata.store()
|
||||
resp = login(get_app(pub)).get('%sinspect' % formdata.get_url(backoffice=True), status=200)
|
||||
assert re.findall('New Function.*(deleted)', resp.text)
|
||||
|
|
|
@ -200,6 +200,34 @@ def test_get_with_indexed_value_dict_changes():
|
|||
assert len(tests) == 2
|
||||
|
||||
|
||||
def test_get_with_indexed_value_dict_list():
|
||||
Foobar.wipe()
|
||||
|
||||
test = Foobar()
|
||||
test.unique_value = 'unique-value'
|
||||
test.store()
|
||||
|
||||
test = Foobar()
|
||||
test.value = 'value'
|
||||
test.unique_value = 'unique-value2'
|
||||
test.dict_value = {'plop': ['2']}
|
||||
test.store()
|
||||
|
||||
test = Foobar()
|
||||
test.value = 'value1'
|
||||
test.unique_value = 'unique-value3'
|
||||
test.dict_value = {'plop': ['2']}
|
||||
test.store()
|
||||
|
||||
for _ in range(2):
|
||||
tests = list(Foobar.get_with_indexed_value('dict_value', '2'))
|
||||
assert len(tests) == 2
|
||||
assert 'unique-value' not in [x.unique_value for x in tests]
|
||||
assert 'unique-value2' in [x.unique_value for x in tests]
|
||||
assert 'unique-value3' in [x.unique_value for x in tests]
|
||||
Foobar.rebuild_indexes()
|
||||
|
||||
|
||||
def test_select():
|
||||
Foobar.wipe()
|
||||
|
||||
|
|
|
@ -633,7 +633,13 @@ class StorableObject:
|
|||
continue
|
||||
attribute = getattr(object, index)
|
||||
if isinstance(attribute, dict):
|
||||
attribute = attribute.values()
|
||||
attribute_list = []
|
||||
for value in attribute.values():
|
||||
if isinstance(value, list):
|
||||
attribute_list.extend(value)
|
||||
else:
|
||||
attribute_list.append(value)
|
||||
attribute = attribute_list
|
||||
elif type(attribute) not in (tuple, list, set):
|
||||
attribute = [attribute]
|
||||
for attr in attribute:
|
||||
|
@ -803,13 +809,19 @@ class StorableObject:
|
|||
|
||||
old_value = []
|
||||
if isinstance(getattr(self, index), dict):
|
||||
new_value = getattr(self, index).values()
|
||||
if previous_object_value:
|
||||
old_value = getattr(previous_object_value, index)
|
||||
if old_value is None:
|
||||
old_value = []
|
||||
new_value = []
|
||||
for value in (getattr(self, index) or {}).values():
|
||||
if isinstance(value, list):
|
||||
new_value.extend(value)
|
||||
else:
|
||||
old_value = old_value.values()
|
||||
new_value.append(value)
|
||||
if previous_object_value:
|
||||
old_value = []
|
||||
for value in (getattr(previous_object_value, index) or {}).values():
|
||||
if isinstance(value, list):
|
||||
new_value.extend(value)
|
||||
else:
|
||||
new_value.append(value)
|
||||
elif type(getattr(self, index)) in (tuple, list, set):
|
||||
new_value = getattr(self, index)
|
||||
if previous_object_value:
|
||||
|
|
Loading…
Reference in New Issue