summaryrefslogtreecommitdiff
path: root/gitlab
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 /gitlab
parentfa520242b878d25e37aacfcb0d838c58d3a4b271 (diff)
downloadgitlab-65c64ebc08d75092151e828fab0fa73f5fd22e45.tar.gz
Add support for user/group/project filter by custom attribute
Closes #367
Diffstat (limited to 'gitlab')
-rw-r--r--gitlab/__init__.py18
-rw-r--r--gitlab/v4/objects.py7
2 files changed, 20 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):