Beispiel #1
0
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})
Beispiel #2
0
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)
Beispiel #3
0
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})
Beispiel #4
0
 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))
Beispiel #5
0
 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()))
Beispiel #6
0
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)
Beispiel #7
0
 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()))
Beispiel #8
0
 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]))
Beispiel #9
0
 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()))
Beispiel #10
0
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({})
Beispiel #11
0
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)