Skip to content

Commit 1b62c2e

Browse files
Oleksii ShkurupiiOleksii Shkurupii
authored andcommitted
feat: add feature to get inherited member for project/group
1 parent 6bdb7f8 commit 1b62c2e

File tree

3 files changed

+29
-52
lines changed

3 files changed

+29
-52
lines changed

docs/gl_objects/groups.rst

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -221,27 +221,33 @@ Reference
221221

222222
+ :class:`gitlab.v4.objects.GroupMember`
223223
+ :class:`gitlab.v4.objects.GroupMemberManager`
224+
+ :class:`gitlab.v4.objects.GroupMemberAllManager`
224225
+ :attr:`gitlab.v4.objects.Group.members`
226+
+ :attr:`gitlab.v4.objects.Group.members_all`
225227

226228
* GitLab API: https://docs.gitlab.com/ce/api/groups.html
227229

228230

229231
Examples
230232
--------
231233

232-
List group members::
234+
List only direct group members::
233235

234236
members = group.members.list()
235237

236238
List the group members recursively (including inherited members through
237239
ancestor groups)::
238240

239-
members = group.members.all(all=True)
241+
members = group.members_all.list(all=True)
240242

241-
Get a group member::
243+
Get only direct group member::
242244

243245
members = group.members.get(member_id)
244246

247+
Get a member of a group, including members inherited through ancestor groups::
248+
249+
members = group.members_all.get(member_id)
250+
245251
Add a member to the group::
246252

247253
member = group.members.create({'user_id': user_id,

docs/gl_objects/projects.rst

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -502,30 +502,37 @@ Reference
502502

503503
+ :class:`gitlab.v4.objects.ProjectMember`
504504
+ :class:`gitlab.v4.objects.ProjectMemberManager`
505+
+ :class:`gitlab.v4.objects.ProjectMemberAllManager`
505506
+ :attr:`gitlab.v4.objects.Project.members`
507+
+ :attr:`gitlab.v4.objects.Project.members_all`
506508

507509
* GitLab API: https://docs.gitlab.com/ce/api/members.html
508510

509511
Examples
510512
--------
511513

512-
List the project members::
514+
List only direct project members::
513515

514516
members = project.members.list()
515517

516518
List the project members recursively (including inherited members through
517519
ancestor groups)::
518520

519-
members = project.members.all(all=True)
521+
members = project.members_all.list(all=True)
520522

521523
Search project members matching a query string::
522524

523525
members = project.members.list(query='bar')
524526

525-
Get a single project member::
527+
Get only direct project member::
526528

527529
member = project.members.get(user_id)
528530

531+
Get a member of a project, including members inherited through ancestor groups::
532+
533+
members = project.members_all.get(member_id)
534+
535+
529536
Add a project member::
530537

531538
member = project.members.create({'user_id': user.id, 'access_level':

gitlab/v4/objects/__init__.py

Lines changed: 10 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1170,30 +1170,11 @@ class GroupMemberManager(CRUDMixin, RESTManager):
11701170
_create_attrs = (("access_level", "user_id"), ("expires_at",))
11711171
_update_attrs = (("access_level",), ("expires_at",))
11721172

1173-
@cli.register_custom_action("GroupMemberManager")
1174-
@exc.on_http_error(exc.GitlabListError)
1175-
def all(self, **kwargs):
1176-
"""List all the members, included inherited ones.
1177-
1178-
Args:
1179-
all (bool): If True, return all the items, without pagination
1180-
per_page (int): Number of items to retrieve per request
1181-
page (int): ID of the page to return (starts with page 1)
1182-
as_list (bool): If set to False and no pagination option is
1183-
defined, return a generator instead of a list
1184-
**kwargs: Extra options to send to the server (e.g. sudo)
11851173

1186-
Raises:
1187-
GitlabAuthenticationError: If authentication is not correct
1188-
GitlabListError: If the list could not be retrieved
1189-
1190-
Returns:
1191-
RESTObjectList: The list of members
1192-
"""
1193-
1194-
path = "%s/all" % self.path
1195-
obj = self.gitlab.http_list(path, **kwargs)
1196-
return [self._obj_cls(self, item) for item in obj]
1174+
class GroupMemberAllManager(RetrieveMixin, RESTManager):
1175+
_path = "/groups/%(group_id)s/members/all"
1176+
_obj_cls = GroupMember
1177+
_from_parent_attrs = {"group_id": "id"}
11971178

11981179

11991180
class GroupMergeRequest(RESTObject):
@@ -1394,6 +1375,7 @@ class Group(SaveMixin, ObjectDeleteMixin, RESTObject):
13941375
("issues", "GroupIssueManager"),
13951376
("labels", "GroupLabelManager"),
13961377
("members", "GroupMemberManager"),
1378+
("members_all", "GroupMemberAllManager"),
13971379
("mergerequests", "GroupMergeRequestManager"),
13981380
("milestones", "GroupMilestoneManager"),
13991381
("notificationsettings", "GroupNotificationSettingsManager"),
@@ -2838,30 +2820,11 @@ class ProjectMemberManager(CRUDMixin, RESTManager):
28382820
_create_attrs = (("access_level", "user_id"), ("expires_at",))
28392821
_update_attrs = (("access_level",), ("expires_at",))
28402822

2841-
@cli.register_custom_action("ProjectMemberManager")
2842-
@exc.on_http_error(exc.GitlabListError)
2843-
def all(self, **kwargs):
2844-
"""List all the members, included inherited ones.
2845-
2846-
Args:
2847-
all (bool): If True, return all the items, without pagination
2848-
per_page (int): Number of items to retrieve per request
2849-
page (int): ID of the page to return (starts with page 1)
2850-
as_list (bool): If set to False and no pagination option is
2851-
defined, return a generator instead of a list
2852-
**kwargs: Extra options to send to the server (e.g. sudo)
28532823

2854-
Raises:
2855-
GitlabAuthenticationError: If authentication is not correct
2856-
GitlabListError: If the list could not be retrieved
2857-
2858-
Returns:
2859-
RESTObjectList: The list of members
2860-
"""
2861-
2862-
path = "%s/all" % self.path
2863-
obj = self.gitlab.http_list(path, **kwargs)
2864-
return [self._obj_cls(self, item) for item in obj]
2824+
class ProjectMemberAllManager(RetrieveMixin, RESTManager):
2825+
_path = "/projects/%(project_id)s/members/all"
2826+
_obj_cls = ProjectMember
2827+
_from_parent_attrs = {"project_id": "id"}
28652828

28662829

28672830
class ProjectNote(RESTObject):
@@ -4595,6 +4558,7 @@ class Project(SaveMixin, ObjectDeleteMixin, RESTObject):
45954558
("issues", "ProjectIssueManager"),
45964559
("labels", "ProjectLabelManager"),
45974560
("members", "ProjectMemberManager"),
4561+
("members_all", "ProjectMemberAllManager"),
45984562
("mergerequests", "ProjectMergeRequestManager"),
45994563
("milestones", "ProjectMilestoneManager"),
46004564
("notes", "ProjectNoteManager"),

0 commit comments

Comments
 (0)