Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Permission update - Bad Request Error #1570

Open
zrayadh opened this issue Feb 11, 2025 · 1 comment
Open

Permission update - Bad Request Error #1570

zrayadh opened this issue Feb 11, 2025 · 1 comment

Comments

@zrayadh
Copy link

zrayadh commented Feb 11, 2025

When migrating from Tableau Server to Tableau Cloud, calling
server.workbooks.update_permissions(target_workbook, PermissionRules)
results in a 400 Bad Request error. The error message indicates that the request body is missing, even though the request payload is properly formatted.


Versions

  • Tableau Cloud API version: 3.24
  • Python version: 3.12
  • TSC library version: 0.36

Sample Code

import tableauserverclient as TSC
from credentials import Credentials
from tableauserverclient.models.reference_item import ResourceReference

SITE = "mySite"
API_TIMEOUT = 120
WORKBOOK_ID = "myWorkbookId"
GROUP_ID = "myGroupId"

tableau_auth = TSC.PersonalAccessTokenAuth(
    Credentials.Tableau.token_name, Credentials.Tableau.token, SITE
)
server = TSC.Server(Credentials.Tableau.server, use_server_version=True)
server.add_http_options({"timeout": API_TIMEOUT, "verify": False})
server.auth.sign_in(tableau_auth)

target_workbook = server.workbooks.get_by_id(WORKBOOK_ID)

capabilities = {
    TSC.Permission.Capability.Read: TSC.Permission.Mode.Allow,
    TSC.Permission.Capability.Filter: TSC.Permission.Mode.Allow,
    TSC.Permission.Capability.ViewComments: TSC.Permission.Mode.Allow,
    TSC.Permission.Capability.AddComment: TSC.Permission.Mode.Allow,
    TSC.Permission.Capability.ExportImage: TSC.Permission.Mode.Allow,
    TSC.Permission.Capability.ExportData: TSC.Permission.Mode.Allow,
}

permission = [
    TSC.PermissionsRule(
        grantee=ResourceReference(id_=GROUP_ID, tag_name="group"),
        capabilities=capabilities,
    )
]

server.workbooks.update_permissions(target_workbook, permission)

Request Payload
PUT /api/3.24/sites/{siteId}/workbooks/{workbookId}/permissions

{
  "timeout": 120,
  "verify": False,
  "headers": {
    "x-tableau-auth": "{token}",
    "content-type": "text/xml",
    "User-Agent": "Tableau Server Client/0.36"
  },
  "data": b"<tsRequest><permissions><granteeCapabilities>
            <group id={groupId} />
            <capabilities>
              <capability name='Read' mode='Allow' />
              <capability name='Filter' mode='Allow' />
              <capability name='ViewComments' mode='Allow' />
              <capability name='AddComment' mode='Allow' />
              <capability name='ExportImage' mode='Allow' />
              <capability name='ExportData' mode='Allow' />
            </capabilities>
           </granteeCapabilities></permissions></tsRequest>"
}

Results
400000: Bad Request
Required request body is missing: public com.tableausoftware.api.rest.IRestApiResponse
com.tableausoftware.api.rest.permissions.RestApiPermissionsController.addWorkbookPermissions
(com.tableausoftware.api.rest.util.RestApiVersion,com.tableausoftware.domain.user.IAuthenticatedUser,
java.lang.String,com.tableausoftware.api.rest.viewmodels.TsRequest,javax.servlet.http.HttpServletRequest,
javax.servlet.http.HttpServletResponse) throws java.lang.Exception

@jorwoods
Copy link
Contributor

jorwoods commented Feb 12, 2025

My sample code does not reproduce this problem.

import os

from dotenv import load_dotenv
import tableauserverclient as TSC

load_dotenv()


server = TSC.Server(os.environ["TABLEAU_SERVER"], use_server_version=True)
auth = TSC.PersonalAccessTokenAuth(
    os.environ["TOKEN_NAME"], os.environ["TOKEN_SECRET"], site_id=os.environ["TABLEAU_SITE"]
)

server.auth.sign_in(auth)

group = server.groups.filter(name="test")[0]
target_workbook = server.workbooks.filter(name="test")[0]

capabilities = {
    TSC.Permission.Capability.Read: TSC.Permission.Mode.Allow,
    TSC.Permission.Capability.Filter: TSC.Permission.Mode.Allow,
    TSC.Permission.Capability.ViewComments: TSC.Permission.Mode.Allow,
    TSC.Permission.Capability.AddComment: TSC.Permission.Mode.Allow,
    TSC.Permission.Capability.ExportImage: TSC.Permission.Mode.Allow,
    TSC.Permission.Capability.ExportData: TSC.Permission.Mode.Allow,
}

permission = [
    TSC.PermissionsRule(
        grantee=group.as_reference(group.id),
        capabilities=capabilities,
    )
]

server.workbooks.update_permissions(target_workbook, permission)

Was successful:

Image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants