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
7 changes: 4 additions & 3 deletions tableauserverclient/models/project_item.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@

from defusedxml.ElementTree import fromstring

from .exceptions import UnpopulatedPropertyError
from .property_decorators import property_is_enum, property_not_empty
from tableauserverclient.models.exceptions import UnpopulatedPropertyError
from tableauserverclient.models.property_decorators import property_is_enum, property_not_empty


class ProjectItem(object):
Expand Down Expand Up @@ -34,6 +34,7 @@ def __init__(
self.content_permissions: Optional[str] = content_permissions
self.parent_id: Optional[str] = parent_id
self._samples: Optional[bool] = samples
self._owner_id: Optional[str] = None

self._permissions = None
self._default_workbook_permissions = None
Expand Down Expand Up @@ -119,7 +120,7 @@ def owner_id(self) -> Optional[str]:

@owner_id.setter
def owner_id(self, value: str) -> None:
raise NotImplementedError("REST API does not currently support updating project owner.")
self._owner_id = value

def is_default(self):
return self.name.lower() == "default"
Expand Down
12 changes: 6 additions & 6 deletions tableauserverclient/server/endpoint/projects_endpoint.py
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
import logging

from .default_permissions_endpoint import _DefaultPermissionsEndpoint
from .endpoint import QuerysetEndpoint, api, XML_CONTENT_TYPE
from .exceptions import MissingRequiredFieldError
from .permissions_endpoint import _PermissionsEndpoint
from tableauserverclient.server.endpoint.default_permissions_endpoint import _DefaultPermissionsEndpoint
from tableauserverclient.server.endpoint.endpoint import QuerysetEndpoint, api, XML_CONTENT_TYPE
from tableauserverclient.server.endpoint.exceptions import MissingRequiredFieldError
from tableauserverclient.server.endpoint.permissions_endpoint import _PermissionsEndpoint
from tableauserverclient.server import RequestFactory, RequestOptions
from tableauserverclient.models import ProjectItem, PaginationItem, Resource

from typing import List, Optional, Tuple, TYPE_CHECKING

if TYPE_CHECKING:
from ..server import Server
from ..request_options import RequestOptions
from tableauserverclient.server.server import Server
from tableauserverclient.server.request_options import RequestOptions

from tableauserverclient.helpers.logging import logger

Expand Down
3 changes: 3 additions & 0 deletions tableauserverclient/server/request_factory.py
Original file line number Diff line number Diff line change
Expand Up @@ -482,6 +482,9 @@ def update_req(self, project_item: "ProjectItem") -> bytes:
project_element.attrib["contentPermissions"] = project_item.content_permissions
if project_item.parent_id is not None:
project_element.attrib["parentProjectId"] = project_item.parent_id
if (owner := project_item.owner_id) is not None:
owner_element = ET.SubElement(project_element, "owner")
owner_element.attrib["id"] = owner
return ET.tostring(xml_request)

def create_req(self, project_item: "ProjectItem") -> bytes:
Expand Down
4 changes: 3 additions & 1 deletion test/assets/project_update.xml
Original file line number Diff line number Diff line change
@@ -1,4 +1,6 @@
<?xml version='1.0' encoding='UTF-8'?>
<tsResponse xmlns="http://tableau.com/api" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://tableau.com/api http://tableau.com/api/ts-api-2.3.xsd">
<project id="1d0304cd-3796-429f-b815-7258370b9b74" name="Test Project" description="Project created for testing" contentPermissions="LockedToProject" parentProjectId="9a8f2265-70f3-4494-96c5-e5949d7a1120" />
<project id="1d0304cd-3796-429f-b815-7258370b9b74" name="Test Project" description="Project created for testing" contentPermissions="LockedToProject" parentProjectId="9a8f2265-70f3-4494-96c5-e5949d7a1120" >
<owner id="dd2239f6-ddf1-4107-981a-4cf94e415794" />
</project>
</tsResponse>
4 changes: 3 additions & 1 deletion test/test_project.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,13 +79,15 @@ def test_update(self) -> None:
parent_id="9a8f2265-70f3-4494-96c5-e5949d7a1120",
)
single_project._id = "1d0304cd-3796-429f-b815-7258370b9b74"
single_project.owner_id = "dd2239f6-ddf1-4107-981a-4cf94e415794"
single_project = self.server.projects.update(single_project)

self.assertEqual("1d0304cd-3796-429f-b815-7258370b9b74", single_project.id)
self.assertEqual("Test Project", single_project.name)
self.assertEqual("Project created for testing", single_project.description)
self.assertEqual("LockedToProject", single_project.content_permissions)
self.assertEqual("9a8f2265-70f3-4494-96c5-e5949d7a1120", single_project.parent_id)
self.assertEqual("dd2239f6-ddf1-4107-981a-4cf94e415794", single_project.owner_id)

def test_content_permission_locked_to_project_without_nested(self) -> None:
with open(SET_CONTENT_PERMISSIONS_XML, "rb") as f:
Expand Down Expand Up @@ -185,7 +187,7 @@ def test_populate_workbooks(self) -> None:
self.baseurl + "/9dbd2263-16b5-46e1-9c43-a76bb8ab65fb/default-permissions/workbooks", text=response_xml
)
single_project = TSC.ProjectItem("test", "1d0304cd-3796-429f-b815-7258370b9b74")
single_project._owner_id = "dd2239f6-ddf1-4107-981a-4cf94e415794"
single_project.owner_id = "dd2239f6-ddf1-4107-981a-4cf94e415794"
single_project._id = "9dbd2263-16b5-46e1-9c43-a76bb8ab65fb"

self.server.projects.populate_workbook_default_permissions(single_project)
Expand Down
5 changes: 0 additions & 5 deletions test/test_project_model.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,3 @@ def test_parent_id(self):
project = TSC.ProjectItem("proj")
project.parent_id = "foo"
self.assertEqual(project.parent_id, "foo")

def test_owner_id(self):
project = TSC.ProjectItem("proj")
with self.assertRaises(NotImplementedError):
project.owner_id = "new_owner"