Change switch to waffle flag.
This commit is contained in:
@@ -3,23 +3,36 @@ This module contains various configuration settings via
|
||||
waffle switches for the instructor_task app.
|
||||
"""
|
||||
|
||||
from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag, WaffleFlagNamespace, WaffleSwitchNamespace
|
||||
|
||||
from openedx.core.djangoapps.waffle_utils import WaffleFlagNamespace, WaffleSwitchNamespace
|
||||
|
||||
WAFFLE_NAMESPACE = u'instructor_task'
|
||||
WAFFLE_NAMESPACE = 'instructor_task'
|
||||
INSTRUCTOR_TASK_WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name=WAFFLE_NAMESPACE)
|
||||
WAFFLE_SWITCHES = WaffleSwitchNamespace(name=WAFFLE_NAMESPACE)
|
||||
|
||||
# Waffle switches
|
||||
OPTIMIZE_GET_LEARNERS_FOR_COURSE = u'optimize_get_learners_for_course'
|
||||
GENERATE_GRADE_REPORT_VERIFIED_ONLY = u'generate_grade_report_for_verified_only'
|
||||
OPTIMIZE_GET_LEARNERS_FOR_COURSE = 'optimize_get_learners_for_course'
|
||||
|
||||
# Course override flags
|
||||
GENERATE_PROBLEM_GRADE_REPORT_VERIFIED_ONLY = 'generate_problem_grade_report_verified_only'
|
||||
GENERATE_COURSE_GRADE_REPORT_VERIFIED_ONLY = 'generate_course_grade_report_verified_only'
|
||||
|
||||
|
||||
def waffle_flags():
|
||||
"""
|
||||
Returns the namespaced, cached, audited Waffle flags dictionary for Grades.
|
||||
"""
|
||||
return {}
|
||||
return {
|
||||
GENERATE_PROBLEM_GRADE_REPORT_VERIFIED_ONLY: CourseWaffleFlag(
|
||||
waffle_namespace=INSTRUCTOR_TASK_WAFFLE_FLAG_NAMESPACE,
|
||||
flag_name=GENERATE_PROBLEM_GRADE_REPORT_VERIFIED_ONLY,
|
||||
flag_undefined_default=False,
|
||||
),
|
||||
GENERATE_COURSE_GRADE_REPORT_VERIFIED_ONLY: CourseWaffleFlag(
|
||||
waffle_namespace=INSTRUCTOR_TASK_WAFFLE_FLAG_NAMESPACE,
|
||||
flag_name=GENERATE_COURSE_GRADE_REPORT_VERIFIED_ONLY,
|
||||
flag_undefined_default=False,
|
||||
),
|
||||
}
|
||||
|
||||
|
||||
def optimize_get_learners_switch_enabled():
|
||||
@@ -29,9 +42,19 @@ def optimize_get_learners_switch_enabled():
|
||||
return WAFFLE_SWITCHES.is_enabled(OPTIMIZE_GET_LEARNERS_FOR_COURSE)
|
||||
|
||||
|
||||
def generate_grade_report_for_verified_only():
|
||||
def problem_grade_report_verified_only(course_id):
|
||||
"""
|
||||
Returns True if waffle switch is enabled that indicates generate grading reports only for
|
||||
verified learners.
|
||||
Returns True if problem grade reports should only
|
||||
return rows for verified students in the given course,
|
||||
False otherwise.
|
||||
"""
|
||||
return WAFFLE_SWITCHES.is_enabled(GENERATE_GRADE_REPORT_VERIFIED_ONLY)
|
||||
return waffle_flags()[GENERATE_PROBLEM_GRADE_REPORT_VERIFIED_ONLY].is_enabled(course_id)
|
||||
|
||||
|
||||
def course_grade_report_verified_only(course_id):
|
||||
"""
|
||||
Returns True if problem grade reports should only
|
||||
return rows for verified students in the given course,
|
||||
False otherwise.
|
||||
"""
|
||||
return waffle_flags()[GENERATE_COURSE_GRADE_REPORT_VERIFIED_ONLY].is_enabled(course_id)
|
||||
|
||||
@@ -29,8 +29,9 @@ from lms.djangoapps.grades.api import prefetch_course_and_subsection_grades
|
||||
from lms.djangoapps.instructor_analytics.basic import list_problem_responses
|
||||
from lms.djangoapps.instructor_analytics.csvs import format_dictlist
|
||||
from lms.djangoapps.instructor_task.config.waffle import (
|
||||
generate_grade_report_for_verified_only,
|
||||
optimize_get_learners_switch_enabled
|
||||
course_grade_report_verified_only,
|
||||
optimize_get_learners_switch_enabled,
|
||||
problem_grade_report_verified_only
|
||||
)
|
||||
from lms.djangoapps.teams.models import CourseTeamMembership
|
||||
from lms.djangoapps.verify_student.services import IDVerificationService
|
||||
@@ -221,6 +222,7 @@ class _CourseGradeReportContext(object):
|
||||
self.action_name = action_name
|
||||
self.course_id = course_id
|
||||
self.task_progress = TaskProgress(self.action_name, total=None, start_time=time())
|
||||
self.report_for_verified_only = course_grade_report_verified_only(self.course_id)
|
||||
|
||||
@lazy
|
||||
def course(self):
|
||||
@@ -312,7 +314,7 @@ class _ProblemGradeReportContext(object):
|
||||
self.task_input = _task_input
|
||||
self.action_name = action_name
|
||||
self.course_id = course_id
|
||||
self.report_for_verified_only = generate_grade_report_for_verified_only()
|
||||
self.report_for_verified_only = problem_grade_report_verified_only(self.course_id)
|
||||
self.task_progress = TaskProgress(self.action_name, total=None, start_time=time())
|
||||
self.file_name = 'problem_grade_report'
|
||||
|
||||
@@ -561,11 +563,9 @@ class CourseGradeReport(object):
|
||||
**filter_kwargs
|
||||
).select_related('profile')
|
||||
yield users
|
||||
|
||||
course_id = context.course_id
|
||||
task_log_message = u'{}, Task type: {}'.format(context.task_info_string, context.action_name)
|
||||
report_for_verified_only = generate_grade_report_for_verified_only()
|
||||
return get_enrolled_learners_for_course(course_id=course_id, verified_only=report_for_verified_only)
|
||||
return get_enrolled_learners_for_course(course_id=course_id, verified_only=context.report_for_verified_only)
|
||||
|
||||
def _user_grades(self, course_grade, context):
|
||||
"""
|
||||
|
||||
@@ -81,7 +81,6 @@ from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase
|
||||
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory, check_mongo_calls
|
||||
from xmodule.partitions.partitions import Group, UserPartition
|
||||
|
||||
from ..config.waffle import GENERATE_GRADE_REPORT_VERIFIED_ONLY
|
||||
from ..models import ReportStore
|
||||
from ..tasks_helper.utils import UPDATE_STATUS_FAILED, UPDATE_STATUS_SUCCEEDED
|
||||
|
||||
@@ -89,7 +88,6 @@ _TEAMS_CONFIG = TeamsConfig({
|
||||
'max_size': 2,
|
||||
'topics': [{'id': 'topic', 'name': 'Topic', 'description': 'A Topic'}],
|
||||
})
|
||||
SWITCH_GENERATE_GRADE_REPORT_VERIFIED_ONLY = '.'.join(['instructor_task', GENERATE_GRADE_REPORT_VERIFIED_ONLY])
|
||||
|
||||
|
||||
class InstructorGradeReportTestCase(TestReportMixin, InstructorTaskCourseTestCase):
|
||||
@@ -411,7 +409,7 @@ class TestInstructorGradeReport(InstructorGradeReportTestCase):
|
||||
|
||||
RequestCache.clear_all_namespaces()
|
||||
|
||||
expected_query_count = 45
|
||||
expected_query_count = 46
|
||||
with patch('lms.djangoapps.instructor_task.tasks_helper.runner._get_current_task'):
|
||||
with check_mongo_calls(mongo_count):
|
||||
with self.assertNumQueries(expected_query_count):
|
||||
@@ -731,23 +729,26 @@ class TestProblemGradeReport(TestReportMixin, InstructorTaskModuleTestCase):
|
||||
])
|
||||
|
||||
@patch('lms.djangoapps.instructor_task.tasks_helper.runner._get_current_task')
|
||||
@override_switch(SWITCH_GENERATE_GRADE_REPORT_VERIFIED_ONLY, True)
|
||||
def test_single_problem_verified_student_only(self, _get_current_task):
|
||||
student_verified = self.create_student(u'user_verified', mode='verified')
|
||||
vertical = ItemFactory.create(
|
||||
parent_location=self.problem_section.location,
|
||||
category='vertical',
|
||||
metadata={'graded': True},
|
||||
display_name='Problem Vertical'
|
||||
)
|
||||
self.define_option_problem(u'Problem1', parent=vertical)
|
||||
with patch(
|
||||
'lms.djangoapps.instructor_task.tasks_helper.grades.problem_grade_report_verified_only',
|
||||
return_value=True,
|
||||
):
|
||||
student_verified = self.create_student(u'user_verified', mode='verified')
|
||||
vertical = ItemFactory.create(
|
||||
parent_location=self.problem_section.location,
|
||||
category='vertical',
|
||||
metadata={'graded': True},
|
||||
display_name='Problem Vertical'
|
||||
)
|
||||
self.define_option_problem(u'Problem1', parent=vertical)
|
||||
|
||||
self.submit_student_answer(self.student_1.username, u'Problem1', ['Option 1'])
|
||||
self.submit_student_answer(student_verified.username, u'Problem1', ['Option 1'])
|
||||
result = ProblemGradeReport.generate(None, None, self.course.id, None, 'graded')
|
||||
self.assertDictContainsSubset(
|
||||
{'action_name': 'graded', 'attempted': 1, 'succeeded': 1, 'failed': 0}, result
|
||||
)
|
||||
self.submit_student_answer(self.student_1.username, u'Problem1', ['Option 1'])
|
||||
self.submit_student_answer(student_verified.username, u'Problem1', ['Option 1'])
|
||||
result = ProblemGradeReport.generate(None, None, self.course.id, None, 'graded')
|
||||
self.assertDictContainsSubset(
|
||||
{'action_name': 'graded', 'attempted': 1, 'succeeded': 1, 'failed': 0}, result
|
||||
)
|
||||
|
||||
@patch('lms.djangoapps.instructor_task.tasks_helper.runner._get_current_task')
|
||||
def test_inactive_enrollment_included(self, _get_current_task):
|
||||
@@ -1708,28 +1709,31 @@ class TestGradeReport(TestReportMixin, InstructorTaskModuleTestCase):
|
||||
)
|
||||
|
||||
@patch('lms.djangoapps.instructor_task.tasks_helper.runner._get_current_task')
|
||||
@override_switch(SWITCH_GENERATE_GRADE_REPORT_VERIFIED_ONLY, True)
|
||||
def test_course_grade_with_verified_student_only(self, _get_current_task):
|
||||
"""
|
||||
Tests that course grade report has expected data when it is generated only for
|
||||
verified learners.
|
||||
"""
|
||||
student_1 = self.create_student(u'user_honor')
|
||||
student_verified = self.create_student(u'user_verified', mode='verified')
|
||||
vertical = ItemFactory.create(
|
||||
parent_location=self.problem_section.location,
|
||||
category='vertical',
|
||||
metadata={'graded': True},
|
||||
display_name='Problem Vertical'
|
||||
)
|
||||
self.define_option_problem(u'Problem1', parent=vertical)
|
||||
with patch(
|
||||
'lms.djangoapps.instructor_task.tasks_helper.grades.course_grade_report_verified_only',
|
||||
return_value=True,
|
||||
):
|
||||
student_1 = self.create_student(u'user_honor')
|
||||
student_verified = self.create_student(u'user_verified', mode='verified')
|
||||
vertical = ItemFactory.create(
|
||||
parent_location=self.problem_section.location,
|
||||
category='vertical',
|
||||
metadata={'graded': True},
|
||||
display_name='Problem Vertical'
|
||||
)
|
||||
self.define_option_problem(u'Problem1', parent=vertical)
|
||||
|
||||
self.submit_student_answer(student_1.username, u'Problem1', ['Option 1'])
|
||||
self.submit_student_answer(student_verified.username, u'Problem1', ['Option 1'])
|
||||
result = CourseGradeReport.generate(None, None, self.course.id, None, 'graded')
|
||||
self.assertDictContainsSubset(
|
||||
{'action_name': 'graded', 'attempted': 1, 'succeeded': 1, 'failed': 0}, result
|
||||
)
|
||||
self.submit_student_answer(student_1.username, u'Problem1', ['Option 1'])
|
||||
self.submit_student_answer(student_verified.username, u'Problem1', ['Option 1'])
|
||||
result = CourseGradeReport.generate(None, None, self.course.id, None, 'graded')
|
||||
self.assertDictContainsSubset(
|
||||
{'action_name': 'graded', 'attempted': 1, 'succeeded': 1, 'failed': 0}, result
|
||||
)
|
||||
|
||||
@ddt.data(True, False)
|
||||
def test_fast_generation(self, create_non_zero_grade):
|
||||
|
||||
Reference in New Issue
Block a user