c11_export.py 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. from pathlib import Path
  2. from cognos11.c11_api import c11_api
  3. import config
  4. import json
  5. import logging
  6. import os
  7. from datetime import datetime
  8. class c11_export:
  9. api: c11_api
  10. cfg: config.Config = None
  11. def __init__(self, cfg=None, api=None):
  12. self.cfg = cfg
  13. if cfg is None:
  14. self.cfg = config.Config()
  15. self.api = api
  16. if api is None:
  17. self.api = c11_api(cfg).login()
  18. now = datetime.now().strftime("%Y%m%d_%H%M%S")
  19. prot_file = f"{self.cfg.cognos11.logs_dir}/error_{now}.log"
  20. os.makedirs(self.cfg.cognos11.logs_dir, exist_ok=True)
  21. logging.basicConfig(
  22. filename=prot_file,
  23. filemode="w",
  24. encoding="utf-8",
  25. level=logging.DEBUG,
  26. force=True,
  27. )
  28. def get_folder(self, folder, format="PDF"):
  29. if folder == "":
  30. folder = "Team Content" if format == "XML" else "Team Content/ReportOutput"
  31. elif not folder.startswith("Team Content"):
  32. folder = "Team Content/ReportOutput/" + folder
  33. return folder
  34. def export_folder(self, folder="", format="PDF") -> None:
  35. folder = self.get_folder(folder, format)
  36. reports = self.api.get_reports_in_folder(folder, True)
  37. for r in reports:
  38. print(r["name"])
  39. if format == "PDF":
  40. self.export_pdf(r["id"], folder)
  41. if format == "XML":
  42. self.export_unstubbed(r["id"])
  43. def export_unstubbed(self, report_id):
  44. report = self.api.get_report(report_id)
  45. unstubbed_report = self.api.request_unstubbed(report_id)
  46. if unstubbed_report:
  47. filename = (
  48. f"{self.cfg.cognos11.specs_dir}/{report['path']}/{report['name']}.xml"
  49. )
  50. os.makedirs(os.path.dirname(filename), exist_ok=True)
  51. with open(filename, "w") as f:
  52. f.write(unstubbed_report)
  53. def export_pdf(self, report_id, folder=None):
  54. report = self.api.get_report(report_id)
  55. if report["type"] == "shortcut":
  56. report_link = report
  57. report = self.api.get_report(report["target_id"]).copy()
  58. for k in ("name", "description", "path", "type", "filename"):
  59. report[k] = report_link[k]
  60. json.dump(report, open("dump.json", "w"), indent=2)
  61. if "meta" not in report:
  62. logging.warning(report["name"] + " is not accessible!")
  63. return False
  64. params = {}
  65. if len(report["meta"]["required"]) > 0:
  66. if set(report["meta"]["required"].keys()) != {"p_Von", "p_Bis"}:
  67. return False
  68. params["p_Von"] = {"2022-10-12": "12.10.2022"}
  69. params["p_Bis"] = {"2022-10-12": "12.10.2022"}
  70. # params["p_Zeitraum"] = {"Einzelne Monate": "Einzelne Monate"}
  71. for k, v in report["meta"]["optional"].items():
  72. if k in ["p_Zeit", "p_Auswahl_Monate", "p_12_Monate"]:
  73. for k1, v1 in reversed(v.items()):
  74. if v1 != "Invalid Dates":
  75. params[k] = {k1: v1}
  76. continue # use last element only
  77. if len(report["params"]) == 0:
  78. filename = report["filename"]
  79. self.request_and_save_file(report["id"], params, filename, report["format"])
  80. return True
  81. if len(report["params"]) == 1:
  82. filename = report["filename"].format("_1")
  83. self.request_and_save_file(report["id"], params, filename, report["format"])
  84. key1 = report["params"][0]
  85. for k1, v1 in report["meta"]["optional"][key1].items():
  86. filename = report["filename"].format(v1)
  87. params[key1] = {k1: v1}
  88. self.request_and_save_file(
  89. report["id"], params, filename, report["format"]
  90. )
  91. return True
  92. if len(report["params"]) == 2:
  93. key1, key2 = report["params"]
  94. for k1, v1 in report["meta"]["optional"][key1].items():
  95. for k2, v2 in report["meta"]["optional"][key2].items():
  96. filename = report["filename"].format(v1, v2)
  97. params[key1] = {k1: v1}
  98. params[key2] = {k2: v2}
  99. self.request_and_save_file(
  100. report["id"], params, filename, report["format"]
  101. )
  102. return True
  103. def request_and_save_file(self, report_id, params, filename, format="PDF"):
  104. logging.debug(filename)
  105. logging.debug(params)
  106. status_code, content = self.api.request_file(report_id, params, format)
  107. if status_code == 200:
  108. os.makedirs(os.path.dirname(filename), exist_ok=True)
  109. with open(filename, "wb") as f:
  110. f.write(content)
  111. else:
  112. logging.warning(content)
  113. def export_errors(self):
  114. reports = self.api.get_reports_in_folder(
  115. "Team Content", recursive=True, specs=True
  116. )
  117. errors = [r for r in reports if "error" in r]
  118. filename = self.cfg.cognos11.logs_dir + "/c11_report_errors.json"
  119. json.dump(errors, open(filename, "w"), indent=2)
  120. def mail_template(self, folder: str):
  121. current_dir = Path(self.cfg.cognos11.reportoutput_dir + "\\" + folder)
  122. subfolders = set(
  123. [f.name for f in current_dir.glob("*") if f.is_dir()]
  124. ).difference([".", "..", "leer"])
  125. folder2 = folder + "\\" if folder != "" else ""
  126. export_files = [
  127. f"{folder2}{f.name};"
  128. for f in current_dir.glob("*.*")
  129. if f.suffix in [".pdf", ".xls"]
  130. ]
  131. if len(export_files) > 0:
  132. folder2 = folder.replace("\\", "_") if folder != "" else "Versand"
  133. template_file = Path(
  134. self.cfg.cognos11.config_dir + "\\" + folder2 + ".template.csv"
  135. )
  136. print(template_file)
  137. with template_file.open("w") as fwh:
  138. fwh.write("Report;Empfaenger\n")
  139. fwh.write("\n".join(export_files))
  140. for f in subfolders:
  141. subfolder = folder + "\\" + f if folder != "" else f
  142. self.mail_template(subfolder)
  143. if __name__ == "__main__":
  144. api = c11_api()
  145. api.login()
  146. pdf = c11_export(None, api)
  147. # pdf.export_folder('Team Content/Verkauf/1. Gesamtverkauf', 'PDF')
  148. # pdf.export_folder('Team Content/Aftersales/1. Service')
  149. pdf.export_errors()