Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
Added
-----

- Add the ``statuses`` parameter to ``GroupsClient.get_my_groups()``. (:pr:`NUMBER`)
30 changes: 29 additions & 1 deletion src/globus_sdk/services/groups/client.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from __future__ import annotations

import sys
import typing as t
import uuid

Expand All @@ -9,6 +10,21 @@
from .data import BatchMembershipActions, GroupPolicies
from .errors import GroupsAPIError

if sys.version_info >= (3, 10):
from typing import TypeAlias
else:
from typing_extensions import TypeAlias

_VALID_STATUSES_T: TypeAlias = t.Literal[
"active",
"declined",
"invited",
"left",
"pending",
"rejected",
"removed",
]


class GroupsClient(client.BaseClient):
"""
Expand Down Expand Up @@ -36,11 +52,19 @@ def default_scope_requirements(self) -> list[Scope]:
return [Scope(GroupsScopes.view_my_groups_and_memberships)]

def get_my_groups(
self, *, query_params: dict[str, t.Any] | None = None
self,
*,
statuses: _VALID_STATUSES_T | t.Iterable[_VALID_STATUSES_T] | None = None,
query_params: dict[str, t.Any] | None = None,
) -> response.ArrayResponse:
"""
Return a list of groups your identity belongs to.

:param statuses:
If provided, only groups containing memberships with the given status
are returned.
Valid values are ``active``, ``invited``, ``pending``, ``rejected``,
``removed``, ``left``, and ``declined``.
:param query_params: Additional passthrough query parameters

.. tab-set::
Expand All @@ -53,6 +77,10 @@ def get_my_groups(
:service: groups
:ref: get_my_groups_and_memberships_v2_groups_my_groups_get
"""
if query_params is None:
query_params = {}
if statuses is not None:
query_params["statuses"] = ",".join(utils.safe_strseq_iter(statuses))
return response.ArrayResponse(
self.get("/groups/my_groups", query_params=query_params)
)
Expand Down
10 changes: 8 additions & 2 deletions tests/functional/services/groups/test_get_my_groups.py
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
from globus_sdk._testing import load_response
import urllib.parse

from globus_sdk._testing import get_last_request, load_response
from globus_sdk.response import ArrayResponse


def test_get_my_groups(groups_client):
meta = load_response(groups_client.get_my_groups).metadata

res = groups_client.get_my_groups()
res = groups_client.get_my_groups(statuses="active")
assert res.http_status == 200

req = get_last_request()
parsed_qs = urllib.parse.parse_qs(urllib.parse.urlparse(req.url).query)
assert parsed_qs["statuses"] == ["active"]

assert isinstance(res, ArrayResponse)
assert isinstance(res.data, list)
assert set(meta["group_names"]) == {g["name"] for g in res}
Loading