"""General helper functions for the student section. """ from grok import getSite from random import SystemRandom as r from datetime import date, datetime from reportlab.pdfgen import canvas from reportlab.lib.units import cm from reportlab.lib.pagesizes import A4 from reportlab.lib.styles import getSampleStyleSheet from reportlab.platypus import (Frame, Paragraph, Image, Table, Spacer) from reportlab.platypus.tables import TableStyle from zope.formlib.form import setUpEditWidgets from waeup.sirp.interfaces import academic_sessions_vocab SLIP_STYLE = TableStyle( [('VALIGN',(0,0),(-1,-1),'TOP')] ) def generate_student_id(students,letter): if letter == '?': letter= r().choice('ABCDEFGHKLMNPQRSTUVWXY') sid = u"%c%d" % (letter,r().randint(99999,1000000)) while sid in students.keys(): sid = u"%c%d" % (letter,r().randint(99999,1000000)) return sid def set_returning_data(student): student['studycourse'].current_level += 100 student['studycourse'].current_session += 1 verdict = student['studycourse'].current_verdict student['studycourse'].current_verdict = '0' student['studycourse'].previous_verdict = verdict return # To be specified in customization packages, see also the view which # calls the function. def getPaymentDetails(category, student): d = {} d['p_item'] = u'' d['amount'] = 0 d['error'] = u'' d['p_session'] = student['studycourse'].current_session session = str(d['p_session']) try: academic_session = getSite()['configuration'][session] except KeyError: d['error'] = u'Session configuration object is not available.' return d d['surcharge_1'] = academic_session.surcharge_1 d['surcharge_2'] = academic_session.surcharge_2 d['surcharge_3'] = academic_session.surcharge_3 if category == 'schoolfee': d['amount'] = academic_session.school_fee_base d['p_item'] = student['studycourse'].certificate.code elif category == 'clearance': d['p_item'] = student['studycourse'].certificate.code d['amount'] = academic_session.clearance_fee elif category == 'bed_allocation': d['p_item'] = getAccommodationDetails(student)['bt'] d['amount'] = academic_session.booking_fee return d # To be specified in customization packages, see also the view which # calls the function. def getAccommodationDetails(student): d = {} d['error'] = u'' site_confoguration = getSite()['configuration'] d['booking_session'] = site_confoguration.accommodation_session d['allowed_states'] = site_confoguration.accommodation_states session = str(d['booking_session']) # Determine bed type studycourse = student['studycourse'] entry_session = studycourse.entry_session current_level = studycourse.current_level end_level = studycourse.certificate.end_level if entry_session == getSite()['configuration'].accommodation_session: bt = 'fr' elif current_level >= end_level: bt = 'fi' else: bt = 're' if student.sex == 'f': sex = 'female' else: sex = 'male' special_handling = 'regular' d['bt'] = u'%s_%s_%s' % (special_handling,sex,bt) return d # To be specified in customization packages, see also view which # calls the function. # I the standard configuration we select the first bed found, # but can also randomize the selection if we like. def selectBed(available_beds): return available_beds[0] def setUpWidgets(view, ignore_request=False): view.adapters = {} view.widgets = setUpEditWidgets( view.form_fields, view.prefix, view.context, view.request, adapters=view.adapters, for_display=True, ignore_request=ignore_request ) def renderStudentData(student, studentview): setUpWidgets(studentview, ignore_request=True) data = [] style = getSampleStyleSheet() for widget in studentview.widgets: if widget.name == 'form.adm_code': continue f_label = '%s:' % widget.label.strip() f_label = Paragraph(f_label, style["Normal"]) f_text = '%s' % widget() f_text = Paragraph(f_text, style["Normal"]) data.append([f_label,f_text]) table = Table(data,style=SLIP_STYLE) return table # To be specified in customization packages, see also view which # calls the function. def renderPDF(view, subject='', filename='slip.pdf', student=None, studentview=None): # (0,0),(-1,-1) = whole table # (0,0),(0,-1) = first column # (-1,0),(-1,-1) = last column # (0,0),(-1,0) = first row # (0,-1),(-1,-1) = last row pdf = canvas.Canvas(filename,pagesize=A4) pdf.setTitle(view.label) pdf.setSubject(subject) pdf.setAuthor('%s (%s)' % (view.request.principal.title, view.request.principal.id)) pdf.setCreator('WAeUP SIRP') width, height = A4 style = getSampleStyleSheet() pdf.line(1*cm,height-(1.8*cm),width-(1*cm),height-(1.8*cm)) story = [] frame_header = Frame(1*cm,1*cm,width-(1.7*cm),height-(1.7*cm)) header_title = getattr(getSite(), 'name', u'Sample University') story.append(Paragraph(header_title, style["Heading1"])) frame_header.addFromList(story,pdf) story = [] frame_body = Frame(1*cm,1*cm,width-(2*cm),height-(3.5*cm)) story.append(Paragraph(view.label, style["Heading2"])) #story.append(HRFlowable()) if student: story.append(Spacer(1, 18)) studenttable = renderStudentData(student, studentview) story.append(studenttable) story.append(Spacer(1, 18)) setUpWidgets(view) data = [] for widget in view.widgets: f_label = '%s:' % widget.label.strip() f_label = Paragraph(f_label, style["Normal"]) f_text = '%s' % widget() f_text = Paragraph(f_text, style["Normal"]) data.append([f_label,f_text]) table = Table(data,style=SLIP_STYLE) story.append(table) frame_body.addFromList(story,pdf) story = [] frame_footer = Frame(1*cm,0,width-(2*cm),1*cm) timestamp = datetime.now().strftime("%d/%m/%Y %H:%M:%S") f_text = '%s' % timestamp story.append(Paragraph(f_text, style["Normal"])) frame_footer.addFromList(story,pdf) view.response.setHeader( 'Content-Type', 'application/pdf') return pdf.getpdfdata()