示例#1
0
def fix_ghost_submission(lti, lti_exception=None):
    my_course_stuff = Submission.query.filter_by(course_id=8).all()
    result = []
    for row in my_course_stuff:
        meta_course = Submission.query.filter_by(course_id=3, assignment_id=row.assignment_id,
                                              user_id=row.user_id).first()
        if meta_course is not None:
            row.code = meta_course.code
            row.correct = meta_course.correct
            row.assignment_version = meta_course.assignment_version
            row.version = meta_course.version
            db.session.commit()
            if row.url:
                code = highlight(row.code, PythonLexer(), HtmlFormatter())
                image_url = url_for('blockpy.get_submission_image', submission_id=row.id, _external=True)
                url = url_for('blockpy.get_submission_code', submission_id=row.id, _external=True)
                potential_image = "Submitted Blocks:<br><img src='{0}'>".format(image_url)
                if row.correct:
                    message = "Success!"
                else:
                    message = "Incomplete"
                body = '''
                <h1>{message}</h1>
                <div>Latest work in progress: <a href='{url}' target='_blank'>View</a></div>
                <div>Touches: {touches}</div>
                {potential_image}
                <br>
                Submitted code:<br>
                {code}
                '''.format(message=message, url=url, touches=row.version, code=code, potential_image=potential_image)
                lti.post_grade(float(row.correct), body, endpoint=row.url)
            result.append(["Changed", row.assignment_id, row.user_id, "to", meta_course.code, meta_course.correct, row.url])
    return jsonify(result=result)
示例#2
0
def submit_explain(lti=lti):
    assignment_id = request.form.get('assignment_id', None)
    course_id = request.values.get('course_id',
                                   g.course.id if 'course' in g else None)
    if None in (assignment_id, course_id):
        return jsonify(success=False,
                       message="No Assignment ID or Course ID given!")
    assignment = Assignment.by_id(int(assignment_id))
    submission = Submission.save_correct(g.user.id, int(assignment_id),
                                         int(course_id))

    lis_result_sourcedid = request.form.get('lis_result_sourcedid',
                                            submission.url) or None
    code, elements = submission.load_explanation(4)
    if lis_result_sourcedid is None or lis_result_sourcedid == "NOT IN SESSION":
        return jsonify(success=False, message="Not in a grading context.")
    hl_lines = [e['line'][0] for e in elements]
    message = """<h1>Code Annotation</h1>
    <div>Thank you for submitting. This activity will be graded manually, so please be patient!</div>
    <div><ul><li>{explanations}</li></ul></div>
    <div>{code}</div>
    """.format(code=highlight(
        code, PythonLexer(),
        HtmlFormatter(linenos=True, hl_lines=hl_lines, noclasses=True)),
               explanations='</li><li>'.join([
                   '<b>{line} ({type}):</b> {answer}'.format(
                       line=e['line'][0],
                       answer=e['answer'],
                       type=Submission.abbreviate_element_type(e['name']))
                   for e in sorted(elements, key=lambda e: e['line'][0])
               ]))
    lti.post_grade(0, message, endpoint=lis_result_sourcedid)
    return jsonify(success=True)
示例#3
0
def submit_explain(lti=lti):
    assignment_id = request.form.get('assignment_id', None)
    course_id = request.values.get('course_id', g.course.id if 'course' in g else None)
    if None in (assignment_id, course_id):
        return jsonify(success=False, message="No Assignment ID or Course ID given!")
    assignment = Assignment.by_id(int(assignment_id))
    submission = Submission.save_correct(g.user.id, int(assignment_id), int(course_id))
    
    lis_result_sourcedid = request.form.get('lis_result_sourcedid', submission.url) or None
    code, elements = submission.load_explanation(4)
    if lis_result_sourcedid is None or lis_result_sourcedid == "NOT IN SESSION":
        return jsonify(success=False, message="Not in a grading context.")
    hl_lines  = [e['line'][0] for e in elements]
    message = """<h1>Code Annotation</h1>
    <div>Thank you for submitting. This activity will be graded manually, so please be patient!</div>
    <div><ul><li>{explanations}</li></ul></div>
    <div>{code}</div>
    """.format(
        code = highlight(code, PythonLexer(), HtmlFormatter(linenos=True, hl_lines=hl_lines, noclasses=True)),
        explanations = '</li><li>'.join(
            ['<b>{line} ({type}):</b> {answer}'.format(line=e['line'][0], 
                                                      answer=e['answer'], 
                                                      type=Submission.abbreviate_element_type(e['name']))
             for e in sorted(elements, key=lambda e: e['line'][0])])
        )
    lti.post_grade(0, message, endpoint=lis_result_sourcedid)   
    return jsonify(success=True)
