JIRA: BOTTLENECKS-29
[bottlenecks.git] / vstf / vstf / controller / reporters / report / pdf / pdftemplate.py
1 ##############################################################################
2 # Copyright (c) 2015 Huawei Technologies Co.,Ltd and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9
10 import time
11
12 from reportlab.platypus.doctemplate import SimpleDocTemplate
13 from reportlab.platypus import PageBreak
14 from vstf.controller.reporters.report.pdf.styles import TemplateStyle, ps_head_lv1, ps_head_lv2, ps_head_lv3
15 import vstf.common.constants as cst
16
17
18 class BaseDocTemplate(SimpleDocTemplate):
19     def __init__(self, filename, **kw):
20         self.allowSplitting = 0
21         SimpleDocTemplate.__init__(self, filename, **kw)
22
23     def afterFlowable(self, flowable):
24         """Registers TOC entries."""
25         if flowable.__class__.__name__ == 'Paragraph':
26             text = flowable.getPlainText()
27             style = flowable.style.name
28             if style == ps_head_lv1.name:
29                 self.notify('TOCEntry', (0, text, self.page - 1))
30             elif style == ps_head_lv2.name:
31                 self.notify('TOCEntry', (1, text, self.page - 1))
32             elif style == ps_head_lv3.name:
33                 self.notify('TOCEntry', (2, text, self.page - 1))
34
35
36 class PdfTemplate(object):
37     def __init__(self, title, logo, header, footer, note=[], style="default"):
38         self._style = TemplateStyle(name=style)
39         self._title = title
40         self._logo = logo[0]
41         #self._header = header[0]
42         self._footer = footer
43         self._note = note
44         info = " Generated on %s " % time.strftime(cst.TIME_FORMAT2, time.localtime())
45         self._note += [info]
46
47     def myFirstPage(self, canvas, doc):
48         raise NotImplementedError("abstract StoryDecorator")
49
50     def myLaterPages(self, canvas, doc):
51         raise NotImplementedError("abstract StoryDecorator")
52
53     def generate(self, story, output):
54         sizes = (self._style.page_wight, self._style.page_height)
55         doc = BaseDocTemplate(output, pagesize=sizes)
56         #    doc.build(story, onFirstPage=self.myFirstPage, onLaterPages=self.myLaterPages)
57         doc.multiBuild(story, onFirstPage=self.myFirstPage, onLaterPages=self.myLaterPages)
58
59
60 class PdfVswitch(PdfTemplate):
61     def myFirstPage(self, canvas, doc):
62         canvas.saveState()
63         title_lines = len(self._title)
64         line_size = [self._style.title_size] * title_lines
65         line_size.append(0)
66
67         canvas.drawImage(self._logo,
68                          (self._style.page_wight - self._style.logo_width) / 2.0,
69                          self._style.page_height / 2.0 + (1 + self._style.title_leading) * reduce(lambda x, y: x + y,
70                                                                                                   line_size),
71                          self._style.logo_width,
72                          self._style.logo_height
73                          )
74         for i in range(title_lines):
75             canvas.setFont(self._style.title_font, line_size[i])
76             canvas.drawCentredString(self._style.page_wight / 2.0,
77                                      self._style.page_height / 2.0 + (1 + self._style.title_leading) * reduce(
78                                          lambda x, y: x + y, line_size[i + 1:]),
79                                      self._title[i]
80                                      )
81         size = self._style.body_size
82         canvas.setFont(self._style.body_font, size)
83         note_line = len(self._note)
84
85         for i in range(note_line):
86             print self._note[i]
87             canvas.drawCentredString(self._style.page_wight / 2.0,
88                                      self._style.page_height / 5.0 + (1 + self._style.body_leading) * size * (
89                                      note_line - i - 1),
90                                      self._note[i]
91                                      )
92         size = self._style.body_size - 2
93         canvas.setFont(self._style.body_font, size)
94         canvas.drawCentredString(self._style.page_wight / 2.0,
95                                  self._style.page_bottom / 2.0 + (1 + self._style.body_leading) * size,
96                                  self._footer[0])
97         canvas.restoreState()
98
99     def myLaterPages(self, canvas, doc):
100         canvas.saveState()
101         canvas.setLineWidth(self._style.line_width)
102         canvas.line(self._style.page_left,
103                     self._style.page_height - self._style.page_top,
104                     self._style.page_wight - self._style.page_right,
105                     self._style.page_height - self._style.page_top
106                     )
107         size = self._style.body_size - 2
108         canvas.setFont(self._style.body_font, size)
109         canvas.drawCentredString(self._style.page_wight / 2.0,
110                                  self._style.page_bottom - 24,
111                                  "%s%s Page %2d " % (self._footer[0], " " * 8, doc.page - 1)
112                                  )
113         canvas.restoreState()
114