pdf_report.py 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. from fpdf import FPDF
  2. import os
  3. from datetime import datetime
  4. class ReportPDF(FPDF):
  5. def __init__(self, repository_name, start_date, end_date):
  6. FPDF.__init__(self,orientation='P',unit='mm',format='A4')
  7. self.repo = repository_name
  8. self.start_end = f"{datetime.strptime(start_date, '%Y-%m-%d').strftime('%b %d, %Y')} to {datetime.strptime(end_date, '%Y-%m-%d').strftime('%b %d, %Y')}"
  9. def header(self):
  10. self.set_font('Arial', 'B', 12)
  11. self.cell(100, 10, f'AutoTriage Report: {self.repo}', 0, 0)
  12. self.cell(90, 10, self.start_end, 0, 0, 'R')
  13. self.ln(20)
  14. def footer(self):
  15. self.set_y(-15)
  16. self.set_font('Arial', 'I', 8)
  17. self.cell(0, 10, f'Page {self.page_no()}', 0, 0, 'C')
  18. def exec_summary(self, text):
  19. self.set_font('Arial', 'B', 16)
  20. self.cell(0, 8, 'Executive Summary', 'B', 0, 'L')
  21. self.ln(10)
  22. self.set_font('Arial', '', 10)
  23. self.multi_cell(0, 5, text)
  24. self.ln(10)
  25. def add_challenge(self, challenge_data):
  26. # title
  27. self.set_font('Arial', '', 14)
  28. self.cell(0, 10, f"{challenge_data['key_challenge']}", 0, 0, 'L')
  29. self.ln(8)
  30. # psosible causes
  31. self.set_font('Arial', 'B', 10)
  32. self.cell(0, 10, "Possible Causes", 0, 0, 'L')
  33. self.ln(5)
  34. self.set_font('Arial', '', 10)
  35. for x in challenge_data['possible_causes']:
  36. self.cell(0, 10, "* " + x, 0, 0, 'L')
  37. self.ln(5)
  38. self.ln(3)
  39. # remediations
  40. self.set_font('Arial', 'B', 10)
  41. self.cell(0, 10, "Remediations", 0, 0, 'L')
  42. self.ln(5)
  43. self.set_font('Arial', '', 10)
  44. for x in challenge_data['remediations']:
  45. self.cell(0, 10, "* " + x, 0, 0, 'L')
  46. self.ln(5)
  47. self.ln(3)
  48. # affected issues
  49. self.set_font('Arial', 'B', 10)
  50. self.cell(30, 10, f"Affected issues: ", 0, 0, 'L')
  51. for iss in challenge_data['affected_issues']:
  52. self.set_text_color(0,0,255)
  53. self.cell(8, 10, str(iss), 0, 0, 'L', link=f"https://github.com/{self.repo}/issues/{iss}")
  54. self.set_text_color(0,0,0)
  55. self.ln(15)
  56. def challenges_section(self, key_challenges_data):
  57. self.set_font('Arial', 'B', 16)
  58. self.cell(0, 8, 'Key Challenges', 'B', 0, 'L')
  59. self.ln(10)
  60. for cd in key_challenges_data:
  61. self.add_challenge(cd)
  62. self.ln(20)
  63. def open_ques_section(self, open_questions):
  64. self.set_font('Arial', 'B', 16)
  65. self.cell(0, 8, 'Open Questions', 'B', 0, 'L')
  66. self.ln(10)
  67. self.set_font('Arial', '', 10)
  68. for qq in open_questions:
  69. self.multi_cell(0, 5, "* " + qq, 0, 0, 'L')
  70. self.ln(5)
  71. self.ln(5)
  72. def add_graphs_section(self, title, plot_paths):
  73. self.set_font('Arial', 'B', 16)
  74. self.cell(0, 8, f'[Viz] {title}', 'B', 0, 'L')
  75. self.ln(10)
  76. for path in plot_paths:
  77. if os.path.exists(path):
  78. self.add_plot(path)
  79. self.ln(10)
  80. def add_plot(self, img):
  81. self.image(img, x=30, w=150)
  82. self.ln(5)
  83. def create_report_pdf(repo_name, start_date, end_date, key_challenges_data, executive_summary, open_questions, out_folder):#, image1, image2):
  84. pdf = ReportPDF(repo_name, start_date, end_date)
  85. pdf.add_page()
  86. pdf.exec_summary(executive_summary)
  87. pdf.open_ques_section(open_questions)
  88. pdf.challenges_section(key_challenges_data)
  89. pdf.add_page()
  90. pdf.add_graphs_section("Repo Maintenance", [f'{out_folder}/plots/engagement_sankey.png'])
  91. pdf.add_page()
  92. pdf.add_graphs_section("Traffic in the last 2 weeks", [f'{out_folder}/plots/{x}.png' for x in ['views_clones','resources', 'referrers']])
  93. pdf.add_page()
  94. pdf.add_graphs_section("New issues in the last 2 weeks", [f'{out_folder}/plots/{x}.png' for x in ['themes', 'severity', 'sentiment', 'expertise']])
  95. pdf.output(f'{out_folder}/report.pdf', 'F')