From deff280556d9b812de107382d78dd17b8132ee30 Mon Sep 17 00:00:00 2001
From: Christopher Bohn <bohn@unl.edu>
Date: Tue, 30 Jun 2020 07:12:14 -0500
Subject: [PATCH] Handled edge case of student excused from project used for
 code review

---
 prep-code-review-and-response.py | 56 +++++++++++++++++---------------
 prep_assignment.py               |  5 +--
 2 files changed, 33 insertions(+), 28 deletions(-)

diff --git a/prep-code-review-and-response.py b/prep-code-review-and-response.py
index 7c3cd05..7d833c6 100644
--- a/prep-code-review-and-response.py
+++ b/prep-code-review-and-response.py
@@ -73,33 +73,37 @@ def validate_forks():
     new_groups: List[CanvasUserGroup] = list(filter(lambda g: g.get_name() == new_groupset,
                                                     course.get_user_groupsets()))[0].get_groups()
     for student in sorted(students, key=lambda s: s.get_canvas_user().get_sortable_name()):
-        print(f'Validating {student.get_canvas_user().get_name()}')
-        old_group_name: str = list(filter(lambda g: student.get_canvas_user() in g.get_students(),
-                                          old_groups))[0].get_name().strip().replace(" ", "")
-        new_group = list(filter(lambda g: student.get_canvas_user() in g.get_students(), new_groups))[0]
-        projects: List[GitlabProject] = student.get_gitlab_user().get_projects()
-        project_names: List[str] = list(map(lambda p: p.get_name(), projects))
-        if old_group_name in project_names:
-            project: GitlabProject = list(filter(lambda p: p.get_name() == old_group_name, projects))[0]
-            if project.get_visibility() != 'private':
-                print(f'\t{student.get_canvas_user().get_name()} has not set {old_group_name}.git to "private" '
-                      f'(access level is {project.get_visibility()}).')
-            users: List[GitlabUser] = project.get_all_users()
-            usernames: List[str] = list(map(lambda u: u.get_username(), users))
-            for TA in TAs:
-                if TA not in usernames:
-                    print(f'\t{student.get_canvas_user().get_name()} did not add @{TA} to repo.')
-            for partner in new_group.get_students():
-                composite_student: CompositeUser = list(filter(lambda s: s.get_canvas_user() == partner, students))[0]
-                if composite_student.get_gitlab_user().get_username() not in usernames:
-                    print(f'\t{student.get_canvas_user().get_name()} did not add {partner.get_name()} to repo.')
+        student_canvas_name = student.get_canvas_user().get_name()
+        print(f'Validating {student_canvas_name}')
+        old_group_name_list = list(filter(lambda g: student.get_canvas_user() in g.get_students(), old_groups))
+        if len(old_group_name_list) > 0:
+            old_group_name: str = old_group_name_list[0].get_name().strip().replace(" ", "")
+            new_group = list(filter(lambda g: student.get_canvas_user() in g.get_students(), new_groups))[0]
+            projects: List[GitlabProject] = student.get_gitlab_user().get_projects()
+            project_names: List[str] = list(map(lambda p: p.get_name(), projects))
+            if old_group_name in project_names:
+                project: GitlabProject = list(filter(lambda p: p.get_name() == old_group_name, projects))[0]
+                if project.get_visibility() != 'private':
+                    print(f'\t{student_canvas_name} has not set {old_group_name}.git to "private" '
+                          f'(access level is {project.get_visibility()}).')
+                users: List[GitlabUser] = project.get_all_users()
+                usernames: List[str] = list(map(lambda u: u.get_username(), users))
+                for TA in TAs:
+                    if TA not in usernames:
+                        print(f'\t{student_canvas_name} did not add @{TA} to repo.')
+                for partner in new_group.get_students():
+                    composite_student: CompositeUser = list(filter(lambda s: s.get_canvas_user() == partner, students))[0]
+                    if composite_student.get_gitlab_user().get_username() not in usernames:
+                        print(f'\t{student_canvas_name} did not add {partner.get_name()} to repo.')
+            else:
+                print(f'\t{student_canvas_name}: Could not locate {old_group_name}.git')
+                print('\t\tThis may be because the student hasn\'t forked their repository, or')
+                print('\t\tbecause they haven\'t given you access, or because they renamed it.')
+                print(f'\t\t\t{student_canvas_name}\'s repositories:')
+                for project in project_names:
+                    print(f'\t\t\t{project}')
         else:
-            print(f'\t{student.get_canvas_user().get_name()}: Could not locate {old_group_name}.git')
-            print('\t\tThis may be because the student hasn\'t forked their repository, or')
-            print('\t\tbecause they haven\'t given you access, or because they renamed it.')
-            print(f'\t\t\t{student.get_canvas_user().get_name()}\'s repositories:')
-            for project in project_names:
-                print(f'\t\t\t{project}')
+            print(f'\t{student_canvas_name} does not have an old Canvas group.')
 
 
 if __name__ == '__main__':
diff --git a/prep_assignment.py b/prep_assignment.py
index 3bfc9cc..29bc55a 100644
--- a/prep_assignment.py
+++ b/prep_assignment.py
@@ -140,9 +140,10 @@ def create_pairs(students: Set[CompositeUser], groupset_name: str = 'Unknown Ass
         print('Next we shall assign partners to students with blacklists.')
     else:
         print('There are no students with blacklists.')
-    for student in students_with_blacklist:
+    for student in students_with_blacklist:     # TODO: there's a bug here when students with blacklists make requests
         pair_number += 1
-        unassigned_students.remove(student)
+        if student in unassigned_students:      # TODO: can probably fix bug by putting ALL the code under this "if"
+            unassigned_students.remove(student)
         potential_partner: CompositeUser = random.choice(tuple(unassigned_students))
         while not (student.is_blacklist_compatible(potential_partner) and
                    student.is_graylist_compatible(potential_partner)):
-- 
GitLab