Commit eb63e060 by Kelketek

Merge pull request #19 from open-craft/presentation-updates

Allowed overriding average labels per mentoring
parents 51a820ee 5646645d
...@@ -221,10 +221,14 @@ class DashboardBlock(StudioEditableXBlockMixin, XBlock): ...@@ -221,10 +221,14 @@ class DashboardBlock(StudioEditableXBlockMixin, XBlock):
), ),
scope=Scope.content, scope=Scope.content,
) )
average_label = String( average_labels = Dict(
display_name=_("Label for average value"), display_name=_("Label for average value"),
default=_("Average"), help=_(
help=_("Label to be shown for calculated average"), "This settings allows overriding label for the calculated average per mentoring block. Must be in JSON "
"format. Examples: {examples_here}."
).format(
examples_here='{"2754b8afc03a439693b9887b6f1d9e36": "Avg.", "215028f7df3d4c68b14fb5fea4da7053": "Mean"}'
),
scope=Scope.content, scope=Scope.content,
) )
show_numbers = Boolean( show_numbers = Boolean(
...@@ -235,7 +239,7 @@ class DashboardBlock(StudioEditableXBlockMixin, XBlock): ...@@ -235,7 +239,7 @@ class DashboardBlock(StudioEditableXBlockMixin, XBlock):
) )
editable_fields = ( editable_fields = (
'display_name', 'mentoring_ids', 'exclude_questions', 'average_label', 'show_numbers', 'display_name', 'mentoring_ids', 'exclude_questions', 'average_labels', 'show_numbers',
'color_rules', 'visual_rules', 'visual_title', 'visual_desc' 'color_rules', 'visual_rules', 'visual_title', 'visual_desc'
) )
css_path = 'public/css/dashboard.css' css_path = 'public/css/dashboard.css'
...@@ -408,6 +412,7 @@ class DashboardBlock(StudioEditableXBlockMixin, XBlock): ...@@ -408,6 +412,7 @@ class DashboardBlock(StudioEditableXBlockMixin, XBlock):
if numeric_values: if numeric_values:
average_value = sum(numeric_values) / len(numeric_values) average_value = sum(numeric_values) / len(numeric_values)
block['average'] = average_value block['average'] = average_value
block['average_label'] = self.average_labels.get(mentoring_block.url_name, _("Average"))
block['has_average'] = True block['has_average'] = True
block['average_color'] = self.color_for_value(average_value) block['average_color'] = self.color_for_value(average_value)
blocks.append(block) blocks.append(block)
...@@ -434,7 +439,6 @@ class DashboardBlock(StudioEditableXBlockMixin, XBlock): ...@@ -434,7 +439,6 @@ class DashboardBlock(StudioEditableXBlockMixin, XBlock):
'blocks': blocks, 'blocks': blocks,
'display_name': self.display_name, 'display_name': self.display_name,
'visual_repr': visual_repr, 'visual_repr': visual_repr,
'average_label': self.average_label,
'show_numbers': self.show_numbers, 'show_numbers': self.show_numbers,
}) })
...@@ -462,10 +466,33 @@ class DashboardBlock(StudioEditableXBlockMixin, XBlock): ...@@ -462,10 +466,33 @@ class DashboardBlock(StudioEditableXBlockMixin, XBlock):
for key, value in data.exclude_questions.iteritems(): for key, value in data.exclude_questions.iteritems():
if not isinstance(value, list): if not isinstance(value, list):
add_error( add_error(
_(u"Exclude questions is malformed: value for key {key} is {value}, expected list of integers") _(u"'Questions to be hidden' is malformed: value for key {key} is {value}, "
u"expected list of integers")
.format(key=key, value=value) .format(key=key, value=value)
) )
if key not in data.mentoring_ids:
add_error(
_(u"'Questions to be hidden' is malformed: mentoring url_name {url_name} "
u"is not added to Dashboard")
.format(url_name=key)
)
if data.average_labels:
for key, value in data.average_labels.iteritems():
if not isinstance(value, basestring):
add_error(
_(u"'Label for average value' is malformed: value for key {key} is {value}, expected string")
.format(key=key, value=value)
)
if key not in data.mentoring_ids:
add_error(
_(u"'Label for average value' is malformed: mentoring url_name {url_name} "
u"is not added to Dashboard")
.format(url_name=key)
)
if data.color_rules: if data.color_rules:
try: try:
self.parse_color_rules_str(data.color_rules, ignore_errors=False) self.parse_color_rules_str(data.color_rules, ignore_errors=False)
......
...@@ -56,7 +56,7 @@ ...@@ -56,7 +56,7 @@
{% endfor %} {% endfor %}
{% if block.has_average %} {% if block.has_average %}
<tr class="avg-row"> <tr class="avg-row">
<th class="desc">{{ average_label }}</th> <th class="desc">{{ block.average_label }}</th>
<td class="value" <td class="value"
{% if block.average_color %} style="border-right-color: {{block.average_color}};"{% endif %} {% if block.average_color %} style="border-right-color: {{block.average_color}};"{% endif %}
{% if not show_numbers %} {% if not show_numbers %}
......
...@@ -58,11 +58,13 @@ class TestDashboardBlock(SeleniumXBlockTest): ...@@ -58,11 +58,13 @@ class TestDashboardBlock(SeleniumXBlockTest):
""" """
SIMPLE_DASHBOARD = """<pb-dashboard mentoring_ids='["dummy-value"]'/>""" SIMPLE_DASHBOARD = """<pb-dashboard mentoring_ids='["dummy-value"]'/>"""
ALTERNATIVE_DASHBOARD = dedent(""" ALTERNATIVE_DASHBOARD = dedent("""
<pb-dashboard mentoring_ids='["dummy-value"]' average_label="Avg." show_numbers="false"/> <pb-dashboard mentoring_ids='["dummy-value"]' show_numbers="false"
average_labels='{"Step 1": "Avg.", "Step 2":"Mean", "Step 3":"Second Quartile"}'
/>
""") """)
HIDE_QUESTIONS_DASHBOARD = dedent(""" HIDE_QUESTIONS_DASHBOARD = dedent("""
<pb-dashboard mentoring_ids='["dummy-value"]' <pb-dashboard mentoring_ids='["dummy-value"]'
exclude_questions='{"Step 1": [2, 3], "Step 2":[3], "Step 3":[2]}' exclude_questions='{"Step 1": [2, 3], "Step 2":[3], "Step 3":[2]}'
/> />
""") """)
MALFORMED_HIDE_QUESTIONS_DASHBOARD = dedent(""" MALFORMED_HIDE_QUESTIONS_DASHBOARD = dedent("""
...@@ -185,7 +187,9 @@ class TestDashboardBlock(SeleniumXBlockTest): ...@@ -185,7 +187,9 @@ class TestDashboardBlock(SeleniumXBlockTest):
steps = dashboard.find_elements_by_css_selector('tbody') steps = dashboard.find_elements_by_css_selector('tbody')
self.assertEqual(len(steps), 3) self.assertEqual(len(steps), 3)
for step in steps: average_labels = ["Avg.", "Mean", "Second Quartile"]
for step_num, step in enumerate(steps):
mcq_rows = step.find_elements_by_css_selector('tr:not(.avg-row)') mcq_rows = step.find_elements_by_css_selector('tr:not(.avg-row)')
self.assertTrue(2 <= len(mcq_rows) <= 3) self.assertTrue(2 <= len(mcq_rows) <= 3)
for mcq in mcq_rows: for mcq in mcq_rows:
...@@ -194,7 +198,7 @@ class TestDashboardBlock(SeleniumXBlockTest): ...@@ -194,7 +198,7 @@ class TestDashboardBlock(SeleniumXBlockTest):
# Check the average: # Check the average:
avg_row = step.find_element_by_css_selector('tr.avg-row') avg_row = step.find_element_by_css_selector('tr.avg-row')
left_col = avg_row.find_element_by_css_selector('.desc') left_col = avg_row.find_element_by_css_selector('.desc')
self.assertEqual(left_col.text, "Avg.") self.assertEqual(left_col.text, average_labels[step_num])
right_col = avg_row.find_element_by_css_selector('.value') right_col = avg_row.find_element_by_css_selector('.value')
self.assertEqual(right_col.text, "") self.assertEqual(right_col.text, "")
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment