master
1from io import BytesIO
2from patchedpdf import Canvas
3
4from reportlab.graphics import barcode
5from reportlab.graphics import renderPDF
6
7class SurveyException(Exception):
8 pass
9
10class Survey(object):
11 def __init__(self, id):
12 self.header = None
13 self.footer = None
14 self.paper = None
15
16 self._canvas = None
17
18 self.id = id
19 self._signature = None
20 self._barcode = None
21
22 self._initializeValues()
23
24 def _initializeValues(self):
25 #TODO: Calculate values/read from database
26 self.surveyname = None
27 self.questions = []
28
29 self.version = 0
30 self.pagesize = 11
31 self.headersize = 1
32 self.footersize = 1
33
34 def signature(self):
35 if not self._signature:
36 #TODO: Make this a crypto signature
37 self._signature = "%d.%d" % (self.id, self.version)
38 return self._signature
39
40 def barcode(self):
41 if not self._barcode:
42 self._barcode = barcode.createBarcodeDrawing("QR", value=self.signature())
43 return self._barcode
44
45 def renderPDF(self):
46 canvas = Canvas(BytesIO())
47
48 #TODO: Render header
49 self.addHeader(canvas)
50 for question in self.questions:
51 if question.height + canvas.currentheight > survey.pagesize + survey.footersize:
52 self.addfooter(canvas)
53 canvas.nextpage()
54 self.addheader(canvas)
55 question.renderPDF(canvas)
56 self.addFooter(canvas)
57
58 return canvas.getpdfdata()
59
60 def addHeader(self, canvas):
61 renderPDF.draw(self.barcode(), canvas, 0, 0)
62
63 def addFooter(self, canvas):
64 pass
65
66def getPDF(id):
67 if int(id) == 0:
68 #Demo Survey
69 survey = Survey(0)
70 return survey.renderPDF()
71 else:
72 raise SurveyException("Invalid surveyid")