Skip to content

Commit 8ae1879

Browse files
Oleksii ShkurupiiOleksii Shkurupii
authored andcommitted
feat: add feature to get inherited member for project/group
1 parent 8ace76a commit 8ae1879

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",
@@ -922,3 +922,39 @@ def render(self, link_url: str, image_url: str, **kwargs: Any) -> Dict[str, Any]
922922
if TYPE_CHECKING:
923923
assert not isinstance(result, requests.Response)
924924
return result
925+
926+
927+
class MemberAllMixin(object):
928+
"""This mixin is deprecated."""
929+
930+
@cli.register_custom_action(("GroupMemberManager", "ProjectMemberManager"))
931+
@exc.on_http_error(exc.GitlabListError)
932+
def all(self, **kwargs):
933+
"""List all the members, included inherited ones.
934+
935+
This Method is deprecated.
936+
937+
Args:
938+
all (bool): If True, return all the items, without pagination
939+
per_page (int): Number of items to retrieve per request
940+
page (int): ID of the page to return (starts with page 1)
941+
as_list (bool): If set to False and no pagination option is
942+
defined, return a generator instead of a list
943+
**kwargs: Extra options to send to the server (e.g. sudo)
944+
945+
Raises:
946+
GitlabAuthenticationError: If authentication is not correct
947+
GitlabListError: If the list could not be retrieved
948+
949+
Returns:
950+
RESTObjectList: The list of members
951+
"""
952+
953+
warnings.warn(
954+
"The all() method for this object is deprecated "
955+
"and will be removed in a future version.",
956+
DeprecationWarning,
957+
)
958+
path = "%s/all" % self.path
959+
obj = self.gitlab.http_list(path, **kwargs)
960+
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
22
from gitlab import exceptions as exc
33
from gitlab.base import 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,71 +21,33 @@ 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"}
2328
_create_attrs = (("access_level", "user_id"), ("expires_at",))
2429
_update_attrs = (("access_level",), ("expires_at",))
2530

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

43-
Returns:
44-
RESTObjectList: The list of members
45-
"""
46-
47-
path = "%s/all" % self.path
48-
obj = self.gitlab.http_list(path, **kwargs)
49-
return [self._obj_cls(self, item) for item in obj]
32+
class GroupMemberAllManager(RetrieveMixin, RESTManager):
33+
_path = "/groups/%(group_id)s/members/all"
34+
_obj_cls = GroupMember
35+
_from_parent_attrs = {"group_id": "id"}
5036

5137

5238
class ProjectMember(SaveMixin, ObjectDeleteMixin, RESTObject):
5339
_short_print_attr = "username"
5440

5541

56-
class ProjectMemberManager(CRUDMixin, RESTManager):
42+
class ProjectMemberManager(MemberAllMixin, CRUDMixin, RESTManager):
5743
_path = "/projects/%(project_id)s/members"
5844
_obj_cls = ProjectMember
5945
_from_parent_attrs = {"project_id": "id"}
6046
_create_attrs = (("access_level", "user_id"), ("expires_at",))
6147
_update_attrs = (("access_level",), ("expires_at",))
6248

63-
@cli.register_custom_action("ProjectMemberManager")
64-
@exc.on_http_error(exc.GitlabListError)
65-
def all(self, **kwargs):
66-
"""List all the members, included inherited ones.
6749

68-
Args:
69-
all (bool): If True, return all the items, without pagination
70-
per_page (int): Number of items to retrieve per request
71-
page (int): ID of the page to return (starts with page 1)
72-
as_list (bool): If set to False and no pagination option is
73-
defined, return a generator instead of a list
74-
**kwargs: Extra options to send to the server (e.g. sudo)
75-
76-
Raises:
77-
GitlabAuthenticationError: If authentication is not correct
78-
GitlabListError: If the list could not be retrieved
79-
80-
Returns:
81-
RESTObjectList: The list of members
82-
"""
83-
84-
path = "%s/all" % self.path
85-
obj = self.gitlab.http_list(path, **kwargs)
86-
return [self._obj_cls(self, item) for item in obj]
50+
class ProjectMemberAllManager(RetrieveMixin, RESTManager):
51+
_path = "/projects/%(project_id)s/members/all"
52+
_obj_cls = ProjectMember
53+
_from_parent_attrs = {"project_id": "id"}

0 commit comments

Comments
 (0)