Jelajahi Sumber

pdf_merge mit variabler Zusammenstellung

gc-server6 1 tahun lalu
induk
melakukan
1a6bf950a7
6 mengubah file dengan 163 tambahan dan 84 penghapusan
  1. 18 2
      c11.py
  2. 27 13
      cognos11/c11_api.py
  3. 11 1
      cognos11/c11_export.py
  4. 73 56
      config/config.py
  5. TEMPAT SAMPAH
      dist/c11.exe
  6. 34 12
      pdf/pdf_merge.py

+ 18 - 2
c11.py

@@ -11,7 +11,15 @@ class ExportFormat(Enum):
 
 
 class C11:
-    commands = ["export", "reportoutput", "errors", "create", "mailtemplate"]
+    commands = [
+        "export",
+        "reportoutput",
+        "errors",
+        "create",
+        "merge",
+        "template",
+        "mailtemplate",
+    ]
 
     def __init__(self):
         self.cfg = config.Config()
@@ -27,6 +35,11 @@ class C11:
         pdf_test.missing_data(self.cfg.cognos11.reportoutput_dir + "/" + folder)
         pdf_merge.merge_reports_in_folder(self.cfg, folder2)
 
+    def merge(self, folder="", config=""):
+        folder2 = cognos11.c11_export.get_folder(folder)
+        config_json = pdf_merge.get_config_json(config, self.cfg.cognos11.config_dir)
+        pdf_merge.merge_reports_in_folder(self.cfg, folder2, config_json)
+
     def errors(self):
         exp = cognos11.c11_export(self.cfg)
         exp.export_errors()
@@ -34,10 +47,13 @@ class C11:
     def create(self, path: str):
         cognos11.c11_create(self.cfg).create_path(path)
 
-    def mailtemplate(self):
+    def template(self):
         exp = cognos11.c11_export(self.cfg)
         exp.mail_template("")
 
+    def mailtemplate(self):
+        return self.template()
+
 
 if __name__ == "__main__":
     plac.Interpreter.call(C11)

+ 27 - 13
cognos11/c11_api.py

@@ -53,13 +53,14 @@ class c11_api:
 
         return base64.b64encode(version + chunks[-1]).decode("utf-8")
 
-    def login(self, user="Global1", password="Cognos#11"):
+    def login(self):
+        cred = self.cfg.cognos11.credetials
         credentials = {
             "parameters": [
-                {"name": "CAMNamespace", "value": "CognosEx"},
                 {"name": "h_CAM_action", "value": "logonAs"},
-                {"name": "CAMUsername", "value": user},
-                {"name": "CAMPassword", "value": password},
+                {"name": "CAMNamespace", "value": cred.namespace},
+                {"name": "CAMUsername", "value": cred.username},
+                {"name": "CAMPassword", "value": cred.password},
             ]
         }
         self.session = requests.Session()
@@ -112,15 +113,16 @@ class c11_api:
                 "type",
                 "target.id",
                 "target.searchPath",
-                "target.defaultName",                
+                "target.defaultName",
                 "base.id",
                 "base.searchPath",
                 "base.defaultName",
-                "parameters"
+                "parameters",
             ]
         )
         res = self.session.get(
-            f"{self.webservice}v1/objects/{folder_id}/items?fields={fields}", headers=self.headers
+            f"{self.webservice}v1/objects/{folder_id}/items?fields={fields}",
+            headers=self.headers,
         )
         folder_list = sorted(res.json()["data"], key=lambda x: x["defaultName"])
         for f in folder_list:
@@ -146,7 +148,9 @@ class c11_api:
                     report["parameters"] = {}
                     params = [p for p in f["parameters"] if len(p["value"]) > 0]
                     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"])
                     # print(json.dumps(f, indent=2))
                 self.reports.append(report)
