def save_student_file(filename, course_id, user): submission_id = request.values.get("submission_id") code = request.values.get("code") submission = Submission.query.get(submission_id) # Verify exists check_resource_exists(submission, "Submission", submission_id) # Verify permissions if submission.user_id != user.id: require_course_grader(user, submission.course_id) # Validate the maximum file size if app.config["MAXIMUM_CODE_SIZE"] < len(code): return ajax_failure( "Maximum size of code exceeded. Current limit is {}, you uploaded {} characters." .format(app.config["MAXIMUM_CODE_SIZE"], len(code))) # Perform update # TODO: What if submission's assignment version conflicts with current assignments' version? version_change = submission.assignment.version != submission.assignment_version submission.save_code(filename, code) make_log_entry(submission.assignment_id, submission.assignment_version, course_id, user.id, "File.Edit", "answer.py", message=code) return ajax_success({"version_change": version_change})
def view_submissions(course_id, user_id, assignment_group_id): embed = maybe_bool(request.values.get('embed')) viewer, viewer_id = get_user() group, assignments, submissions = get_groups_submissions( assignment_group_id, user_id, course_id) # Check permissions for submission in submissions: if not submission: return ajax_failure( "No submission for the given course, user, and group.") elif submission.user_id != viewer_id: require_course_grader(viewer, submission.course_id) # Do action points_total, points_possible = calculate_submissions_score( assignments, submissions) score = round(points_total / points_possible, 2) # TODO: Handle tags is_grader = viewer.is_grader(course_id) tags = [] if is_grader: tags = [tag.encode_json() for tag in AssignmentTag.get_all()] return render_template("reports/group.html", embed=embed, points_total=points_total, points_possible=points_possible, score=score, tags=tags, is_grader=is_grader, group=list(zip(assignments, submissions)), user_id=user_id, course_id=course_id)
def save_assignment(lti=lti): assignment_id = request.values.get('assignment_id') user, user_id = get_user() course_id = get_course_id() assignment = Assignment.query.get(assignment_id) # Verify exists check_resource_exists(assignment, "Assignment", assignment_id) # Verify permissions if assignment.owner_id != user.id: require_course_grader(user, assignment.course_id) # Parse new settings updates = {} if "hidden" in request.values: updates["hidden"] = maybe_bool(request.values.get("hidden")) if "reviewed" in request.values: updates["reviewed"] = maybe_bool(request.values.get("reviewed")) if "public" in request.values: updates["public"] = maybe_bool(request.values.get("public")) if "url" in request.values: updates["url"] = request.values.get("url") or None if "ip_ranges" in request.values: updates["ip_ranges"] = request.values.get("ip_ranges") if "name" in request.values: updates["name"] = request.values.get("name") if "settings" in request.values: updates["settings"] = request.values.get("settings") # Perform update modified = assignment.edit(updates) make_log_entry(assignment.id, assignment.version, course_id or assignment.course_id, user.id, "X-Instructor.Settings.Edit", "assignment_settings.blockpy", message=json.dumps(updates)) return ajax_success({"modified": modified})
def delete(self, review_id): user, user_id = get_user() review = Review.by_id(review_id) check_resource_exists(review, "Review", review_id) submission = Submission.by_id(review.submission_id) check_resource_exists(submission, "Submission", review.submission_id) require_course_grader(user, submission.course_id) review.delete() return ajax_success(dict(success=True))
def get_one(self, review_id): user, user_id = get_user() review = Review.by_id(review_id) check_resource_exists(review, "Review", review_id) submission = Submission.by_id(review.submission_id) check_resource_exists(submission, "Submission", review.submission_id) if submission.user_id != user_id: require_course_grader(user, submission.course_id) return ajax_success(dict(review=review.encode_json()))
def get_submission_image(lti=lti): submission_id = int(request.values.get('submission_id')) relative_image_path = 'uploads/submission_blocks/{}.png'.format(submission_id) submission = Submission.query.get(submission_id) user, user_id = get_user() # Check exists check_resource_exists(submission, "Submission", submission_id) # Check permissions if submission.user_id != user_id: require_course_grader(user, submission.course_id) # Do action return app.send_static_file(relative_image_path)
def put(self, review_id): user, user_id = get_user() review = Review.by_id(review_id) check_resource_exists(review, "Review", review_id) submission = Submission.by_id(review.submission_id) check_resource_exists(submission, "Submission", review.submission_id) require_course_grader(user, submission.course_id) review_data = request.json.copy() del review_data['id'] fix_nullables(review_data) review_data['author_id'] = user_id edited_review = review.edit(review_data) return ajax_success(dict(review=edited_review.encode_json()))
def get_all(self): submission_id = maybe_int(request.values.get('submission_id')) user, user_id = get_user() if submission_id is None: reviews = Review.get_generic_reviews() else: submission = Submission.by_id(submission_id) check_resource_exists(submission, "Submission", submission_id) reviews = Review.get_for_submission(submission_id) if submission.user_id != user_id: require_course_grader(user, submission.course_id) return ajax_success( dict(reviews=[review.encode_json() for review in reviews]))
def post(self): user, user_id = get_user() submission_id = maybe_int(request.values.get('submission_id')) submission = Submission.by_id(submission_id) check_resource_exists(submission, "Submission", submission_id) require_course_grader(user, submission.course_id) review_data = request.values.copy() del review_data['id'] review_data['author_id'] = user_id review_data['submission_version'] = submission.version review_data['assignment_version'] = submission.assignment_version fix_nullables(review_data) new_review = Review.new(review_data) return ajax_success(dict(review=new_review.encode_json()))
def save_instructor_file(course_id, user, filename): assignment_id = request.values.get("assignment_id") code = request.values.get("code") assignment = Assignment.query.get(assignment_id) # Verify exists check_resource_exists(assignment, "Assignment", assignment_id) # Verify permissions if assignment.owner_id != user.id: require_course_grader(user, assignment.course_id) # Perform update assignment.save_file(filename, code) make_log_entry(assignment_id, assignment.version, course_id, user.id, "X-Instructor.File.Edit", filename, message=code) return ajax_success({})
def view_submission(): submission_id = request.values.get('submission_id') viewer, viewer_id = get_user() embed = maybe_bool(request.values.get('embed')) submission = Submission.by_id(submission_id) # Check exists check_resource_exists(submission, "Submission", submission_id) # Check permissions if submission.user_id != viewer_id: require_course_grader(viewer, submission.course_id) is_grader = viewer.is_grader(submission.course_id) tags = [] if is_grader: tags = [tag.encode_json() for tag in AssignmentTag.get_all()] # Do action return render_template("reports/alone.html", embed=embed, submission=submission, assignment=submission.assignment, is_grader=is_grader, tags=tags, user_id=submission.user_id, course_id=submission.course_id)