From d72905707fc33d85839913c1fe45c951b3c9d011 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Tue, 3 Nov 2015 13:59:42 +0100 Subject: [PATCH 2/2] api: apply users query to all text fields (#8851) --- tests/test_api.py | 12 ++++++++++++ wcs/api.py | 8 +++++++- wcs/users.py | 9 +++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/tests/test_api.py b/tests/test_api.py index 0aeeee7..32c2ae2 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -649,3 +649,15 @@ def test_users(pub, local_user): resp = get_app(pub).get(sign_uri('/api/users/?q=foobar')) assert len(resp.json['data']) == 0 + + from wcs.admin.settings import UserFieldsFormDef + formdef = UserFieldsFormDef(pub) + formdef.fields.append(fields.StringField(id='3', label='test', type='string')) + formdef.store() + + local_user.form_data = {'3': 'HELLO'} + local_user.set_attributes_from_formdata(local_user.form_data) + local_user.store() + + resp = get_app(pub).get(sign_uri('/api/users/?q=HELLO')) + assert len(resp.json['data']) == 1 diff --git a/wcs/api.py b/wcs/api.py index 460db99..30a2b0e 100644 --- a/wcs/api.py +++ b/wcs/api.py @@ -496,7 +496,13 @@ class ApiUsersDirectory(Directory): criterias = [] query = get_request().form.get('q') if query: - criterias.append(st.Or([st.ILike('name', query), st.ILike('email', query)])) + from admin.settings import UserFieldsFormDef + formdef = UserFieldsFormDef() + criteria_fields = [st.ILike('name', query), st.ILike('email', query)] + for field in formdef.fields: + if field.type in ('string', 'text', 'email'): + criteria_fields.append(st.ILike('f%s' % field.id, query)) + criterias.append(st.Or(criteria_fields)) def as_dict(user): user_info = user.get_substitution_variables(prefix='') diff --git a/wcs/users.py b/wcs/users.py index 6de1b30..f3e7da3 100644 --- a/wcs/users.py +++ b/wcs/users.py @@ -180,6 +180,15 @@ class User(StorableObject): return variables get_substitution_variables_list = classmethod(get_substitution_variables_list) + def __getattr__(self, attr): + if attr in self.__dict__: + return self.__dict__[attr] + if attr[0] == 'f' and (self.__dict__['form_data'] and attr[0] == 'f' and + self.__dict__['form_data']): + return self.__dict__['form_data'].get(attr[1:]) + return super(User, self).__getattr__(attr) + + Substitutions.register('session_user', category=N_('User'), comment=N_('Session User')) Substitutions.register('session_user_display_name', category=N_('User'), comment=N_('Session User Display Name')) Substitutions.register('session_user_email', category=N_('User'), comment=N_('Session User Email')) -- 2.6.2