|
@@ -21,6 +21,7 @@ class c11_api:
|
|
reports = []
|
|
reports = []
|
|
folders = []
|
|
folders = []
|
|
jobs = []
|
|
jobs = []
|
|
|
|
+ server_version = "202004"
|
|
|
|
|
|
def __init__(self, cfg: config.Config):
|
|
def __init__(self, cfg: config.Config):
|
|
self.cfg = cfg
|
|
self.cfg = cfg
|
|
@@ -78,8 +79,17 @@ class c11_api:
|
|
|
|
|
|
self.caf = r.json()["cafContextId"]
|
|
self.caf = r.json()["cafContextId"]
|
|
self.cam = self.generate_token(r.cookies["usersessionid"])
|
|
self.cam = self.generate_token(r.cookies["usersessionid"])
|
|
|
|
+
|
|
|
|
+ self.server_version = self.get_server_version()
|
|
return self
|
|
return self
|
|
|
|
|
|
|
|
+ def get_server_version(self):
|
|
|
|
+ r = self.session.get(self.webservice + "pat/rsstartupblock_3.js")
|
|
|
|
+ res = re.search(r"\=\"(\d{6})\";", r.text)
|
|
|
|
+ if res:
|
|
|
|
+ return res.group(1)
|
|
|
|
+ return "202004"
|
|
|
|
+
|
|
def get_folders(self):
|
|
def get_folders(self):
|
|
if len(self.folders) == 0:
|
|
if len(self.folders) == 0:
|
|
self.folders.append({"id": "_dot_public_folders", "name": "Team Content"})
|
|
self.folders.append({"id": "_dot_public_folders", "name": "Team Content"})
|
|
@@ -150,9 +160,7 @@ class c11_api:
|
|
report["parameters"] = {}
|
|
report["parameters"] = {}
|
|
params = [p for p in f["parameters"] if len(p["value"]) > 0]
|
|
params = [p for p in f["parameters"] if len(p["value"]) > 0]
|
|
for p in params:
|
|
for p in params:
|
|
- report["parameters"][p["name"]] = dict(
|
|
|
|
- [(v["use"], v["display"]) for v in p["value"]]
|
|
|
|
- )
|
|
|
|
|
|
+ report["parameters"][p["name"]] = dict([(v["use"], v["display"]) for v in p["value"]])
|
|
# report["details"] = self.get_report_details(report["id"])
|
|
# report["details"] = self.get_report_details(report["id"])
|
|
# print(json.dumps(f, indent=2))
|
|
# print(json.dumps(f, indent=2))
|
|
self.reports.append(report)
|
|
self.reports.append(report)
|
|
@@ -268,7 +276,7 @@ class c11_api:
|
|
"X-XSRF-TOKEN": self.headers["X-XSRF-TOKEN"],
|
|
"X-XSRF-TOKEN": self.headers["X-XSRF-TOKEN"],
|
|
"X-RsCMStoreID": report["id"],
|
|
"X-RsCMStoreID": report["id"],
|
|
"X-UseRsConsumerMode": "true",
|
|
"X-UseRsConsumerMode": "true",
|
|
- "SOAPAction": "http://www.ibm.com/xmlns/prod/cognos/reportService/202004/",
|
|
|
|
|
|
+ "SOAPAction": f"http://www.ibm.com/xmlns/prod/cognos/reportService/{self.server_version}/",
|
|
}
|
|
}
|
|
soap = self.templates["get_report"].render(
|
|
soap = self.templates["get_report"].render(
|
|
{
|
|
{
|
|
@@ -282,9 +290,7 @@ class c11_api:
|
|
}
|
|
}
|
|
)
|
|
)
|
|
|
|
|
|
- r = self.session.post(
|
|
|
|
- self.webservice + "v1/reports", data=soap, headers=headers
|
|
|
|
- )
|
|
|
|
|
|
+ r = self.session.post(self.webservice + "v1/reports", data=soap, headers=headers)
|
|
if r.status_code == 500:
|
|
if r.status_code == 500:
|
|
bs = BeautifulSoup(r.text, "xml")
|
|
bs = BeautifulSoup(r.text, "xml")
|
|
report["error"] = bs.find_all("messageString")[0].string
|
|
report["error"] = bs.find_all("messageString")[0].string
|
|
@@ -318,27 +324,14 @@ class c11_api:
|
|
|
|
|
|
for sv in bs.find_all("selectvalue"):
|
|
for sv in bs.find_all("selectvalue"):
|
|
k = sv["parameter"]
|
|
k = sv["parameter"]
|
|
- v = dict(
|
|
|
|
- [
|
|
|
|
- (opt["usevalue"], opt.get("displayvalue", ""))
|
|
|
|
- for opt in sv.find_all("selectoption")
|
|
|
|
- ]
|
|
|
|
- )
|
|
|
|
|
|
+ v = dict([(opt["usevalue"], opt.get("displayvalue", "")) for opt in sv.find_all("selectoption")])
|
|
meta["optional"][k] = v
|
|
meta["optional"][k] = v
|
|
|
|
|
|
for sv in bs.find_all("selectdate"):
|
|
for sv in bs.find_all("selectdate"):
|
|
k = sv["parameter"]
|
|
k = sv["parameter"]
|
|
- v = dict(
|
|
|
|
- [
|
|
|
|
- (opt["usevalue"], opt.get("displayvalue", ""))
|
|
|
|
- for opt in sv.find_all("selectoption")
|
|
|
|
- ]
|
|
|
|
- )
|
|
|
|
|
|
+ v = dict([(opt["usevalue"], opt.get("displayvalue", "")) for opt in sv.find_all("selectoption")])
|
|
meta["optional"][k] = v
|
|
meta["optional"][k] = v
|
|
- filename = (
|
|
|
|
- self.cfg.cognos11.config_dir
|
|
|
|
- + f"/params/{report['path']}/{report['name']}.json"
|
|
|
|
- )
|
|
|
|
|
|
+ filename = self.cfg.cognos11.config_dir + f"/params/{report['path']}/{report['name']}.json"
|
|
os.makedirs(os.path.dirname(filename), exist_ok=True)
|
|
os.makedirs(os.path.dirname(filename), exist_ok=True)
|
|
json.dump(meta, open(filename, "w"), indent=2)
|
|
json.dump(meta, open(filename, "w"), indent=2)
|
|
report["meta"] = meta
|
|
report["meta"] = meta
|
|
@@ -347,9 +340,7 @@ class c11_api:
|
|
|
|
|
|
def get_report_filename(self, report):
|
|
def get_report_filename(self, report):
|
|
path = report["path"].replace("Team Content/ReportOutput", "")
|
|
path = report["path"].replace("Team Content/ReportOutput", "")
|
|
- report[
|
|
|
|
- "filename"
|
|
|
|
- ] = f"{self.cfg.cognos11.reportoutput_dir}/{path}/{report['name']}.pdf"
|
|
|
|
|
|
+ report["filename"] = f"{self.cfg.cognos11.reportoutput_dir}/{path}/{report['name']}.pdf"
|
|
report["format"] = "PDF"
|
|
report["format"] = "PDF"
|
|
if report["name"][-5:].lower() == ".xlsx":
|
|
if report["name"][-5:].lower() == ".xlsx":
|
|
report["format"] = "spreadsheetML"
|
|
report["format"] = "spreadsheetML"
|
|
@@ -357,18 +348,14 @@ class c11_api:
|
|
|
|
|
|
report["params"] = list(re.findall(r"\[([^\]]+)\]", report["filename"]))
|
|
report["params"] = list(re.findall(r"\[([^\]]+)\]", report["filename"]))
|
|
for i, p in enumerate(report["params"]):
|
|
for i, p in enumerate(report["params"]):
|
|
- report["filename"] = report["filename"].replace(
|
|
|
|
- "[" + p + "]", "{" + str(i) + "}"
|
|
|
|
- )
|
|
|
|
|
|
+ report["filename"] = report["filename"].replace("[" + p + "]", "{" + str(i) + "}")
|
|
return report
|
|
return report
|
|
|
|
|
|
def request_unstubbed(self, report_id):
|
|
def request_unstubbed(self, report_id):
|
|
report = self.get_report(report_id)
|
|
report = self.get_report(report_id)
|
|
if "spec" not in report:
|
|
if "spec" not in report:
|
|
return ""
|
|
return ""
|
|
- payload = json.dumps(
|
|
|
|
- {"reportspec_stubbed": report["spec"], "storeid": report["id"]}
|
|
|
|
- )
|
|
|
|
|
|
+ payload = json.dumps({"reportspec_stubbed": report["spec"], "storeid": report["id"]})
|
|
|
|
|
|
headers = {
|
|
headers = {
|
|
"Content-Type": "application/json; charset=UTF-8",
|
|
"Content-Type": "application/json; charset=UTF-8",
|
|
@@ -378,9 +365,7 @@ class c11_api:
|
|
"cafContextId": self.caf,
|
|
"cafContextId": self.caf,
|
|
}
|
|
}
|
|
|
|
|
|
- r = self.session.post(
|
|
|
|
- self.webservice + "v1/reports/unstubreport", data=payload, headers=headers
|
|
|
|
- )
|
|
|
|
|
|
+ r = self.session.post(self.webservice + "v1/reports/unstubreport", data=payload, headers=headers)
|
|
if r.status_code != 200:
|
|
if r.status_code != 200:
|
|
logging.error(f"{report['path']}/{report['name']}")
|
|
logging.error(f"{report['path']}/{report['name']}")
|
|
logging.error(r.text)
|
|
logging.error(r.text)
|
|
@@ -414,7 +399,7 @@ class c11_api:
|
|
"Content-Type": "text/xml; charset=UTF-8",
|
|
"Content-Type": "text/xml; charset=UTF-8",
|
|
"X-XSRF-TOKEN": self.headers["X-XSRF-TOKEN"],
|
|
"X-XSRF-TOKEN": self.headers["X-XSRF-TOKEN"],
|
|
"X-UseRsConsumerMode": "true",
|
|
"X-UseRsConsumerMode": "true",
|
|
- "SOAPAction": "http://www.ibm.com/xmlns/prod/cognos/reportService/202004/",
|
|
|
|
|
|
+ "SOAPAction": f"http://www.ibm.com/xmlns/prod/cognos/reportService/{self.server_version}/",
|
|
}
|
|
}
|
|
if report_id is not None:
|
|
if report_id is not None:
|
|
res["X-RsCMStoreID"] = report_id
|
|
res["X-RsCMStoreID"] = report_id
|
|
@@ -439,9 +424,7 @@ class c11_api:
|
|
)
|
|
)
|
|
.encode("utf-8")
|
|
.encode("utf-8")
|
|
)
|
|
)
|
|
- r = self.session.post(
|
|
|
|
- self.webservice + "v1/reports", data=soap, headers=headers
|
|
|
|
- )
|
|
|
|
|
|
+ r = self.session.post(self.webservice + "v1/reports", data=soap, headers=headers)
|
|
|
|
|
|
bs = BeautifulSoup(r.text, "xml")
|
|
bs = BeautifulSoup(r.text, "xml")
|
|
if r.status_code == 200:
|
|
if r.status_code == 200:
|
|
@@ -461,22 +444,14 @@ class c11_api:
|
|
# self.session.get(self.webservice + 'v1/reports/startupconfig?keys=supportedContentLocales,supportedCurrencies,
|
|
# self.session.get(self.webservice + 'v1/reports/startupconfig?keys=supportedContentLocales,supportedCurrencies,
|
|
# supportedFonts,metadataInformationURI,glossaryURI&locale=de')
|
|
# supportedFonts,metadataInformationURI,glossaryURI&locale=de')
|
|
headers = self.get_report_headers()
|
|
headers = self.get_report_headers()
|
|
- soap = (
|
|
|
|
- self.templates["get_package"]
|
|
|
|
- .render({"caf": self.caf, "cam": self.cam})
|
|
|
|
- .encode("utf-8")
|
|
|
|
- )
|
|
|
|
- r = self.session.post(
|
|
|
|
- self.webservice + "v1/reports", data=soap, headers=headers
|
|
|
|
- )
|
|
|
|
|
|
+ soap = self.templates["get_package"].render({"caf": self.caf, "cam": self.cam}).encode("utf-8")
|
|
|
|
+ r = self.session.post(self.webservice + "v1/reports", data=soap, headers=headers)
|
|
open("package.xml", "wb").write(r.content)
|
|
open("package.xml", "wb").write(r.content)
|
|
|
|
|
|
search_path = self.request_search_path(folder_id)
|
|
search_path = self.request_search_path(folder_id)
|
|
report_name = os.path.basename(fullpath)
|
|
report_name = os.path.basename(fullpath)
|
|
unstubbed = open(fullpath, "rb").read()
|
|
unstubbed = open(fullpath, "rb").read()
|
|
- headers[
|
|
|
|
- "SOAPAction"
|
|
|
|
- ] = "http://www.ibm.com/xmlns/prod/cognos/reportService/202004/.session"
|
|
|
|
|
|
+ headers["SOAPAction"] = f"http://www.ibm.com/xmlns/prod/cognos/reportService/{self.server_version}/.session"
|
|
headers["Referer"] = "http://localhost:9300/bi/pat/rsapp.htm"
|
|
headers["Referer"] = "http://localhost:9300/bi/pat/rsapp.htm"
|
|
# headers['caf'] = self.caf
|
|
# headers['caf'] = self.caf
|
|
|
|
|
|
@@ -493,9 +468,7 @@ class c11_api:
|
|
)
|
|
)
|
|
.encode("utf-8")
|
|
.encode("utf-8")
|
|
)
|
|
)
|
|
- r = self.session.post(
|
|
|
|
- self.webservice + "v1/reports", data=soap, headers=headers
|
|
|
|
- )
|
|
|
|
|
|
+ r = self.session.post(self.webservice + "v1/reports", data=soap, headers=headers)
|
|
open("request_create.xml", "wb").write(r.request.body)
|
|
open("request_create.xml", "wb").write(r.request.body)
|
|
print(r.status_code)
|
|
print(r.status_code)
|
|
print(r.text)
|
|
print(r.text)
|
|
@@ -515,9 +488,7 @@ class c11_api:
|
|
"unstubbed": unstubbed,
|
|
"unstubbed": unstubbed,
|
|
}
|
|
}
|
|
) # .encode("utf-8")
|
|
) # .encode("utf-8")
|
|
- r = self.session.post(
|
|
|
|
- self.webservice + "v1/reports", data=soap, headers=headers
|
|
|
|
- )
|
|
|
|
|
|
+ r = self.session.post(self.webservice + "v1/reports", data=soap, headers=headers)
|
|
# open('request_update.xml', 'wb').write(r.request.body)
|
|
# open('request_update.xml', 'wb').write(r.request.body)
|
|
print(r.status_code)
|
|
print(r.status_code)
|
|
print(r.text)
|
|
print(r.text)
|
|
@@ -537,9 +508,7 @@ class c11_api:
|
|
return folder_id
|
|
return folder_id
|
|
|
|
|
|
def request_search_path(self, id):
|
|
def request_search_path(self, id):
|
|
- res = self.session.get(
|
|
|
|
- f"{self.webservice}v1/objects/{id}?fields=searchPath", headers=self.headers
|
|
|
|
- )
|
|
|
|
|
|
+ res = self.session.get(f"{self.webservice}v1/objects/{id}?fields=searchPath", headers=self.headers)
|
|
return res.json()["data"][0]["searchPath"]
|
|
return res.json()["data"][0]["searchPath"]
|
|
|
|
|
|
|
|
|