Example #1
0
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)
Example #2
0
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)
Example #3
0
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
Example #4
0
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