示例#4
0
def fix_ghost_submission(lti, lti_exception=None):
    my_course_stuff = Submission.query.filter_by(course_id=8).all()
    result = []
    for row in my_course_stuff:
        meta_course = Submission.query.filter_by(course_id=3, assignment_id=row.assignment_id,
                                              user_id=row.user_id).first()
        if meta_course is not None:
            row.code = meta_course.code
            row.correct = meta_course.correct
            row.assignment_version = meta_course.assignment_version
            row.version = meta_course.version
            db.session.commit()
            if row.url:
                code = highlight(row.code, PythonLexer(), HtmlFormatter())
                image_url = url_for('blockpy.get_submission_image', submission_id=row.id, _external=True)
                url = url_for('blockpy.get_submission_code', submission_id=row.id, _external=True)
                potential_image = "Submitted Blocks:<br><img src='{0}'>".format(image_url)
                if row.correct:
                    message = "Success!"
                else:
                    message = "Incomplete"
                body = '''
                <h1>{message}</h1>
                <div>Latest work in progress: <a href='{url}' target='_blank'>View</a></div>
                <div>Touches: {touches}</div>
                {potential_image}
                <br>
                Submitted code:<br>
                {code}
                '''.format(message=message, url=url, touches=row.version, code=code, potential_image=potential_image)
                lti.post_grade(float(row.correct), body, endpoint=row.url)
            result.append(["Changed", row.assignment_id, row.user_id, "to", meta_course.code, meta_course.correct, row.url])
    return jsonify(result=result)
示例#5
0
def save_correct(lti, lti_exception=None):
    assignment_id = request.values.get('assignment_id', None)
    assignment_group_id = request.values.get('group_id', None)
    status = float(request.values.get('status', "0.0"))
    image = request.values.get('image', "")
    hide_correctness = request.values.get('hide_correctness',
                                          "false") == "true"
    force_update = request.values.get('force_update', "false") == "true"
    course_id = request.values.get('course_id',
                                   g.course.id if 'course' in g else None)
    if course_id == -1 or lti is None:
        return failure("No Assignment ID or Course ID given!")
    if None in (assignment_id, course_id):
        return failure("No Assignment ID or Course ID given!")
    assignment = Assignment.by_id(assignment_id)
    if status >= 1:
        submission = Submission.save_correct(g.user.id,
                                             assignment_id,
                                             course_id=int(course_id))
    else:
        submission = assignment.get_submission(g.user.id, course_id=course_id)
    was_changed = submission.set_status(int(100 * status))
    if not force_update and not was_changed:
        return jsonify(success=True,
                       submitted=False,
                       message="No grade change",
                       ip=request.remote_addr)
    lis_result_sourcedid = request.values.get('lis_result_sourcedid',
                                              submission.url) or None
    if lis_result_sourcedid is None:
        return jsonify(success=True,
                       submitted=False,
                       message="Not in a grading context.",
                       ip=request.remote_addr)
    session['lis_result_sourcedid'] = lis_result_sourcedid
    image_url = submission.save_block_image(image)

    if assignment_group_id != None and assignment_group_id != '' and assignment_group_id != 'None':
        score = get_group_score(int(assignment_group_id), g.user.id,
                                int(course_id), hide_correctness)
        url = url_for('blockpy.view_current_group',
                      group_id=int(assignment_group_id),
                      course_id=int(course_id),
                      user_id=g.user.id,
                      _external=True)
        report = "<a href='{url}'>View Group</a>".format(url=url)
    else:
        score = float(submission.correct) or status
        url = url_for('blockpy.view_current_assignment',
                      assignment_id=int(assignment_id),
                      course_id=int(course_id),
                      user_id=g.user.id,
                      _external=True)
        report = "<a href='{url}'>View Assignment</a>".format(url=url)
    lti.post_grade(score, report, endpoint=lis_result_sourcedid)
    return jsonify(success=True, submitted=True, ip=request.remote_addr)
示例#6
0
def lti_post_grade(lti, submission, lis_result_sourcedid, assignment_group_id, user_id, course_id):
    total_score, view_url = get_outcomes(submission, assignment_group_id, user_id, course_id)
    lis_result_sourcedid = submission.endpoint if lis_result_sourcedid is None else lis_result_sourcedid
    if 'lis_outcome_service_url' not in session:
        course = Course.by_id(course_id)
        session['lis_outcome_service_url'] = course.endpoint
    session['lis_result_sourcedid'] = lis_result_sourcedid
    if lis_result_sourcedid and lti:
        lti.post_grade(total_score, view_url, endpoint=lis_result_sourcedid, url=True)
        return True, total_score
    return False, total_score
