def grader_validate_rubrics(ctx, course, assignment_id, grader, only): if grader is None: user = ctx.obj["client"].get_user() grader = get_grader_or_exit(ctx, course, user.username) else: grader = get_grader_or_exit(ctx, course, grader) assignment = get_assignment_or_exit(ctx, course, assignment_id) teams_registrations = get_teams_registrations(course, assignment, grader = grader, only = only) all_valid = True for team, registration in teams_registrations.items(): valid, error_msg = validate_repo_rubric(ctx, course, assignment, team, registration) if valid: print "%s: Rubric OK." % team.team_id else: print "%s: Rubric ERROR: %s" % (team.team_id, error_msg) all_valid = False if not all_valid: ctx.exit(CHISUBMIT_FAIL) else: return CHISUBMIT_SUCCESS
def grader_validate_rubrics(ctx, course, assignment_id, grader, only): if grader is None: user = ctx.obj["client"].get_user() grader = get_grader_or_exit(ctx, course, user.username) else: grader = get_grader_or_exit(ctx, course, grader) assignment = get_assignment_or_exit(ctx, course, assignment_id) teams_registrations = get_teams_registrations(course, assignment, grader=grader, only=only) all_valid = True for team, registration in list(teams_registrations.items()): valid, error_msg = validate_repo_rubric(ctx, course, assignment, team, registration) if valid: print("%s: Rubric OK." % team.team_id) else: print("%s: Rubric ERROR: %s" % (team.team_id, error_msg)) all_valid = False if not all_valid: ctx.exit(CHISUBMIT_FAIL) else: return CHISUBMIT_SUCCESS
def grader_push_grading(ctx, course, assignment_id, grader, only, skip_rubric_validation): if grader is None: user = ctx.obj["client"].get_user() grader = get_grader_or_exit(ctx, course, user.username) else: grader = get_grader_or_exit(ctx, course, grader) assignment = get_assignment_or_exit(ctx, course, assignment_id) teams_registrations = get_teams_registrations(course, assignment, grader = grader, only = only, only_ready_for_grading=True) if len(teams_registrations) == 0: print "No teams found" ctx.exit(CHISUBMIT_FAIL) for team, registration in teams_registrations.items(): if not skip_rubric_validation: valid, error_msg = validate_repo_rubric(ctx, course, assignment, team, registration) if not valid: print "Not pushing branch for team %s. Rubric does not validate: %s" % (team.team_id, error_msg) continue print "Pushing grading branch for team %s... " % team.team_id gradingrepo_push_grading_branch(ctx.obj['config'], course, team, registration) return CHISUBMIT_SUCCESS
def grader_pull_grading(ctx, course, grader, assignment_id): if grader is None: user = ctx.obj["client"].get_user() grader = get_grader_or_exit(ctx, course, user.username) else: grader = get_grader_or_exit(ctx, course, grader) assignment = get_assignment_or_exit(ctx, course, assignment_id) teams_registrations = get_teams_registrations(course, assignment, grader=grader) if len(teams_registrations) == 0: print("No teams found") ctx.exit(CHISUBMIT_FAIL) teams = sorted(list(teams_registrations.keys()), key=operator.attrgetter("team_id")) for team in teams: registration = teams_registrations[team] repo = GradingGitRepo.get_grading_repo(ctx.obj['config'], course, team, registration) if repo is None: print(("%40s -- Creating grading repo... " % team.team_id), end=' ') repo = GradingGitRepo.create_grading_repo(ctx.obj['config'], course, team, registration, staging_only=True) repo.sync() gradingrepo_pull_grading_branch(ctx.obj['config'], course, team, registration) repo.set_grader_author() print("done") else: print(("%40s -- Pulling grading branch..." % team.team_id), end=' ') gradingrepo_pull_grading_branch(ctx.obj['config'], course, team, registration) print("done") rubricfile = "%s.rubric.txt" % assignment.assignment_id rubricfilepath = "%s/%s" % (repo.repo_path, rubricfile) if not os.path.exists(rubricfilepath): rubric = RubricFile.from_assignment(assignment) rubric.save(rubricfilepath, include_blank_comments=True) return CHISUBMIT_SUCCESS
def instructor_grading_list_grader_assignments(ctx, course, assignment_id, grader_id): assignment = get_assignment_or_exit(ctx, course, assignment_id) if grader_id is not None: grader = get_grader_or_exit(ctx, course, grader_id) else: grader = None teams_registrations = get_teams_registrations(course, assignment) teams = list(teams_registrations.keys()) teams.sort(key=operator.attrgetter("team_id")) for t in teams: registration = teams_registrations[t] if grader is None: if registration.grader is None: grader_str = "<no-grader-assigned>" else: grader_str = registration.grader.user.username print(t.team_id, grader_str) else: if grader == registration.grader.user.username: print(t.team_id) return CHISUBMIT_SUCCESS
def instructor_grading_assign_grader(ctx, course, assignment_id, team_id, grader_id): team = get_team_or_exit(ctx, course, team_id) grader = get_grader_or_exit(ctx, course, grader_id) registration = get_assignment_registration_or_exit(ctx, team, assignment_id) registration.grader_username = grader.username
def instructor_grading_list_grader_assignments(ctx, course, assignment_id, grader_id): assignment = get_assignment_or_exit(ctx, course, assignment_id) if grader_id is not None: grader = get_grader_or_exit(ctx, course, grader_id) else: grader = None teams_registrations = get_teams_registrations(course, assignment) teams = teams_registrations.keys() teams.sort(key=operator.attrgetter("team_id")) for t in teams: registration = teams_registrations[t] if grader is None: if registration.grader is None: grader_str = "<no-grader-assigned>" else: grader_str = registration.grader.user.username print t.team_id, grader_str else: if grader == registration.grader.user.username: print t.team_id return CHISUBMIT_SUCCESS
def shared_course_set_user_attribute(ctx, course, user_type, username, attr_name, attr_value): if user_type == "instructor": user = get_instructor_or_exit(ctx, course, username) elif user_type == "grader": user = get_grader_or_exit(ctx, course, username) elif user_type == "student": user = get_student_or_exit(ctx, course, username) api_obj_set_attribute(ctx, user, attr_name, attr_value)
def grader_pull_grading(ctx, course, grader, assignment_id): if grader is None: user = ctx.obj["client"].get_user() grader = get_grader_or_exit(ctx, course, user.username) else: grader = get_grader_or_exit(ctx, course, grader) assignment = get_assignment_or_exit(ctx, course, assignment_id) teams_registrations = get_teams_registrations(course, assignment, grader = grader) if len(teams_registrations) == 0: print "No teams found" ctx.exit(CHISUBMIT_FAIL) teams = sorted(teams_registrations.keys(), key=operator.attrgetter("team_id")) for team in teams: registration = teams_registrations[team] repo = GradingGitRepo.get_grading_repo(ctx.obj['config'], course, team, registration) if repo is None: print ("%20s -- Creating grading repo... " % team.team_id), repo = GradingGitRepo.create_grading_repo(ctx.obj['config'], course, team, registration, staging_only = True) repo.sync() gradingrepo_pull_grading_branch(ctx.obj['config'], course, team, registration) repo.set_grader_author() print "done" else: print ("%20s -- Pulling grading branch..." % team.team_id), gradingrepo_pull_grading_branch(ctx.obj['config'], course, team, registration) print "done" rubricfile = "%s.rubric.txt" % assignment.assignment_id rubricfilepath = "%s/%s" % (repo.repo_path, rubricfile) if not os.path.exists(rubricfilepath): rubric = RubricFile.from_assignment(assignment) rubric.save(rubricfilepath, include_blank_comments=True) return CHISUBMIT_SUCCESS
def instructor_grading_add_conflict(ctx, course, grader_id, student_id): grader = get_grader_or_exit(ctx, course, grader_id) student = get_student_or_exit(ctx, course, student_id) if student.username in grader.conflicts_usernames: print("Student %s is already listed as a conflict for grader %s" % (student.username, grader.username)) ctx.exit(CHISUBMIT_FAIL) conflicts_usernames = grader.conflicts_usernames[:] conflicts_usernames.append(student.username) grader.conflicts_usernames = conflicts_usernames return CHISUBMIT_SUCCESS
def instructor_validate_rubrics(ctx, course, assignment_id, grader, only): if grader is not None: grader = get_grader_or_exit(ctx, course, grader) assignment = get_assignment_or_exit(ctx, course, assignment_id) teams_registrations = get_teams_registrations(course, assignment, grader = grader, only = only) for team, registration in teams_registrations.items(): valid, error_msg = validate_repo_rubric(ctx, course, assignment, team, registration) if valid: print "%s: Rubric OK." % team.team_id else: print "%s: Rubric ERROR: %s" % (team.team_id, error_msg) return CHISUBMIT_SUCCESS
def instructor_grading_assign_grader(ctx, course, assignment_id, team_id, grader_id, none): if none and grader_id is not None: print("Cannot specify a grader and also --none") ctx.exit(CHISUBMIT_FAIL) if not none and grader_id is None: print("You must specify a grader or use --none") ctx.exit(CHISUBMIT_FAIL) team = get_team_or_exit(ctx, course, team_id) registration = get_assignment_registration_or_exit(ctx, team, assignment_id) if none: registration.grader_username = None else: grader = get_grader_or_exit(ctx, course, grader_id) registration.grader_username = grader.username
def instructor_validate_rubrics(ctx, course, assignment_id, grader, only): if grader is not None: grader = get_grader_or_exit(ctx, course, grader) assignment = get_assignment_or_exit(ctx, course, assignment_id) teams_registrations = get_teams_registrations(course, assignment, grader=grader, only=only) for team, registration in list(teams_registrations.items()): valid, error_msg = validate_repo_rubric(ctx, course, assignment, team, registration) if valid: print("%s: Rubric OK." % team.team_id) else: print("%s: Rubric ERROR: %s" % (team.team_id, error_msg)) return CHISUBMIT_SUCCESS
def instructor_grading_collect_rubrics(ctx, course, assignment_id, dry_run, only, grader_id): assignment = get_assignment_or_exit(ctx, course, assignment_id) if grader_id is not None: grader = get_grader_or_exit(ctx, course, grader_id) else: grader = None rcs = assignment.get_rubric_components() teams_registrations = get_teams_registrations(course, assignment, grader=grader, only=only) teams = sorted(teams_registrations.keys(), key=operator.attrgetter("team_id")) for team in teams: registration = teams_registrations[team] repo = GradingGitRepo.get_grading_repo(ctx.obj['config'], course, team, registration) if repo is None: print "Repository for %s does not exist" % (team.team_id) continue rubricfile = repo.repo_path + "/%s.rubric.txt" % assignment.assignment_id if not os.path.exists(rubricfile): print "Repository for %s does not have a rubric for assignment %s" % (team.team_id, assignment.assignment_id) continue try: rubric = RubricFile.from_file(open(rubricfile), assignment) except ChisubmitRubricException, cre: print "ERROR: Rubric for %s does not validate (%s)" % (team.team_id, cre.message) continue points = [] for rc in rcs: grade = rubric.points[rc.description] if grade is None: points.append(0.0) else: if not dry_run: registration.set_grade(rc, grade) points.append(grade) adjustments = {} total_penalties = 0.0 total_bonuses = 0.0 if rubric.penalties is not None: for desc, p in rubric.penalties.items(): adjustments[desc] = p total_penalties += p if rubric.bonuses is not None: for desc, p in rubric.bonuses.items(): adjustments[desc] = p total_bonuses += p if not dry_run: registration.grade_adjustments = adjustments if ctx.obj["verbose"]: print team.team_id print "Points Obtained: %s" % points print "Penalties: %.2f" % total_penalties print "Bonuses: %.2f" % total_bonuses if not dry_run: total_grade = registration.get_total_grade() else: total_grade = sum(points) + total_penalties + total_bonuses if ctx.obj["verbose"]: print "TOTAL: %.2f" % total_grade print else: print "%-40s %.2f" % (team.team_id, total_grade)
def instructor_grading_collect_rubrics(ctx, course, assignment_id, dry_run, only, grader_id): assignment = get_assignment_or_exit(ctx, course, assignment_id) if grader_id is not None: grader = get_grader_or_exit(ctx, course, grader_id) else: grader = None rcs = assignment.get_rubric_components() teams_registrations = get_teams_registrations(course, assignment, grader=grader, only=only) teams = sorted(list(teams_registrations.keys()), key=operator.attrgetter("team_id")) for team in teams: registration = teams_registrations[team] repo = GradingGitRepo.get_grading_repo(ctx.obj['config'], course, team, registration) if repo is None: print("Repository for %s does not exist" % (team.team_id)) continue rubricfile = repo.repo_path + "/%s.rubric.txt" % assignment.assignment_id if not os.path.exists(rubricfile): print( "Repository for %s does not have a rubric for assignment %s" % (team.team_id, assignment.assignment_id)) continue try: rubric = RubricFile.from_file(open(rubricfile), assignment) except ChisubmitRubricException as cre: print("ERROR: Rubric for %s does not validate (%s)" % (team.team_id, cre)) continue points = [] for rc in rcs: grade = rubric.points_obtained[rc.description] if grade is None: points.append(0.0) else: if not dry_run: registration.set_grade(rc, grade) points.append(grade) adjustments = {} total_penalties = 0.0 total_bonuses = 0.0 if rubric.penalties is not None: for desc, p in list(rubric.penalties.items()): adjustments[desc] = p total_penalties += p if rubric.bonuses is not None: for desc, p in list(rubric.bonuses.items()): adjustments[desc] = p total_bonuses += p if not dry_run: registration.grade_adjustments = adjustments if ctx.obj["verbose"]: print(team.team_id) print("Points Obtained: %s" % points) print("Penalties: %.2f" % total_penalties) print("Bonuses: %.2f" % total_bonuses) if not dry_run: total_grade = registration.get_total_grade() else: total_grade = sum(points) + total_penalties + total_bonuses if ctx.obj["verbose"]: print("TOTAL: %.2f" % total_grade) print() else: print("%-40s %.2f" % (team.team_id, total_grade))