Select Git revision
TestController.php
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
"""