diff --git a/prep-code-review-and-response.py b/prep-code-review-and-response.py index fe3e0cf4044bd194197582b8da9a2be9303bcce7..d5b04a9d9a656ed007ef5f486917196558b8f0eb 100644 --- a/prep-code-review-and-response.py +++ b/prep-code-review-and-response.py @@ -4,28 +4,72 @@ from common_functions import select_from_list # TODO: look for opportunity to reduce DRY, relative to main function in prep_assignment def create_partners(): - print('Creating pairs from students') - the_groupset: str = input('Please provide the name of the student groupset: ') - the_student_set: Set[CompositeUser] = get_students() + group_set: str = input('Please provide the name of the student groupset: ') + students: Set[CompositeUser] = get_students() + print('Creating student pairs') # TODO: check for changes to course roster # TODO: check for changes to gitlab usernames - the_partners: List[Tuple[int, CompositeUser, CompositeUser, Optional[CompositeUser]]] = \ - create_pairs(the_student_set, the_groupset) + pairings: List[Tuple[int, CompositeUser, CompositeUser, Optional[CompositeUser]]] = \ + create_pairs(students, group_set) print() - save_student_roster(the_student_set) - create_contact_list(the_groupset, the_partners) + save_student_roster(students) + create_contact_list(group_set, pairings) print() - create_groups(the_groupset, the_partners) + create_groups(group_set, pairings) + print('TODO: Manually edit the new student roster and the contact list as needed.') -def clone_forks(): - print('Cloning the forks (... not yet)') +# TODO: look for opportunity to reduce DRY, relative to prep_assignment.create_repositories +# TODO: extract code for reuse in validate_forks +def create_clone_script(): + old_groupset: str = input('Please provide the name of the student groupset for the previous assignment: ') + new_groupset: str = input('Please provide the name of the student groupset for the next assignment: ') + students: Set[CompositeUser] = get_students() + filename = f'{new_groupset}-clone.sh' + print(f'Creating file for clone script: {filename}.') + course = CanvasCourse(Course.canvas_course_id) + old_groups: List[CanvasUserGroup] = list(filter(lambda g: g.get_name() == old_groupset, + course.get_user_groupsets()))[0].get_groups() + new_groups: List[CanvasUserGroup] = list(filter(lambda g: g.get_name() == new_groupset, + course.get_user_groupsets()))[0].get_groups() + with open(filename, mode='w') as clone_file: + clone_file.write('#!/bin/bash\n\n') + clone_file.write('# Auto-generated clone script.\n\n\n') + for new_group in new_groups: + new_group_name: str = new_group.get_name().strip().replace(" ", "") + clone_file.write(f'# {new_group_name}\n') + group_students: List[CanvasUser] = new_group.get_students() + for student in group_students: + old_group_name: str = list(filter(lambda g: student in g.get_students(), + old_groups))[0].get_name().strip().replace(" ", "") + print(f'\t{student.get_name()} was in {old_group_name} and is now in {new_group_name}.') + composite_student: CompositeUser = list(filter(lambda s: s.get_canvas_user() == student, students))[0] + gitlab_username: str = composite_student.get_gitlab_user().get_username() + # # THIS WOULD BE USED IF WE KNEW THE FORKS WERE PRESENT; IF THEY'RE NOT PRESENT THEN LEN(PROJECTS)==0 + # projects: List[GitlabProject] = GitlabProject.get_projects_by_keyword(old_group_name) + # project: GitlabProject = \ + # list(filter(lambda p: p.get_creator().get_username() == gitlab_username, projects))[0] + # repo_url: str = project.get_cloning_url() + # # THIS IS HOW WE'LL FAKE IT + repo_url: str = f'git@git.unl.edu:{gitlab_username}/{old_group_name}.git' + clone_file.write(f'git clone {repo_url} {new_group_name}-{student.get_name().replace(" ","_")}\n') + clone_file.write('\n') + subprocess.call(['chmod', '+x', filename]) + + +def validate_forks(): + print('Examining the forks (... not yet)') if __name__ == '__main__': - print('There are two steps, creating partners (before the completion of the assignment to be reviewed),') - print('and cloning/verifying successful forks (after deadline to fork & add Maintainers)') + print('There are four steps, creating partners (before the completion of the assignment') + print('to be reviewed), manually adjusting the pairings as needed (e.g., due to') + print('excusals from previous assignment, creating the cloning script after adjustments') + print('have been made, and validating successful forks (after deadline to fork & add') + print('Maintainers).') print() - tasks = {'Create partners': create_partners, 'Clone forks': clone_forks} + tasks = {'Create partners': create_partners, + 'Create clone script': create_clone_script, + 'Validate forks': validate_forks} task = select_from_list(list(tasks), 'task') tasks[task]()