示例#7
0
def save_correct(lti, lti_exception=None):
    assignment_id = request.form.get('assignment_id', None)
    status = float(request.form.get('status', "0.0"))
    image = request.form.get('image', "")
    course_id = request.form.get('course_id', g.course.id)
    if None in (assignment_id, course_id):
        return jsonify(success=False, message="No Assignment ID or Course ID given!")
    assignment = Assignment.by_id(assignment_id)
    if status == 1:
        submission = Submission.save_correct(g.user.id, assignment_id, course_id=int(course_id))
    else:
        submission = assignment.get_submission(g.user.id, course_id=course_id)
    if submission.correct:
        message = "Success!"
    else:
        message = "Incomplete"
    sub_blocks_folder = os.path.join(app.config['UPLOADS_DIR'], 'submission_blocks')
    image_path = os.path.join(sub_blocks_folder, str(submission.id)+'.png')
    if image != "":
        converted_image = image[22:].decode('base64')
        with open(image_path, 'wb') as image_file:
            image_file.write(converted_image);
        image_url = url_for('blockpy.get_submission_image', submission_id=submission.id, _external=True)
    elif os.path.exists(image_path):
        try:
            os.remove(image_path)
        except Exception:
            app.logger.info("Could not delete")
    lis_result_sourcedid = request.form.get('lis_result_sourcedid', submission.url) or None
    url = url_for('blockpy.get_submission_code', submission_id=submission.id, _external=True)
    print url
    if lis_result_sourcedid is None:
        return jsonify(success=False, message="Not in a grading context.")
    else:
        session['lis_result_sourcedid'] = lis_result_sourcedid
    if assignment.mode == 'maze':
        lti.post_grade(float(submission.correct), "<h1>{0}</h1>".format(message), endpoint=lis_result_sourcedid);
    else:
        code = highlight(submission.code, PythonLexer(), HtmlFormatter())
        potential_image = "Submitted Blocks:<br><img src='{0}'>".format(image_url) if image else ""
        body = '''
        <h1>{message}</h1>
        <div>Latest work in progress: <a href='{url}' target='_blank'>View</a></div>
        <div>Touches: {touches}</div>
        {potential_image}
        <br>
        Submitted code:<br>
        {code}
        '''.format(message=message, url=url, touches=submission.version, code=code, potential_image=potential_image)
        lti.post_grade(float(submission.correct), body, endpoint=lis_result_sourcedid)
    return jsonify(success=True)
示例#8
0
def save_correct(lti, lti_exception=None):
    assignment_id = request.values.get('assignment_id', None)
    status = float(request.values.get('status', "0.0"))
    image = request.values.get('image', "")
    course_id = request.values.get('course_id', g.course.id if 'course' in g else None)
    if None in (assignment_id, course_id):
        return jsonify(success=False, message="No Assignment ID or Course ID given!")
    assignment = Assignment.by_id(assignment_id)
    if status == 1:
        submission = Submission.save_correct(g.user.id, assignment_id, course_id=int(course_id))
    else:
        submission = assignment.get_submission(g.user.id, course_id=course_id)
    if submission.correct:
        message = "Success!"
    else:
        message = "Incomplete"
    sub_blocks_folder = os.path.join(app.config['UPLOADS_DIR'], 'submission_blocks')
    image_path = os.path.join(sub_blocks_folder, str(submission.id)+'.png')
    if image != "":
        converted_image = image[22:].decode('base64')
        with open(image_path, 'wb') as image_file:
            image_file.write(converted_image);
        image_url = url_for('blockpy.get_submission_image', submission_id=submission.id, _external=True)
    elif os.path.exists(image_path):
        try:
            os.remove(image_path)
        except Exception:
            app.logger.info("Could not delete")
    lis_result_sourcedid = request.values.get('lis_result_sourcedid', submission.url) or None
    url = url_for('blockpy.get_submission_code', submission_id=submission.id, _external=True)
    if lis_result_sourcedid is None:
        return jsonify(success=False, message="Not in a grading context.")
    else:
        session['lis_result_sourcedid'] = lis_result_sourcedid
    if assignment.mode == 'maze':
        lti.post_grade(float(submission.correct), "<h1>{0}</h1>".format(message), endpoint=lis_result_sourcedid);
    else:
        formatter = HtmlFormatter(linenos=True, noclasses=True)
        code = highlight(submission.code, PythonLexer(), formatter)
        potential_image = "Submitted Blocks:<br><img src='{0}'>".format(image_url) if image else ""
        body = '''
        <h1>{message}</h1>
        <div>Latest work in progress: <a href='{url}' target='_blank'>View</a></div>
        <div>Touches: {touches}</div>
        {potential_image}
        <br>
        Submitted code:<br>
        {code}
        '''.format(message=message, url=url, touches=submission.version, code=code, potential_image=potential_image)
        lti.post_grade(float(submission.correct), body, endpoint=lis_result_sourcedid)
    return jsonify(success=True)