From 68ff595967a5745b369a93d9d18fef48b65ebedb Mon Sep 17 00:00:00 2001 From: "John L. Villalovos" Date: Fri, 26 Nov 2021 11:54:33 -0800 Subject: [PATCH] feat: add support for `projects.groups.list()` Add support for `projects.groups.list()` endpoint. Closes #1717 --- docs/gl_objects/projects.rst | 5 +++++ gitlab/v4/objects/projects.py | 19 +++++++++++++++++++ tests/functional/api/test_projects.py | 18 ++++++++++++++++++ 3 files changed, 42 insertions(+) diff --git a/docs/gl_objects/projects.rst b/docs/gl_objects/projects.rst index c00c5546a..30d851553 100644 --- a/docs/gl_objects/projects.rst +++ b/docs/gl_objects/projects.rst @@ -92,6 +92,11 @@ Create a project in a group:: group_id = gl.groups.list(search='my-group')[0].id project = gl.projects.create({'name': 'myrepo', 'namespace_id': group_id}) +List a project's groups:: + + # Get a list of ancestor/parent groups for a project. + groups = project.groups.list() + Update a project:: project.snippets_enabled = 1 diff --git a/gitlab/v4/objects/projects.py b/gitlab/v4/objects/projects.py index c5ce7173e..272688a19 100644 --- a/gitlab/v4/objects/projects.py +++ b/gitlab/v4/objects/projects.py @@ -109,6 +109,24 @@ class GroupProjectManager(ListMixin, RESTManager): ) +class ProjectGroup(RESTObject): + pass + + +class ProjectGroupManager(ListMixin, RESTManager): + _path = "/projects/{project_id}/groups" + _obj_cls = ProjectGroup + _from_parent_attrs = {"project_id": "id"} + _list_filters = ( + "search", + "skip_groups", + "with_shared", + "shared_min_access_level", + "shared_visible_only", + ) + _types = {"skip_groups": types.ListAttribute} + + class Project(RefreshMixin, SaveMixin, ObjectDeleteMixin, RepositoryMixin, RESTObject): _short_print_attr = "path" @@ -132,6 +150,7 @@ class Project(RefreshMixin, SaveMixin, ObjectDeleteMixin, RepositoryMixin, RESTO files: ProjectFileManager forks: "ProjectForkManager" generic_packages: GenericPackageManager + groups: ProjectGroupManager hooks: ProjectHookManager imports: ProjectImportManager issues: ProjectIssueManager diff --git a/tests/functional/api/test_projects.py b/tests/functional/api/test_projects.py index 3a317d553..4cd951502 100644 --- a/tests/functional/api/test_projects.py +++ b/tests/functional/api/test_projects.py @@ -311,3 +311,21 @@ def test_project_wiki(project): wiki.save() wiki.delete() assert len(project.wikis.list()) == 0 + + +def test_project_groups_list(gl, group): + """Test listing groups of a project""" + # Create a subgroup of our top-group, we will place our new project inside + # this group. + group2 = gl.groups.create( + {"name": "group2_proj", "path": "group2_proj", "parent_id": group.id} + ) + data = { + "name": "test-project-tpsg", + "namespace_id": group2.id, + } + project = gl.projects.create(data) + + groups = project.groups.list() + group_ids = set([x.id for x in groups]) + assert set((group.id, group2.id)) == group_ids