source: main/waeup.sirp/trunk/src/waeup/sirp/students/utils.py @ 7020

Last change on this file since 7020 was 7019, checked in by Henrik Bettermann, 14 years ago

Implement download page for pdf payment receipts (ExportPDFPaymentSlipPage) including student base data.

  • Property svn:keywords set to Id
File size: 6.4 KB
Line 
1"""General helper functions for the student section.
2"""
3from grok import getSite
4from random import SystemRandom as r
5from datetime import date, datetime
6from reportlab.pdfgen import canvas
7from reportlab.lib.units import cm
8from reportlab.lib.pagesizes import A4
9from reportlab.lib.styles import getSampleStyleSheet
10from reportlab.platypus import (Frame, Paragraph, Image,
11    Table, Spacer)
12from reportlab.platypus.tables import TableStyle
13from zope.formlib.form import setUpEditWidgets
14from waeup.sirp.interfaces import academic_sessions_vocab
15
16SLIP_STYLE = TableStyle(
17    [('VALIGN',(0,0),(-1,-1),'TOP')]
18    )
19
20def generate_student_id(students,letter):
21    if letter == '?':
22        letter= r().choice('ABCDEFGHKLMNPQRSTUVWXY')
23    sid = u"%c%d" % (letter,r().randint(99999,1000000))
24    while sid in students.keys():
25        sid = u"%c%d" % (letter,r().randint(99999,1000000))
26    return sid
27
28def set_returning_data(student):
29    student['studycourse'].current_level += 100
30    student['studycourse'].current_session += 1
31    verdict = student['studycourse'].current_verdict
32    student['studycourse'].current_verdict = '0'
33    student['studycourse'].previous_verdict = verdict
34    return
35
36# To be specified in customization packages, see also view which
37# calls the function.
38# This function is for demonstration and testing only.
39def getPaymentDetails(category, student):
40    d = {}
41    d['p_item'] = u''
42    d['amount'] = 0
43    d['error'] = u''
44    d['p_session'] = student['studycourse'].current_session
45    session = str(d['p_session'])
46    try:
47        academic_session = getSite()['configuration'][session]
48    except KeyError:
49        d['error'] = u'Session configuration object is not available.'
50        return d
51    d['surcharge_1'] = academic_session.surcharge_1
52    d['surcharge_2'] = academic_session.surcharge_2
53    d['surcharge_3'] = academic_session.surcharge_3
54    if category == 'schoolfee':
55        d['amount'] = academic_session.fee_1
56        d['p_item'] = student['studycourse'].certificate.code
57    elif category == 'clearance':
58        d['p_item'] = student['studycourse'].certificate.code
59        d['amount'] = academic_session.fee_2
60    elif category == 'bed_allocation':
61        d['p_item'] = getAccommodationDetails(student)['bt']
62        d['amount'] = academic_session.booking_fee
63    return d
64
65# To be specified in customization packages, see also view which
66# calls the function.
67# This function is for demonstration and testing only.
68def getAccommodationDetails(student):
69    d = {}
70    d['error'] = u''
71    site_confoguration = getSite()['configuration']
72    d['booking_session'] = site_confoguration.accommodation_session
73    d['allowed_states'] = site_confoguration.accommodation_states
74    session = str(d['booking_session'])
75    # Determine bed type
76    studycourse = student['studycourse']
77    entry_session = studycourse.entry_session
78    current_level = studycourse.current_level
79    end_level = studycourse.certificate.end_level
80    if entry_session == getSite()['configuration'].accommodation_session:
81        bt = 'fr'
82    elif current_level >= end_level:
83        bt = 'fi'
84    else:
85        bt = 're'
86    if student.sex == 'f':
87        sex = 'female'
88    else:
89        sex = 'male'
90    special_handling = 'regular'
91    d['bt'] = u'%s_%s_%s' % (special_handling,sex,bt)
92    return d
93
94# To be specified in customization packages, see also view which
95# calls the function.
96# I the standard configuration we select the first bed found,
97# but can also randomize the selection if we like.
98def selectBed(available_beds):
99    return available_beds[0]
100
101def setUpWidgets(view, ignore_request=False):
102    view.adapters = {}
103    view.widgets = setUpEditWidgets(
104        view.form_fields, view.prefix, view.context, view.request,
105        adapters=view.adapters, for_display=True,
106        ignore_request=ignore_request
107        )
108
109def renderStudentData(student, studentview):
110    setUpWidgets(studentview, ignore_request=True)
111    data = []
112    style = getSampleStyleSheet()
113    for widget in studentview.widgets:
114        if widget.name == 'form.adm_code':
115            continue
116        f_label = '<font size=12>%s</font>:' % widget.label.strip()
117        f_label = Paragraph(f_label, style["Normal"])
118        f_text = '<font size=12>%s</font>' % widget()
119        f_text = Paragraph(f_text, style["Normal"])
120        data.append([f_label,f_text])
121    table = Table(data,style=SLIP_STYLE)
122    return table
123
124# To be specified in customization packages, see also view which
125# calls the function.
126def renderPDF(view, subject='', filename='slip.pdf', student=None, studentview=None):
127    # (0,0),(-1,-1) = whole table
128    # (0,0),(0,-1) = first column
129    # (-1,0),(-1,-1) = last column
130    # (0,0),(-1,0) = first row
131    # (0,-1),(-1,-1) = last row
132
133    pdf = canvas.Canvas(filename,pagesize=A4)
134    pdf.setTitle(view.label)
135    pdf.setSubject(subject)
136    pdf.setAuthor('%s (%s)' % (view.request.principal.title,
137        view.request.principal.id))
138    pdf.setCreator('WAeUP SIRP')
139    width, height = A4
140    style = getSampleStyleSheet()
141    pdf.line(1*cm,height-(1.8*cm),width-(1*cm),height-(1.8*cm))
142
143    story = []
144    frame_header = Frame(1*cm,1*cm,width-(1.7*cm),height-(1.7*cm))
145    header_title = getattr(getSite(), 'name', u'Sample University')
146    story.append(Paragraph(header_title, style["Heading1"]))
147    frame_header.addFromList(story,pdf)
148
149    story = []
150    frame_body = Frame(1*cm,1*cm,width-(2*cm),height-(3.5*cm))
151    story.append(Paragraph(view.label, style["Heading2"]))
152    #story.append(HRFlowable())
153    if student:
154        story.append(Spacer(1, 18))
155        studenttable = renderStudentData(student, studentview)
156        story.append(studenttable)
157    story.append(Spacer(1, 18))
158    setUpWidgets(view)
159    data = []
160    for widget in view.widgets:
161        f_label = '<font size=12>%s</font>:' % widget.label.strip()
162        f_label = Paragraph(f_label, style["Normal"])
163        f_text = '<font size=12>%s</font>' % widget()
164        f_text = Paragraph(f_text, style["Normal"])
165        data.append([f_label,f_text])
166    table = Table(data,style=SLIP_STYLE)
167    story.append(table)
168    frame_body.addFromList(story,pdf)
169
170    story = []
171    frame_footer = Frame(1*cm,0,width-(2*cm),1*cm)
172    timestamp = datetime.now().strftime("%d/%m/%Y %H:%M:%S")
173    f_text = '<font size=10>%s</font>' % timestamp
174    story.append(Paragraph(f_text, style["Normal"]))
175    frame_footer.addFromList(story,pdf)
176
177    view.response.setHeader(
178        'Content-Type', 'application/pdf')
179    return pdf.getpdfdata()
Note: See TracBrowser for help on using the repository browser.