source: main/waeup.kofa/trunk/src/waeup/kofa/applicants/pdf.py @ 8550

Last change on this file since 8550 was 8549, checked in by Henrik Bettermann, 12 years ago

We are customizing PDFApplicationSlip adapter and thus need to define the note there.

  • Property svn:keywords set to Id
File size: 5.4 KB
Line 
1## $Id: pdf.py 8549 2012-05-29 22:35:26Z henrik $
2##
3## Copyright (C) 2011 Uli Fouquet & Henrik Bettermann
4## This program is free software; you can redistribute it and/or modify
5## it under the terms of the GNU General Public License as published by
6## the Free Software Foundation; either version 2 of the License, or
7## (at your option) any later version.
8##
9## This program is distributed in the hope that it will be useful,
10## but WITHOUT ANY WARRANTY; without even the implied warranty of
11## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12## GNU General Public License for more details.
13##
14## You should have received a copy of the GNU General Public License
15## along with this program; if not, write to the Free Software
16## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17##
18"""
19Generate PDF docs for applicants.
20"""
21import grok
22from reportlab.platypus import Paragraph, Spacer
23from zope.component import getUtility
24from zope.i18n import translate
25from waeup.kofa.applicants.interfaces import IApplicant, IApplicantsUtils
26from waeup.kofa.browser import DEFAULT_PASSPORT_IMAGE_PATH
27from waeup.kofa.browser.interfaces import IPDFCreator
28from waeup.kofa.browser.pdf import SMALL_PARA_STYLE
29from waeup.kofa.interfaces import IExtFileStore, IPDF, IKofaUtils
30from waeup.kofa.interfaces import MessageFactory as _
31from waeup.kofa.widgets.datewidget import FriendlyDateDisplayWidget
32
33class PDFApplicationSlip(grok.Adapter):
34    """Create a PDF application slip for applicants.
35    """
36    # XXX: Many things in here are reusable. We might want to split
37    # things. Possibly move parts to IPDFCreator?
38    grok.context(IApplicant)
39    grok.implements(IPDF)
40    grok.name('application_slip')
41    note = None
42
43    form_fields =  grok.AutoFields(IApplicant).omit(
44        'locked', 'course_admitted')
45    form_fields['date_of_birth'].custom_widget = FriendlyDateDisplayWidget('le')
46
47    @property
48    def title(self):
49        container_title = self.context.__parent__.title
50        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
51        ar_translation = translate(_('Application Record'),
52            'waeup.kofa', target_language=portal_language)
53        return '%s - %s %s' % (container_title,
54            ar_translation, self.context.application_number)
55
56    def _getCourseAdmittedLink(self, view):
57        """Return link, title and code in html format to the certificate
58           admitted.
59        """
60        course_admitted = self.context.course_admitted
61        if view is not None and getattr(course_admitted, '__parent__',None):
62            url = view.url(course_admitted)
63            title = course_admitted.title
64            code = course_admitted.code
65            return '<a href="%s">%s - %s</a>' %(url,code,title)
66        return ''
67
68    def _getDeptAndFaculty(self):
69        """Return long titles of department and faculty.
70
71        Returns a list [department_title, faculty_title]
72
73        If the context applicant has no course admitted or dept. and
74        faculty cannot be determined, ``None`` is returned.
75        """
76        course_admitted = self.context.course_admitted
77        dept = getattr(
78                getattr(course_admitted, '__parent__', None),
79                '__parent__', None)
80        faculty = getattr(dept, '__parent__', None)
81        return [x is not None and x.longtitle() or x for x in dept, faculty]
82
83    def _addComments(self, data):
84        if self.context.state == 'created':
85            comment = translate(_(
86                'Proceed to the login page of the portal' +
87                ' and enter your new credentials:' +
88                ' user name= ${a}, password = ${b}. ' +
89                'Change your password when you have logged in.',
90                mapping = {
91                    'a':self.context.student_id,
92                    'b':self.context.application_number}
93                ))
94            comment = Paragraph(comment, SMALL_PARA_STYLE)
95            data.extend([Spacer(1, 18), comment])
96        return data
97
98    def __call__(self, view=None):
99        """Return a PDF representation of the context applicant.
100
101        If no `view` is given, the course admitted field will be an
102        empty string and author will be set as ``'unknown'``.
103
104        If a `view` is given, author will be set as the calling
105        principal.
106        """
107        doc_title = '\n'.join([x.strip() for x in self.title.split(' - ')])
108        data = []
109        portal_language = getUtility(IKofaUtils).PORTAL_LANGUAGE
110        separators = getUtility(IApplicantsUtils).SEPARATORS_DICT
111        creator = getUtility(IPDFCreator)
112
113        # append history
114        data.extend(creator.fromStringList(self.context.history.messages))
115
116        # append photograph
117        img_path = getattr(
118            getUtility(IExtFileStore).getFileByContext(self.context),
119            'name', DEFAULT_PASSPORT_IMAGE_PATH)
120        data.append(creator.getImage(img_path))
121        data.append(Spacer(1, 12))
122
123        # append widgets
124        dept, faculty = self._getDeptAndFaculty()
125        data.append(creator.getWidgetsTable(
126            self.form_fields, self.context, view, lang=portal_language,
127            domain='waeup.kofa', separators=separators,
128            course_label='Admitted Course of Study:',
129            course_link=self._getCourseAdmittedLink(view),
130            dept=dept, faculty=faculty))
131
132        # append comments
133        data = self._addComments(data)
134
135        return creator.create_pdf(data, None, doc_title, note=self.note)
Note: See TracBrowser for help on using the repository browser.