Skip to content
Snippets Groups Projects
Select Git revision
  • dfad5bf2598a1c5a6a65c7ae6ea18efd3ebbb5bd
  • 3.9 default
  • develop
  • 6.0
  • 5.0
  • 4.0
  • scrutinizer-patch-4
  • scrutinizer-patch-3
  • scrutinizer-patch-2
  • scrutinizer-patch-1
  • 3.7
  • 3.8
  • 3.6
  • 3.9_backported
  • 3.8_backported
  • 3.7_backported
  • 3.5
  • 3.6_backported
  • 3.5_backported
  • 3.4
  • 3.3_backported
  • 6.0.4
  • 6.0.3
  • 5.0.7
  • 6.0.2
  • 6.0.1
  • 5.0.6
  • 6.0.0
  • 5.0.5
  • 6.0.0-rc
  • 5.0.4
  • 6.0.0-beta
  • 5.0.3
  • 4.0.6
  • 5.0.2
  • 5.0.1
  • 4.0.5
  • 5.0.0
  • 4.0.4
  • 5.0.0-rc2
  • 5.0.0-rc1
41 results

functions.inc.php

Blame
  • prep_assignment.py 4.03 KiB
    import random
    import subprocess
    from api.composite_user import CompositeUser
    from api.canvas_classes import *
    from api.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
        student_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)
            student_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)
            student_pairs.append((pair_number, student, potential_partner))
        return student_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, verbose):
        if verbose:
            print('Creating file for clone script.')
        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:
                if verbose:
                    print(f'Creating repo for pair number {pair[0]}')
                project = GitlabProject.create_project_in_group(Course.gitlab_namespace,
                                                                f'{assignment_number}pair{pair[0]}')
                if verbose:
                    print(f'\tAdding {pair[1]}')
                project.add_user_as_maintainer(pair[1].get_gitlab_user())
                if verbose:
                    print(f'\tAdding {pair[2]}')
                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 = '21b'
        pairs = create_pairs('2019-08.csv')
        save_pairs(assignment, pairs)
        print('Pairs created')
    
        create_repositories(assignment, pairs, True)
        print('Repositories created')
        create_groups(assignment, pairs)
        print('Canvas groups created')
    
        print('TODO:\tAdd issues')
        print('\tCommit starter code')
        print('\tUpdate graylists (also, please update the code to update the graylists)')