storage: add support for hashed indexed containing dict of lists (#55638)

This commit is contained in:
Frédéric Péters 2021-07-16 14:24:34 +02:00
parent a18639ae6d
commit a1c3eb9e26
3 changed files with 50 additions and 10 deletions

View File

@ -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)

View File

@ -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()

View File

@ -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: