Skip to content
Snippets Groups Projects
Commit a200641c authored by Christopher Bohn's avatar Christopher Bohn :thinking:
Browse files

Added option to print statistics by course section

parent b9415805
No related branches found
No related tags found
No related merge requests found
......@@ -3,6 +3,7 @@ import statistics
import sys
from typing import List, Optional, Dict, Set
import common_functions
from api.canvas_classes import CanvasAssignment, CanvasAssignmentGroup, CanvasCourse, CanvasUser
from common_functions import select_from_list
from majors import Major
......@@ -48,10 +49,13 @@ def create_semester_filter() -> str:
def print_statistics_for_some_majors(assignment: CanvasAssignment, majors: Set[Major],
major_partitions: Dict[Major, Set[CanvasUser]]) -> None:
major_partitions: Dict[Major, Set[CanvasUser]],
students: Optional[List[CanvasUser]] = None) -> None:
points_possible: float = assignment.get_points_possible()
for major in majors:
scores: List[float] = [assignment.get_score(student) for student in major_partitions[major]
student_subset: Set[CanvasUser] = major_partitions[major] if students is None \
else major_partitions[major].intersection(students)
scores: List[float] = [assignment.get_score(student) for student in student_subset
if assignment.get_score(student) is not None]
try:
average_score: float = statistics.mean(scores)
......@@ -70,14 +74,37 @@ def print_statistics(assignment: CanvasAssignment, major_partitions: Dict[Major,
print_statistics_for_some_majors(assignment, non_computing_majors, major_partitions)
def assess_assignments(course: CanvasCourse, major_partitions: Dict[Major, Set[CanvasUser]]) -> None:
def print_statistics_by_section(course: CanvasCourse, assignment: CanvasAssignment,
major_partitions: Dict[Major, Set[CanvasUser]]) -> None:
print(f'Statistics for {assignment}:')
computing_majors: Set[Major] = {major for major in Major.majors if major.is_computing_major}
non_computing_majors: Set[Major]
all_non_computing_majors: Set[Major] = {major for major in major_partitions.keys() if not major.is_computing_major}
for section in course.get_sections():
print(section)
students: List[CanvasUser] = section.get_students()
# noinspection PyTypeChecker
non_computing_majors = set() # why does PyCharm think set() returns Set[set]?
for student in students:
non_computing_majors.update({major for major in all_non_computing_majors
if student in major_partitions[major]})
print_statistics_for_some_majors(assignment, computing_majors, major_partitions, students)
print_statistics_for_some_majors(assignment, non_computing_majors, major_partitions, students)
print()
def assess_assignments(course: CanvasCourse, major_partitions: Dict[Major, Set[CanvasUser]],
print_section_statistics: bool = False) -> None:
print('You may now select the assignments to assess.')
answer: str = 'Yes'
while answer == '' or answer[0].upper() != 'N':
assignment_group: CanvasAssignmentGroup = \
select_from_list(course.get_assignment_groups(), 'assignment group')
oat_assignment: CanvasAssignment = select_from_list(assignment_group.get_assignments(), 'assignment')
if not print_section_statistics:
print_statistics(oat_assignment, major_partitions)
else:
print_statistics_by_section(course, oat_assignment, major_partitions)
print()
answer = input('Assess additional assignments? [Y/n] ')
......@@ -104,7 +131,10 @@ def assess_course(course: CanvasCourse) -> None:
print()
print(f'There are {len(major_partitions)} majors among the students '
f'(some students may have more than one major).')
assess_assignments(course, major_partitions)
print(f'There are {len(course.get_sections())} sections in the course. In most cases, you only need to print '
f'aggregate statistics for the full course. ', end='')
answer = input('Do you want to print statistics for each section instead? [y/N] ')
assess_assignments(course, major_partitions, answer != '' and answer[0].upper() == 'Y')
print()
......
......@@ -889,7 +889,7 @@ class CanvasCourseSection:
elif len(candidates) > 1:
print(f'ERROR: Indirectly found {len(candidates)} canvas users for {user_json["name"]} '
f'using the "unique" login {user_json["login_id"]}. Adding none of them.')
else:
elif user_json["name"] != "Test Student":
print(f'ERROR: Could not locate canvas user: {user_json["name"]}')
return students
......@@ -947,7 +947,6 @@ class CanvasCourse:
courses = [CanvasCourse(course.id) for course in canvas_courses if semester_filter in course.course_code]
return courses
def __init__(self, course_id: int):
self.canvas_course = CanvasSession.get_session().get_course(course_id)
......
......@@ -16,7 +16,8 @@ class Major:
@classmethod
def get_major(cls, name: str) -> "Major":
candidate = [major for major in cls.majors if name == major.name or name in major.alternate_names]
candidate = [major for major in cls.majors if name.lower() == major.name.lower()
or name.lower() in [alternate_name.lower() for alternate_name in major.alternate_names]]
if candidate:
return candidate[0]
else:
......@@ -29,7 +30,7 @@ class Major:
return {Major.get_major('Graduate Student')}
else:
majors: Optional[Set[str]] = student_data['unlSISMajor']
return {Major.get_major(major) for major in majors} if majors is not None else Major.get_major('None')
return {Major.get_major(major) for major in majors} if majors is not None else {Major.get_major('None')}
@property
def name(self) -> str:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment