Deprecate UserItem.Roles.UnlicensedWithPublish and .ViewerWithPublish (never accepted by the server)

Open
#1,834 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Assessment

Difficulty
3/5
Estimated time
1-2 days
Newbie friendliness
55/100
Issue type
Refactor
Clarity
Mostly clear
Activity status
Quiet
Tech stack
python
Domain
api

Research direction

Start by locating UserItem.Roles and how its class attributes are resolved; compare a class_getattr approach with a Roles.getattribute shim. Review _decompose_site_role and the behavior introduced by PR #1812. Done means accesses to both constants warn, their docstring records historical compatibility and server incompatibility, and existing invalid-user handling remains intact.

Written by the indexing model from the issue text.

Description

enhancement

UserItem.Roles.UnlicensedWithPublish and UserItem.Roles.ViewerWithPublish are in the public API but have never worked as site role values against the Tableau server:

  • POST /users (XML path used by users.add): RestApiSiteRole.fromString accepts the modern site roles plus a handful of v2 legacy names (Publisher, Interactor, Guest, SupportUser, SiteAdministrator, ReadOnly). Neither UnlicensedWithPublish nor ViewerWithPublish is in that enum on any REST API version I can see in monolith git history (back to 2023 Perforce snapshot).
  • POST /users/import (CSV path used by users.bulk_add): CsvLicenseRoleTypeConverter accepts only creator/interactor/explorer/viewer/unlicensed/empty; any other value throws USER_CSV_INVALID_LICENSE. There is no site role → license translation before the license converter runs. UnlicensedWithPublish / ViewerWithPublish as literal license column values are rejected outright.

They've been in UserItem.Roles since the first commit of the library (2016-09-02) and have almost certainly been broken since Tableau Server 8.x/9.x-era licensing was replaced with the current Creator/Explorer/Viewer model.

Proposed fix:

  • Emit a DeprecationWarning when either is accessed as a class attribute (via __class_getattr__ on a metaclass, or a Roles.__getattribute__ shim).
  • Update the docstring to note the constants are retained for historical compatibility but do not correspond to any accepted server-side site role.
  • Remove in a future major version.

Alternatively, if there is any historical or planned server behavior that would accept these strings that I have not found, please point at it and this issue can be closed.

Related

  • PR #1812 refactored _decompose_site_role and initially defaulted unmapped site roles to Unlicensed, silently coercing these two roles to a valid-but-wrong user creation. That was changed to emit license="Invalid" (commit ac84fd3) so the server continues to reject the row instead of silently succeeding. This issue is the longer-term followup to properly deprecate the offending constants.
Dominant language
Python
Stars
716
Forks
446
Avg merge
8d 8h
Merged PRs (30d)
2

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from tableau/server-client-python

All issues in tableau/server-client-python

Similar issues

More Python issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.