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
4 changes: 3 additions & 1 deletion tableauserverclient/server/endpoint/auth_endpoint.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .endpoint import Endpoint
from .endpoint import Endpoint, api
from .. import RequestFactory, NAMESPACE
import xml.etree.ElementTree as ET
import logging
Expand All @@ -21,6 +21,7 @@ def __exit__(self, exc_type, exc_val, exc_tb):
def baseurl(self):
return "{0}/auth".format(self.parent_srv.baseurl)

@api(version="2.0")
def sign_in(self, auth_req):
url = "{0}/{1}".format(self.baseurl, 'signin')
signin_req = RequestFactory.Auth.signin_req(auth_req)
Expand All @@ -35,6 +36,7 @@ def sign_in(self, auth_req):
logger.info('Signed into {0} as {1}'.format(self.parent_srv.server_address, auth_req.username))
return Auth.contextmgr(self.sign_out)

@api(version="2.0")
def sign_out(self):
url = "{0}/{1}".format(self.baseurl, 'signout')
# If there are no auth tokens you're already signed out. No-op
Expand Down
9 changes: 8 additions & 1 deletion tableauserverclient/server/endpoint/datasources_endpoint.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .endpoint import Endpoint
from .endpoint import Endpoint, api
from .exceptions import MissingRequiredFieldError
from .fileuploads_endpoint import Fileuploads
from .. import RequestFactory, DatasourceItem, PaginationItem, ConnectionItem
Expand All @@ -22,6 +22,7 @@ def baseurl(self):
return "{0}/sites/{1}/datasources".format(self.parent_srv.baseurl, self.parent_srv.site_id)

# Get all datasources
@api(version="2.0")
def get(self, req_options=None):
logger.info('Querying all datasources on site')
url = self.baseurl
Expand All @@ -31,6 +32,7 @@ def get(self, req_options=None):
return all_datasource_items, pagination_item

# Get 1 datasource by id
@api(version="2.0")
def get_by_id(self, datasource_id):
if not datasource_id:
error = "Datasource ID undefined."
Expand All @@ -41,6 +43,7 @@ def get_by_id(self, datasource_id):
return DatasourceItem.from_response(server_response.content)[0]

# Populate datasource item's connections
@api(version="2.0")
def populate_connections(self, datasource_item):
if not datasource_item.id:
error = 'Datasource item missing ID. Datasource must be retrieved from server first.'
Expand All @@ -51,6 +54,7 @@ def populate_connections(self, datasource_item):
logger.info('Populated connections for datasource (ID: {0})'.format(datasource_item.id))

# Delete 1 datasource by id
@api(version="2.0")
def delete(self, datasource_id):
if not datasource_id:
error = "Datasource ID undefined."
Expand All @@ -60,6 +64,7 @@ def delete(self, datasource_id):
logger.info('Deleted single datasource (ID: {0})'.format(datasource_id))

# Download 1 datasource by id
@api(version="2.0")
def download(self, datasource_id, filepath=None):
if not datasource_id:
error = "Datasource ID undefined."
Expand All @@ -81,6 +86,7 @@ def download(self, datasource_id, filepath=None):
return os.path.abspath(filepath)

# Update datasource
@api(version="2.0")
def update(self, datasource_item):
if not datasource_item.id:
error = 'Datasource item missing ID. Datasource must be retrieved from server first.'
Expand All @@ -93,6 +99,7 @@ def update(self, datasource_item):
return updated_datasource._parse_common_tags(server_response.content)

