Skip to content

Commit 2305915

Browse files
Oleksii Shkurupiinejch
authored andcommitted
feat: add feature to get inherited member for project/group
1 parent 0d3b8ae commit 2305915

File tree

4 files changed

+77
-57
lines changed

4 files changed

+77
-57
lines changed

docs/gl_objects/groups.rst

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,27 +225,35 @@ Reference
225225

226226
+ :class:`gitlab.v4.objects.GroupMember`
227227
+ :class:`gitlab.v4.objects.GroupMemberManager`
228+
+ :class:`gitlab.v4.objects.GroupMemberAllManager`
228229
+ :attr:`gitlab.v4.objects.Group.members`
230+
+ :attr:`gitlab.v4.objects.Group.members_all`
229231

230232
* GitLab API: https://docs.gitlab.com/ce/api/groups.html
231233

232234

233235
Examples
234236
--------
235237

236-
List group members::
238+
List only direct group members::
237239

238240
members = group.members.list()
239241

240242
List the group members recursively (including inherited members through
241243
ancestor groups)::
242244

243-
members = group.members.all(all=True)
245+
members = group.members.all(all=True) # Deprecated
246+
# or
247+
members = group.members_all.list(all=True)
244248

245-
Get a group member::
249+
Get only direct group member::
246250

247251
members = group.members.get(member_id)
248252

253+
Get a member of a group, including members inherited through ancestor groups::
254+
255+
members = group.members_all.get(member_id)
256+
249257
Add a member to the group::
250258

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

docs/gl_objects/projects.rst

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -502,30 +502,39 @@ 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(all=True) # Deprecated
522+
# or
523+
members = project.members_all.list(all=True)
520524

521525
Search project members matching a query string::
522526

523527
members = project.members.list(query='bar')
524528

525-
Get a single project member::
529+
Get only direct project member::
526530

527531
member = project.members.get(user_id)
528532

533+
Get a member of a project, including members inherited through ancestor groups::
534+
535+
members = project.members_all.get(member_id)
536+
537+
529538
Add a project member::
530539

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

gitlab/mixins.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
from gitlab import exceptions as exc
3737
from gitlab import types as g_types
3838
from gitlab import utils
39-
39+
import warnings
4040

