def render_mark_results_script(qtid, qid, marks, script): """Run the provided script to show the marking for the question. """ version = DB.get_q_version(qid) variation = DB.get_q_variation(qid) qvars = DB.get_qt_variation(qtid, variation, version) questionhtml = render_q_html(qid, readonly=True) reshtml = "" qvars["__builtins__"] = {'MyFuncs': OqeSmartmarkFuncs, 'withinTolerance': script_funcs.within_tolerance, 'math': math, 'round': round, 'float': float, 'log': script_funcs.result_log_fn(qid), 'dir': dir, 'abs': abs, 'None': None, 'True': True, 'False': False, 'questionHTML': questionhtml, 'int': int, 'resultsHTML': reshtml} qvars['markeroutput'] = marks guesses = [int(var[1:]) for var in marks.keys() if re.search(r"^G([0-9]+)$", var) > 0] answers = [int(var[1:]) for var in marks.keys() if re.search(r"^A([0-9]+)$", var) > 0] tolerances = [int(var[1:]) for var in marks.keys() if re.search(r"^T([0-9]+)$", var) > 0] scores = [int(var[1:]) for var in marks.keys() if re.search(r"^M([0-9]+)$", var) > 0] comments = [int(var[1:]) for var in marks.keys() if re.search(r"^C([0-9]+)$", var) > 0] qvars['guesses'] = {} qvars['answers'] = {} qvars['tolerances'] = {} qvars['scores'] = {} qvars['comments'] = {} for guess in guesses: qvars['guesses'][guess] = marks['G%d' % guess] for answer in answers: qvars['answers'][answer] = marks['A%d' % answer] for tolerance in tolerances: qvars['tolerances'][tolerance] = marks['T%d' % tolerance] for score in scores: qvars['scores'][score] = marks['M%d' % score] for comment in comments: qvars['comments'][comment] = marks['C%d' % comment] qvars['numparts'] = len(answers) qvars['parts'] = range(1, len(answers) + 1) try: exec (script, qvars) except BaseException: (etype, value, tb) = sys.exc_info() script_funcs.q_log(qid, "error", "__results.py", "Reverting to standard display: __results.py: %s" % ( traceback.format_exception(etype, value, tb)[-2:])) if 'resultsHTML' in qvars: if len(qvars['resultsHTML']) > 2: reshtml = qvars['resultsHTML'] for v in qvars.keys(): reshtml = reshtml.replace("<IMG SRC %s>" % v, '<IMG SRC="$OaQID$%s" />' % qvars[v]) reshtml = reshtml.replace("$OaQID$", "%d/" % qid) return reshtml script_funcs.q_log(qid, "error", "__results.py", "'resultsHTML' not set, using standard renderer.") return render_mark_results_standard(qid, marks)
def render_mark_results_script(qtid, qid, marks, script): """Run the provided script to show the marking for the question. """ version = DB.get_q_version(qid) variation = DB.get_q_variation(qid) qvars = DB.get_qt_variation(qtid, variation, version) questionhtml = render_q_html(qid, readonly=True) reshtml = "" qvars["__builtins__"] = { 'MyFuncs': OqeSmartmarkFuncs, 'withinTolerance': script_funcs.within_tolerance, 'math': math, 'round': round, 'float': float, 'log': script_funcs.result_log_fn(qid), 'dir': dir, 'abs': abs, 'None': None, 'True': True, 'False': False, 'questionHTML': questionhtml, 'int': int, 'resultsHTML': reshtml } qvars['markeroutput'] = marks guesses = [ int(var[1:]) for var in marks.keys() if re.search(r"^G([0-9]+)$", var) > 0 ] answers = [ int(var[1:]) for var in marks.keys() if re.search(r"^A([0-9]+)$", var) > 0 ] tolerances = [ int(var[1:]) for var in marks.keys() if re.search(r"^T([0-9]+)$", var) > 0 ] scores = [ int(var[1:]) for var in marks.keys() if re.search(r"^M([0-9]+)$", var) > 0 ] comments = [ int(var[1:]) for var in marks.keys() if re.search(r"^C([0-9]+)$", var) > 0 ] qvars['guesses'] = {} qvars['answers'] = {} qvars['tolerances'] = {} qvars['scores'] = {} qvars['comments'] = {} for guess in guesses: qvars['guesses'][guess] = marks['G%d' % guess] for answer in answers: qvars['answers'][answer] = marks['A%d' % answer] for tolerance in tolerances: qvars['tolerances'][tolerance] = marks['T%d' % tolerance] for score in scores: qvars['scores'][score] = marks['M%d' % score] for comment in comments: qvars['comments'][comment] = marks['C%d' % comment] qvars['numparts'] = len(answers) qvars['parts'] = range(1, len(answers) + 1) try: exec(script, qvars) except BaseException: (etype, value, tb) = sys.exc_info() script_funcs.q_log( qid, "error", "__results.py", "Reverting to standard display: __results.py: %s" % (traceback.format_exception(etype, value, tb)[-2:])) if 'resultsHTML' in qvars: if len(qvars['resultsHTML']) > 2: reshtml = qvars['resultsHTML'] for v in qvars.keys(): reshtml = reshtml.replace("<IMG SRC %s>" % v, '<IMG SRC="$OaQID$%s" />' % qvars[v]) reshtml = reshtml.replace("$OaQID$", "%d/" % qid) return reshtml script_funcs.q_log(qid, "error", "__results.py", "'resultsHTML' not set, using standard renderer.") return render_mark_results_standard(qid, marks)
def mark_q_script(qvars, script, answer): """ Use the given script to mark the question. """ marks = {} for name in qvars: try: # See if we can convert it to numeric form if "NaN" in qvars[name] or "inf" in qvars[name]: qvars[name] = "" qvars[name] = float(qvars[name]) except (KeyError, ValueError, TypeError): # Guess not pass parts = [int(var[1:]) for var in qvars.keys() if re.search("^A([0-9]+)$", var) > 0] # Set up the functions scripts can call qvars["__builtins__"] = {'MyFuncs': OqeSmartmarkFuncs, 'withinTolerance': script_funcs.within_tolerance, 'math': math, 'round': round, 'float': float, 'abs': abs, 'log': script_funcs.marker_log_fn, 'None': None, 'True': True, 'False': False} qvars['numanswers'] = len(parts) for part in parts: marks['A%d' % part] = qvars['A%d' % part] if 'A%d' % part in qvars: try: # See if we can convert it to numeric form qvars['A%d' % part] = float(qvars['A%d' % part]) except (KeyError, ValueError, TypeError): # Guess not pass else: qvars['A%d' % part] = None if ('G%d' % part) in answer: guess = answer['G%d' % part] try: # See if we can convert it to numeric form qvars['G%d' % part] = float(guess) except (KeyError, ValueError, TypeError): try: # How about exponential? (st, flt) = parseexpo(guess) if flt: qvars['G%d' % part] = flt else: # Occasionally people use , instead of . # which is ok in Europe. guess = guess.replace(",", ".") flt = float(guess) qvars['G%d' % part] = flt except (KeyError, ValueError, TypeError): # treat it as string qvars['G%d' % part] = answer['G%d' % part] else: qvars['G%d' % part] = "None" if qvars['G%d' % part] == "": qvars['G%d' % part] = "None" try: qid = qvars['OaQID'] except KeyError: qid = -1 try: exec (script, qvars) except BaseException: (etype, value, tb) = sys.exc_info() script_funcs.q_log(qid, "error", "__marker.py", "Falling back to standard marker __marker.py: %s" % ( traceback.format_exception(etype, value, tb)[-2:])) try: qid = qvars['OaQID'] except KeyError: qid = -1 if 'C0' in qvars: parts.append(0) for part in parts: if not part == 0: marks["M%d" % part] = qvars["M%d" % part] comment = qvars["C%d" % part] for v in qvars.keys(): comment = comment.replace("<VAL %s>" % v, '%s' % qvars[v]) comment = comment.replace("<IMG SRC %s>" % v, '<IMG SRC="$OaQID$%s" />' % qvars[v]) comment = comment.replace("<ATT SRC %s>" % v, '<A HREF="$OaQID$%s" TARGET="_new">(View in New Window)</a>' % qvars[v]) # Run twice to cope with basic nesting. for v in qvars.keys(): comment = comment.replace("<VAL %s>" % v, '%s' % qvars[v]) comment = comment.replace("<IMG SRC %s>" % v, '<IMG SRC="$OaQID$%s" />' % qvars[v]) comment = comment.replace("<ATT SRC %s>" % v, '<A HREF="$OaQID$%s" TARGET="_new">(View in New Window)</a>' % qvars[v]) comment = comment.replace("$OaQID$", "%d/" % qid) marks["C%d" % part] = comment if not part == 0: marks["G%d" % part] = qvars["G%d" % part] marks["T%d" % part] = qvars["T%d" % part] return marks
def mark_q_script(qvars, script, answer): """ Use the given script to mark the question. """ marks = {} for name in qvars: try: # See if we can convert it to numeric form if "NaN" in qvars[name] or "inf" in qvars[name]: qvars[name] = "" qvars[name] = float(qvars[name]) except (KeyError, ValueError, TypeError): # Guess not pass parts = [ int(var[1:]) for var in qvars.keys() if re.search("^A([0-9]+)$", var) > 0 ] # Set up the functions scripts can call qvars["__builtins__"] = { 'MyFuncs': OqeSmartmarkFuncs, 'withinTolerance': script_funcs.within_tolerance, 'math': math, 'round': round, 'float': float, 'abs': abs, 'log': script_funcs.marker_log_fn, 'None': None, 'True': True, 'False': False } qvars['numanswers'] = len(parts) for part in parts: marks['A%d' % part] = qvars['A%d' % part] if 'A%d' % part in qvars: try: # See if we can convert it to numeric form qvars['A%d' % part] = float(qvars['A%d' % part]) except (KeyError, ValueError, TypeError): # Guess not pass else: qvars['A%d' % part] = None if ('G%d' % part) in answer: guess = answer['G%d' % part] try: # See if we can convert it to numeric form qvars['G%d' % part] = float(guess) except (KeyError, ValueError, TypeError): try: # How about exponential? (st, flt) = parseexpo(guess) if flt: qvars['G%d' % part] = flt else: # Occasionally people use , instead of . # which is ok in Europe. guess = guess.replace(",", ".") flt = float(guess) qvars['G%d' % part] = flt except (KeyError, ValueError, TypeError): # treat it as string qvars['G%d' % part] = answer['G%d' % part] else: qvars['G%d' % part] = "None" if qvars['G%d' % part] == "": qvars['G%d' % part] = "None" try: qid = qvars['OaQID'] except KeyError: qid = -1 try: exec(script, qvars) except BaseException: (etype, value, tb) = sys.exc_info() script_funcs.q_log( qid, "error", "__marker.py", "Falling back to standard marker __marker.py: %s" % (traceback.format_exception(etype, value, tb)[-2:])) try: qid = qvars['OaQID'] except KeyError: qid = -1 if 'C0' in qvars: parts.append(0) for part in parts: if not part == 0: marks["M%d" % part] = qvars["M%d" % part] comment = qvars["C%d" % part] for v in qvars.keys(): comment = comment.replace("<VAL %s>" % v, '%s' % qvars[v]) comment = comment.replace("<IMG SRC %s>" % v, '<IMG SRC="$OaQID$%s" />' % qvars[v]) comment = comment.replace( "<ATT SRC %s>" % v, '<A HREF="$OaQID$%s" TARGET="_new">(View in New Window)</a>' % qvars[v]) # Run twice to cope with basic nesting. for v in qvars.keys(): comment = comment.replace("<VAL %s>" % v, '%s' % qvars[v]) comment = comment.replace("<IMG SRC %s>" % v, '<IMG SRC="$OaQID$%s" />' % qvars[v]) comment = comment.replace( "<ATT SRC %s>" % v, '<A HREF="$OaQID$%s" TARGET="_new">(View in New Window)</a>' % qvars[v]) comment = comment.replace("$OaQID$", "%d/" % qid) marks["C%d" % part] = comment if not part == 0: marks["G%d" % part] = qvars["G%d" % part] marks["T%d" % part] = qvars["T%d" % part] return marks