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 pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy