Merge pull request #17682 from mitodl/fix_overrideing_due_date_issue

Fixed override due date by limiting scope to selected users
This commit is contained in:
J Eskew
2018-10-12 17:37:32 -04:00
committed by GitHub
6 changed files with 86 additions and 14 deletions

View File

@@ -208,7 +208,7 @@ Phil McGachey <phil_mcgachey@harvard.edu>
Sri Harsha Pamu <kmitharsha@gmail.com>
Cris Ewing <cris@crisewing.com>
Carlos de La Guardia <carlos@jazkarta.com>
Amir Qayyum Khan <amir.qayyum@arbisoft.com>
Amir Qayyum Khan <amir.qayyum.khan@gmail.com>
Jolyon Bloomfield <jolyon@mit.edu>
Kyle McCormick <kylemccor@gmail.com>
Jim Cai <jimcai@stanford.edu>

View File

@@ -59,7 +59,7 @@ def get_blocks(
include_gated_sections = 'show_gated_sections' in requested_fields
if user is not None:
transformers += course_blocks_api.get_course_block_access_transformers()
transformers += course_blocks_api.get_course_block_access_transformers(user)
transformers += [MilestonesAndSpecialExamsTransformer(
include_special_exams=include_special_exams,
include_gated_sections=include_gated_sections)]

View File

@@ -44,7 +44,7 @@ class TestBlockSerializerBase(SharedModuleStoreTestCase):
requested_student_view_data=['video'],
)
self.transformers = BlockStructureTransformers(
get_course_block_access_transformers() + [blocks_api_transformer]
get_course_block_access_transformers(self.user) + [blocks_api_transformer]
)
self.block_structure = get_course_blocks(
self.user,

View File

@@ -23,10 +23,15 @@ def has_individual_student_override_provider():
return INDIVIDUAL_STUDENT_OVERRIDE_PROVIDER in getattr(settings, 'FIELD_OVERRIDE_PROVIDERS', ())
def get_course_block_access_transformers():
def get_course_block_access_transformers(user):
"""
Default list of transformers for manipulating course block structures
based on the user's access to the course blocks.
Arguments:
user (django.contrib.auth.models.User) - User object for
which the block structure is to be transformed.
"""
course_block_access_transformers = [
library_content.ContentLibraryTransformer(),
@@ -35,7 +40,7 @@ def get_course_block_access_transformers():
visibility.VisibilityTransformer(),
]
if has_individual_student_override_provider():
course_block_access_transformers += [load_override_data.OverrideDataTransformer()]
course_block_access_transformers += [load_override_data.OverrideDataTransformer(user)]
return course_block_access_transformers
@@ -77,7 +82,7 @@ def get_course_blocks(
access.
"""
if not transformers:
transformers = BlockStructureTransformers(get_course_block_access_transformers())
transformers = BlockStructureTransformers(get_course_block_access_transformers(user))
transformers.usage_info = CourseUsageInfo(starting_block_usage_key.course_key, user)
return get_block_structure_manager(starting_block_usage_key.course_key).get_transformed(

View File

@@ -15,22 +15,24 @@ REQUESTED_FIELDS = [
]
def _get_override_query(course_key, location_list):
def _get_override_query(course_key, location_list, user_id):
"""
returns queryset containing override data.
Args:
course_key (CourseLocator): Course locator object
location_list (List<UsageKey>): List of usage key of all blocks
user_id (int): User id
"""
return StudentFieldOverride.objects.filter(
course_id=course_key,
location__in=location_list,
field__in=REQUESTED_FIELDS
field__in=REQUESTED_FIELDS,
student__id=user_id
)
def override_xblock_fields(course_key, location_list, block_structure):
def override_xblock_fields(course_key, location_list, block_structure, user_id):
"""
loads override data of block
@@ -38,8 +40,9 @@ def override_xblock_fields(course_key, location_list, block_structure):
course_key (CourseLocator): course locator object
location_list (List<UsageKey>): list of usage key of all blocks
block_structure (BlockStructure): block structure class
user_id (int): User id
"""
query = _get_override_query(course_key, location_list)
query = _get_override_query(course_key, location_list, user_id)
for student_field_override in query:
value = json.loads(student_field_override.value)
field = student_field_override.field
@@ -57,6 +60,9 @@ class OverrideDataTransformer(BlockStructureTransformer):
WRITE_VERSION = 1
READ_VERSION = 1
def __init__(self, user):
self.user = user
@classmethod
def name(cls):
"""
@@ -80,5 +86,6 @@ class OverrideDataTransformer(BlockStructureTransformer):
override_xblock_fields(
usage_info.course_key,
block_structure.topological_traversal(),
block_structure
block_structure,
self.user.id
)

View File

@@ -35,7 +35,8 @@ class TestOverrideDataTransformer(ModuleStoreTestCase):
@classmethod
def setUpClass(cls):
super(TestOverrideDataTransformer, cls).setUpClass()
cls.learner = UserFactory.create(password="test")
cls.learner = UserFactory.create()
cls.learner2 = UserFactory.create()
def setUp(self):
super(TestOverrideDataTransformer, self).setUp()
@@ -49,9 +50,16 @@ class TestOverrideDataTransformer(ModuleStoreTestCase):
self.learner.id, subsection.location, 'html', 'new_component'
)
CourseEnrollmentFactory.create(user=self.learner, course_id=self.course_key, is_active=True)
self.block = self.store.create_child(
self.learner2.id, subsection.location, 'html', 'new_component'
)
CourseEnrollmentFactory.create(user=self.learner2, course_id=self.course_key, is_active=True)
@ddt.data(*REQUESTED_FIELDS)
def test_transform(self, field):
"""
assert that data transformed
"""
override_field_for_user(
self.learner,
self.block,
@@ -63,7 +71,7 @@ class TestOverrideDataTransformer(ModuleStoreTestCase):
OverrideDataTransformer.collect(self.block_structure)
# transform phase
OverrideDataTransformer().transform(
OverrideDataTransformer(self.learner).transform(
usage_info=self.course_usage_key,
block_structure=self.block_structure,
)
@@ -71,6 +79,32 @@ class TestOverrideDataTransformer(ModuleStoreTestCase):
# verify overridden data
assert get_override_for_user(self.learner, self.block, field) == expected_overrides.get(field)
@ddt.data(*REQUESTED_FIELDS)
def test_transform_for_selected_learner(self, field):
"""
assert that data transformed for selected learner
"""
override_field_for_user(
self.learner,
self.block,
field,
expected_overrides.get(field)
)
# collect phase
OverrideDataTransformer.collect(self.block_structure)
# transform phase
OverrideDataTransformer(self.learner).transform(
usage_info=self.course_usage_key,
block_structure=self.block_structure,
)
# verify learner has overridden data
assert get_override_for_user(self.learner, self.block, field) == expected_overrides.get(field)
# other learner2 dont have overridden data
assert get_override_for_user(self.learner2, self.block, field) is None
def test_transform_all_fields(self):
"""Test overriding of all fields"""
for field in REQUESTED_FIELDS:
@@ -85,7 +119,7 @@ class TestOverrideDataTransformer(ModuleStoreTestCase):
OverrideDataTransformer.collect(self.block_structure)
# transform phase
OverrideDataTransformer().transform(
OverrideDataTransformer(self.learner).transform(
usage_info=self.course_usage_key,
block_structure=self.block_structure,
)
@@ -93,3 +127,29 @@ class TestOverrideDataTransformer(ModuleStoreTestCase):
# verify overridden data
for field in REQUESTED_FIELDS:
assert get_override_for_user(self.learner, self.block, field) == expected_overrides.get(field)
def test_transform_all_fields_for_selected_learner(self):
"""Test overriding of all fields"""
for field in REQUESTED_FIELDS:
override_field_for_user(
self.learner,
self.block,
field,
expected_overrides.get(field)
)
# collect phase
OverrideDataTransformer.collect(self.block_structure)
# transform phase
OverrideDataTransformer(self.learner).transform(
usage_info=self.course_usage_key,
block_structure=self.block_structure,
)
# verify overridden data
for field in REQUESTED_FIELDS:
# learner has overridden data
assert get_override_for_user(self.learner, self.block, field) == expected_overrides.get(field)
# other learner2 dont have overridden data
assert get_override_for_user(self.learner2, self.block, field) is None