瀏覽代碼

request_plan before execution

gc-server3 1 年之前
父節點
當前提交
ebfe0b535b
共有 4 個文件被更改,包括 79 次插入35 次删除
  1. 7 3
      c11.py
  2. 68 29
      cognos11/c11_export.py
  3. 二進制
      dist/c11.exe
  4. 4 3
      pdf/pdf_merge.py

+ 7 - 3
c11.py

@@ -3,6 +3,7 @@ import cognos11
 from pdf import pdf_merge, pdf_test
 import plac
 from enum import Enum
+from pprint import pprint
 
 
 class ExportFormat(Enum):
@@ -24,15 +25,18 @@ class C11:
     def __init__(self):
         self.cfg = config.Config()
 
-    def export(self, folder="", format="XML"):
+    def export(self, folder=""):
         exp = cognos11.c11_export(self.cfg)
-        exp.export_folder(folder, format)
+        exp.export_folder(folder)
 
     def reportoutput(self, folder=""):
         exp = cognos11.c11_export(self.cfg)
         folder2 = exp.get_folder(folder)
-        exp.export_folder(folder, "PDF")
+        req_plan = exp.get_folder_pdf_request_plan(folder)
+        exp.execute_request_plan(req_plan)
         pdf_test.missing_data(self.cfg.cognos11.reportoutput_dir + "/" + folder)
+        merge_group = exp.get_merge_group(req_plan)
+        pprint(merge_group)
         pdf_merge.merge_reports_in_folder(self.cfg, folder2)
 
     def merge(self, folder="", config=""):

+ 68 - 29
cognos11/c11_export.py

@@ -5,6 +5,15 @@ import json
 import logging
 import os
 from datetime import datetime
+from dataclasses import dataclass
+
+
+@dataclass
+class ReportRequest:
+    report_id: str
+    params: dict
+    filename: str
+    report_format: str
 
 
 class c11_export:
@@ -39,15 +48,12 @@ class c11_export:
             folder = "Team Content/ReportOutput/" + folder
         return folder
 
-    def export_folder(self, folder="", format="PDF") -> None:
-        folder = self.get_folder(folder, format)
+    def export_folder(self, folder="") -> None:
+        folder = self.get_folder(folder, "XML")
         reports = self.api.get_reports_in_folder(folder, True)
         for r in reports:
             print(r["name"])
-            if format == "PDF":
-                self.export_pdf(r["id"], folder)
-            if format == "XML":
-                self.export_unstubbed(r["id"])
+            self.export_unstubbed(r["id"])
 
     def export_unstubbed(self, report_id):
         report = self.api.get_report(report_id)
@@ -60,6 +66,11 @@ class c11_export:
             with open(filename, "w") as f:
                 f.write(unstubbed_report)
 
+    def get_folder_pdf_request_plan(self, folder=""):
+        folder = self.get_folder(folder, "PDF")
+        reports = self.api.get_reports_in_folder(folder, True)
+        return [self.export_pdf(r) for r in reports]
+
     def export_pdf(self, report_id, folder=None):
         report = self.api.get_report(report_id)
         if report["type"] == "shortcut":
@@ -88,51 +99,79 @@ class c11_export:
 
         if len(report["params"]) == 0:
             filename = report["filename"]
-            self.request_and_save_file(report["id"], params, filename, report["format"])
-            return True
+            return [ReportRequest(report["id"], params, filename, report["format"])]
+        result = []
         if len(report["params"]) == 1:
-            filename = report["filename"].format("_1")
-            self.request_and_save_file(report["id"], params, filename, report["format"])
+            filename = report["filename"].format("_Summe")
+            result.append(
+                ReportRequest(report["id"], params, filename, report["format"])
+            )
 
             key1 = report["params"][0]
             for k1, v1 in report["meta"]["optional"][key1].items():
                 filename = report["filename"].format(v1)
                 params[key1] = {k1: v1}
