diff --git a/lms/djangoapps/certificates/views.py b/lms/djangoapps/certificates/views.py index deb78fe3c7..472215ab5c 100644 --- a/lms/djangoapps/certificates/views.py +++ b/lms/djangoapps/certificates/views.py @@ -52,8 +52,7 @@ def certificate_request(request): return return_error(survey_response['error']) grade = None - # TODO: (bridger) Update this to use the faster grade instead of grade_sheet - student_gradesheet = grades.grade_sheet(request.user) + student_gradesheet = grades.grade(request.user, request, course) grade = student_gradesheet['grade'] if not grade: @@ -66,8 +65,7 @@ def certificate_request(request): else: #This is not a POST, we should render the page with the form - # TODO: (bridger) Update this to use the faster grade instead of grade_sheet - grade_sheet = grades.grade_sheet(request.user) + student_gradesheet = grades.grade(request.user, request, course) certificate_state = certificate_state_for_student(request.user, grade_sheet['grade']) if certificate_state['state'] != "requestable": diff --git a/lms/djangoapps/courseware/grades.py b/lms/djangoapps/courseware/grades.py index aa7caea31b..ef68335c72 100644 --- a/lms/djangoapps/courseware/grades.py +++ b/lms/djangoapps/courseware/grades.py @@ -19,9 +19,18 @@ def yield_module_descendents(module): def grade(student, request, course, student_module_cache=None): """ - This grades a student as quickly as possible. It reutns the - output from the course grader. More information on the format - is in the docstring for CourseGrader. + This grades a student as quickly as possible. It retuns the + output from the course grader, augmented with the final letter + grade. The keys in the output are: + + - grade : A final letter grade. + - percent : The final percent for the class (rounded up). + - section_breakdown : A breakdown of each section that makes + up the grade. (For display) + - grade_breakdown : A breakdown of the major components that + make up the final grade. (For display) + + More information on the format is in the docstring for CourseGrader. """ grading_context = course.grading_context @@ -84,8 +93,33 @@ def grade(student, request, course, student_module_cache=None): totaled_scores[section_format] = format_scores grade_summary = course.grader.grade(totaled_scores) - return grade_summary + # We round the grade here, to make sure that the grade is an whole percentage and + # doesn't get displayed differently than it gets grades + grade_summary['percent'] = round(grade_summary['percent'] * 100 + 0.05) / 100 + + letter_grade = grade_for_percentage(course.grade_cutoffs, grade_summary['percent']) + grade_summary['grade'] = letter_grade + + return grade_summary + +def grade_for_percentage(grade_cutoffs, percentage): + """ + Returns a letter grade 'A' 'B' 'C' or None. + + Arguments + - grade_cutoffs is a dictionary mapping a grade to the lowest + possible percentage to earn that grade. + - percentage is the final percent across all problems in a course + """ + + letter_grade = None + for possible_grade in ['A', 'B', 'C']: + if percentage >= grade_cutoffs[possible_grade]: + letter_grade = possible_grade + break + + return letter_grade def progress_summary(student, course, grader, student_module_cache): """ diff --git a/lms/templates/gradebook.html b/lms/templates/gradebook.html index d4c5461916..e5721969e9 100644 --- a/lms/templates/gradebook.html +++ b/lms/templates/gradebook.html @@ -44,15 +44,15 @@ <%def name="percent_data(percentage)"> <% - data_class = "grade_none" - if percentage > .87: - data_class = "grade_a" - elif percentage > .70: - data_class = "grade_b" - elif percentage > .6: - data_class = "grade_c" - elif percentage > 0: - data_class = "grade_f" + letter_grade = 'None' + if percentage > 0: + letter_grade = 'F' + for grade in ['A', 'B', 'C']: + if percentage >= course.grade_cutoffs[grade]: + letter_grade = grade + break + + data_class = "grade_" + letter_grade %> ${ "{0:.0%}".format( percentage ) } diff --git a/lms/templates/profile.html b/lms/templates/profile.html index 8107bb1923..9fd0055d60 100644 --- a/lms/templates/profile.html +++ b/lms/templates/profile.html @@ -18,7 +18,7 @@