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