123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- import json
- import logging
- import os
- from .c11_api import c11_api
- from datetime import datetime
- class c11_export:
- api: c11_api
- config = None
- log_dir = "C:/GlobalCube/Tasks/logs/c11"
- spec_dir = "C:/GlobalCube/System/OPTIMA/Report"
- def __init__(self, cfg, api=None):
- self.config = cfg
- self.api = api
- if api is None:
- self.api = c11_api().login()
- now = datetime.now().strftime('%Y%m%d_%H%M%S')
- prot_file = f"{self.log_dir}/error_{now}.log"
- os.makedirs(self.log_dir, exist_ok=True)
- logging.basicConfig(
- filename=prot_file,
- filemode='w',
- encoding='utf-8',
- level=logging.DEBUG,
- force=True
- )
- def export_folder(self, folder='', format='PDF') -> None:
- if folder == '':
- folder = 'Team Content' if format == 'XML' else 'Team Content/ReportOutput'
- elif not folder.startswith('Team Content'):
- folder = 'Team Content/ReportOutput/' + folder
- 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'])
- def export_unstubbed(self, report_id):
- report = self.api.get_report(report_id)
- unstubbed_report = self.api.request_unstubbed(report_id)
- if unstubbed_report:
- filename = f"{self.spec_dir}/{report['path']}/{report['name']}.xml"
- os.makedirs(os.path.dirname(filename), exist_ok=True)
- with open(filename, "w") as f:
- f.write(unstubbed_report)
- def export_pdf(self, report_id, folder=None):
- report = self.api.get_report(report_id)
- if 'meta' not in report:
- logging.warning(report['name'] + ' is not accessible!')
- return False
- params = {}
- if len(report['meta']['required']) > 0:
- if set(report['meta']['required'].keys()) != {'p_Von', 'p_Bis'}:
- return False
- params['p_Von'] = {'2022-10-12': '12.10.2022'}
- params['p_Bis'] = {'2022-10-12': '12.10.2022'}
- params['p_Zeitraum'] = {'Einzelne Monate': 'Einzelne Monate'}
- for k, v in report['meta']['optional'].items():
- if k in ['p_Zeit', 'p_Auswahl_Monate', 'p_12_Monate']:
- for k1, v1 in reversed(v.items()):
- if v1 != 'Invalid Dates':
- params[k] = {k1: v1}
- continue # use last element only
- if len(report['params']) == 0:
- filename = report['filename']
- self.request_and_save_file(report['id'], params, filename)
- return True
- if len(report['params']) == 1:
- filename = report['filename'].format('1')
- self.request_and_save_file(report['id'], params, filename)
- 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)
- return True
- if len(report['params']) == 2:
- key1, key2 = report['params']
- for k1, v1 in report['meta']['optional'][key1].items():
- 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)
- return True
- def request_and_save_file(self, report_id, params, filename):
- logging.debug(filename)
- logging.debug(params)
- status_code, content = self.api.request_file(report_id, params)
- if status_code == 200:
- os.makedirs(os.path.dirname(filename), exist_ok=True)
- with open(filename, "wb") as f:
- f.write(content)
- else:
- logging.warning(content)
- def export_errors(self):
- reports = self.api.get_reports_in_folder('Team Content', recursive=True, specs=True)
- errors = [r for r in reports if 'error' in r]
- filename = 'C:/GlobalCube/Tasks/logs/c11_report_errors.json'
- json.dump(errors, open(filename, 'w'), indent=2)
- if __name__ == '__main__':
- api = c11_api()
- api.login()
- pdf = c11_export(None, api)
- # pdf.export_folder('Team Content/Verkauf/1. Gesamtverkauf', 'PDF')
- # pdf.export_folder('Team Content/Aftersales/1. Service')
- pdf.export_errors()
|