diff --git a/tests/backoffice_pages/test_all.py b/tests/backoffice_pages/test_all.py index 5da091177..d8cf0f39b 100644 --- a/tests/backoffice_pages/test_all.py +++ b/tests/backoffice_pages/test_all.py @@ -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) diff --git a/tests/test_storage.py b/tests/test_storage.py index 31930943a..eb40cc42d 100644 --- a/tests/test_storage.py +++ b/tests/test_storage.py @@ -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() diff --git a/wcs/qommon/storage.py b/wcs/qommon/storage.py index f5d18eeb0..672772e73 100644 --- a/wcs/qommon/storage.py +++ b/wcs/qommon/storage.py @@ -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: