From f775677d1f15103c564a2f5df76acccf85c848f2 Mon Sep 17 00:00:00 2001 From: Jac Fitzgerald Date: Wed, 17 Jun 2026 10:58:44 -0700 Subject: [PATCH] feat: document email filter for users endpoint Fixes #1562 Co-Authored-By: Claude Sonnet 4.6 --- .../server/endpoint/users_endpoint.py | 2 ++ tableauserverclient/server/request_options.py | 1 + test/test_user.py | 27 +++++++++++++++++++ 3 files changed, 30 insertions(+) diff --git a/tableauserverclient/server/endpoint/users_endpoint.py b/tableauserverclient/server/endpoint/users_endpoint.py index 966ebd0a8..48c77da66 100644 --- a/tableauserverclient/server/endpoint/users_endpoint.py +++ b/tableauserverclient/server/endpoint/users_endpoint.py @@ -717,6 +717,8 @@ def filter(self, *invalid, page_size: int | None = None, **kwargs) -> QuerySet[U domain_name=... domain_name__in=... + email=... + email__in=... friendly_name=... friendly_name__in=... is_local=... diff --git a/tableauserverclient/server/request_options.py b/tableauserverclient/server/request_options.py index 15cf2e0f4..5a8600908 100644 --- a/tableauserverclient/server/request_options.py +++ b/tableauserverclient/server/request_options.py @@ -137,6 +137,7 @@ class Field: DisplayTabs = "displayTabs" DomainName = "domainName" DomainNickname = "domainNickname" + Email = "email" FavoritesTotal = "favoritesTotal" Fields = "fields" FlowId = "flowId" diff --git a/test/test_user.py b/test/test_user.py index 8f489187f..44036317f 100644 --- a/test/test_user.py +++ b/test/test_user.py @@ -541,6 +541,33 @@ def test_add_idp_and_auth_error(server: TSC.Server) -> None: server.users.bulk_add(users) +def test_filter_by_email(server: TSC.Server) -> None: + response_xml = GET_XML.read_text() + with requests_mock.mock() as m: + m.get(requests_mock.ANY, text=response_xml) + qs = server.users.filter(email="test@example.com") + + # Access total_available to trigger the HTTP request and inspect the query string + assert qs.total_available == 2 + assert len(m.request_history) >= 1 + first_request_qs = m.request_history[0].qs + assert "filter" in first_request_qs + assert "email:eq:test@example.com" in first_request_qs["filter"] + + +def test_filter_by_email_in(server: TSC.Server) -> None: + response_xml = GET_XML.read_text() + with requests_mock.mock() as m: + m.get(requests_mock.ANY, text=response_xml) + qs = server.users.filter(email__in=["alice@example.com", "bob@example.com"]) + + assert qs.total_available == 2 + assert len(m.request_history) >= 1 + first_request_qs = m.request_history[0].qs + assert "filter" in first_request_qs + assert "email:in:[alice@example.com,bob@example.com]" in first_request_qs["filter"] + + def test_remove_users_csv(server: TSC.Server) -> None: server.version = "3.15" users = [