예제 #1
0
def grading_view(backup, form=None):
    """ General purpose grading view. Used by routes."""
    courses, current_course = get_courses()
    assign = backup.assignment
    diff_type = request.args.get('diff', None)
    if diff_type not in (None, 'short', 'full'):
        diff_type = None
    if not assign.files and diff_type:
        diff_type = None

    # sort comments by (filename, line)
    comments = collections.defaultdict(list)
    for comment in backup.comments:
        comments[(comment.filename, comment.line)].append(comment)

    # highlight files and add comments
    files = highlight.diff_files(assign.files, backup.files(), diff_type)
    for filename, lines in files.items():
        for line in lines:
            line.comments = comments[(filename, line.line_after)]

    group = [User.query.get(o) for o in backup.owners()]
    scores = [s for s in backup.scores if not s.archived]
    task = backup.grading_tasks
    if task:
        # Choose the first grading_task
        task = task[0]

    return render_template(
        'staff/grading/code.html', courses=courses, assignment=assign,
        backup=backup, group=group, scores=scores, files=files,
        diff_type=diff_type, task=task, form=form
    )
예제 #2
0
def code(name, submit, bid):
    assign = get_assignment(name)
    backup = Backup.query.get(bid)

    if not (backup and Backup.can(backup, current_user, "view")):
        abort(404)
    if backup.submit != submit:
        return redirect(
            url_for('.code', name=name, submit=backup.submit, bid=bid))

    diff_type = request.args.get('diff')
    if diff_type not in (None, 'short', 'full'):
        return redirect(url_for('.code', name=name, submit=submit, bid=bid))
    if not assign.files and diff_type:
        return abort(404)

    # sort comments by (filename, line)
    comments = collections.defaultdict(list)
    for comment in backup.comments:
        comments[(comment.filename, comment.line)].append(comment)
    # highlight files and add comments
    files = highlight.diff_files(assign.files, backup.files(), diff_type)
    for filename, lines in files.items():
        for line in lines:
            line.comments = comments[(filename, line.line_after)]
    return render_template('student/assignment/code.html',
                           course=assign.course,
                           assignment=assign,
                           backup=backup,
                           files=files,
                           diff_type=diff_type)
예제 #3
0
def code(name, submit, bid):
    assign = get_assignment(name)
    backup = Backup.query.get(bid)

    if not (backup and Backup.can(backup, current_user, "view")):
        abort(404)
    if backup.submit != submit:
        return redirect(url_for('.code', name=name, submit=backup.submit, bid=bid))

    diff_type = request.args.get('diff')
    if diff_type not in (None, 'short', 'full'):
        return redirect(url_for('.code', name=name, submit=submit, bid=bid))
    if not assign.files and diff_type:
        return abort(404)

    # sort comments by (filename, line)
    comments = collections.defaultdict(list)
    for comment in backup.comments:
        comments[(comment.filename, comment.line)].append(comment)
    # highlight files and add comments
    files = highlight.diff_files(assign.files, backup.files(), diff_type)
    for filename, source_file in files.items():
        for line in source_file.lines:
            line.comments = comments[(filename, line.line_after)]
    return render_template('student/assignment/code.html',
        course=assign.course, assignment=assign, backup=backup,
        files=files, diff_type=diff_type)
예제 #4
0
파일: admin.py 프로젝트: gratimax/ok
def grading_view(backup, form=None):
    """ General purpose grading view. Used by routes."""
    courses, current_course = get_courses()
    assign = backup.assignment
    diff_type = request.args.get('diff', None)
    if diff_type not in (None, 'short', 'full'):
        diff_type = None
    if not assign.files and diff_type:
        diff_type = None

    # sort comments by (filename, line)
    comments = collections.defaultdict(list)
    for comment in backup.comments:
        comments[(comment.filename, comment.line)].append(comment)

    # highlight files and add comments
    files = highlight.diff_files(assign.files, backup.files(), diff_type)
    for filename, lines in files.items():
        for line in lines:
            line.comments = comments[(filename, line.line_after)]

    group = [User.query.get(o) for o in backup.owners()]
    scores = [s for s in backup.scores if not s.archived]
    task = backup.grading_tasks
    if task:
        # Choose the first grading_task
        task = task[0]

    return render_template(
        'staff/grading/code.html', courses=courses, assignment=assign,
        backup=backup, group=group, scores=scores, files=files,
        diff_type=diff_type, task=task, form=form
    )
