Skip to content
Snippets Groups Projects
Unverified Commit 26a5f184 authored by Awais Jibran's avatar Awais Jibran Committed by GitHub
Browse files

Merge pull request #24177 from edx/aj/change-switch-to-waffle-flag

Change switch to waffle flag.
parents 4a3f2e33 5d4df538
No related branches found
No related tags found
No related merge requests found
......@@ -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 problem grade reports should only
return rows for verified students in the given course,
False otherwise.
"""
return waffle_flags()[GENERATE_PROBLEM_GRADE_REPORT_VERIFIED_ONLY].is_enabled(course_id)
def course_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_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):
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment