From 8c7421ff0ea5ed24f0c7f8163358fa12ed13fc99 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Fri, 26 May 2023 14:51:14 +0200 Subject: [PATCH] misc: extend users data sources with attributes (#77887) --- tests/test_datasource_users.py | 264 ++++++++++++++++++++++++++++++--- wcs/data_sources.py | 10 +- 2 files changed, 251 insertions(+), 23 deletions(-) diff --git a/tests/test_datasource_users.py b/tests/test_datasource_users.py index 65b3fb248..664090daf 100644 --- a/tests/test_datasource_users.py +++ b/tests/test_datasource_users.py @@ -1,7 +1,9 @@ import pytest from wcs import data_sources +from wcs.admin.settings import UserFieldsFormDef from wcs.data_sources import NamedDataSource +from wcs.fields import StringField from wcs.qommon.http_request import HTTPRequest from wcs.qommon.template import Template @@ -53,32 +55,136 @@ def test_datasource_users(pub): users.append(user) assert data_sources.get_items({'type': datasource.slug}) == [ - ('1', 'John Doe 0', '1', {'id': 1, 'text': 'John Doe 0'}), - ('2', 'John Doe 1', '2', {'id': 2, 'text': 'John Doe 1'}), + ( + '1', + 'John Doe 0', + '1', + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + }, + ), + ( + '2', + 'John Doe 1', + '2', + { + 'id': 2, + 'text': 'John Doe 1', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 1', + 'user_email': None, + }, + ), ] assert data_sources.get_items(datasource.extended_data_source) == [ - ('1', 'John Doe 0', '1', {'id': 1, 'text': 'John Doe 0'}), - ('2', 'John Doe 1', '2', {'id': 2, 'text': 'John Doe 1'}), + ( + '1', + 'John Doe 0', + '1', + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + }, + ), + ( + '2', + 'John Doe 1', + '2', + { + 'id': 2, + 'text': 'John Doe 1', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 1', + 'user_email': None, + }, + ), ] assert data_sources.get_structured_items({'type': datasource.slug}) == [ - {'id': 1, 'text': 'John Doe 0'}, - {'id': 2, 'text': 'John Doe 1'}, + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + }, + { + 'id': 2, + 'text': 'John Doe 1', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 1', + 'user_email': None, + }, ] assert data_sources.get_structured_items(datasource.extended_data_source) == [ - {'id': 1, 'text': 'John Doe 0'}, - {'id': 2, 'text': 'John Doe 1'}, + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + }, + { + 'id': 2, + 'text': 'John Doe 1', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 1', + 'user_email': None, + }, ] assert tmpl.render(context) == 'John Doe 0, John Doe 1' datasource.users_included_roles = [role1.id] datasource.store() assert data_sources.get_structured_items({'type': datasource.slug}) == [ - {'id': 1, 'text': 'John Doe 0'}, - {'id': 2, 'text': 'John Doe 1'}, + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + }, + { + 'id': 2, + 'text': 'John Doe 1', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 1', + 'user_email': None, + }, ] assert data_sources.get_structured_items(datasource.extended_data_source) == [ - {'id': 1, 'text': 'John Doe 0'}, - {'id': 2, 'text': 'John Doe 1'}, + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + }, + { + 'id': 2, + 'text': 'John Doe 1', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 1', + 'user_email': None, + }, ] assert tmpl.render(context) == 'John Doe 0, John Doe 1' @@ -90,9 +196,25 @@ def test_datasource_users(pub): users[0].roles = [role1.id, role2.id] users[0].store() - assert data_sources.get_structured_items({'type': datasource.slug}) == [{'id': 1, 'text': 'John Doe 0'}] + assert data_sources.get_structured_items({'type': datasource.slug}) == [ + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + } + ] assert data_sources.get_structured_items(datasource.extended_data_source) == [ - {'id': 1, 'text': 'John Doe 0'} + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + } ] assert tmpl.render(context) == 'John Doe 0' @@ -101,9 +223,25 @@ def test_datasource_users(pub): datasource.users_included_roles = [] datasource.users_excluded_roles = [role1.id] datasource.store() - assert data_sources.get_structured_items({'type': datasource.slug}) == [{'id': 1, 'text': 'John Doe 0'}] + assert data_sources.get_structured_items({'type': datasource.slug}) == [ + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + } + ] assert data_sources.get_structured_items(datasource.extended_data_source) == [ - {'id': 1, 'text': 'John Doe 0'} + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + } ] assert tmpl.render(context) == 'John Doe 0' @@ -118,20 +256,102 @@ def test_datasource_users(pub): users[1].is_active = False users[1].store() assert not datasource.include_disabled_users - assert data_sources.get_structured_items({'type': datasource.slug}) == [{'id': 1, 'text': 'John Doe 0'}] + assert data_sources.get_structured_items({'type': datasource.slug}) == [ + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + } + ] assert data_sources.get_structured_items(datasource.extended_data_source) == [ - {'id': 1, 'text': 'John Doe 0'} + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + } ] assert tmpl.render(context) == 'John Doe 0' datasource.include_disabled_users = True datasource.store() assert data_sources.get_structured_items({'type': datasource.slug}) == [ - {'id': 1, 'text': 'John Doe 0'}, - {'id': 2, 'text': 'John Doe 1'}, + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + }, + { + 'id': 2, + 'text': 'John Doe 1', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 1', + 'user_email': None, + }, ] assert data_sources.get_structured_items(datasource.extended_data_source) == [ - {'id': 1, 'text': 'John Doe 0'}, - {'id': 2, 'text': 'John Doe 1'}, + { + 'id': 1, + 'text': 'John Doe 0', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 0', + 'user_email': None, + }, + { + 'id': 2, + 'text': 'John Doe 1', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'user_display_name': 'John Doe 1', + 'user_email': None, + }, ] assert tmpl.render(context) == 'John Doe 0, John Doe 1' + + +def test_datasource_users_user_formdef(pub): + pub.user_class.wipe() + + formdef = UserFieldsFormDef(pub) + formdef.fields = [ + StringField(id='3', label='test', varname='plop'), + ] + formdef.store() + + user = pub.user_class(name='John Doe') + user.form_data = {'3': 'Bar'} + user.store() + + NamedDataSource.wipe() + datasource = NamedDataSource(name='foo') + datasource.data_source = {'type': 'wcs:users'} + datasource.store() + + assert data_sources.get_items({'type': datasource.slug}) == [ + ( + '3', + 'John Doe', + '3', + { + 'user_display_name': 'John Doe', + 'user_email': None, + 'user_f3': 'Bar', + 'user_field_test': 'Bar', + 'user_var_plop': 'Bar', + 'user_admin_access': False, + 'user_backoffice_access': False, + 'id': 3, + 'text': 'John Doe', + }, + ) + ] diff --git a/wcs/data_sources.py b/wcs/data_sources.py index c09b43530..3e6b4f6de 100644 --- a/wcs/data_sources.py +++ b/wcs/data_sources.py @@ -423,7 +423,15 @@ def _get_structured_items(data_source, mode=None, raise_on_error=False): ) include_disabled_users = data_source.get('include_disabled_users') - return [{'id': u.id, 'text': u.name} for u in users if u.is_active or include_disabled_users] + + def get_dict(user): + user_dict = user.get_substitution_variables(prefix='') + del user_dict['user'] + user_dict['id'] = user.id + user_dict['text'] = user.name + return user_dict + + return [get_dict(u) for u in users if u.is_active or include_disabled_users] if data_source.get('type') == 'jsonvalue': try: -- 2.39.2