def test_getTableauData(httpserver, mocker: MockerFixture): ts = TS() ts.session = requests.Session() httpserver.serve_content(tableauDataResponse) ts.host = httpserver.url + "/" ts.tableauData = {"vizql_root": "", "sessionid": "", "sheetId": ""} result = api.getTableauData(ts) assert result == tableauDataResponse
def loads(self, url, params={}): api.setSession(self) r = api.getTableauViz(self, self.session, url, params) soup = BeautifulSoup(r, "html.parser") tableauPlaceHolder = soup.find("div", {"class": "tableauPlaceholder"}) if tableauPlaceHolder is not None: params = dict([(t.get("name", ""), unquote(t.get("value", ""))) for t in tableauPlaceHolder.findAll("param")]) if ("host_url" not in params) or ("site_root" not in params) or ( "name" not in params): self.logger.info("no params found in placeholder") return if "ticket" in params: # get xsrf cookie sessionUrl = f'{params["host_url"]}trusted/{params["ticket"]}{params["site_root"]}/views/{params["name"]}' api.getSessionUrl(self, self.session, sessionUrl) url = f'{params["host_url"][:-1]}{params["site_root"]}/views/{params["name"]}' r = api.getTableauVizForSession(self, self.session, url) soup = BeautifulSoup(r, "html.parser") self.tableauData = json.loads( soup.find("textarea", { "id": "tsConfigContainer" }).text) uri = urlparse(url) self.host = "{uri.scheme}://{uri.netloc}".format(uri=uri) r = api.getTableauData(self) try: dataReg = re.search(r"\d+;({.*})\d+;({.*})", r, re.MULTILINE) self.info = json.loads(dataReg.group(1)) self.data = json.loads(dataReg.group(2)) if "presModelMap" in self.data["secondaryInfo"]: presModelMap = self.data["secondaryInfo"]["presModelMap"] self.dataSegments = presModelMap["dataDictionary"][ "presModelHolder"]["genDataDictionaryPresModel"][ "dataSegments"] self.dashboard = self.info["sheetName"] except (AttributeError): raise TableauException(message=r)
def loads(self, url): api.setSession(self) r = api.getTableauViz(self.session, url) soup = BeautifulSoup(r, "html.parser") tableauPlaceHolder = soup.find("div", {"class": "tableauPlaceholder"}) if tableauPlaceHolder is not None: params = dict([(t.get("name", ""), unquote(t.get("value", ""))) for t in tableauPlaceHolder.findAll("param")]) if ("host_url" not in params) or ("site_root" not in params) or ( "name" not in params): self.logger.info("no params found in placeholder") return if "ticket" in params: # get xsrf cookie sessionUrl = f'{params["host_url"]}trusted/{params["ticket"]}{params["site_root"]}/views/{params["name"]}' api.getSessionUrl(self.session, sessionUrl) url = f'{params["host_url"][:-1]}{params["site_root"]}/views/{params["name"]}' r = api.getTableauVizForSession(self.session, url) soup = BeautifulSoup(r, "html.parser") self.tableauData = json.loads( soup.find("textarea", { "id": "tsConfigContainer" }).text) uri = urlparse(url) self.host = "{uri.scheme}://{uri.netloc}/".format(uri=uri) r = api.getTableauData(self) dataReg = re.search(r"\d+;({.*})\d+;({.*})", r, re.MULTILINE) self.info = json.loads(dataReg.group(1)) self.data = json.loads(dataReg.group(2)) self.dashboard = self.info["sheetName"]