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)
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)
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)
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)
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
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)
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)