Skip to content
Snippets Groups Projects
Select Git revision
  • c6c64c0420dbf4f50c95a5db85384f8f60c227b0
  • master default protected
2 results

prep_assignment.py

Blame
  • Christopher Bohn's avatar
    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.
    c6c64c04
    History
    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
        """