c11_export.py 6.8 KB

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