4141
__all__ = [
4242
"GetMixin",
@@ -928,3 +928,39 @@ def render(self, link_url: str, image_url: str, **kwargs: Any) -> Dict[str, Any]
928928
if TYPE_CHECKING:
929929
assert not isinstance(result, requests.Response)
930930
return result
931+
932+
933+
class MemberAllMixin(object):
934+
"""This mixin is deprecated."""
935+
936+
@cli.register_custom_action(("GroupMemberManager", "ProjectMemberManager"))
937+
@exc.on_http_error(exc.GitlabListError)
938+
def all(self, **kwargs):
939+
"""List all the members, included inherited ones.
940+
941+
This Method is deprecated.
942+
943+
Args:
944+
all (bool): If True, return all the items, without pagination
945+
per_page (int): Number of items to retrieve per request
946+
page (int): ID of the page to return (starts with page 1)
947+
as_list (bool): If set to False and no pagination option is
948+
defined, return a generator instead of a list
949+
**kwargs: Extra options to send to the server (e.g. sudo)
950+
951+
Raises:
952+
GitlabAuthenticationError: If authentication is not correct
953+
GitlabListError: If the list could not be retrieved
954+
955+
Returns:
956+
RESTObjectList: The list of members
957+
"""
958+
959+
warnings.warn(
960+
"The all() method for this object is deprecated "
961+
"and will be removed in a future version.",
962+
DeprecationWarning,
963+
)
964+
path = "%s/all" % self.path
965+
obj = self.gitlab.http_list(path, **kwargs)
966+
return [self._obj_cls(self, item) for item in obj]

gitlab/v4/objects/members.py

Lines changed: 17 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
from gitlab import cli, types
22
from gitlab import exceptions as exc
33
from gitlab.base import RequiredOptional, RESTManager, RESTObject
4-
from gitlab.mixins import CRUDMixin, ObjectDeleteMixin, SaveMixin
5-
4+
from gitlab.mixins import (
5+
CRUDMixin,
6+
ObjectDeleteMixin,
7+
SaveMixin,
8+
RetrieveMixin,
9+
MemberAllMixin,
10+
)
611

712
__all__ = [
813
"GroupMember",
@@ -16,7 +21,7 @@ class GroupMember(SaveMixin, ObjectDeleteMixin, RESTObject):
1621
_short_print_attr = "username"
1722

1823

19-
class GroupMemberManager(CRUDMixin, RESTManager):
24+
class GroupMemberManager(MemberAllMixin, CRUDMixin, RESTManager):
2025
_path = "/groups/%(group_id)s/members"
2126
_obj_cls = GroupMember
2227
_from_parent_attrs = {"group_id": "id"}
@@ -28,37 +33,18 @@ class GroupMemberManager(CRUDMixin, RESTManager):
2833
)
2934
_types = {"user_ids": types.ListAttribute}
3035

31-
@cli.register_custom_action("GroupMemberManager")
32-
@exc.on_http_error(exc.GitlabListError)
33-
def all(self, **kwargs):
34-
"""List all the members, included inherited ones.
35-
36-
Args:
37-
all (bool): If True, return all the items, without pagination
38-
per_page (int): Number of items to retrieve per request
39-
page (int): ID of the page to return (starts with page 1)
40-
as_list (bool): If set to False and no pagination option is
41-
defined, return a generator instead of a list
42-
**kwargs: Extra options to send to the server (e.g. sudo)
43-
44-
Raises:
45-
GitlabAuthenticationError: If authentication is not correct
46-
GitlabListError: If the list could not be retrieved
4736

48-
Returns:
49-
RESTObjectList: The list of members
50-
"""
51-
52-
path = "%s/all" % self.path
53-
obj = self.gitlab.http_list(path, **kwargs)
54-
return [self._obj_cls(self, item) for item in obj]
37+
class GroupMemberAllManager(RetrieveMixin, RESTManager):
38+
_path = "/groups/%(group_id)s/members/all"
39+
_obj_cls = GroupMember
40+
_from_parent_attrs = {"group_id": "id"}
5541

5642

5743
class ProjectMember(SaveMixin, ObjectDeleteMixin, RESTObject):
5844
_short_print_attr = "username"
5945

6046

61-
class ProjectMemberManager(CRUDMixin, RESTManager):
47+
class ProjectMemberManager(MemberAllMixin, CRUDMixin, RESTManager):
6248
_path = "/projects/%(project_id)s/members"
6349
_obj_cls = ProjectMember
6450
_from_parent_attrs = {"project_id": "id"}
@@ -70,27 +56,8 @@ class ProjectMemberManager(CRUDMixin, RESTManager):
7056
)
7157
_types = {"user_ids": types.ListAttribute}
7258

73-
@cli.register_custom_action("ProjectMemberManager")
74-
@exc.on_http_error(exc.GitlabListError)
75-
def all(self, **kwargs):
76-
"""List all the members, included inherited ones.
7759

78-
Args:
79-
all (bool): If True, return all the items, without pagination
80-
per_page (int): Number of items to retrieve per request
81-
page (int): ID of the page to return (starts with page 1)
82-
as_list (bool): If set to False and no pagination option is
83-
defined, return a generator instead of a list
84-
**kwargs: Extra options to send to the server (e.g. sudo)
85-
86-
Raises:
87-
GitlabAuthenticationError: If authentication is not correct
88-
GitlabListError: If the list could not be retrieved
89-
90-
Returns:
91-
RESTObjectList: The list of members
92-
"""
93-
94-
path = "%s/all" % self.path
95-
obj = self.gitlab.http_list(path, **kwargs)
96-
return [self._obj_cls(self, item) for item in obj]
60+
class ProjectMemberAllManager(RetrieveMixin, RESTManager):
61+
_path = "/projects/%(project_id)s/members/all"
62+
_obj_cls = ProjectMember
63+
_from_parent_attrs = {"project_id": "id"}

0 commit comments

Comments
 (0)