summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGauvain Pocentek <gauvain@pocentek.net>2018-01-01 16:15:22 +0100
committerGauvain Pocentek <gauvain@pocentek.net>2018-01-01 16:15:22 +0100
commit65c64ebc08d75092151e828fab0fa73f5fd22e45 (patch)
treef89e45b102899950d4e6d23c67365b0291e86fb4
parentfa520242b878d25e37aacfcb0d838c58d3a4b271 (diff)
downloadgitlab-65c64ebc08d75092151e828fab0fa73f5fd22e45.tar.gz
Add support for user/group/project filter by custom attribute
Closes #367
-rw-r--r--gitlab/__init__.py18
-rw-r--r--gitlab/v4/objects.py7
-rw-r--r--tools/python_test_v4.py3
3 files changed, 23 insertions, 5 deletions
diff --git a/gitlab/__init__.py b/gitlab/__init__.py
index b5f32c9..738085a 100644
--- a/gitlab/__init__.py
+++ b/gitlab/__init__.py
@@ -642,8 +642,22 @@ class Gitlab(object):
return parsed._replace(path=new_path).geturl()
url = self._build_url(path)
- params = query_data.copy()
- params.update(kwargs)
+
+ def copy_dict(dest, src):
+ for k, v in src.items():
+ if isinstance(v, dict):
+ # Transform dict values in new attributes. For example:
+ # custom_attributes: {'foo', 'bar'} =>
+ # custom_attributes['foo']: 'bar'
+ for dict_k, dict_v in v.items():
+ dest['%s[%s]' % (k, dict_k)] = dict_v
+ else:
+ dest[k] = v
+
+ params = {}
+ copy_dict(params, query_data)
+ copy_dict(params, kwargs)
+
opts = self._get_session_opts(content_type='application/json')
# don't set the content-type header when uploading files
diff --git a/gitlab/v4/objects.py b/gitlab/v4/objects.py
index 106b102..d7bb3d5 100644
--- a/gitlab/v4/objects.py
+++ b/gitlab/v4/objects.py
@@ -253,7 +253,7 @@ class UserManager(CRUDMixin, RESTManager):
_obj_cls = User
_list_filters = ('active', 'blocked', 'username', 'extern_uid', 'provider',
- 'external', 'search')
+ 'external', 'search', 'custom_attributes')
_create_attrs = (
tuple(),
('email', 'username', 'name', 'password', 'reset_password', 'skype',
@@ -656,7 +656,7 @@ class GroupManager(CRUDMixin, RESTManager):
_path = '/groups'
_obj_cls = Group
_list_filters = ('skip_groups', 'all_available', 'search', 'order_by',
- 'sort', 'statistics', 'owned')
+ 'sort', 'statistics', 'owned', 'custom_attributes')
_create_attrs = (
('name', 'path'),
('description', 'visibility', 'parent_id', 'lfs_enabled',
@@ -2639,7 +2639,8 @@ class ProjectManager(CRUDMixin, RESTManager):
)
_list_filters = ('search', 'owned', 'starred', 'archived', 'visibility',
'order_by', 'sort', 'simple', 'membership', 'statistics',
- 'with_issues_enabled', 'with_merge_requests_enabled')
+ 'with_issues_enabled', 'with_merge_requests_enabled',
+ 'custom_attributes')
class Runner(SaveMixin, ObjectDeleteMixin, RESTObject):
diff --git a/tools/python_test_v4.py b/tools/python_test_v4.py
index 4af9ea9..e065020 100644
--- a/tools/python_test_v4.py
+++ b/tools/python_test_v4.py
@@ -129,6 +129,7 @@ assert(len(new_user.emails.list()) == 0)
attrs = new_user.customattributes.list()
assert(len(attrs) == 0)
attr = new_user.customattributes.set('key', 'value1')
+assert(len(gl.users.list(custom_attributes={'key': 'value1'})) == 1)
assert(attr.key == 'key')
assert(attr.value == 'value1')
assert(len(new_user.customattributes.list()) == 1)
@@ -234,6 +235,7 @@ group2.members.delete(gl.user.id)
attrs = group2.customattributes.list()
assert(len(attrs) == 0)
attr = group2.customattributes.set('key', 'value1')
+assert(len(gl.groups.list(custom_attributes={'key': 'value1'})) == 1)
assert(attr.key == 'key')
assert(attr.value == 'value1')
assert(len(group2.customattributes.list()) == 1)
@@ -303,6 +305,7 @@ assert(l1[0].id != l2[0].id)
attrs = admin_project.customattributes.list()
assert(len(attrs) == 0)
attr = admin_project.customattributes.set('key', 'value1')
+assert(len(gl.projects.list(custom_attributes={'key': 'value1'})) == 1)
assert(attr.key == 'key')
assert(attr.value == 'value1')
assert(len(admin_project.customattributes.list()) == 1)