Allow Multiple Filters of the Same Key

Before, the way filters were passed in would not allow filtering
on the same key.
For example:
    keystone.users.list(name__contains='test', name__contains='user')
This fails because of how kwargs handles key/value pairs.

This patch allows using multiple values for the same filter.
Example:
    keystone.users.list(name__contains=['test', 'user'])
Specifying the only one filter value is still functional as expected.

Co-Authored-By: Jeffrey Augustine <ja224e@att.com>
Partially-Implements: bp pci-dss-query-password-expired-users
Change-Id: I89cecf7e18974e7860ba0925840d6264168eabcb
This commit is contained in:
Samuel Pilla 2017-01-20 09:43:14 -06:00 committed by Tin Lam
parent dcb719d0e5
commit ef6ffa6516
3 changed files with 33 additions and 1 deletions

View File

@ -353,7 +353,10 @@ class CrudManager(Manager):
return self._head(self.build_url(dict_args_in_out=kwargs))
def _build_query(self, params):
return '?%s' % urllib.parse.urlencode(params) if params else ''
if params is None:
return ''
else:
return '?%s' % urllib.parse.urlencode(params, doseq=True)
def build_key_only_query(self, params_list):
"""Build a query that does not include values, just keys.

View File

@ -76,6 +76,29 @@ class UsersTestCase(base.V3ClientTestCase):
self.assertIn(user_one.entity, users)
self.assertIn(user_two.entity, users)
def test_list_users_with_filters(self):
suffix = uuid.uuid4().hex
user1_ref = {
'name': 'test_user' + suffix,
'domain': self.project_domain_id,
'default_project': self.project_id,
'password': uuid.uuid4().hex,
'description': uuid.uuid4().hex}
user2_ref = {
'name': fixtures.RESOURCE_NAME_PREFIX + uuid.uuid4().hex,
'domain': self.project_domain_id,
'default_project': self.project_id,
'password': uuid.uuid4().hex,
'description': uuid.uuid4().hex}
user1 = self.client.users.create(**user1_ref)
self.client.users.create(**user2_ref)
users = self.client.users.list(name__contains=['test_user', suffix])
self.assertEqual(1, len(users))
self.assertIn(user1, users)
def test_update_user(self):
user = fixtures.User(self.client, self.project_domain_id)
self.useFixture(user)

View File

@ -0,0 +1,6 @@
---
features:
- |
Added ability to filter on multiple values with the same parameter key.
For example, we can now filter on user names that contain both ``test`` and
``user`` using ``keystone.users.list(name__contains=['test', 'user'])``.