@@ -189,11 +193,18 @@ class c11_api:
     def get_job_details(self, object_id):
         fields = ",".join(
             [
-                "userInterfaces", "disabled",
-                "runInAdvancedViewer", "modificationTime", "canBurst",
+                "userInterfaces",
+                "disabled",
+                "runInAdvancedViewer",
+                "modificationTime",
+                "canBurst",
                 "defaultPortalAction",
-                "base.defaultName", "tags", "target.searchPath", "target.disabled",
-                "options", "base.options",
+                "base.defaultName",
+                "tags",
+                "target.searchPath",
+                "target.disabled",
+                "options",
+                "base.options",
             ]
         )
         res = self.session.get(
@@ -304,7 +315,10 @@ class c11_api:
                 ]
             )
             meta[req][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)
         json.dump(meta, open(filename, "w"), indent=2)
         report["meta"] = meta

+ 11 - 1
cognos11/c11_export.py

@@ -17,6 +17,7 @@ class c11_export:
             self.cfg = config.Config()
         self.api = api
         if api is None:
+            # if self.cfg.cognos11.
             self.api = c11_api(cfg).login()
 
         now = datetime.now().strftime("%Y%m%d_%H%M%S")
@@ -30,7 +31,8 @@ class c11_export:
             force=True,
         )
 
-    def get_folder(self, folder, format="PDF"):
+    @staticmethod
+    def get_folder(folder, format="PDF"):
         if folder == "":
             folder = "Team Content" if format == "XML" else "Team Content/ReportOutput"
         elif not folder.startswith("Team Content"):
@@ -101,8 +103,16 @@ class c11_export:
                 )
             return True
         if len(report["params"]) == 2:
+            filename = report["filename"].format("gesamt", "_1")
+            self.request_and_save_file(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"]
+                )
+
                 for k2, v2 in report["meta"]["optional"][key2].items():
                     filename = report["filename"].format(v1, v2)
                     params[key1] = {k1: v1}

+ 73 - 56
config/config.py

@@ -24,6 +24,13 @@ class Cognos7Config:
     prot_dir: str
 
 
+@dataclass
+class Cognos11Credentials:
+    namespace: str
+    username: str
+    password: str
+
+
 @dataclass
 class Cognos11Config:
     logs_dir: str
@@ -34,6 +41,7 @@ class Cognos11Config:
     folders_file: str
     reports_file: str
     jobs_file: str
+    credetials: Cognos11Credentials
 
 
 def joinpath(path, *other):
@@ -41,95 +49,104 @@ def joinpath(path, *other):
 
 
 class Config:
-    kunde = 'Test'
-    version = 'C11'
+    kunde = "Test"
+    version = "C11"
     versand_separat = False
     cognos7: Cognos7Config
     cognos11: Cognos11Config
     _cfg = {}
 
-    def __init__(self, ini='GAPS.ini'):
+    def __init__(self, ini="GAPS.ini"):
         self._cfg = {}
 
         self.tools_dir = Path(os.curdir).absolute()
         self.tasks_dir = str(self.tools_dir.parent).lower()
-        if self.tools_dir.parent.name.lower() != 'tasks':
+        if self.tools_dir.parent.name.lower() != "tasks":
             # development
-            self.tools_dir = self.tools_dir.joinpath('gctools')
-            self.portal_dir = 'c:\\globalcube'
+            self.tools_dir = self.tools_dir.joinpath("gctools")
+            self.portal_dir = "c:\\globalcube"
             if not Path(self.portal_dir).exists():
-                self.portal_dir = joinpath(self.tools_dir, 'Portal')
+                self.portal_dir = joinpath(self.tools_dir, "Portal")
         else:
             base_dir = self.tools_dir.parent.parent
-            if base_dir.name.lower() != 'globalcube':
-                self.version = 'C7'
+            if base_dir.name.lower() != "globalcube":
+                self.version = "C7"
             self.portal_dir = str(base_dir)
 
-        self.system_dir = joinpath(self.portal_dir, 'System')
-        self.tasks_dir = joinpath(self.portal_dir, 'Tasks')
-        self.xml_dir = joinpath(self.tasks_dir, 'config')
-        self.log_dir = joinpath(self.tasks_dir, 'logs')
+        self.system_dir = joinpath(self.portal_dir, "System")
+        self.tasks_dir = joinpath(self.portal_dir, "Tasks")
+        self.xml_dir = joinpath(self.tasks_dir, "config")
+        self.log_dir = joinpath(self.tasks_dir, "logs")
 
-        if ':' not in ini:
+        if ":" not in ini:
             ini = joinpath(self.tasks_dir, ini)
