pdf_export.py 4.2 KB

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