예제 #5
0
def get_diffs(backups, backup_id, partner_backups, bound=10):
    """
    Given a list `backups`, a `backup_id`, and `bound`
    Compute the a dict containing diffs/stats of surronding the `backup_id`:
        diff_dict = {
        "stats": diff_stats_list,
        "files": files_list,
        "partners": partner_files_list,
        "prev_backup_id": prev_backup_id,
        "backup_id": backup_id,
        "next_backup_id": next_backup_id
    }
    return {} if `backup_id` not found
    """
    backup_dict = _get_backup_range(backups, backup_id, bound)
    if not backup_dict:
        return {}

    backups = backup_dict["backups"]
    backup_id = backup_dict["backup_id"] # relevant backup_id might be different
    prev_backup_id = backup_dict["prev_backup_id"]
    next_backup_id = backup_dict["next_backup_id"]

    get_recent_backup = _recent_backup_finder(partner_backups)
    assign_files = backups[0].assignment.files
    files_list, diff_stats_list, partner_files_list = [], [], []
    for i, backup in enumerate(backups):
        if not i: # first unique backup => no diff
            continue

        prev = backups[i - 1].files()
        curr = backup.files()
        files = highlight.diff_files(prev, curr, "short")
        files_list.append(files)

        backup_stats = {
            'submitter': backup.submitter.email,
            'backup_id' : backup.hashid,
            'bid': backup.id,
            'partner_backup_id': None,
            'partner_bid': None,
            'question': None,
            'time': None,
            'passed': None,
            'failed': None
        }

        analytics = backup and backup.analytics()
        grading = backup and backup.grading()

        partner_backup_files = None

        if analytics:
            backup_stats['time'] = analytics.get('time')
            partner_backup = get_recent_backup(analytics)
            if partner_backup:
                backup_stats["partner_backup_id"] = partner_backup.hashid
                backup_stats["partner_bid"] = partner_backup.id
                partner_backup_files = highlight.diff_files(partner_backup.files(), curr, "short")

        if grading:
            questions = list(grading.keys())
            question = None
            passed, failed = 0, 0
            for question in questions:
                passed += grading.get(question).get('passed')
                passed += grading.get(question).get('failed')
            if len(questions) > 1:
                question = questions

            backup_stats['question'] = question
            backup_stats['passed'] = passed
            backup_stats['failed'] = failed
        else:
            unlock = backup.unlocking()
            backup_stats['question'] = "[Unlocking] " + unlock.split(">")[0]

        diff_stats_list.append(backup_stats)
        partner_files_list.append(partner_backup_files)

    diff_dict = {
        "stats": diff_stats_list,
        "files": files_list,
        "partners": partner_files_list,
        "prev_backup_id": prev_backup_id,
        "backup_id": backup_id,
        "next_backup_id": next_backup_id
    }
    return diff_dict
예제 #6
0
def get_diffs(backups, backup_id, partner_backups, bound=10):
    """
    Given a list `backups`, a `backup_id`, and `bound`
    Compute the a dict containing diffs/stats of surronding the `backup_id`:
        diff_dict = {
        "stats": diff_stats_list,
        "files": files_list,
        "partners": partner_files_list,
        "prev_backup_id": prev_backup_id,
        "backup_id": backup_id,
        "next_backup_id": next_backup_id
    }
    return {} if `backup_id` not found
    """
    backup_dict = _get_backup_range(backups, backup_id, bound)
    if not backup_dict:
        return {}

    backups = backup_dict["backups"]
    backup_id = backup_dict[
        "backup_id"]  # relevant backup_id might be different
    prev_backup_id = backup_dict["prev_backup_id"]
    next_backup_id = backup_dict["next_backup_id"]

    get_recent_backup = _recent_backup_finder(partner_backups)
    assign_files = backups[0].assignment.files
    files_list, diff_stats_list, partner_files_list = [], [], []
    for i, backup in enumerate(backups):
        if not i:  # first unique backup => no diff
            continue

        prev = backups[i - 1].files()
        curr = backup.files()
        files = highlight.diff_files(prev, curr, "short")
        files_list.append(files)

        backup_stats = {
            'submitter': backup.submitter.email,
            'backup_id': backup.hashid,
            'bid': backup.id,
            'partner_backup_id': None,
            'partner_bid': None,
            'question': None,
            'time': None,
            'passed': None,
            'failed': None
        }

        analytics = backup and backup.analytics()
        grading = backup and backup.grading()

        partner_backup_files = None

        if analytics:
            backup_stats['time'] = analytics.get('time')
            partner_backup = get_recent_backup(analytics)
            if partner_backup:
                backup_stats["partner_backup_id"] = partner_backup.hashid
                backup_stats["partner_bid"] = partner_backup.id
                partner_backup_files = highlight.diff_files(
                    partner_backup.files(), curr, "short")

        if grading:
            questions = list(grading.keys())
            question = None
            passed, failed = 0, 0
            for question in questions:
                passed += grading.get(question).get('passed')
                passed += grading.get(question).get('failed')
            if len(questions) > 1:
                question = questions

            backup_stats['question'] = question
            backup_stats['passed'] = passed
            backup_stats['failed'] = failed
        else:
            unlock = backup.unlocking()
            backup_stats['question'] = "[Unlocking] " + unlock.split(">")[0]

        diff_stats_list.append(backup_stats)
        partner_files_list.append(partner_backup_files)

    diff_dict = {
        "stats": diff_stats_list,
        "files": files_list,
        "partners": partner_files_list,
        "prev_backup_id": prev_backup_id,
        "backup_id": backup_id,
        "next_backup_id": next_backup_id
    }
    return diff_dict