diff --git a/lms/djangoapps/ccx/tests/test_field_override_performance.py b/lms/djangoapps/ccx/tests/test_field_override_performance.py index 7b67ee3d46..848aee4f9b 100644 --- a/lms/djangoapps/ccx/tests/test_field_override_performance.py +++ b/lms/djangoapps/ccx/tests/test_field_override_performance.py @@ -239,7 +239,7 @@ class TestFieldOverrideMongoPerformance(FieldOverridePerformanceTestCase): __test__ = True # TODO: decrease query count as part of REVO-28 - QUERY_COUNT = 32 + QUERY_COUNT = 35 TEST_DATA = { # (providers, course_width, enable_ccx, view_as_ccx): ( # # of sql queries to default, @@ -268,7 +268,7 @@ class TestFieldOverrideSplitPerformance(FieldOverridePerformanceTestCase): __test__ = True # TODO: decrease query count as part of REVO-28 - QUERY_COUNT = 32 + QUERY_COUNT = 35 TEST_DATA = { ('no_overrides', 1, True, False): (QUERY_COUNT, 3), diff --git a/lms/djangoapps/courseware/tests/test_course_info.py b/lms/djangoapps/courseware/tests/test_course_info.py index dd66ac573c..26d9807a63 100644 --- a/lms/djangoapps/courseware/tests/test_course_info.py +++ b/lms/djangoapps/courseware/tests/test_course_info.py @@ -430,8 +430,8 @@ class SelfPacedCourseInfoTestCase(LoginEnrollmentTestCase, SharedModuleStoreTest def test_num_queries_instructor_paced(self): # TODO: decrease query count as part of REVO-28 - self.fetch_course_info_with_queries(self.instructor_paced_course, 41, 3) + self.fetch_course_info_with_queries(self.instructor_paced_course, 44, 3) def test_num_queries_self_paced(self): # TODO: decrease query count as part of REVO-28 - self.fetch_course_info_with_queries(self.self_paced_course, 41, 3) + self.fetch_course_info_with_queries(self.self_paced_course, 44, 3) diff --git a/lms/djangoapps/courseware/tests/test_views.py b/lms/djangoapps/courseware/tests/test_views.py index f85ecb7f23..3ad1c08e90 100644 --- a/lms/djangoapps/courseware/tests/test_views.py +++ b/lms/djangoapps/courseware/tests/test_views.py @@ -213,8 +213,8 @@ class IndexQueryTestCase(ModuleStoreTestCase): NUM_PROBLEMS = 20 @ddt.data( - (ModuleStoreEnum.Type.mongo, 10, 176), - (ModuleStoreEnum.Type.split, 4, 170), + (ModuleStoreEnum.Type.mongo, 10, 179), + (ModuleStoreEnum.Type.split, 4, 173), ) @ddt.unpack def test_index_query_counts(self, store_type, expected_mongo_query_count, expected_mysql_query_count): @@ -1465,8 +1465,8 @@ class ProgressPageTests(ProgressPageBaseTests): self.assertContains(resp, u"Download Your Certificate") @ddt.data( - (True, 52), - (False, 51) + (True, 55), + (False, 54) ) @ddt.unpack def test_progress_queries_paced_courses(self, self_paced, query_count): @@ -1479,8 +1479,8 @@ class ProgressPageTests(ProgressPageBaseTests): @patch.dict(settings.FEATURES, {'ASSUME_ZERO_GRADE_IF_ABSENT_FOR_ALL_TESTS': False}) @ddt.data( - (False, 60, 40), - (True, 51, 35) + (False, 63, 43), + (True, 54, 38) ) @ddt.unpack def test_progress_queries(self, enable_waffle, initial, subsequent): diff --git a/lms/djangoapps/experiments/utils.py b/lms/djangoapps/experiments/utils.py index 5ce047395a..c39ecd519a 100644 --- a/lms/djangoapps/experiments/utils.py +++ b/lms/djangoapps/experiments/utils.py @@ -18,6 +18,8 @@ from opaque_keys import InvalidKeyError from openedx.core.djangoapps.catalog.utils import get_programs from openedx.core.djangoapps.django_comment_common.models import Role from openedx.core.djangoapps.waffle_utils import WaffleFlag, WaffleFlagNamespace +from openedx.features.course_duration_limits.access import get_user_course_expiration_date +from openedx.features.course_duration_limits.models import CourseDurationLimitConfig logger = logging.getLogger(__name__) @@ -59,6 +61,23 @@ DASHBOARD_INFO_FLAG = WaffleFlag(experiments_namespace, flag_undefined_default=True) # TODO END: clean up as part of REVEM-199 (End) +# .. toggle_name: experiments.add_audit_deadline +# .. toggle_type: feature_flag +# .. toggle_default: True +# .. toggle_description: Toggle for adding the current course's audit deadline +# .. toggle_category: experiments +# .. toggle_use_cases: monitored_rollout +# .. toggle_creation_date: 2019-5-7 +# .. toggle_expiration_date: None +# .. toggle_warnings: None +# .. toggle_tickets: REVEM-329 +# .. toggle_status: supported +AUDIT_DEADLINE_FLAG = WaffleFlag( + waffle_namespace=experiments_namespace, + flag_name=u'add_audit_deadline', + flag_undefined_default=True +) + def check_and_get_upgrade_link_and_date(user, enrollment=None, course=None): """ @@ -343,6 +362,7 @@ def get_experiment_user_metadata_context(course, user): 'enrollment_time': enrollment_time, 'pacing_type': 'self_paced' if course.self_paced else 'instructor_paced', 'upgrade_deadline': upgrade_date, + 'audit_access_deadline': get_audit_access_expiration(user, course), 'course_key': course.id, 'course_start': course.start, 'course_end': course.end, @@ -358,6 +378,18 @@ def get_experiment_user_metadata_context(course, user): } +def get_audit_access_expiration(user, course): + """ + Return the expiration date for the user's audit access to this course. + """ + if AUDIT_DEADLINE_FLAG.is_enabled(): + if not CourseDurationLimitConfig.enabled_for_enrollment(user=user, course_key=course.id): + return None + + return get_user_course_expiration_date(user, course) + return None + + def get_base_experiment_metadata_context(course, user, enrollment, user_enrollments, audit_enrollments): """ Return a context dictionary with the keys used by dashboard_metadata.html. @@ -381,6 +413,7 @@ def get_base_experiment_metadata_context(course, user, enrollment, user_enrollme 'enrollment_time': enrollment_time, 'pacing_type': 'self_paced' if course.self_paced else 'instructor_paced', 'upgrade_deadline': upgrade_date, + 'audit_access_deadline': get_audit_access_expiration(user, course), 'course_key': course.id, 'course_start': course.start, 'course_end': course.end, diff --git a/lms/templates/experiments/user_metadata.html b/lms/templates/experiments/user_metadata.html index 9d548cecb4..a8df2afcc0 100644 --- a/lms/templates/experiments/user_metadata.html +++ b/lms/templates/experiments/user_metadata.html @@ -14,6 +14,7 @@ user_metadata = { 'enrollment_mode', 'upgrade_link', 'upgrade_price', + 'audit_access_deadline', 'pacing_type', 'has_staff_access', 'forum_roles', diff --git a/openedx/features/course_experience/tests/views/test_course_home.py b/openedx/features/course_experience/tests/views/test_course_home.py index bcef93c4fc..9612385742 100644 --- a/openedx/features/course_experience/tests/views/test_course_home.py +++ b/openedx/features/course_experience/tests/views/test_course_home.py @@ -217,7 +217,7 @@ class TestCourseHomePage(CourseHomePageTestCase): # Fetch the view and verify the query counts # TODO: decrease query count as part of REVO-28 - with self.assertNumQueries(91, table_blacklist=QUERY_COUNT_TABLE_BLACKLIST): + with self.assertNumQueries(94, table_blacklist=QUERY_COUNT_TABLE_BLACKLIST): with check_mongo_calls(4): url = course_home_url(self.course) self.client.get(url) diff --git a/openedx/features/course_experience/tests/views/test_course_updates.py b/openedx/features/course_experience/tests/views/test_course_updates.py index 19cbee92f2..787648ab67 100644 --- a/openedx/features/course_experience/tests/views/test_course_updates.py +++ b/openedx/features/course_experience/tests/views/test_course_updates.py @@ -134,7 +134,7 @@ class TestCourseUpdatesPage(SharedModuleStoreTestCase): # Fetch the view and verify that the query counts haven't changed # TODO: decrease query count as part of REVO-28 - with self.assertNumQueries(50, table_blacklist=QUERY_COUNT_TABLE_BLACKLIST): + with self.assertNumQueries(53, table_blacklist=QUERY_COUNT_TABLE_BLACKLIST): with check_mongo_calls(4): url = course_updates_url(self.course) self.client.get(url)