-                self.request_and_save_file(
-                    report["id"], params, filename, report["format"]
+                result.append(
+                    ReportRequest(report["id"], params, filename, report["format"])
                 )
-            return True
+            return result
         if len(report["params"]) == 2:
-            filename = report["filename"].format("gesamt", "_1")
-            self.request_and_save_file(report["id"], params, filename, report["format"])
+            filename = report["filename"].format("_Summe", "").replace("_.", ".")
+            result.append(
+                ReportRequest(report["id"], params, filename, report["format"])
+            )
 
             key1, key2 = report["params"]
             for k1, v1 in report["meta"]["optional"][key1].items():
-                filename = report["filename"].format(v1, "_1")
-                self.request_and_save_file(
-                    report["id"], params, filename, report["format"]
+                filename = report["filename"].format(v1, "_Summe")
+                params = {}
+                params[key1] = {k1: v1}
+                result.append(
+                    ReportRequest(report["id"], params, filename, report["format"])
                 )
 
                 for k2, v2 in report["meta"]["optional"][key2].items():
                     filename = report["filename"].format(v1, v2)
-                    params[key1] = {k1: v1}
                     params[key2] = {k2: v2}
-                    self.request_and_save_file(
-                        report["id"], params, filename, report["format"]
+                    result.append(
+                        ReportRequest(report["id"], params, filename, report["format"])
                     )
-            return True
-
-    def request_and_save_file(self, report_id, params, filename, format="PDF"):
-        logging.debug(filename)
-        logging.debug(params)
-        status_code, content = self.api.request_file(report_id, params, format)
+            return result
+
+    def execute_request_plan(self, req_plan):
+        for req_group in req_plan:
+            for report_req in req_group:
+                self.request_and_save_file(report_req)
+
+    def request_and_save_file(self, report_request: ReportRequest):
+        logging.debug(report_request.filename)
+        logging.debug(report_request.params)
+        status_code, content = self.api.request_file(
+            report_request.report_id,
+            report_request.params,
+            report_request.report_format,
+        )
         if status_code == 200:
-            os.makedirs(os.path.dirname(filename), exist_ok=True)
-            with open(filename, "wb") as f:
+            os.makedirs(os.path.dirname(report_request.filename), exist_ok=True)
+            with open(report_request.filename, "wb") as f:
                 f.write(content)
         else:
             logging.warning(content)
 
+    def get_merge_group(self, req_plan):
+        res = {}
+        for req_group in req_plan:
+            if len(req_group) == 1:
+                continue
+            files = [r.filename for r in req_group]
+            filename = files[0].replace("_Summe", "_Summe_und_Schichten")
+            res[filename] = files
+
+            files2 = [r for r in files if "_Summe" not in r]
+            filename2 = filename.replace("_Summe_und_Schichten", "_nur_Schichten")
+            res[filename2] = files2
+        return res
+
     def export_errors(self):
         reports = self.api.get_reports_in_folder(
             "Team Content", recursive=True, specs=True

二進制
dist/c11.exe


+ 4 - 3
pdf/pdf_merge.py

@@ -18,7 +18,7 @@ def pdf_merge(base_dir: str, report_name, config=None):
         pdfs = [f for f in Path(base_dir).glob(report_prefix + "*.pdf")]
         pdfs.sort(key=lambda f: f.stat().st_mtime)
         if len(entries) > 0:
-            pdfs = [f for e in entries for f in pdfs if e + ".pdf" in f]
+            pdfs = [f for e in entries for f in pdfs if e + ".pdf" in f.name]
         if len(pdfs) > 0:
             with PdfMerger() as merger:
                 for pdf in pdfs:
@@ -37,9 +37,10 @@ def merge_reports_in_folder(
 ):
     reports = get_reports(cfg.cognos11.reports_file, folder)
     print(folder)
+    folder2 = folder[26:]
     for r in reports:
-        print(r)
-        pdf_merge(cfg.cognos11.reportoutput_dir, r, config)
+        print(folder2 + "/" + r)
+        pdf_merge(cfg.cognos11.reportoutput_dir + "/" + folder2, r, config)
 
 
 def get_config_json(config, config_dir):