Passed
Push — master ( b23eaf...087ae8 )
by Daniel
01:44
created

TableauServerCommunicator.is_publishing_possible()   A

Complexity

Conditions 3

Size

Total Lines 20
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 19
dl 0
loc 20
rs 9.45
c 0
b 0
f 0
cc 3
nop 4
1
# package tto ensure communication with Tableau Server
2
import tableauserverclient as tsc
3
4
from pathlib import Path
5
6
7
class TableauServerCommunicator():
8
    req_opts = tsc.RequestOptions(pagesize=1000)
9
    tableau_server = None
10
11
    def connect_to_tableau_server(self, local_logger, timmer, connection_details):
12
        timmer.start()
13
        local_logger.debug('I am about to connect to the Tableau Server with URL: '
14
                           + connection_details['Tableau Server'] + ' and the Site '
15
                           + connection_details['Tableau Site'] + ' using the Username '
16
                           + connection_details['Username'])
17
        self.tableau_server = tsc.Server(server_address     = connection_details['Tableau Server'],
18
                                         use_server_version = True)
19
        tableau_auth = tsc.TableauAuth(username               = connection_details['Username'],
20
                                       password               = connection_details['Password'],
21
                                       site_id                = connection_details['Tableau Site'],
22
                                       user_id_to_impersonate = None)
23
        self.tableau_server.auth.sign_in(tableau_auth)
24
        local_logger.debug('Connection to the Tableau Server has been established successfully!')
25
        timmer.stop()
26
27
    def disconnect_from_tableau_server(self, local_logger, timmer):
28
        timmer.start()
29
        self.tableau_server.auth.sign_out()
30
        local_logger.debug('The connection to the Tableau Server has been terminated!')
31
        timmer.stop()
32
33
    @staticmethod
34
    def is_publishing_possible(self, local_logger, relevant_project_name, relevant_project_ids):
35
        publish_possible = False
36
        int_found_projects = len(relevant_project_ids)
37
        if int_found_projects == 0:
38
            local_logger.error('No project with provided name "' + relevant_project_name
39
                               + '" has been found')
40
            local_logger.debug('No publishing action will take place!')
41
            local_logger.debug('Check your input parameter values for accuracy and try again!')
42
        elif int_found_projects > 1:
43
            local_logger.error(f'There are {str(int_found_projects)} projects with provided name "'
44
                               + relevant_project_name + ' but a unique identifier is expected')
45
            local_logger.debug('No publishing action will take place!')
46
            local_logger.info('Check your input parameter values for accuracy and try again!')
47
        else:
48
            publish_possible = True
49
            local_logger.info(f'A single project identifier was found "' + relevant_project_ids[0]
50
                              + '" so I will proceed with publishing provided file there')
51
            local_logger.info('Stay tuned for the confirmation')
52
        return publish_possible
53
54
    def load_tableau_project_ids(self, local_logger, timmer, relevant_projects_to_filter,
55
                                 str_filtering_type):
56
        timmer.start()
57
        project_items, pagination_item = self.tableau_server.projects.get(req_options=self.req_opts)
58
        local_logger.info('Reading list of all projects available has been completed')
59
        local_logger.info(str(len(project_items)) + ' projects were found')
60
        timmer.stop()
61
        timmer.start()
62
        dictionary_project_ids = []
63
        project_counter = 0
64
        for project_current in project_items:
65
            relevant = 0
66
            if str_filtering_type == 'JustOnesMentioned':
67
                if project_current.name.replace(chr(8211), chr(45)) in relevant_projects_to_filter:
68
                    relevant = 1
69
            elif str_filtering_type == 'OnesMentionedMarked':
70
                relevant = 2
71
            elif str_filtering_type == 'All':
72
                relevant = 99
73
            if relevant >= 1:
74
                dictionary_project_ids.append(project_counter)
75
                dictionary_project_ids[project_counter] = project_current.id
76
                project_counter = project_counter + 1
77
        local_logger.info('Retaining the projects according to filtering type provided ("'
78
                          + str_filtering_type + '") has been completed')
79
        local_logger.info(str(len(dictionary_project_ids)) + ' projects were retained')
80
        timmer.stop()
81
        return dictionary_project_ids
82
83
    def publish_data_source_to_tableau_server(self, local_logger, timmer, publish_details):
84
        timmer.start()
85
        local_logger.info('About to start publishing')
86
        data_source_name = Path(publish_details['Tableau Extract File']).name\
87
                               .replace('.hyper', '') + " Extract"
88
        project_data_source = tsc.DatasourceItem(project_id = publish_details['Project ID'],
89
                                                 name       = data_source_name)
90
        self.tableau_server.datasources.publish(project_data_source,
91
                                                publish_details['Tableau Extract File'],
92
                                                publish_details['Publishing Mode'],
93
                                                )
94
        local_logger.info('Publishing has finished with success!')
95
        timmer.stop()
96