-        with open(ini, 'r') as stream:
+        with open(ini, "r") as stream:
             for line in stream.readlines():
-                if '=' in line:
-                    key, value = line.split('=')
-                    self._cfg[key] = value.replace('"', '').replace('\n', '')
-        self.kunde = self._cfg.get('KUNDE', 'Test')
-        self.kunde_safe = self.kunde.replace(' ', '-').lower()
-
-        self.system = self._cfg.get('SYSTEM', '')
-        if self.system != '':
+                if "=" in line:
+                    key, value = line.split("=")
+                    self._cfg[key] = value.replace('"', "").replace("\n", "")
+        self.kunde = self._cfg.get("KUNDE", "Test")
+        self.kunde_safe = self.kunde.replace(" ", "-").lower()
+
+        self.system = self._cfg.get("SYSTEM", "")
+        if self.system != "":
             self.system_dir = joinpath(self.system_dir, self.system)
         self.mail_config()
         self.cognos7_config()
         self.cognos11_config()
 
     def mail_config(self):
-        self.smtp = MailConfig(**{
-            'server': 'mail.global-cube.com',
-            'port': '465',
-            'secure': 'ssl',
-            'username': 'versand',
-            'password': 'y6!avXX3tQvr',
-            'email': 'versand+neuer-kunde@global-cube.com'
-        })
-        if self._cfg.get('SMTP_HOST', '') != '':
-            secure = {'': '', 'N': '', 'J': 'ssl', 'SSL': 'ssl', 'TLS': 'tls'}
+        self.smtp = MailConfig(
+            **{
+                "server": "mail.global-cube.com",
+                "port": "465",
+                "secure": "ssl",
+                "username": "versand",
+                "password": "y6!avXX3tQvr",
+                "email": "versand+neuer-kunde@global-cube.com",
+            }
+        )
+        if self._cfg.get("SMTP_HOST", "") != "":
+            secure = {"": "", "N": "", "J": "ssl", "SSL": "ssl", "TLS": "tls"}
 
             self.smtp = MailConfig(
-                server=self._cfg.get('SMTP_HOST'),
-                port=self._cfg.get('SMTP_PORT'),
-                secure=secure[self._cfg.get('SMTP_SSL', '')],
-                username=self._cfg.get('SMTP_USER'),
-                password=self._cfg.get('SMTP_PW'),
-                email=self._cfg.get('SMTP_FROM'),
+                server=self._cfg.get("SMTP_HOST"),
+                port=self._cfg.get("SMTP_PORT"),
+                secure=secure[self._cfg.get("SMTP_SSL", "")],
+                username=self._cfg.get("SMTP_USER"),
+                password=self._cfg.get("SMTP_PW"),
+                email=self._cfg.get("SMTP_FROM"),
             )
-        self.versand_separat = self._cfg.get('VERSAND_SEPARAT') == 'J'
+        self.versand_separat = self._cfg.get("VERSAND_SEPARAT") == "J"
 
     def cognos7_config(self):
         self.cognos7 = Cognos7Config(
-            program_dir=self._cfg.get('COGNOS', 'c:\\program files (x86)\\cognos\\cer5\\bin'),
-            iqd_dir=joinpath(self.system_dir, 'IQD'),
-            models_dir=joinpath(self.system_dir, 'Models'),
-            cube_dir=joinpath(self.system_dir, 'Cube_out'),
-            report_dir=joinpath(self.system_dir, 'Report'),
-            publish_dir=joinpath(self.portal_dir, 'Publish', 'daten'),
-            prot_dir=joinpath(self.system_dir, 'Prot')
+            program_dir=self._cfg.get(
+                "COGNOS", "c:\\program files (x86)\\cognos\\cer5\\bin"
+            ),
+            iqd_dir=joinpath(self.system_dir, "IQD"),
+            models_dir=joinpath(self.system_dir, "Models"),
+            cube_dir=joinpath(self.system_dir, "Cube_out"),
+            report_dir=joinpath(self.system_dir, "Report"),
+            publish_dir=joinpath(self.portal_dir, "Publish", "daten"),
+            prot_dir=joinpath(self.system_dir, "Prot"),
         )
         if not Path(self.cognos7.publish_dir).exists():
