"""General helper functions for the student section. """ import grok 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 from waeup.sirp.students.interfaces import IStudentsUtils 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 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 render_student_data(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 class StudentsUtils(grok.GlobalUtility): """A collection of methods subject to customization. """ grok.implements(IStudentsUtils) def get_payment_details(self,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 = grok.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'] = self.get_accommodation_details(student)['bt'] d['amount'] = academic_session.booking_fee return d def get_accommodation_details(self, student): d = {} d['error'] = u'' site_confoguration = grok.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 == grok.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 # In the standard configuration we select the first bed found, # but can also randomize the selection if we like. def select_bed(self, available_beds): return available_beds[0] def render_pdf(self, 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(grok.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 = render_student_data(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()