master
Raw Download raw file
 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")