Upload the contribution of vstf as bottleneck network framework.
[bottlenecks.git] / vstf / vstf / controller / reporters / report / pdf / pdftemplate.py
1 #!/usr/bin/python
2 # -*- coding: utf8 -*-
3 import time
4
5 from reportlab.platypus.doctemplate import SimpleDocTemplate
6 from reportlab.platypus import PageBreak
7 from vstf.controller.reporters.report.pdf.styles import TemplateStyle, ps_head_lv1, ps_head_lv2, ps_head_lv3
8
9
10 class MyDocTemplate(SimpleDocTemplate):
11     def __init__(self, filename, **kw):
12         self.allowSplitting = 0
13         SimpleDocTemplate.__init__(self, filename, **kw)
14
15     def afterFlowable(self, flowable):
16         """Registers TOC entries."""
17         if flowable.__class__.__name__ == 'Paragraph':
18             text = flowable.getPlainText()
19             style = flowable.style.name
20             if style == ps_head_lv1.name:
21                 self.notify('TOCEntry', (0, text, self.page - 1))
22             elif style == ps_head_lv2.name:
23                 self.notify('TOCEntry', (1, text, self.page - 1))
24             elif style == ps_head_lv3.name:
25                 self.notify('TOCEntry', (2, text, self.page - 1))
26
27
28 class PdfTemplate:
29     def __init__(self, style, title, logo, header, footer, output, note=None):
30         self._style = style
31         self._title = title
32         self._logo = logo[0]
33         self._header = header[0]
34         self._footer = footer
35         self._output = output[0]
36         self._note = note
37         info = " Generated on %s " % time.strftime('%Y/%m/%d %H:%M:%S', time.localtime())
38         self._note[0] += info
39
40     def myFirstPage(self, canvas, doc):
41         raise NotImplementedError("abstract StoryDecorator")
42
43     def myLaterPages(self, canvas, doc):
44         raise NotImplementedError("abstract StoryDecorator")
45
46     def generate(self, story):
47         sizes = (self._style.page_wight, self._style.page_height)
48         doc = MyDocTemplate(self._output, pagesize=sizes)
49         #    doc.build(story, onFirstPage=self.myFirstPage, onLaterPages=self.myLaterPages)
50         doc.multiBuild(story, onFirstPage=self.myFirstPage, onLaterPages=self.myLaterPages)
51
52
53 class PdfVswitch(PdfTemplate):
54     def myFirstPage(self, canvas, doc):
55         canvas.saveState()
56         title_lines = len(self._title)
57         line_size = [self._style.title_size] * title_lines
58         line_size.append(0)
59
60         canvas.drawImage(self._logo,
61                          (self._style.page_wight - self._style.logo_width) / 2.0,
62                          self._style.page_height / 2.0 + (1 + self._style.title_leading) * reduce(lambda x, y: x + y,
63                                                                                                   line_size),
64                          self._style.logo_width,
65                          self._style.logo_height
66                          )
67         for i in range(title_lines):
68             canvas.setFont(self._style.title_font, line_size[i])
69             canvas.drawCentredString(self._style.page_wight / 2.0,
70                                      self._style.page_height / 2.0 + (1 + self._style.title_leading) * reduce(
71                                          lambda x, y: x + y, line_size[i + 1:]),
72                                      self._title[i]
73                                      )
74         size = self._style.body_size
75         canvas.setFont(self._style.body_font, size)
76         note_line = len(self._note)
77
78         for i in range(note_line):
79             print self._note[i]
80             canvas.drawCentredString(self._style.page_wight / 2.0,
81                                      self._style.page_height / 5.0 + (1 + self._style.body_leading) * size * (
82                                      note_line - i - 1),
83                                      self._note[i]
84                                      )
85         size = self._style.body_size - 2
86         canvas.setFont(self._style.body_font, size)
87         canvas.drawCentredString(self._style.page_wight / 2.0,
88                                  self._style.page_bottom / 2.0 + (1 + self._style.body_leading) * size,
89                                  self._footer[0])
90         canvas.restoreState()
91
92     def myLaterPages(self, canvas, doc):
93         canvas.saveState()
94         canvas.setLineWidth(self._style.line_width)
95         canvas.line(self._style.page_left,
96                     self._style.page_height - self._style.page_top,
97                     self._style.page_wight - self._style.page_right,
98                     self._style.page_height - self._style.page_top
99                     )
100         size = self._style.body_size - 2
101         canvas.setFont(self._style.body_font, size)
102         canvas.drawCentredString(self._style.page_wight / 2.0,
103                                  self._style.page_bottom - 24,
104                                  "%s%s Page %2d " % (self._footer[0], " " * 8, doc.page - 1)
105                                  )
106         canvas.restoreState()
107