-            self.cognos7.publish_dir = joinpath(self.portal_dir, 'daten'),
+            self.cognos7.publish_dir = (joinpath(self.portal_dir, "daten"),)
 
     def cognos11_config(self):
         self.cognos11 = Cognos11Config(
-            logs_dir=joinpath(self.log_dir, 'c11'),
-            reportoutput_dir=joinpath(self.portal_dir, 'ReportOutput'),
-            specs_dir=joinpath(self.system_dir, 'Report'),
-            webservice='http://localhost:9300/bi/',
-            config_dir=joinpath(self.xml_dir, 'c11'),
-            folders_file=joinpath(self.xml_dir, 'c11', 'folders.json'),
-            reports_file=joinpath(self.xml_dir, 'c11', 'reports.json'),
-            jobs_file=joinpath(self.xml_dir, 'c11', 'jobs.json')
+            logs_dir=joinpath(self.log_dir, "c11"),
+            reportoutput_dir=joinpath(self.portal_dir, "ReportOutput"),
+            specs_dir=joinpath(self.system_dir, "Report"),
+            webservice="http://localhost:9300/bi/",
+            config_dir=joinpath(self.xml_dir, "c11"),
+            folders_file=joinpath(self.xml_dir, "c11", "folders.json"),
+            reports_file=joinpath(self.xml_dir, "c11", "reports.json"),
+            jobs_file=joinpath(self.xml_dir, "c11", "jobs.json"),
+            credetials=Cognos11Credentials(
+                namespace=self._cfg.get("C11_NS", "CognosEx"),
+                username=self._cfg.get("C11_U", "Global1"),
+                password=self._cfg.get("C11_P", "Cognos#11"),
+            ),
         )

TEMPAT SAMPAH
dist/c11.exe


+ 34 - 12
pdf/pdf_merge.py

@@ -5,17 +5,25 @@ import re
 import json
 
 
-def pdf_merge(base_dir: str, report_name):
+def pdf_merge(base_dir: str, report_name, config=None):
+    if config is None:
+        config = {"_0": []}
     report_prefix = re.sub(r"\[([^\]]+)\]", "", report_name)
-    target = f"{base_dir}/{report_prefix}_0.pdf"
-    if Path(target).exists():
-        Path(target).unlink()
-    pdfs = [f for f in Path(base_dir).glob(report_prefix + "*.pdf")]
-    if len(pdfs) > 0:
-        with PdfMerger() as merger:
-            for pdf in sorted(pdfs, key=lambda f: f.stat().st_mtime):
-                merger.append(pdf)
-            merger.write(target)
+    if report_prefix[-2:] == "__":
+        report_prefix = report_prefix[:-1]
+    for suffix, entries in config.items():
+        target = f"{base_dir}/{report_prefix}{suffix}.pdf"
+        if Path(target).exists():
+            Path(target).unlink()
+        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]
+        if len(pdfs) > 0:
+            with PdfMerger() as merger:
+                for pdf in pdfs:
+                    merger.append(pdf)
+                merger.write(target)
 
 
 def get_reports(reports_file, folder):
@@ -24,12 +32,26 @@ def get_reports(reports_file, folder):
     return [r["name"] for r in reports if r["path"].startswith(folder)]
 
 
-def merge_reports_in_folder(cfg: config.Config, folder="Team Content/ReportOutput"):
+def merge_reports_in_folder(
+    cfg: config.Config, folder="Team Content/ReportOutput", config=None
+):
     reports = get_reports(cfg.cognos11.reports_file, folder)
     print(folder)
     for r in reports:
         print(r)
-        pdf_merge(cfg.cognos11.reportoutput_dir, r)
+        pdf_merge(cfg.cognos11.reportoutput_dir, r, config)
+
+
+def get_config_json(config, config_dir):
+    if config == "":
+        return None
+    if config.startswith("{"):
+        return json.loads(config)
+    config_file = f"{config_dir}/merge/{config}.json"
+    if not Path(config_file).exists():
+        return None
+    with open(config_file, "r") as frh:
+        return json.load(frh)
 
 
 if __name__ == "__main__":