Made explanation for hints field in crowdsource_hinter.py more clear.
Fixed various commenting things. Removed an unused function in the crowdsourced module coffeescript. Improved commenting in hint_manager. Fixed pep and pylint violations.
This commit is contained in:
@@ -22,7 +22,7 @@ from xmodule.modulestore.django import modulestore
|
||||
@ensure_csrf_cookie
|
||||
def hint_manager(request, course_id):
|
||||
try:
|
||||
course = get_course_with_access(request.user, course_id, 'staff', depth=None)
|
||||
get_course_with_access(request.user, course_id, 'staff', depth=None)
|
||||
except Http404:
|
||||
out = 'Sorry, but students are not allowed to access the hint manager!'
|
||||
return HttpResponse(out)
|
||||
@@ -74,12 +74,17 @@ def get_hints(request, course_id, field):
|
||||
other_field = 'mod_queue'
|
||||
field_label = 'Approved Hints'
|
||||
other_field_label = 'Hints Awaiting Moderation'
|
||||
# The course_id is of the form school/number/classname.
|
||||
# We want to use the course_id to find all matching definition_id's.
|
||||
# To do this, just take the school/number part - leave off the classname.
|
||||
chopped_id = '/'.join(course_id.split('/')[:-1])
|
||||
chopped_id = re.escape(chopped_id)
|
||||
all_hints = XModuleContentField.objects.filter(field_name=field, definition_id__regex=chopped_id)
|
||||
# big_out_dict[problem id] = [[answer, {pk: [hint, votes]}], sorted by answer]
|
||||
# big_out_dict maps a problem id to a list of [answer, hints] pairs, sorted in order of answer.
|
||||
big_out_dict = {}
|
||||
# name_dict[problem id] = Display name of problem
|
||||
# id_to name maps a problem id to the name of the problem.
|
||||
# id_to_name[problem id] = Display name of problem
|
||||
id_to_name = {}
|
||||
|
||||
for hints_by_problem in all_hints:
|
||||
@@ -88,7 +93,6 @@ def get_hints(request, course_id, field):
|
||||
if name is None:
|
||||
continue
|
||||
id_to_name[hints_by_problem.definition_id] = name
|
||||
# Answer list contains (answer, dict_of_hints) tuples.
|
||||
|
||||
def answer_sorter(thing):
|
||||
"""
|
||||
@@ -102,6 +106,7 @@ def get_hints(request, course_id, field):
|
||||
# Put all non-numerical answers first.
|
||||
return float('-inf')
|
||||
|
||||
# Answer list contains [answer, dict_of_hints] pairs.
|
||||
answer_list = sorted(json.loads(hints_by_problem.value).items(), key=answer_sorter)
|
||||
big_out_dict[hints_by_problem.definition_id] = answer_list
|
||||
|
||||
@@ -113,6 +118,7 @@ def get_hints(request, course_id, field):
|
||||
'id_to_name': id_to_name}
|
||||
return render_dict
|
||||
|
||||
|
||||
def location_to_problem_name(loc):
|
||||
"""
|
||||
Given the location of a crowdsource_hinter module, try to return the name of the
|
||||
@@ -229,4 +235,4 @@ def approve(request, course_id, field):
|
||||
problem_dict[answer] = {}
|
||||
problem_dict[answer][pk] = hint_to_move
|
||||
problem_in_hints.value = json.dumps(problem_dict)
|
||||
problem_in_hints.save()
|
||||
problem_in_hints.save()
|
||||
|
||||
@@ -1,21 +1,17 @@
|
||||
import unittest
|
||||
import nose.tools
|
||||
import json
|
||||
|
||||
from django.http import Http404
|
||||
from django.test.client import Client, RequestFactory
|
||||
from django.test.utils import override_settings
|
||||
import mitxmako.middleware
|
||||
|
||||
from courseware.models import XModuleContentField
|
||||
from courseware.tests.factories import ContentFactory
|
||||
from courseware.tests.tests import TEST_DATA_MONGO_MODULESTORE
|
||||
import instructor.hint_manager as view
|
||||
from student.tests.factories import UserFactory, AdminFactory
|
||||
from student.tests.factories import UserFactory
|
||||
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase
|
||||
from xmodule.modulestore.tests.factories import CourseFactory
|
||||
|
||||
|
||||
|
||||
@override_settings(MODULESTORE=TEST_DATA_MONGO_MODULESTORE)
|
||||
class HintManagerTest(ModuleStoreTestCase):
|
||||
|
||||
@@ -36,7 +32,7 @@ class HintManagerTest(ModuleStoreTestCase):
|
||||
value=json.dumps({'1.0': {'1': ['Hint 1', 2],
|
||||
'3': ['Hint 3', 12]},
|
||||
'2.0': {'4': ['Hint 4', 3]}
|
||||
}))
|
||||
}))
|
||||
ContentFactory.create(field_name='mod_queue',
|
||||
definition_id=self.problem_id,
|
||||
value=json.dumps({'2.0': {'2': ['Hint 2', 1]}}))
|
||||
@@ -48,13 +44,12 @@ class HintManagerTest(ModuleStoreTestCase):
|
||||
# (I can't figure out how to get fake structures into the modulestore.)
|
||||
view.location_to_problem_name = lambda loc: "Test problem"
|
||||
|
||||
|
||||
def test_student_block(self):
|
||||
"""
|
||||
Makes sure that students cannot see the hint management view.
|
||||
"""
|
||||
c = Client()
|
||||
user = UserFactory.create(username='student', email='student@edx.org', password='test')
|
||||
UserFactory.create(username='student', email='student@edx.org', password='test')
|
||||
c.login(username='student', password='test')
|
||||
out = c.get(self.url)
|
||||
print out
|
||||
@@ -70,7 +65,7 @@ class HintManagerTest(ModuleStoreTestCase):
|
||||
|
||||
def test_invalid_field_access(self):
|
||||
"""
|
||||
Makes sure that field names other than 'mod_queue' and 'hints' are
|
||||
Makes sure that field names other than 'mod_queue' and 'hints' are
|
||||
rejected.
|
||||
"""
|
||||
out = self.c.post(self.url, {'op': 'delete hints', 'field': 'all your private data'})
|
||||
@@ -110,7 +105,7 @@ class HintManagerTest(ModuleStoreTestCase):
|
||||
'3': ['Hint 3', 12]}),
|
||||
('2.0', {'4': ['Hint 4', 3]})
|
||||
]}
|
||||
self.assertTrue(out['all_hints'] == expected)
|
||||
self.assertTrue(out['all_hints'] == expected)
|
||||
|
||||
def test_deletehints(self):
|
||||
"""
|
||||
@@ -167,6 +162,3 @@ class HintManagerTest(ModuleStoreTestCase):
|
||||
problem_hints = XModuleContentField.objects.get(field_name='hints', definition_id=self.problem_id).value
|
||||
self.assertTrue(json.loads(problem_hints)['2.0']['2'] == ['Hint 2', 1])
|
||||
self.assertTrue(len(json.loads(problem_hints)['2.0']) == 2)
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user