Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
E
edx-platform
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
edx
edx-platform
Commits
873f1431
Commit
873f1431
authored
Aug 06, 2012
by
Bridger Maxwell
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Put back dynamic grade cutoffs and final grade rounding (from stable-end-of-course)
parent
4fedca5b
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
64 additions
and
22 deletions
+64
-22
lms/djangoapps/certificates/views.py
+2
-4
lms/djangoapps/courseware/grades.py
+37
-3
lms/templates/gradebook.html
+9
-9
lms/templates/profile.html
+1
-1
lms/templates/profile_graphs.js
+15
-5
No files found.
lms/djangoapps/certificates/views.py
View file @
873f1431
...
@@ -52,8 +52,7 @@ def certificate_request(request):
...
@@ -52,8 +52,7 @@ def certificate_request(request):
return
return_error
(
survey_response
[
'error'
])
return
return_error
(
survey_response
[
'error'
])
grade
=
None
grade
=
None
# TODO: (bridger) Update this to use the faster grade instead of grade_sheet
student_gradesheet
=
grades
.
grade
(
request
.
user
,
request
,
course
)
student_gradesheet
=
grades
.
grade_sheet
(
request
.
user
)
grade
=
student_gradesheet
[
'grade'
]
grade
=
student_gradesheet
[
'grade'
]
if
not
grade
:
if
not
grade
:
...
@@ -66,8 +65,7 @@ def certificate_request(request):
...
@@ -66,8 +65,7 @@ def certificate_request(request):
else
:
else
:
#This is not a POST, we should render the page with the form
#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
student_gradesheet
=
grades
.
grade
(
request
.
user
,
request
,
course
)
grade_sheet
=
grades
.
grade_sheet
(
request
.
user
)
certificate_state
=
certificate_state_for_student
(
request
.
user
,
grade_sheet
[
'grade'
])
certificate_state
=
certificate_state_for_student
(
request
.
user
,
grade_sheet
[
'grade'
])
if
certificate_state
[
'state'
]
!=
"requestable"
:
if
certificate_state
[
'state'
]
!=
"requestable"
:
...
...
lms/djangoapps/courseware/grades.py
View file @
873f1431
...
@@ -19,9 +19,18 @@ def yield_module_descendents(module):
...
@@ -19,9 +19,18 @@ def yield_module_descendents(module):
def
grade
(
student
,
request
,
course
,
student_module_cache
=
None
):
def
grade
(
student
,
request
,
course
,
student_module_cache
=
None
):
"""
"""
This grades a student as quickly as possible. It reutns the
This grades a student as quickly as possible. It retuns the
output from the course grader. More information on the format
output from the course grader, augmented with the final letter
is in the docstring for CourseGrader.
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
grading_context
=
course
.
grading_context
...
@@ -84,8 +93,33 @@ def grade(student, request, course, student_module_cache=None):
...
@@ -84,8 +93,33 @@ def grade(student, request, course, student_module_cache=None):
totaled_scores
[
section_format
]
=
format_scores
totaled_scores
[
section_format
]
=
format_scores
grade_summary
=
course
.
grader
.
grade
(
totaled_scores
)
grade_summary
=
course
.
grader
.
grade
(
totaled_scores
)
# 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
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
):
def
progress_summary
(
student
,
course
,
grader
,
student_module_cache
):
"""
"""
...
...
lms/templates/gradebook.html
View file @
873f1431
...
@@ -44,15 +44,15 @@
...
@@ -44,15 +44,15 @@
<
%
def
name=
"percent_data(percentage)"
>
<
%
def
name=
"percent_data(percentage)"
>
<
%
<
%
data_class =
"grade_none"
letter_grade =
'None'
if
percentage
>
.87
:
if
percentage
>
0
:
data_class = "grade_a"
letter_grade = 'F'
elif percentage > .70
:
for grade in ['A', 'B', 'C']
:
data_class = "grade_b"
if percentage >= course.grade_cutoffs[grade]:
elif percentage > .6:
letter_grade = grade
data_class = "grade_c"
break
elif percentage > 0:
data_class = "grade_f"
data_class = "grade_" + letter_grade
%>
%>
<td
class=
"${data_class}"
>
${ "{0:.0%}".format( percentage ) }
</td>
<td
class=
"${data_class}"
>
${ "{0:.0%}".format( percentage ) }
</td>
</
%
def>
</
%
def>
...
...
lms/templates/profile.html
View file @
873f1431
...
@@ -18,7 +18,7 @@
...
@@ -18,7 +18,7 @@
<script
type=
"text/javascript"
src=
"${static.url('js/vendor/flot/jquery.flot.stack.js')}"
></script>
<script
type=
"text/javascript"
src=
"${static.url('js/vendor/flot/jquery.flot.stack.js')}"
></script>
<script
type=
"text/javascript"
src=
"${static.url('js/vendor/flot/jquery.flot.symbol.js')}"
></script>
<script
type=
"text/javascript"
src=
"${static.url('js/vendor/flot/jquery.flot.symbol.js')}"
></script>
<script>
<script>
$
{
profile_graphs
.
body
(
grade_summary
,
"grade-detail-graph"
)}
$
{
profile_graphs
.
body
(
grade_summary
,
course
.
grade_cutoffs
,
"grade-detail-graph"
)}
</script>
</script>
<script>
<script>
...
...
lms/templates/profile_graphs.js
View file @
873f1431
<%
page
args
=
"grade_summary, graph_div_id, **kwargs"
/>
<%
page
args
=
"grade_summary, gra
de_cutoffs, gra
ph_div_id, **kwargs"
/>
<%!
<%!
import
json
import
json
import
math
%>
%>
$
(
function
()
{
$
(
function
()
{
...
@@ -89,8 +90,16 @@ $(function () {
...
@@ -89,8 +90,16 @@ $(function () {
ticks
+=
[
[
overviewBarX
,
"Total"
]
]
ticks
+=
[
[
overviewBarX
,
"Total"
]
]
tickIndex
+=
1
+
sectionSpacer
tickIndex
+=
1
+
sectionSpacer
totalScore
=
grade_summary
[
'percent'
]
totalScore
=
math
.
floor
(
grade_summary
[
'percent'
]
*
100
)
/
100
#
We
floor
it
to
the
nearest
percent
,
80.9
won
't show up like a 90 (an A)
detail_tooltips['
Dropped
Scores
'] = dropped_score_tooltips
detail_tooltips['
Dropped
Scores
'] = dropped_score_tooltips
## ----------------------------- Grade cutoffs ------------------------- ##
grade_cutoff_ticks = [ [1, "100%"], [0, "0%"] ]
for grade in ['
A
', '
B
', '
C
']:
percent = grade_cutoffs[grade]
grade_cutoff_ticks.append( [ percent, "{0} {1:.0%}".format(grade, percent) ] )
%>
%>
var series = ${ json.dumps( series ) };
var series = ${ json.dumps( series ) };
...
@@ -98,6 +107,7 @@ $(function () {
...
@@ -98,6 +107,7 @@ $(function () {
var bottomTicks = ${ json.dumps(bottomTicks) };
var bottomTicks = ${ json.dumps(bottomTicks) };
var detail_tooltips = ${ json.dumps(detail_tooltips) };
var detail_tooltips = ${ json.dumps(detail_tooltips) };
var droppedScores = ${ json.dumps(droppedScores) };
var droppedScores = ${ json.dumps(droppedScores) };
var grade_cutoff_ticks = ${ json.dumps(grade_cutoff_ticks) }
//Alwasy be sure that one series has the xaxis set to 2, or the second xaxis labels won'
t
show
up
//Alwasy be sure that one series has the xaxis set to 2, or the second xaxis labels won'
t
show
up
series
.
push
(
{
label
:
'Dropped Scores'
,
data
:
droppedScores
,
points
:
{
symbol
:
"cross"
,
show
:
true
,
radius
:
3
},
bars
:
{
show
:
false
},
color
:
"#333"
}
);
series
.
push
(
{
label
:
'Dropped Scores'
,
data
:
droppedScores
,
points
:
{
symbol
:
"cross"
,
show
:
true
,
radius
:
3
},
bars
:
{
show
:
false
},
color
:
"#333"
}
);
...
@@ -107,10 +117,10 @@ $(function () {
...
@@ -107,10 +117,10 @@ $(function () {
lines
:
{
show
:
false
,
steps
:
false
},
lines
:
{
show
:
false
,
steps
:
false
},
bars
:
{
show
:
true
,
barWidth
:
0.8
,
align
:
'center'
,
lineWidth
:
0
,
fill
:
.
8
},},
bars
:
{
show
:
true
,
barWidth
:
0.8
,
align
:
'center'
,
lineWidth
:
0
,
fill
:
.
8
},},
xaxis
:
{
tickLength
:
0
,
min
:
0.0
,
max
:
$
{
tickIndex
-
sectionSpacer
},
ticks
:
ticks
,
labelAngle
:
90
},
xaxis
:
{
tickLength
:
0
,
min
:
0.0
,
max
:
$
{
tickIndex
-
sectionSpacer
},
ticks
:
ticks
,
labelAngle
:
90
},
yaxis
:
{
ticks
:
[[
1
,
"100%"
],
[
0.87
,
"A 87%"
],
[
0.7
,
"B 70%"
],
[
0.6
,
"C 60%"
],
[
0
,
"0%"
]]
,
min
:
0.0
,
max
:
1.0
,
labelWidth
:
50
},
yaxis
:
{
ticks
:
grade_cutoff_ticks
,
min
:
0.0
,
max
:
1.0
,
labelWidth
:
50
},
grid
:
{
hoverable
:
true
,
clickable
:
true
,
borderWidth
:
1
,
grid
:
{
hoverable
:
true
,
clickable
:
true
,
borderWidth
:
1
,
markings
:
[
{
yaxis
:
{
from
:
0.87
,
to
:
1
},
color
:
"#ddd"
},
{
yaxis
:
{
from
:
0.7
,
to
:
0.87
},
color
:
"#e9e9e9"
},
markings
:
[
{
yaxis
:
{
from
:
$
{
grade_cutoffs
[
'A'
]},
to
:
1
},
color
:
"#ddd"
},
{
yaxis
:
{
from
:
$
{
grade_cutoffs
[
'B'
]},
to
:
$
{
grade_cutoffs
[
'A'
]}
},
color
:
"#e9e9e9"
},
{
yaxis
:
{
from
:
0.6
,
to
:
0.7
},
color
:
"#f3f3f3"
},
]
},
{
yaxis
:
{
from
:
$
{
grade_cutoffs
[
'C'
]},
to
:
$
{
grade_cutoffs
[
'B'
]}
},
color
:
"#f3f3f3"
},
]
},
legend
:
{
show
:
false
},
legend
:
{
show
:
false
},
};
};
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment