Class: TableauApi::Resources::Workbooks

Inherits:
Base
  • Object
show all
Defined in:
lib/tableau_api/resources/workbooks.rb

Constant Summary collapse

CAPABILITIES =

rubocop:enable Metrics/ParameterLists

%w[
  AddComment ChangeHierarchy ChangePermissions CreateRefreshMetrics Delete ExportData ExportImage
  ExportXml Filter Read RunExplainData ShareView ViewComments ViewUnderlyingData WebAuthoring Write
].freeze
CAPABILITY_MODES =
%w[ALLOW DENY].freeze

Instance Method Summary collapse

Methods inherited from Base

#initialize

Constructor Details

This class inherits a constructor from TableauApi::Resources::Base

Instance Method Details

#add_permissions(workbook_id:, user_id: nil, group_id: nil, capabilities:) ⇒ Object

capabilities is a hash of symbol keys to booleans { Read: true, ChangePermissions: false }



86
87
88
89
90
91
92
93
# File 'lib/tableau_api/resources/workbooks.rb', line 86

def add_permissions(workbook_id:, user_id: nil, group_id: nil, capabilities:)
  validate_user_group_exclusivity(user_id, group_id)

  request = permissions_request(workbook_id, user_id, group_id, capabilities)
  res = @client.connection.api_put("sites/#{@client.auth.site_id}/workbooks/#{workbook_id}/permissions", body: request)

  res.code == 200
end

#delete_permissions(workbook_id:, user_id: nil, group_id: nil, capability:, capability_mode:) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
# File 'lib/tableau_api/resources/workbooks.rb', line 95

def delete_permissions(workbook_id:, user_id: nil, group_id: nil, capability:, capability_mode:)
  validate_user_group_exclusivity(user_id, group_id)
  raise 'invalid capability' unless CAPABILITIES.include? capability.to_s
  raise 'invalid mode' unless CAPABILITY_MODES.include? capability_mode.to_s

  subpath = user_id ? "users/#{user_id}" : "groups/#{group_id}"
  subpath += "/#{capability}/#{capability_mode.capitalize}"
  res = @client.connection.api_delete("sites/#{@client.auth.site_id}/workbooks/#{workbook_id}/permissions/#{subpath}")

  res.code == 204
end

#find(workbook_id) ⇒ Object



130
131
132
133
# File 'lib/tableau_api/resources/workbooks.rb', line 130

def find(workbook_id)
  res = @client.connection.api_get("sites/#{@client.auth.site_id}/workbooks/#{workbook_id}")
  res['tsResponse']['workbook'] if res.code == 200
end

#listObject



140
141
142
143
# File 'lib/tableau_api/resources/workbooks.rb', line 140

def list
  url = "sites/#{@client.auth.site_id}/users/#{@client.auth.user_id}/workbooks"
  @client.connection.api_get_collection(url, 'workbooks.workbook')
end

#permissions(workbook_id:) ⇒ Object

Raises:



58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/tableau_api/resources/workbooks.rb', line 58

def permissions(workbook_id:)
  res = @client.connection.api_get("sites/#{@client.auth.site_id}/workbooks/#{workbook_id}/permissions")

  raise TableauError, res if res.code != 200
  permissions = HTTParty::Parser.new(res.body, :xml).parse['tsResponse']['permissions']['granteeCapabilities']
  return [] if permissions.nil?

  permissions = [permissions] unless permissions.is_a? Array
  permissions.map do |p|
    grantee_type = p['group'].nil? ? 'user' : 'group'

    capabilities = {}
    capabilities_list = p['capabilities']['capability']
    capabilities_list = [capabilities_list] unless capabilities_list.is_a? Array

    capabilities_list.each do |c|
      capabilities[c['name'].to_sym] = c['mode'] == 'Allow'
    end

    {
      grantee_type: grantee_type,
      grantee_id: p[grantee_type]['id'],
      capabilities: capabilities
    }
  end
end

#preview_image(workbook_id:) ⇒ Object



125
126
127
128
# File 'lib/tableau_api/resources/workbooks.rb', line 125

def preview_image(workbook_id:)
  res = @client.connection.api_get("sites/#{@client.auth.site_id}/workbooks/#{workbook_id}/previewImage")
  res.body if res.code == 200
end

#publish(name:, project_id:, file:, overwrite: false, show_tabs: false, connection_username: nil, connection_password: nil, connection_embed: false) ⇒ Object

rubocop:disable Metrics/ParameterLists

Raises:



20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/tableau_api/resources/workbooks.rb', line 20

def publish(name:, project_id:, file:, overwrite: false, show_tabs: false, connection_username: nil, connection_password: nil, connection_embed: false)
  request = Builder::XmlMarkup.new.tsRequest do |ts|
    ts.workbook(name: name, showTabs: show_tabs) do |wb|
      wb.project(id: project_id)
      wb.connectionCredentials(name: connection_username, password: connection_password, embed: connection_embed) if connection_username
    end
  end

  query = URI.encode_www_form([['overwrite', overwrite]])
  path = "sites/#{@client.auth.site_id}/workbooks?#{query}"

  parts = {
    'request_payload' => request,
    'tableau_workbook' => UploadIO.new(file, 'application/octet-stream')
  }

  headers = {
    parts: {
      'request_payload' => { 'Content-Type' => 'text/xml' },
      'tableau_workbook' => { 'Content-Type' => 'application/octet-string' }
    }
  }

  res = @client.connection.api_post_multipart(path, parts, headers)

  return HTTParty::Parser.new(res.body, :xml).parse['tsResponse']['workbook'] if res.code == '201'

  raise TableauError, res
end

#refresh(workbook_id:) ⇒ Object



119
120
121
122
123
# File 'lib/tableau_api/resources/workbooks.rb', line 119

def refresh(workbook_id:)
  request = Builder::XmlMarkup.new.tsRequest
  res = @client.connection.api_post("sites/#{@client.auth.site_id}/workbooks/#{workbook_id}/refresh", body: request)
  res.code == 202
end

#update(workbook_id:, owner_user_id:) ⇒ Object



107
108
109
110
111
112
113
114
115
116
117
# File 'lib/tableau_api/resources/workbooks.rb', line 107

def update(workbook_id:, owner_user_id:)
  request = Builder::XmlMarkup.new.tsRequest do |ts|
    ts.workbook(id: workbook_id) do |w|
      w.owner(id: owner_user_id)
    end
  end

  res = @client.connection.api_put("sites/#{@client.auth.site_id}/workbooks/#{workbook_id}", body: request)

  res.code == 200
end

#version(file) ⇒ Object



6
7
8
9
10
11
12
13
14
15
16
17
# File 'lib/tableau_api/resources/workbooks.rb', line 6

def version(file)
  version = nil

  if File.exist?(file) && File.extname(file) == '.twbx'
    Zip::File.open(file) do |zip_file|
      entry = zip_file.glob('*.twb').first
      version = HTTParty::Parser.new(entry.get_input_stream.read, :xml).parse['workbook']['version']
    end
  end

  version
end

#views(workbook_id) ⇒ Object



135
136
137
138
# File 'lib/tableau_api/resources/workbooks.rb', line 135

def views(workbook_id)
  url = "sites/#{@client.auth.site_id}/workbooks/#{workbook_id}/views"
  @client.connection.api_get_collection(url, 'views.view')
end