Commit 475ac62c by Felix Sun

Fixed epic git rebase meltdown. No new features.

parent 6ccfa2e3
...@@ -14,7 +14,7 @@ from xmodule.modulestore import Location ...@@ -14,7 +14,7 @@ from xmodule.modulestore import Location
from xmodule.modulestore.exceptions import ItemNotFoundError from xmodule.modulestore.exceptions import ItemNotFoundError
from xmodule.x_module import XModule from xmodule.x_module import XModule
from xmodule.xml_module import XmlDescriptor from xmodule.xml_module import XmlDescriptor
from xblock.core import XBlock, Scope, String, Integer, Float, Object, Boolean from xblock.core import XBlock, Scope, String, Integer, Float, Boolean, Dict, List
from django.utils.html import escape from django.utils.html import escape
...@@ -23,18 +23,10 @@ log = logging.getLogger(__name__) ...@@ -23,18 +23,10 @@ log = logging.getLogger(__name__)
class CrowdsourceHinterFields(object): class CrowdsourceHinterFields(object):
has_children = True has_children = True
hints = Object(help='''A dictionary mapping answers to lists of [hint, number_of_votes] pairs. hints = Dict(help='''A dictionary mapping answers to lists of [hint, number_of_votes] pairs.
''', scope=Scope.content, default= { ''', scope=Scope.content, default= {})
'4':
[['This is a hint.', 5],
['This is hint 2', 3],
['This is hint 3', 2],
['This is hint 4', 1]]})
'''
Testing data for hints:
''' previous_answers = List(help='''A list of previous answers this student made to this problem.
previous_answers = Object(help='''A list of previous answers this student made to this problem.
Of the form (answer, (hint_id_1, hint_id_2, hint_id_3)) for each problem. hint_id's are Of the form (answer, (hint_id_1, hint_id_2, hint_id_3)) for each problem. hint_id's are
None if the hint was not given.''', None if the hint was not given.''',
scope=Scope.user_state, default=[]) scope=Scope.user_state, default=[])
...@@ -50,6 +42,8 @@ class CrowdsourceHinterFields(object): ...@@ -50,6 +42,8 @@ class CrowdsourceHinterFields(object):
mod_queue = Dict(help='''Contains hints that have not been approved by the staff yet. Structured mod_queue = Dict(help='''Contains hints that have not been approved by the staff yet. Structured
identically to the hints dictionary.''', scope=Scope.content, default={}) identically to the hints dictionary.''', scope=Scope.content, default={})
hint_pk = Integer(help='Used to index hints.', scope=Scope.content, default=0)
class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule): class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule):
''' An Xmodule that makes crowdsourced hints. ''' An Xmodule that makes crowdsourced hints.
...@@ -62,8 +56,8 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule): ...@@ -62,8 +56,8 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule):
js_module_name = "Hinter" js_module_name = "Hinter"
def __init__(self, system, location, descriptor, model_data): def __init__(self, *args, **kwargs):
XModule.__init__(self, system, location, descriptor, model_data) XModule.__init__(self, *args, **kwargs)
def get_html(self): def get_html(self):
...@@ -104,7 +98,7 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule): ...@@ -104,7 +98,7 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule):
of the answer. of the answer.
-Lon-capa dependent. -Lon-capa dependent.
''' '''
return answer.values()[0][0] return str(float(answer.values()[0]))
def handle_ajax(self, dispatch, get): def handle_ajax(self, dispatch, get):
...@@ -124,16 +118,15 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule): ...@@ -124,16 +118,15 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule):
''' '''
The student got the incorrect answer found in get. Give him a hint. The student got the incorrect answer found in get. Give him a hint.
''' '''
print self.hints
answer = self.ans_to_text(get) answer = self.ans_to_text(get)
# Look for a hint to give. # Look for a hint to give.
if (answer not in self.hints) or (len(self.hints[answer]) == 0): if (answer not in self.hints) or (len(self.hints[answer]) == 0):
# No hints to give. Return. # No hints to give. Return.
self.previous_answers += [(answer, (None, None, None))] self.previous_answers += [[answer, [None, None, None]]]
return json.dumps({'contents': ' '}) return json.dumps({'contents': ' '})
# Get the top hint, plus two random hints. # Get the top hint, plus two random hints.
n_hints = len(self.hints[answer]) n_hints = len(self.hints[answer])
best_hint_index = max(xrange(n_hints), key=lambda i:self.hints[answer][i][1]) best_hint_index = max(self.hints[answer], key=lambda key: self.hints[answer][key][1])
best_hint = self.hints[answer][best_hint_index][0] best_hint = self.hints[answer][best_hint_index][0]
if len(self.hints[answer]) == 1: if len(self.hints[answer]) == 1:
rand_hint_1 = '' rand_hint_1 = ''
...@@ -147,9 +140,10 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule): ...@@ -147,9 +140,10 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule):
rand_hint_2 = '' rand_hint_2 = ''
self.previous_answers += [[answer, [best_hint_index, hint_index_1, None]]] self.previous_answers += [[answer, [best_hint_index, hint_index_1, None]]]
else: else:
hint_index_1, hint_index_2 = random.sample(xrange(len(self.hints[answer])), 2) (hint_index_1, rand_hint_1), (hint_index_2, rand_hint_2) =\
rand_hint_1 = self.hints[answer][hint_index_1][0] random.sample(self.hints[answer].items(), 2)
rand_hint_2 = self.hints[answer][hint_index_2][0] rand_hint_1 = rand_hint_1[0]
rand_hint_2 = rand_hint_2[0]
self.previous_answers += [(answer, (best_hint_index, hint_index_1, hint_index_2))] self.previous_answers += [(answer, (best_hint_index, hint_index_1, hint_index_2))]
hint_text = best_hint + '<br />' + rand_hint_1 + '<br />' + rand_hint_2 hint_text = best_hint + '<br />' + rand_hint_1 + '<br />' + rand_hint_2
return json.dumps({'contents': hint_text}) return json.dumps({'contents': hint_text})
...@@ -172,9 +166,10 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule): ...@@ -172,9 +166,10 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule):
answer, hints_offered = self.previous_answers[i] answer, hints_offered = self.previous_answers[i]
pretty_answers.append(answer) pretty_answers.append(answer)
# If there are previous hints for this answer, ask the student to vote on one. # If there are previous hints for this answer, ask the student to vote on one.
out += '<div class = "previous-answer" id="previous-answer-' + str(i) + \
'" style="display:none">'
if answer in self.hints: if answer in self.hints:
out += '<div class = "previous-answer" id="previous-answer-' + str(i) + \ out += 'Which hint was most helpful when you got the wrong answer of '\
'" style="display:none"> Which hint was most helpful when you got the wrong answer of '\
+ answer + '?' + answer + '?'
# Add each hint to the html string, with a vote button. # Add each hint to the html string, with a vote button.
for hint_id in hints_offered: for hint_id in hints_offered:
...@@ -190,7 +185,7 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule): ...@@ -190,7 +185,7 @@ class CrowdsourceHinterModule(CrowdsourceHinterFields, XModule):
# Or, let the student create his own hint # Or, let the student create his own hint
out += '''<br /> If you didn\'t like any of these, plese submit your own: <br /> out += '''<br /> If you didn\'t like any of these, plese submit your own: <br />
<textarea cols="50" id="custom-hint-'''+str(i)+'''"> <textarea cols="50" style="height:100px" class="custom-hint" id="custom-hint-'''+str(i)+'''">
What would you say to help someone who got this wrong answer? What would you say to help someone who got this wrong answer?
(Don't give away the answer, please.) (Don't give away the answer, please.)
</textarea>''' </textarea>'''
...@@ -220,7 +215,7 @@ What would you say to help someone who got this wrong answer? ...@@ -220,7 +215,7 @@ What would you say to help someone who got this wrong answer?
if self.user_voted: if self.user_voted:
return json.dumps({'contents': 'Sorry, but you have already voted!'}) return json.dumps({'contents': 'Sorry, but you have already voted!'})
ans_no = int(get['answer']) ans_no = int(get['answer'])
hint_no = int(get['hint']) hint_no = str(get['hint'])
answer = self.previous_answers[ans_no][0] answer = self.previous_answers[ans_no][0]
temp_dict = self.hints temp_dict = self.hints
temp_dict[answer][hint_no][1] += 1 temp_dict[answer][hint_no][1] += 1
...@@ -244,18 +239,11 @@ What would you say to help someone who got this wrong answer? ...@@ -244,18 +239,11 @@ What would you say to help someone who got this wrong answer?
# Do html escaping. Perhaps in the future do profanity filtering, etc. as well. # Do html escaping. Perhaps in the future do profanity filtering, etc. as well.
hint = escape(get['hint']) hint = escape(get['hint'])
answer = self.previous_answers[int(get['answer'])][0] answer = self.previous_answers[int(get['answer'])][0]
if self.user_voted:
return json.dumps({'contents': 'Sorry, but you have already voted!'})
# Add the new hint to self.hints. (Awkward because a direct write # Add the new hint to self.hints. (Awkward because a direct write
# is necessary.) # is necessary.)
<<<<<<< HEAD
<<<<<<< HEAD
temp_dict = self.hints
temp_dict[answer].append([hint, 1]) # With one vote (the user himself).
self.hints = temp_dict
=======
if self.moderate:
=======
if self.moderate == 'True': if self.moderate == 'True':
>>>>>>> Made tests of the crowdsource hinter module more standardized and easier to read. Fixed database non-initialization bug in crowdsource hinter module.
temp_dict = self.mod_queue temp_dict = self.mod_queue
else: else:
temp_dict = self.hints temp_dict = self.hints
...@@ -268,15 +256,12 @@ What would you say to help someone who got this wrong answer? ...@@ -268,15 +256,12 @@ What would you say to help someone who got this wrong answer?
self.mod_queue = temp_dict self.mod_queue = temp_dict
else: else:
self.hints = temp_dict self.hints = temp_dict
>>>>>>> Began work on instructor view to hinting system.
# Mark the user has having voted; reset previous_answers # Mark the user has having voted; reset previous_answers
self.user_voted = True self.user_voted = True
self.previous_answers = [] self.previous_answers = []
return json.dumps({'contents': 'Thank you for your hint!'}) return json.dumps({'contents': 'Thank you for your hint!'})
<<<<<<< HEAD
=======
def delete_hint(self, answer, hint_id): def delete_hint(self, answer, hint_id):
''' '''
From the answer, delete the hint with hint_id. From the answer, delete the hint with hint_id.
...@@ -288,7 +273,6 @@ What would you say to help someone who got this wrong answer? ...@@ -288,7 +273,6 @@ What would you say to help someone who got this wrong answer?
self.hints = temp_hints self.hints = temp_hints
>>>>>>> Began work on instructor view to hinting system.
class CrowdsourceHinterDescriptor(CrowdsourceHinterFields, XmlDescriptor): class CrowdsourceHinterDescriptor(CrowdsourceHinterFields, XmlDescriptor):
module_class = CrowdsourceHinterModule module_class = CrowdsourceHinterModule
stores_state = True stores_state = True
......
...@@ -30,6 +30,7 @@ class @Hinter ...@@ -30,6 +30,7 @@ class @Hinter
@$('input.vote').click @vote @$('input.vote').click @vote
@$('#feedback-select').change @feedback_ui_change @$('#feedback-select').change @feedback_ui_change
@$('input.submit-hint').click @submit_hint @$('input.submit-hint').click @submit_hint
@$('.custom-hint').click @clear_default_text
vote: (eventObj) => vote: (eventObj) =>
...@@ -46,6 +47,13 @@ class @Hinter ...@@ -46,6 +47,13 @@ class @Hinter
$.postWithPrefix "#{@url}/submit_hint",post_json, (response) => $.postWithPrefix "#{@url}/submit_hint",post_json, (response) =>
@render(response.contents) @render(response.contents)
clear_default_text: (eventObj) =>
target = @$(eventObj.currentTarget)
if target.data('cleared') == undefined
target.val('')
target.data('cleared', true)
feedback_ui_change: => feedback_ui_change: =>
# Make all of the previous-answer divs hidden. # Make all of the previous-answer divs hidden.
@$('.previous-answer').css('display', 'none') @$('.previous-answer').css('display', 'none')
......
...@@ -136,6 +136,7 @@ class CrowdsourceHinterTest(unittest.TestCase): ...@@ -136,6 +136,7 @@ class CrowdsourceHinterTest(unittest.TestCase):
m = CHModuleFactory.create() m = CHModuleFactory.create()
json_in = {'problem_name': '24.0'} json_in = {'problem_name': '24.0'}
json_out = json.loads(m.get_hint(json_in))['contents'] json_out = json.loads(m.get_hint(json_in))['contents']
print json_out
self.assertTrue('Best hint' in json_out) self.assertTrue('Best hint' in json_out)
self.assertTrue(json_out.count('hint') == 3) self.assertTrue(json_out.count('hint') == 3)
...@@ -211,7 +212,9 @@ class CrowdsourceHinterTest(unittest.TestCase): ...@@ -211,7 +212,9 @@ class CrowdsourceHinterTest(unittest.TestCase):
''' '''
m = CHModuleFactory.create(user_voted=True) m = CHModuleFactory.create(user_voted=True)
json_in = {'answer': 1, 'hint': 'This is a new hint.'} json_in = {'answer': 1, 'hint': 'This is a new hint.'}
print m.user_voted
m.submit_hint(json_in) m.submit_hint(json_in)
print m.hints
self.assertTrue('29.0' not in m.hints) self.assertTrue('29.0' not in m.hints)
......
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