# Publish datasource
@api(version="2.0")
def publish(self, datasource_item, file_path, mode, connection_credentials=None):
if not os.path.isfile(file_path):
error = "File path does not lead to an existing file."
Expand Down
2 changes: 1 addition & 1 deletion tableauserverclient/server/endpoint/endpoint.py
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ def api(version):
def _decorator(func):
@wraps(func)
def wrapper(self, *args, **kwargs):
server_version = Version(self.parent_srv.version)
server_version = Version(self.parent_srv.version or "0.0")
minimum_supported = Version(version)
if server_version < minimum_supported:
error = "This endpoint is not available in API version {}. Requires {}".format(
Expand Down
4 changes: 3 additions & 1 deletion tableauserverclient/server/endpoint/fileuploads_endpoint.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
from .exceptions import MissingRequiredFieldError
from .endpoint import Endpoint
from .endpoint import Endpoint, api
from .. import RequestFactory
from ...models.fileupload_item import FileuploadItem
import os.path
Expand All @@ -20,6 +20,7 @@ def __init__(self, parent_srv):
def baseurl(self):
return "{0}/sites/{1}/fileUploads".format(self.parent_srv.baseurl, self.parent_srv.site_id)

@api(version="2.0")
def initiate(self):
url = self.baseurl
server_response = self.post_request(url, '')
Expand All @@ -28,6 +29,7 @@ def initiate(self):
logger.info('Initiated file upload session (ID: {0})'.format(self.upload_id))
return self.upload_id

@api(version="2.0")
def append(self, xml_request, content_type):
if not self.upload_id:
error = "File upload session must be initiated first."
Expand Down
9 changes: 8 additions & 1 deletion tableauserverclient/server/endpoint/groups_endpoint.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .endpoint import Endpoint
from .endpoint import Endpoint, api
from .exceptions import MissingRequiredFieldError
from ...models.exceptions import UnpopulatedPropertyError
from .. import RequestFactory, GroupItem, UserItem, PaginationItem
Expand All @@ -13,6 +13,7 @@ def baseurl(self):
return "{0}/sites/{1}/groups".format(self.parent_srv.baseurl, self.parent_srv.site_id)

# Gets all groups
@api(version="2.0")
def get(self, req_options=None):
logger.info('Querying all groups on site')
url = self.baseurl
Expand All @@ -22,6 +23,7 @@ def get(self, req_options=None):
return all_group_items, pagination_item

# Gets all users in a given group
@api(version="2.0")
def populate_users(self, group_item, req_options=None):
if not group_item.id:
error = "Group item missing ID. Group must be retrieved from server first."
Expand All @@ -34,6 +36,7 @@ def populate_users(self, group_item, req_options=None):
return pagination_item

# Deletes 1 group by id
@api(version="2.0")
def delete(self, group_id):
if not group_id:
error = "Group ID undefined."
Expand All @@ -42,13 +45,16 @@ def delete(self, group_id):
self.delete_request(url)
logger.info('Deleted single group (ID: {0})'.format(group_id))

# Create a 'local' Tableau group
@api(version="2.0")
def create(self, group_item):
url = self.baseurl
create_req = RequestFactory.Group.create_req(group_item)
server_response = self.post_request(url, create_req)
return GroupItem.from_response(server_response.content)[0]

# Removes 1 user from 1 group
@api(version="2.0")
def remove_user(self, group_item, user_id):
self._remove_user(group_item, user_id)
try:
Expand All @@ -63,6 +69,7 @@ def remove_user(self, group_item, user_id):
logger.info('Removed user (id: {0}) from group (ID: {1})'.format(user_id, group_item.id))

# Adds 1 user to 1 group
@api(version="2.0")
def add_user(self, group_item, user_id):
new_user = self._add_user(group_item, user_id)
try:
Expand Down
6 changes: 5 additions & 1 deletion tableauserverclient/server/endpoint/projects_endpoint.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .endpoint import Endpoint
from .endpoint import Endpoint, api
from .exceptions import MissingRequiredFieldError
from .. import RequestFactory, ProjectItem, PaginationItem
import logging
Expand All @@ -12,6 +12,7 @@ class Projects(Endpoint):
def baseurl(self):
return "{0}/sites/{1}/projects".format(self.parent_srv.baseurl, self.parent_srv.site_id)

@api(version="2.0")
def get(self, req_options=None):
logger.info('Querying all projects on site')
url = self.baseurl
Expand All @@ -20,6 +21,7 @@ def get(self, req_options=None):
all_project_items = ProjectItem.from_response(server_response.content)
return all_project_items, pagination_item

@api(version="2.0")
def delete(self, project_id):
if not project_id:
error = "Project ID undefined."
Expand All @@ -28,6 +30,7 @@ def delete(self, project_id):
self.delete_request(url)
logger.info('Deleted single project (ID: {0})'.format(project_id))

@api(version="2.0")
def update(self, project_item):
if not project_item.id:
error = "Project item missing ID."
Expand All @@ -40,6 +43,7 @@ def update(self, project_item):
updated_project = copy.copy(project_item)
return updated_project._parse_common_tags(server_response.content)

@api(version="2.0")
def create(self, project_item):
url = self.baseurl
create_req = RequestFactory.Project.create_req(project_item)
Expand Down
6 changes: 5 additions & 1 deletion tableauserverclient/server/endpoint/schedules_endpoint.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .endpoint import Endpoint
from .endpoint import Endpoint, api
from .exceptions import MissingRequiredFieldError
from .. import RequestFactory, PaginationItem, ScheduleItem
import logging
Expand All @@ -12,6 +12,7 @@ class Schedules(Endpoint):
def baseurl(self):
return "{0}/schedules".format(self.parent_srv.baseurl)

@api(version="2.3")
def get(self, req_options=None):
logger.info("Querying all schedules")
url = self.baseurl
Expand All @@ -20,6 +21,7 @@ def get(self, req_options=None):
all_schedule_items = ScheduleItem.from_response(server_response.content)
return all_schedule_items, pagination_item

@api(version="2.3")
def delete(self, schedule_id):
if not schedule_id:
error = "Schedule ID undefined"
Expand All @@ -28,6 +30,7 @@ def delete(self, schedule_id):
self.delete_request(url)
logger.info("Deleted single schedule (ID: {0})".format(schedule_id))

@api(version="2.3")
def update(self, schedule_item):
if not schedule_item.id:
error = "Schedule item missing ID."
Expand All @@ -43,6 +46,7 @@ def update(self, schedule_item):
updated_schedule = copy.copy(schedule_item)
return updated_schedule._parse_common_tags(server_response.content)

@api(version="2.3")
def create(self, schedule_item):
if schedule_item.interval_item is None:
error = "Interval item must be defined."
Expand Down
3 changes: 2 additions & 1 deletion tableauserverclient/server/endpoint/server_info_endpoint.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .endpoint import Endpoint
from .endpoint import Endpoint, api
from .exceptions import ServerResponseError, ServerInfoEndpointNotFoundError
from ...models import ServerInfoItem
import logging
Expand All @@ -11,6 +11,7 @@ class ServerInfo(Endpoint):
def baseurl(self):
return "{0}/serverInfo".format(self.parent_srv.baseurl)

@api(version="2.4")
def get(self):
""" Retrieve the server info for the server. This is an unauthenticated call """
try:
Expand Down
7 changes: 6 additions & 1 deletion tableauserverclient/server/endpoint/sites_endpoint.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .endpoint import Endpoint
from .endpoint import Endpoint, api
from .exceptions import MissingRequiredFieldError
from .. import RequestFactory, SiteItem, PaginationItem
import logging
Expand All @@ -13,6 +13,7 @@ def baseurl(self):
return "{0}/sites".format(self.parent_srv.baseurl)

# Gets all sites
@api(version="2.0")
def get(self, req_options=None):
logger.info('Querying all sites on site')
url = self.baseurl
Expand All @@ -22,6 +23,7 @@ def get(self, req_options=None):
return all_site_items, pagination_item

# Gets 1 site by id
@api(version="2.0")
def get_by_id(self, site_id):
if not site_id:
error = "Site ID undefined."
Expand All @@ -32,6 +34,7 @@ def get_by_id(self, site_id):
return SiteItem.from_response(server_response.content)[0]

# Update site
@api(version="2.0")
def update(self, site_item):
if not site_item.id:
error = "Site item missing ID."
Expand All @@ -49,6 +52,7 @@ def update(self, site_item):
return update_site._parse_common_tags(server_response.content)

# Delete 1 site object
@api(version="2.0")
def delete(self, site_id):
if not site_id:
error = "Site ID undefined."
Expand All @@ -63,6 +67,7 @@ def delete(self, site_id):
logger.info('Deleted single site (ID: {0}) and signed out'.format(site_id))

# Create new site
@api(version="2.0")
def create(self, site_item):
if site_item.admin_mode:
if site_item.admin_mode == SiteItem.AdminMode.ContentOnly and site_item.user_quota:
Expand Down
8 changes: 7 additions & 1 deletion tableauserverclient/server/endpoint/users_endpoint.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .endpoint import Endpoint
from .endpoint import Endpoint, api
from .exceptions import MissingRequiredFieldError
from .. import RequestFactory, UserItem, WorkbookItem, PaginationItem
import logging
Expand All @@ -13,6 +13,7 @@ def baseurl(self):
return "{0}/sites/{1}/users".format(self.parent_srv.baseurl, self.parent_srv.site_id)

# Gets all users
@api(version="2.0")
def get(self, req_options=None):
logger.info('Querying all users on site')
url = self.baseurl
Expand All @@ -22,6 +23,7 @@ def get(self, req_options=None):
return all_user_items, pagination_item

# Gets 1 user by id
@api(version="2.0")
def get_by_id(self, user_id):
if not user_id:
error = "User ID undefined."
Expand All @@ -32,6 +34,7 @@ def get_by_id(self, user_id):
return UserItem.from_response(server_response.content).pop()

# Update user
@api(version="2.0")
def update(self, user_item, password=None):
if not user_item.id:
error = "User item missing ID."
Expand All @@ -45,6 +48,7 @@ def update(self, user_item, password=None):
return updated_item._parse_common_tags(server_response.content)

# Delete 1 user by id
@api(version="2.0")
def remove(self, user_id):
if not user_id:
error = "User ID undefined."
Expand All @@ -54,6 +58,7 @@ def remove(self, user_id):
logger.info('Removed single user (ID: {0})'.format(user_id))

# Add new user to site
@api(version="2.0")
def add(self, user_item):
url = self.baseurl
add_req = RequestFactory.User.add_req(user_item)
Expand All @@ -63,6 +68,7 @@ def add(self, user_item):
return new_user

# Get workbooks for user
@api(version="2.0")
def populate_workbooks(self, user_item, req_options=None):
if not user_item.id:
error = "User item missing ID."
Expand Down
4 changes: 3 additions & 1 deletion tableauserverclient/server/endpoint/views_endpoint.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from .endpoint import Endpoint
from .endpoint import Endpoint, api
from .exceptions import MissingRequiredFieldError
from .. import ViewItem, PaginationItem
import logging
Expand All @@ -11,6 +11,7 @@ class Views(Endpoint):
def baseurl(self):
return "{0}/sites/{1}".format(self.parent_srv.baseurl, self.parent_srv.site_id)

@api(version="2.2")
def get(self, req_options=None):
logger.info('Querying all views on site')
url = "{0}/views".format(self.baseurl)
Expand All @@ -19,6 +20,7 @@ def get(self, req_options=None):
all_view_items = ViewItem.from_response(server_response.content)
return all_view_items, pagination_item

@api(version="2.0")
def populate_preview_image(self, view_item):
if not view_item.id or not view_item.workbook_id:
error = "View item missing ID or workbook ID."
Expand Down
Loading