Still working on grades refactor. Not working yet, but reached a checkpoint.
This commit is contained in:
@@ -19,7 +19,7 @@ SectionPercentage = namedtuple("SectionPercentage", "percentage label summary")
|
||||
class CourseGrader:
|
||||
def grade(self, grade_sheet):
|
||||
raise NotImplementedError
|
||||
|
||||
|
||||
class FormatWithDropsGrader(CourseGrader):
|
||||
"""
|
||||
Grades all sections specified in course_format with an equal weight. A specified
|
||||
@@ -62,14 +62,14 @@ class FormatWithDropsGrader(CourseGrader):
|
||||
|
||||
def grade(self, grade_sheet):
|
||||
def totalWithDrops(breakdown, drop_count):
|
||||
#create an array of tuples with (index, mark), sorted by mark['percentage'] descending
|
||||
sorted_breakdown = sorted( enumerate(breakdown), key=lambda x: -x[1]['percentage'] )
|
||||
#create an array of tuples with (index, mark), sorted by mark['percent'] descending
|
||||
sorted_breakdown = sorted( enumerate(breakdown), key=lambda x: -x[1]['percent'] )
|
||||
# A list of the indices of the dropped scores
|
||||
dropped_indices = [x[0] for x in sorted_breakdown[-drop_count:]]
|
||||
aggregate_score = 0
|
||||
for index, mark in enumerate(breakdown):
|
||||
if index not in dropped_indices:
|
||||
aggregate_score += mark['percentage']
|
||||
aggregate_score += mark['percent']
|
||||
|
||||
aggregate_score /= len(scores) - drop_count
|
||||
|
||||
@@ -81,38 +81,38 @@ class FormatWithDropsGrader(CourseGrader):
|
||||
for i in range(12):
|
||||
if i < len(scores):
|
||||
percentage = scores[i].earned / float(scores[i].possible)
|
||||
summary = self.section_detail_formatter.format(index: i+1,
|
||||
name: scores[i].section,
|
||||
percentage: percentage,
|
||||
earned: scores[i].earned,
|
||||
possible: scores[i].possible )
|
||||
summary = self.section_detail_formatter.format(index = i+1,
|
||||
name = scores[i].section,
|
||||
percent = percentage,
|
||||
earned = scores[i].earned,
|
||||
possible = scores[i].possible )
|
||||
else:
|
||||
percentage = 0
|
||||
summary = self.section_missing_detail_formatter.format(index: i+1)
|
||||
summary = self.section_missing_detail_formatter.format(index = i+1)
|
||||
|
||||
if settings.GENERATE_PROFILE_SCORES:
|
||||
points_possible = random.randrange(10, 50)
|
||||
points_earned = random.randrange(5, points_possible)
|
||||
percentage = points_earned / float(points_possible)
|
||||
summary = self.section_detail_formatter.format(index: i+1,
|
||||
name: "Randomly Generated",
|
||||
percentage: percentage,
|
||||
earned: points_earned,
|
||||
possible: points_possible )
|
||||
summary = self.section_detail_formatter.format(index = i+1,
|
||||
name = "Randomly Generated",
|
||||
percent = percentage,
|
||||
earned = points_earned,
|
||||
possible = points_possible )
|
||||
|
||||
label = self.section_label_formatter.format(index: i+1)
|
||||
label = self.section_label_formatter.format(index = i+1)
|
||||
|
||||
|
||||
breakdown.append( {'percent': percentage, 'label': label, 'detail': summary, category: self.category} )
|
||||
breakdown.append( {'percent': percentage, 'label': label, 'detail': summary, 'category': self.category} )
|
||||
|
||||
total_percent, dropped_indices = totalWithDrops(breakdown, self.drop_count)
|
||||
|
||||
for dropped_index in dropped_indicies:
|
||||
for dropped_index in dropped_indices:
|
||||
breakdown[dropped_index]['mark'] = {'detail': "The lowest {0} scores are dropped.".format(self.drop_count) }
|
||||
|
||||
|
||||
total_detail = self.total_detail_formatter.format(percent: total_percent)
|
||||
breakdown.append( {'percent': total_percent, 'label': self.total_label_formatter, 'detail': total_detail, category: self.category, prominent: True} )
|
||||
total_detail = self.total_detail_formatter.format(percent = total_percent)
|
||||
breakdown.append( {'percent': total_percent, 'label': self.total_label_formatter, 'detail': total_detail, 'category': self.category, 'prominent': True} )
|
||||
|
||||
|
||||
return {'percent' : total_percent,
|
||||
@@ -245,7 +245,11 @@ def grade_sheet(student):
|
||||
'sections' : sections,})
|
||||
|
||||
|
||||
grade_summary = grade_summary_6002x(totaled_scores)
|
||||
grader = FormatWithDropsGrader("Homework", 12, 2, "Homework", "Homework {index} - {name} - {percent:.0%} ({earned:g}/{possible:g})",
|
||||
"Unreleased Homework {index} - 0% (?/?)", "HW {index:02d}", "Homework Average = {percent:.0%}", "HW Avg")
|
||||
|
||||
|
||||
grade_summary = grader.grade(totaled_scores)
|
||||
|
||||
return {'courseware_summary' : chapters,
|
||||
'grade_summary' : grade_summary}
|
||||
|
||||
@@ -22,6 +22,7 @@ $(function () {
|
||||
|
||||
<%
|
||||
colors = ["#b72121", "#600101", "#666666", "#333333"]
|
||||
categories = {}
|
||||
#'
|
||||
tickIndex = 1
|
||||
sectionSpacer = 0.5
|
||||
@@ -34,78 +35,31 @@ $(function () {
|
||||
droppedScores = [] #These are the datapoints to indicate assignments which aren't factored into the total score
|
||||
dropped_score_tooltips = []
|
||||
|
||||
for section in grade_summary:
|
||||
if 'subscores' in section: ##This is for sections like labs or homeworks, with several smaller components and a total
|
||||
series.append({
|
||||
'label' : section['category'],
|
||||
'data' : [[i + tickIndex, score.percentage] for i,score in enumerate(section['subscores'])],
|
||||
'color' : colors[sectionIndex]
|
||||
})
|
||||
|
||||
ticks += [[i + tickIndex, score.label ] for i,score in enumerate(section['subscores'])]
|
||||
bottomTicks.append( [tickIndex + len(section['subscores'])/2, section['category']] )
|
||||
detail_tooltips[ section['category'] ] = [score.summary for score in section['subscores']]
|
||||
|
||||
droppedScores += [[tickIndex + index, 0.05] for index in section['dropped_indices']]
|
||||
|
||||
dropExplanation = "The lowest {0} {1} scores are dropped".format( len(section['dropped_indices']), section['category'] )
|
||||
dropped_score_tooltips += [dropExplanation] * len(section['dropped_indices'])
|
||||
|
||||
|
||||
tickIndex += len(section['subscores']) + sectionSpacer
|
||||
|
||||
|
||||
category_total_label = section['category'] + " Total"
|
||||
series.append({
|
||||
'label' : category_total_label,
|
||||
'data' : [ [tickIndex, section['totalscore']] ],
|
||||
'color' : colors[sectionIndex]
|
||||
})
|
||||
|
||||
ticks.append( [tickIndex, section['totallabel']] )
|
||||
detail_tooltips[category_total_label] = [section['totalscore_summary']]
|
||||
else:
|
||||
series.append({
|
||||
'label' : section['category'],
|
||||
'data' : [ [tickIndex, section['totalscore']] ],
|
||||
'color' : colors[sectionIndex]
|
||||
})
|
||||
|
||||
ticks.append( [tickIndex, section['totallabel']] )
|
||||
detail_tooltips[section['category']] = [section['totalscore_summary']]
|
||||
|
||||
tickIndex += 1 + sectionSpacer
|
||||
sectionIndex += 1
|
||||
|
||||
|
||||
detail_tooltips['Dropped Scores'] = dropped_score_tooltips
|
||||
|
||||
## ----------------------------- Grade overviewew bar ------------------------- ##
|
||||
totalWeight = 0.0
|
||||
sectionIndex = 0
|
||||
totalScore = 0.0
|
||||
overviewBarX = tickIndex
|
||||
|
||||
for section in grade_summary:
|
||||
weighted_score = section['totalscore'] * section['weight']
|
||||
summary_text = "{0} - {1:.1%} of a possible {2:.0%}".format(section['category'], weighted_score, section['weight'])
|
||||
|
||||
weighted_category_label = section['category'] + " - Weighted"
|
||||
|
||||
if section['totalscore'] > 0:
|
||||
series.append({
|
||||
'label' : weighted_category_label,
|
||||
'data' : [ [overviewBarX, weighted_score] ],
|
||||
'color' : colors[sectionIndex]
|
||||
})
|
||||
for section in grade_summary['section_breakdown']:
|
||||
if section.get('prominent', False):
|
||||
tickIndex += sectionSpacer
|
||||
|
||||
detail_tooltips[weighted_category_label] = [ summary_text ]
|
||||
sectionIndex += 1
|
||||
totalWeight += section['weight']
|
||||
totalScore += section['totalscore'] * section['weight']
|
||||
if section['category'] not in categories:
|
||||
colorIndex = len(categories) % len(colors)
|
||||
categories[ section['category'] ] = {'label' : section['category'],
|
||||
'data' : [],
|
||||
'color' : colors[colorIndex]}
|
||||
|
||||
ticks += [ [overviewBarX, "Total"] ]
|
||||
tickIndex += 1 + sectionSpacer
|
||||
categoryData = categories[ section['category'] ]
|
||||
|
||||
categoryData['data'].append( [tickIndex, section['percent']] )
|
||||
ticks.append( [tickIndex, section['label'] ] )
|
||||
|
||||
|
||||
if section['category'] in detail_tooltips:
|
||||
detail_tooltips[ section['category'] ].append( section['detail'] )
|
||||
else:
|
||||
detail_tooltips[ section['category'] ] = [ section['detail'], ]
|
||||
|
||||
tickIndex += 1
|
||||
|
||||
if section.get('prominent', False):
|
||||
tickIndex += sectionSpacer
|
||||
%>
|
||||
|
||||
var series = ${ json.dumps(series) };
|
||||
|
||||
Reference in New Issue
Block a user