GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — Add custom view default-user endpoints (API 3.21+) by jacalata · Pull Request #1913 · tableau/server-client-python

Conversation

@jacalata

@jacalata jacalata commented Nov 12, 2026

Copy link
Copy Markdown
Contributor

Closes #702

A custom view can be saved as the default view for individual users. TSC has no way to list those users or to set them. This adds both.

New methods

  • server.custom_views.get_users_with_default(view, req_options=None) returns (list[UserItem], PaginationItem): the users who have this custom view as their default. Paginated.
  • server.custom_views.set_as_default_for_users(view, users, strict=False) sets the custom view as the default for up to 100 users and returns a list[UserDefaultViewAssignment] with user_id, success, error_code and summary for each user.

Both are API 3.21+ and administrator-only. Both accept a CustomViewItem or an ID; users accepts UserItems or IDs.

This is separate from WorkbookItem.default_view_id, which is one value per workbook shared by every user.

Behavior to review

  • The server applies each user independently, so a call can partly succeed. By default the per-user outcome is returned and failures are logged. With strict=True, DefaultViewAssignmentError is raised after the request when any user failed; .failures holds those results. Users that succeeded are still updated, so strict mode is not all-or-nothing.
  • Client-side validation raises before any request: MissingRequiredFieldError for a missing view ID, TypeError if users is a single string, ValueError for no users, more than 100, or a user without an ID.
  • Success_codes is now any 2xx (range(200, 300)). The REST docs list 200 for the set call, but Tableau Server's implementation responds 207 Multi-Status, which TSC rejected. This is global: 207 is not used by any other endpoint, and no in-repo code or test relies on a 2xx being treated as an error. The one behavior change is that a 205 or 206 response carrying an error body would now parse as success; no endpoint TSC calls returns those.
  • The test fixtures are built from the REST API docs and the response schema, not captured from a live server.

Written with Claude Code

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
jacalata added 3 commits November 10, 2026 19:36
@jacalata
Add CustomViews.get_default_users
394f321
Wraps GET /customviews/{id}/default/users (API 3.21+, administrators only),
which lists the users who have a custom view set as their default.

Written with Claude Code
@jacalata
Add CustomViews.set_as_default_for_users
0659f06
Wraps POST /customviews/{id}/default/users (API 3.21+, administrators only),
which makes one custom view the default for up to 100 users. Returns the
outcome for each user. strict=True raises DefaultViewAssignmentError if any
user failed; users that succeeded are still updated.

Accept any 2xx status, since this call returns 207 Multi-Status.

Written with Claude Code
@jacalata
Harden set_as_default_for_users input and result handling
ae5d566
- Reject a bare string for `users` with TypeError; list() would split it
  into one-character user IDs.
- Warn when the server reports a different number of results than users
  requested.
- DefaultViewAssignmentError no longer prints "None" for results that lack
  a user ID or error details.
- Add tests for results without a user or error, a missing success
  attribute, an empty result list, and the Success_codes boundaries.

Written with Claude Code
Copilot AI balanced review requested due to automatic review settings November 12, 2026 03:18
Copilot AI reviewed Nov 12, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

There was a problem hiding this comment.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota. Try requesting a review at a lower effort level.

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

All reactions
@github-actions

github-actions Bot commented Nov 12, 2026

Copy link
Copy Markdown

Coverage

Coverage Report
FileStmtsMissCoverMissing
tableauserverclient
   __init__.py50100% 
   config.py150100% 
   datetime_helpers.py2511 96%
   exponential_backoff.py200100% 
   filesys_helpers.py310100% 
   namespace.py2533 88%
tableauserverclient/bin
   __init__.py20100% 
   _version.py358212212 41%
tableauserverclient/helpers
   __init__.py10100% 
   logging.py20100% 
   strings.py3111 97%
