Commit 95a9ca13 by Sarina Canelake

Merge pull request #5148 from lduarte1991/lduarte-harvardx-pr24

Annotation Tools: Give staff/instructors full permissions (bug fix)
parents fcae6b57 a1541b61
...@@ -109,6 +109,9 @@ class ImageAnnotationModule(AnnotatableFields, XModule): ...@@ -109,6 +109,9 @@ class ImageAnnotationModule(AnnotatableFields, XModule):
self.instructions = self._extract_instructions(xmltree) self.instructions = self._extract_instructions(xmltree)
self.openseadragonjson = html_to_text(etree.tostring(xmltree.find('json'), encoding='unicode')) self.openseadragonjson = html_to_text(etree.tostring(xmltree.find('json'), encoding='unicode'))
self.user = "" self.user = ""
self.is_course_staff = False
if self.runtime.get_user_role() in ['instructor', 'staff']:
self.is_course_staff = True
if self.runtime.get_real_user is not None: if self.runtime.get_real_user is not None:
self.user = self.runtime.get_real_user(self.runtime.anonymous_student_id).email self.user = self.runtime.get_real_user(self.runtime.anonymous_student_id).email
...@@ -128,10 +131,15 @@ class ImageAnnotationModule(AnnotatableFields, XModule): ...@@ -128,10 +131,15 @@ class ImageAnnotationModule(AnnotatableFields, XModule):
'default_tab': self.default_tab, 'default_tab': self.default_tab,
'instructor_email': self.instructor_email, 'instructor_email': self.instructor_email,
'annotation_mode': self.annotation_mode, 'annotation_mode': self.annotation_mode,
'is_course_staff': self.is_course_staff,
} }
fragment = Fragment(self.system.render_template('imageannotation.html', context)) fragment = Fragment(self.system.render_template('imageannotation.html', context))
fragment.add_javascript_url(self.runtime.STATIC_URL + "js/vendor/tinymce/js/tinymce/tinymce.full.min.js")
fragment.add_javascript_url(self.runtime.STATIC_URL + "js/vendor/tinymce/js/tinymce/jquery.tinymce.min.js") # TinyMCE already exists in Studio so we should not load the files again
# get_real_user always returns "None" in Studio since its runtimes contains no anonymous ids
if self.runtime.get_real_user is not None:
fragment.add_javascript_url(self.runtime.STATIC_URL + "js/vendor/tinymce/js/tinymce/tinymce.full.min.js")
fragment.add_javascript_url(self.runtime.STATIC_URL + "js/vendor/tinymce/js/tinymce/jquery.tinymce.min.js")
return fragment return fragment
......
...@@ -46,9 +46,23 @@ class ImageAnnotationModuleTestCase(unittest.TestCase): ...@@ -46,9 +46,23 @@ class ImageAnnotationModuleTestCase(unittest.TestCase):
""" """
Makes sure that the Module is declared and mocked with the sample xml above. Makes sure that the Module is declared and mocked with the sample xml above.
""" """
# return anything except None to test LMS
def test_real_user(useless):
useless_user = Mock(email='fake@fake.com', id=useless)
return useless_user
# test to make sure that role is checked in LMS
def test_user_role():
return 'staff'
self.system = get_test_system()
self.system.get_real_user = test_real_user
self.system.get_user_role = test_user_role
self.system.anonymous_student_id = None
self.mod = ImageAnnotationModule( self.mod = ImageAnnotationModule(
Mock(), Mock(),
get_test_system(), self.system,
DictFieldData({'data': self.sample_xml}), DictFieldData({'data': self.sample_xml}),
ScopeIds(None, None, None, None) ScopeIds(None, None, None, None)
) )
...@@ -74,5 +88,5 @@ class ImageAnnotationModuleTestCase(unittest.TestCase): ...@@ -74,5 +88,5 @@ class ImageAnnotationModuleTestCase(unittest.TestCase):
Tests the function that passes in all the information in the context that will be used in templates/textannotation.html Tests the function that passes in all the information in the context that will be used in templates/textannotation.html
""" """
context = self.mod.student_view({}).content context = self.mod.student_view({}).content
for key in ['display_name', 'instructions_html', 'annotation_storage', 'token', 'tag', 'openseadragonjson']: for key in ['display_name', 'instructions_html', 'annotation_storage', 'token', 'tag', 'openseadragonjson', 'default_tab', 'instructor_email', 'annotation_mode', 'is_course_staff']:
self.assertIn(key, context) self.assertIn(key, context)
...@@ -31,9 +31,23 @@ class TextAnnotationModuleTestCase(unittest.TestCase): ...@@ -31,9 +31,23 @@ class TextAnnotationModuleTestCase(unittest.TestCase):
""" """
Makes sure that the Module is declared and mocked with the sample xml above. Makes sure that the Module is declared and mocked with the sample xml above.
""" """
# return anything except None to test LMS
def test_real_user(useless):
useless_user = Mock(email='fake@fake.com', id=useless)
return useless_user
# test to make sure that role is checked in LMS
def test_user_role():
return 'staff'
self.system = get_test_system()
self.system.get_real_user = test_real_user
self.system.get_user_role = test_user_role
self.system.anonymous_student_id = None
self.mod = TextAnnotationModule( self.mod = TextAnnotationModule(
Mock(), Mock(),
get_test_system(), self.system,
DictFieldData({'data': self.sample_xml}), DictFieldData({'data': self.sample_xml}),
ScopeIds(None, None, None, None) ScopeIds(None, None, None, None)
) )
...@@ -59,5 +73,5 @@ class TextAnnotationModuleTestCase(unittest.TestCase): ...@@ -59,5 +73,5 @@ class TextAnnotationModuleTestCase(unittest.TestCase):
Tests the function that passes in all the information in the context that will be used in templates/textannotation.html Tests the function that passes in all the information in the context that will be used in templates/textannotation.html
""" """
context = self.mod.student_view({}).content context = self.mod.student_view({}).content
for key in ['display_name', 'tag', 'source', 'instructions_html', 'content_html', 'annotation_storage', 'token']: for key in ['display_name', 'tag', 'source', 'instructions_html', 'content_html', 'annotation_storage', 'token', 'diacritic_marks', 'default_tab', 'annotation_mode', 'is_course_staff']:
self.assertIn(key, context) self.assertIn(key, context)
...@@ -27,9 +27,23 @@ class VideoAnnotationModuleTestCase(unittest.TestCase): ...@@ -27,9 +27,23 @@ class VideoAnnotationModuleTestCase(unittest.TestCase):
""" """
Makes sure that the Video Annotation Module is created. Makes sure that the Video Annotation Module is created.
""" """
# return anything except None to test LMS
def test_real_user(useless):
useless_user = Mock(email='fake@fake.com', id=useless)
return useless_user
# test to make sure that role is checked in LMS
def test_user_role():
return 'staff'
self.system = get_test_system()
self.system.get_real_user = test_real_user
self.system.get_user_role = test_user_role
self.system.anonymous_student_id = None
self.mod = VideoAnnotationModule( self.mod = VideoAnnotationModule(
Mock(), Mock(),
get_test_system(), self.system,
DictFieldData({'data': self.sample_xml, 'sourceUrl': self.sample_sourceurl}), DictFieldData({'data': self.sample_xml, 'sourceUrl': self.sample_sourceurl}),
ScopeIds(None, None, None, None) ScopeIds(None, None, None, None)
) )
...@@ -67,5 +81,5 @@ class VideoAnnotationModuleTestCase(unittest.TestCase): ...@@ -67,5 +81,5 @@ class VideoAnnotationModuleTestCase(unittest.TestCase):
Tests to make sure variables passed in truly exist within the html once it is all rendered. Tests to make sure variables passed in truly exist within the html once it is all rendered.
""" """
context = self.mod.student_view({}).content context = self.mod.student_view({}).content
for key in ['display_name', 'instructions_html', 'sourceUrl', 'typeSource', 'poster', 'annotation_storage']: for key in ['display_name', 'instructions_html', 'sourceUrl', 'typeSource', 'poster', 'annotation_storage', 'default_tab', 'instructor_email', 'annotation_mode', "is_course_staff"]:
self.assertIn(key, context) self.assertIn(key, context)
...@@ -103,6 +103,9 @@ class TextAnnotationModule(AnnotatableFields, XModule): ...@@ -103,6 +103,9 @@ class TextAnnotationModule(AnnotatableFields, XModule):
self.instructions = self._extract_instructions(xmltree) self.instructions = self._extract_instructions(xmltree)
self.content = etree.tostring(xmltree, encoding='unicode') self.content = etree.tostring(xmltree, encoding='unicode')
self.user_email = "" self.user_email = ""
self.is_course_staff = False
if self.runtime.get_user_role() in ['instructor', 'staff']:
self.is_course_staff = True
if self.runtime.get_real_user is not None: if self.runtime.get_real_user is not None:
self.user_email = self.runtime.get_real_user(self.runtime.anonymous_student_id).email self.user_email = self.runtime.get_real_user(self.runtime.anonymous_student_id).email
...@@ -125,10 +128,15 @@ class TextAnnotationModule(AnnotatableFields, XModule): ...@@ -125,10 +128,15 @@ class TextAnnotationModule(AnnotatableFields, XModule):
'default_tab': self.default_tab, 'default_tab': self.default_tab,
'instructor_email': self.instructor_email, 'instructor_email': self.instructor_email,
'annotation_mode': self.annotation_mode, 'annotation_mode': self.annotation_mode,
'is_course_staff': self.is_course_staff,
} }
fragment = Fragment(self.system.render_template('textannotation.html', context)) fragment = Fragment(self.system.render_template('textannotation.html', context))
fragment.add_javascript_url(self.runtime.STATIC_URL + "js/vendor/tinymce/js/tinymce/tinymce.full.min.js")
fragment.add_javascript_url(self.runtime.STATIC_URL + "js/vendor/tinymce/js/tinymce/jquery.tinymce.min.js") # TinyMCE already exists in Studio so we should not load the files again
# get_real_user always returns "None" in Studio since its runtimes contains no anonymous ids
if self.runtime.get_real_user is not None:
fragment.add_javascript_url(self.runtime.STATIC_URL + "js/vendor/tinymce/js/tinymce/tinymce.full.min.js")
fragment.add_javascript_url(self.runtime.STATIC_URL + "js/vendor/tinymce/js/tinymce/jquery.tinymce.min.js")
return fragment return fragment
......
...@@ -103,6 +103,9 @@ class VideoAnnotationModule(AnnotatableFields, XModule): ...@@ -103,6 +103,9 @@ class VideoAnnotationModule(AnnotatableFields, XModule):
self.instructions = self._extract_instructions(xmltree) self.instructions = self._extract_instructions(xmltree)
self.content = etree.tostring(xmltree, encoding='unicode') self.content = etree.tostring(xmltree, encoding='unicode')
self.user_email = "" self.user_email = ""
self.is_course_staff = False
if self.runtime.get_user_role() in ['instructor', 'staff']:
self.is_course_staff = True
if self.runtime.get_real_user is not None: if self.runtime.get_real_user is not None:
self.user_email = self.runtime.get_real_user(self.runtime.anonymous_student_id).email self.user_email = self.runtime.get_real_user(self.runtime.anonymous_student_id).email
...@@ -131,10 +134,15 @@ class VideoAnnotationModule(AnnotatableFields, XModule): ...@@ -131,10 +134,15 @@ class VideoAnnotationModule(AnnotatableFields, XModule):
'default_tab': self.default_tab, 'default_tab': self.default_tab,
'instructor_email': self.instructor_email, 'instructor_email': self.instructor_email,
'annotation_mode': self.annotation_mode, 'annotation_mode': self.annotation_mode,
'is_course_staff': self.is_course_staff,
} }
fragment = Fragment(self.system.render_template('videoannotation.html', context)) fragment = Fragment(self.system.render_template('videoannotation.html', context))
fragment.add_javascript_url(self.runtime.STATIC_URL + "js/vendor/tinymce/js/tinymce/tinymce.full.min.js")
fragment.add_javascript_url(self.runtime.STATIC_URL + "js/vendor/tinymce/js/tinymce/jquery.tinymce.min.js") # TinyMCE already exists in Studio so we should not load the files again
# get_real_user always returns "None" in Studio since its runtimes contains no anonymous ids
if self.runtime.get_real_user is not None:
fragment.add_javascript_url(self.runtime.STATIC_URL + "js/vendor/tinymce/js/tinymce/tinymce.full.min.js")
fragment.add_javascript_url(self.runtime.STATIC_URL + "js/vendor/tinymce/js/tinymce/jquery.tinymce.min.js")
return fragment return fragment
......
...@@ -72,7 +72,7 @@ ...@@ -72,7 +72,7 @@
var unit_id = $('#sequence-list').find('.active').attr("data-element"); var unit_id = $('#sequence-list').find('.active').attr("data-element");
uri += unit_id; uri += unit_id;
var pagination = 100, var pagination = 100,
is_staff = ('${user.email}'=='${instructor_email}'), is_staff = '${is_course_staff}' === 'True',
options = { options = {
optionsAnnotator: { optionsAnnotator: {
permissions:{ permissions:{
......
...@@ -61,7 +61,7 @@ ${static.css(group='style-xmodule-annotations', raw=True)} ...@@ -61,7 +61,7 @@ ${static.css(group='style-xmodule-annotations', raw=True)}
var unit_id = $('#sequence-list').find('.active').attr("data-element"); var unit_id = $('#sequence-list').find('.active').attr("data-element");
uri += unit_id; uri += unit_id;
var pagination = 100, var pagination = 100,
is_staff = !('${user.is_staff}'=='False'), is_staff = '${is_course_staff}' === 'True',
options = { options = {
optionsAnnotator: { optionsAnnotator: {
permissions:{ permissions:{
......
...@@ -64,7 +64,7 @@ ${static.css(group='style-xmodule-annotations', raw=True)} ...@@ -64,7 +64,7 @@ ${static.css(group='style-xmodule-annotations', raw=True)}
var unit_id = $('#sequence-list').find('.active').attr("data-element"); var unit_id = $('#sequence-list').find('.active').attr("data-element");
uri += unit_id; uri += unit_id;
var pagination = 100, var pagination = 100,
is_staff = !('${user.is_staff}'=='False'), is_staff = '${is_course_staff}' === 'True',
options = { options = {
optionsAnnotator: { optionsAnnotator: {
permissions:{ permissions:{
......
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