def getGradeData(schoolyear, pid, term): """Return all the data from the database GRADES table for the given pupil as a mapping. Either term or – in the case of "extra" reports – date is supplied to key the entry. The string in field 'GRADES' is converted to a mapping. If there is grade data, its validity is checked. If there is no grade data, this field is <None>. """ db = DB(schoolyear) gdata = db.select1('GRADES', PID=pid, TERM=term) if gdata: # Convert the grades to a <dict> gmap = dict(gdata) try: gmap['GRADES'] = grades2map(gdata['GRADES']) except ValueError: REPORT.Fail(_BAD_GRADE_DATA, pid=pid, term=term) return gmap return None
def db2grades(schoolyear, term, klass, checkonly=False): """Fetch the grades for the given school-class/group, term, schoolyear. Return a list [(pid, pname, {subject -> grade}), ...] <klass> is a <Klass> instance, which can include a list of streams (including '_' for pupils without a stream). If there are streams, only grades for pupils in one of these streams will be included. """ slist = klass.streams plist = [] # Get the pupils from the pupils db and search for grades for these. pupils = Pupils(schoolyear) db = DB(schoolyear) for pdata in pupils.classPupils(klass): # Check pupil's stream if there is a stream filter pstream = pdata['STREAM'] if slist and (pstream not in slist): continue pid = pdata['PID'] gdata = db.select1('GRADES', PID=pid, TERM=term) if gdata: gstring = gdata['GRADES'] or None if gstring: if gdata['KLASS'] != klass.klass or gdata['STREAM'] != pstream: # Pupil has switched klass and/or stream. # This can only be handled via individual view. gstring = None else: gstring = None if gstring and not checkonly: try: gmap = grades2map(gstring) except ValueError: REPORT.Fail(_BAD_GRADE_DATA, pid=pid, term=term) plist.append((pid, pdata.name(), gmap)) else: plist.append((pid, pdata.name(), gstring)) return plist