tableauserverclient/models
   __init__.py470100% 
   auth_federation_item.py8799 90%
   collection_item.py4177 83%
   column_item.py553232 42%
   connection_credentials.py351111 69%
   connection_item.py1131313 88%
   custom_view_item.py1602121 87%
   data_acceleration_report_item.py5411 98%
   data_alert_item.py15844 97%
   data_freshness_policy_item.py1551515 90%
   database_item.py2073636 83%
   datasource_item.py3001212 96%
   dqw_item.py10455 95%
   exceptions.py40100% 
   extensions_item.py13244 97%
   extract_item.py4444 91%
   favorites_item.py6988 88%
   fileupload_item.py190100% 
   flow_item.py1491010 93%
   flow_run_item.py710100% 
   group_item.py8966 93%
   groupset_item.py4977 86%
   interval_item.py1823232 82%
   job_item.py1921010 95%
   linked_tasks_item.py7911 99%
   location_item.py2922 93%
   metric_item.py1291313 90%
   oidc_item.py6333 95%
   pagination_item.py3411 97%
   permissions_item.py1111212 89%
   project_item.py2073131 85%
   property_decorators.py1001818 82%
   reference_item.py2622 92%
   revision_item.py5911 98%
   schedule_item.py20966 97%
   server_info_item.py3777 81%
   site_item.py6361313 98%
   subscription_item.py10122 98%
   table_item.py1191818 85%
   tableau_auth.py612525 59%
   tableau_types.py2711 96%
   tag_item.py150100% 
   target.py60100% 
   task_item.py5622 96%
   user_item.py3381717 95%
   view_item.py2201616 93%
   virtual_connection_item.py6488 88%
   webhook_item.py6911 99%
   workbook_item.py3621616 96%
tableauserverclient/server
   __init__.py90100% 
   exceptions.py40100% 
   filter.py2911 97%
   pager.py3311 97%
   query.py1431515 90%
   request_factory.py1374194194 86%
   request_options.py38655 99%
   server.py2502525 90%
   sort.py60100% 
tableauserverclient/server/endpoint
   __init__.py360100% 
   auth_endpoint.py731010 86%
   auth_federation_endpoint.py800100% 
   custom_views_endpoint.py1911212 94%
   data_acceleration_report_endpoint.py210100% 
   data_alert_endpoint.py942323 76%
   databases_endpoint.py1113030 73%
   datasources_endpoint.py3233333 90%
   default_permissions_endpoint.py4433 93%
   dqw_endpoint.py451616 64%
   endpoint.py2602525 90%
   exceptions.py8666 93%
   extensions_endpoint.py310100% 
   favorites_endpoint.py942222 77%
   fileuploads_endpoint.py510100% 
   flow_runs_endpoint.py6299 85%
   flow_task_endpoint.py2122 90%
   flows_endpoint.py1984747 76%
   groups_endpoint.py12699 93%
   groupsets_endpoint.py7277 90%
   jobs_endpoint.py6899 87%
   linked_tasks_endpoint.py370100% 
   metadata_endpoint.py881414 84%
   metrics_endpoint.py5566 89%
   oidc_endpoint.py4211 98%
   permissions_endpoint.py4433 93%
   projects_endpoint.py1782424 87%
   resource_tagger.py1273535 72%
   schedules_endpoint.py1191111 91%
   server_info_endpoint.py361010 72%
   sites_endpoint.py1302727 79%
   subscriptions_endpoint.py561414 75%
   tables_endpoint.py1103636 67%
   tasks_endpoint.py6366 90%
   users_endpoint.py17077 96%
   views_endpoint.py15099 94%
   virtual_connections_endpoint.py1131010 91%
   webhooks_endpoint.py5499 83%
   workbooks_endpoint.py3382222 93%
TOTAL12419142889% 
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

Copilot code review Copilot
Copilot review effort
Applies to this pull request for everyone.Learn more about Copilot code review.
Copilot left review comments

At least 1 approving review is required to merge this pull request.

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

None yet

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

Support for getting the user's default view

Uh oh!

There was an error while loading. Please reload this page.

2 participants

@jacalata
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.