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:
@@ -353,7 +353,10 @@ class CrudManager(Manager):
|
|||||||
return self._head(self.build_url(dict_args_in_out=kwargs))
|
return self._head(self.build_url(dict_args_in_out=kwargs))
|
||||||
|
|
||||||
def _build_query(self, params):
|
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):
|
def build_key_only_query(self, params_list):
|
||||||
"""Build a query that does not include values, just keys.
|
"""Build a query that does not include values, just keys.
|
||||||
|
@@ -76,6 +76,29 @@ class UsersTestCase(base.V3ClientTestCase):
|
|||||||
self.assertIn(user_one.entity, users)
|
self.assertIn(user_one.entity, users)
|
||||||
self.assertIn(user_two.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):
|
def test_update_user(self):
|
||||||
user = fixtures.User(self.client, self.project_domain_id)
|
user = fixtures.User(self.client, self.project_domain_id)
|
||||||
self.useFixture(user)
|
self.useFixture(user)
|
||||||
|
@@ -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'])``.
|
Reference in New Issue
Block a user