c11_export.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. from cognos11.c11_api import c11_api
  2. import config
  3. import json
  4. import logging
  5. import os
  6. from datetime import datetime
  7. class c11_export:
  8. api: c11_api
  9. cfg: config.Config = None
  10. def __init__(self, cfg=None, api=None):
  11. self.cfg = cfg
  12. if cfg is None:
  13. self.cfg = config.Config()
  14. self.api = api
  15. if api is None:
  16. self.api = c11_api(cfg).login()
  17. now = datetime.now().strftime('%Y%m%d_%H%M%S')
  18. prot_file = f"{self.cfg.cognos11.logs_dir}/error_{now}.log"
  19. os.makedirs(self.cfg.cognos11.logs_dir, exist_ok=True)
  20. logging.basicConfig(
  21. filename=prot_file,
  22. filemode='w',
  23. encoding='utf-8',
  24. level=logging.DEBUG,
  25. force=True
  26. )
  27. def get_folder(self, folder, format='PDF'):
  28. if folder == '':
  29. folder = 'Team Content' if format == 'XML' else 'Team Content/ReportOutput'
  30. elif not folder.startswith('Team Content'):
  31. folder = 'Team Content/ReportOutput/' + folder
  32. return folder
  33. def export_folder(self, folder='', format='PDF') -> None:
  34. folder = self.get_folder(folder, format)
  35. reports = self.api.get_reports_in_folder(folder, True)
  36. for r in reports:
  37. print(r['name'])
  38. if format == 'PDF':
  39. self.export_pdf(r['id'], folder)
  40. if format == 'XML':
  41. self.export_unstubbed(r['id'])
  42. def export_unstubbed(self, report_id):
  43. report = self.api.get_report(report_id)
  44. unstubbed_report = self.api.request_unstubbed(report_id)
  45. if unstubbed_report:
  46. filename = f"{self.cfg.cognos11.specs_dir}/{report['path']}/{report['name']}.xml"
  47. os.makedirs(os.path.dirname(filename), exist_ok=True)
  48. with open(filename, "w") as f:
  49. f.write(unstubbed_report)
  50. def export_pdf(self, report_id, folder=None):
  51. report = self.api.get_report(report_id)
  52. if 'meta' not in report:
  53. logging.warning(report['name'] + ' is not accessible!')
  54. return False
  55. params = {}
  56. if len(report['meta']['required']) > 0:
  57. if set(report['meta']['required'].keys()) != {'p_Von', 'p_Bis'}:
  58. return False
  59. params['p_Von'] = {'2022-10-12': '12.10.2022'}
  60. params['p_Bis'] = {'2022-10-12': '12.10.2022'}
  61. params['p_Zeitraum'] = {'Einzelne Monate': 'Einzelne Monate'}
  62. for k, v in report['meta']['optional'].items():
  63. if k in ['p_Zeit', 'p_Auswahl_Monate', 'p_12_Monate']:
  64. for k1, v1 in reversed(v.items()):
  65. if v1 != 'Invalid Dates':
  66. params[k] = {k1: v1}
  67. continue # use last element only
  68. if len(report['params']) == 0:
  69. filename = report['filename']
  70. self.request_and_save_file(report['id'], params, filename)
  71. return True
  72. if len(report['params']) == 1:
  73. filename = report['filename'].format('1')
  74. self.request_and_save_file(report['id'], params, filename)
  75. key1 = report['params'][0]
  76. for k1, v1 in report['meta']['optional'][key1].items():
  77. filename = report['filename'].format(v1)
  78. params[key1] = {k1: v1}
  79. self.request_and_save_file(report['id'], params, filename)
  80. return True
  81. if len(report['params']) == 2:
  82. key1, key2 = report['params']
  83. for k1, v1 in report['meta']['optional'][key1].items():
  84. for k2, v2 in report['meta']['optional'][key2].items():
  85. filename = report['filename'].format(v1, v2)
  86. params[key1] = {k1: v1}
  87. params[key2] = {k2: v2}
  88. self.request_and_save_file(report['id'], params, filename)
  89. return True
  90. def request_and_save_file(self, report_id, params, filename):
  91. logging.debug(filename)
  92. logging.debug(params)
  93. status_code, content = self.api.request_file(report_id, params)
  94. if status_code == 200:
  95. os.makedirs(os.path.dirname(filename), exist_ok=True)
  96. with open(filename, "wb") as f:
  97. f.write(content)
  98. else:
  99. logging.warning(content)
  100. def export_errors(self):
  101. reports = self.api.get_reports_in_folder('Team Content', recursive=True, specs=True)
  102. errors = [r for r in reports if 'error' in r]
  103. filename = self.cfg.cognos11.logs_dir + '/c11_report_errors.json'
  104. json.dump(errors, open(filename, 'w'), indent=2)
  105. if __name__ == '__main__':
  106. api = c11_api()
  107. api.login()
  108. pdf = c11_export(None, api)
  109. # pdf.export_folder('Team Content/Verkauf/1. Gesamtverkauf', 'PDF')
  110. # pdf.export_folder('Team Content/Aftersales/1. Service')
  111. pdf.export_errors()