Select Git revision
prep_assignment.py

Christopher Bohn authored
This first iteration is limited to working with an even number of students, does not yet add Issues to the Gitlab Issue Tracker, and does not yet update the graylists in the student CSV.
prep_assignment.py 4.01 KiB
import random
import subprocess
from composite_user import CompositeUser
from canvas_classes import *
from gitlab_classes import *
from course import Course
def create_pairs(filename):
# only works when there are an even number of students
students = CompositeUser.read_student_csv(filename)
students_with_blacklist = sorted(list(filter(lambda s: s.has_blacklist(), students)),
key=lambda t: len(t.blacklist), reverse=True)
unassigned_students = set(students)
pair_number = 0
pairs = []
for student in students_with_blacklist:
pair_number += 1
unassigned_students.remove(student)
potential_partner = random.choice(tuple(unassigned_students))
while not (student.is_blacklist_compatible(potential_partner) and
student.is_graylist_compatible(potential_partner)):
# has the potential to run infinitely
potential_partner = random.choice(tuple(unassigned_students))
unassigned_students.remove(potential_partner)
pairs.append((pair_number, student, potential_partner))
while unassigned_students:
pair_number += 1
student = random.choice(tuple(unassigned_students))
unassigned_students.remove(student)
attempts = 1
potential_partner = random.choice(tuple(unassigned_students))
while not (student.is_graylist_compatible(potential_partner) and attempts <= len(unassigned_students)):
attempts += 1
potential_partner = random.choice(tuple(unassigned_students))
unassigned_students.remove(potential_partner)
pairs.append((pair_number, student, potential_partner))
return pairs
def save_pairs(assignment_number, student_pairs):
filename = f'{assignment_number}-pairs.md'
with open(filename, mode='w') as pair_file:
pair_file.write(f'# PARTNERS FOR ASSIGNMENT {assignment_number}\n\n')
for pair in student_pairs:
pair_file.write(f'- {assignment_number}pair {pair[0]}\n')
pair_file.write(f' - {pair[1]}\n')
pair_file.write(f' - {pair[2]}\n')
def create_repositories(assignment_number, student_pairs):
filename = f'{assignment_number}-clone.sh'
with open(filename, mode='w') as clone_file:
clone_file.write('#!/bin/bash\n\n')
clone_file.write('# Auto-generated clone script.\n')
for pair in student_pairs:
project = GitlabProject.create_project_in_group(Course.gitlab_namespace, f'{assignment_number}pair{pair[0]}')
project.add_user_as_maintainer(pair[1].get_gitlab_user())
project.add_user_as_maintainer(pair[2].get_gitlab_user())
repo_url = project.get_cloning_url()
clone_file.write(f'git clone {repo_url}\n')
subprocess.call(['chmod', '+x', filename])
def create_groups(assignment_number, student_pairs):
course = CanvasCourse(Course.canvas_course_id)
group_set = course.create_groupset(f'{assignment_number}pairs')
for pair in student_pairs:
group = group_set.create_group(f'{assignment_number}pair {pair[0]}')
group.add_student(pair[1].get_canvas_user())
group.add_student(pair[2].get_canvas_user())
if __name__ == '__main__':
assignment = 10
pairs = create_pairs('2019-08.csv')
save_pairs(assignment, pairs)
print('Pairs created')
# pair = list(pairs)[0]
# print(f'{pair[1].get_gitlab_user()}, {pair[2].get_gitlab_user()}')
# project = GitlabProject.create_project_in_group(Course.gitlab_namespace, f'{assignment_number}pairx{pair[0]}')
# project.add_user_as_maintainer(pair[1].get_gitlab_user())
# project.add_user_as_maintainer(pair[2].get_gitlab_user())
create_repositories(assignment, pairs)
print('Repositories created')
create_groups(assignment, pairs)
print('Canvas groups created')
print('TODO:\tAdd issues')
print('\tCommit starter code')
"""
BALLS! I forgot to update the graylists
I also forgot newlines in the cloning script - fixed code, need to fix script
"""