def makeOneSheet(schoolyear, date, pdata, term, rtype): """ <schoolyear>: year in which school-year ends (int) <data>: date of issue ('YYYY-MM-DD') <pdata>: a <PupilData> instance for the pupil whose report is to be built <term>: keys the grades in the database (term or date) <rtype>: report category, determines template """ pid = pdata['PID'] # Read database entry for the grades gradedata = getGradeData(schoolyear, pid, term) gmap = gradedata['GRADES'] # grade mapping pname = pdata.name() # <GradeReportData> manages the report template, etc.: # From here on use klass and stream from <gradedata> klass = Klass.fromKandS(gradedata['KLASS'], gradedata['STREAM']) reportData = GradeReportData(schoolyear, rtype, klass) # Get the name of the relevant configuration file in folder GRADES: grademap = klass.match_map(CONF.MISC.GRADE_SCALE) # Build a grade mapping for the tags of the template: pdata.grades = reportData.getTagmap(gmap, pname, grademap) # Update grade database if term != date: updateGradeReport(schoolyear, pid, term, date=date, rtype=rtype) ### Generate html for the reports source = reportData.template.render(report_type=rtype, SCHOOLYEAR=printSchoolYear(schoolyear), DATE_D=date, todate=Dates.dateConv, STREAM=printStream, pupils=[pdata], klass=klass) # Convert to pdf html = HTML(string=source, base_url=os.path.dirname(reportData.template.filename)) pdfBytes = html.write_pdf(font_config=FontConfiguration()) REPORT.Info(_MADEPREPORT, pupil=pname) return pdfBytes
def pupil(pid): """View: select report type and [edit-existing vs. new] for single report. All existing report dates for this pupil will be presented for selection. If there are no existing dates for this pupil, the only option is to construct a new one. Also a report type can be selected. The list might include invalid types as it is difficult at this stage (considering potential changes of stream or even school-class) to determine exactly which ones are valid. """ class _Form(FlaskForm): KLASS = SelectField("Klasse") STREAM = SelectField("Maßstab") EDITNEW = SelectField("Ausgabedatum") RTYPE = SelectField("Zeugnistyp") schoolyear = session['year'] # Get pupil data pupils = Pupils(schoolyear) pdata = pupils.pupil(pid) pname = pdata.name() klass = pdata.getKlass(withStream=True) # Get existing dates. db = DB(schoolyear) rows = db.select('GRADES', PID=pid) dates = [_NEWDATE] for row in db.select('GRADES', PID=pid): dates.append(row['TERM']) # If the stream, or even school-class have changed since an # existing report, the templates and available report types may be # different. To keep it simple, a list of all report types from the # configuration file GRADES.REPORT_TEMPLATES is presented for selection. # An invalid choice can be flagged at the next step. # If there is a mismatch between school-class/stream of the pupil as # selected on this page and that of the existing GRADES entry, a # warning can be shown at the next step. rtypes = [ rtype for rtype in CONF.GRADES.REPORT_TEMPLATES if rtype[0] != '_' ] kname = klass.klass stream = klass.stream form = _Form(KLASS=kname, STREAM=stream, RTYPE=_DEFAULT_RTYPE) form.KLASS.choices = [(k, k) for k in reversed(pupils.classes())] form.STREAM.choices = [(s, s) for s in CONF.GROUPS.STREAMS] form.EDITNEW.choices = [(d, d) for d in dates] form.RTYPE.choices = [(t, t) for t in rtypes] if form.validate_on_submit(): # POST klass = Klass.fromKandS(form.KLASS.data, form.STREAM.data) rtag = form.EDITNEW.data rtype = form.RTYPE.data kmap = CONF.GRADES.REPORT_TEMPLATES[rtype] tfile = klass.match_map(kmap) if tfile: return redirect( url_for('bp_grades.make1', pid=pid, kname=klass, rtag=rtag, rtype=rtype)) else: flash( "Zeugnistyp '%s' nicht möglich für Gruppe %s" % (rtype, klass), "Error") # GET return render_template(os.path.join(_BPNAME, 'pupil.html'), form=form, heading=_HEADING, klass=kname, pname=pname)