Merge pull request #19922 from edx/REVMI-108
[REVMI-108] stop bucketing new users into FBE holdback
This commit is contained in:
@@ -20,7 +20,7 @@ from django_comment_common.models import (
|
||||
)
|
||||
from django_comment_client.tests.factories import RoleFactory
|
||||
from course_modes.tests.factories import CourseModeFactory
|
||||
from experiments.models import ExperimentKeyValue
|
||||
from experiments.models import ExperimentData, ExperimentKeyValue
|
||||
from xmodule.partitions.partitions import ENROLLMENT_TRACK_PARTITION_ID
|
||||
|
||||
from lms.djangoapps.courseware.module_render import load_single_xblock
|
||||
@@ -39,6 +39,7 @@ from openedx.features.content_type_gating.helpers import CONTENT_GATING_PARTITIO
|
||||
from openedx.features.content_type_gating.partitions import ContentTypeGatingPartition
|
||||
from openedx.features.content_type_gating.models import ContentTypeGatingConfig
|
||||
from openedx.features.course_duration_limits.config import (
|
||||
EXPERIMENT_DATA_HOLDBACK_KEY,
|
||||
EXPERIMENT_ID,
|
||||
)
|
||||
from student.models import CourseEnrollment
|
||||
@@ -532,14 +533,15 @@ class TestProblemTypeAccess(SharedModuleStoreTestCase):
|
||||
"""
|
||||
Test that putting a user in the content gating holdback disables content gating.
|
||||
"""
|
||||
if put_user_in_holdback:
|
||||
ExperimentKeyValue.objects.create(
|
||||
experiment_id=EXPERIMENT_ID,
|
||||
key="content_type_gating_holdback_percentage",
|
||||
value="100"
|
||||
).value
|
||||
|
||||
user = UserFactory.create()
|
||||
if put_user_in_holdback:
|
||||
ExperimentData.objects.create(
|
||||
user=user,
|
||||
experiment_id=EXPERIMENT_ID,
|
||||
key=EXPERIMENT_DATA_HOLDBACK_KEY,
|
||||
value='True'
|
||||
)
|
||||
|
||||
CourseEnrollment.enroll(user, self.course.id)
|
||||
|
||||
graded, has_score, weight = True, True, 1
|
||||
|
||||
@@ -28,36 +28,3 @@ FEATURE_BASED_ENROLLMENT_GLOBAL_KILL_FLAG = WaffleFlag(
|
||||
|
||||
EXPERIMENT_ID = 11
|
||||
EXPERIMENT_DATA_HOLDBACK_KEY = 'holdback'
|
||||
|
||||
|
||||
@receiver(ENROLL_STATUS_CHANGE)
|
||||
def set_value_for_content_type_gating_holdback(sender, event=None, user=None, **kwargs): # pylint: disable=unused-argument
|
||||
if event == EnrollStatusChange.enroll:
|
||||
user_holdback_data = ExperimentData.objects.filter(
|
||||
user=user,
|
||||
experiment_id=EXPERIMENT_ID,
|
||||
key=EXPERIMENT_DATA_HOLDBACK_KEY,
|
||||
)
|
||||
user_holdback_data_already_set = user_holdback_data.exists()
|
||||
if not user_holdback_data_already_set:
|
||||
try:
|
||||
content_type_gating_holdback_percentage_value = ExperimentKeyValue.objects.get(
|
||||
experiment_id=EXPERIMENT_ID,
|
||||
key="content_type_gating_holdback_percentage"
|
||||
).value
|
||||
content_type_gating_holdback_percentage = float(content_type_gating_holdback_percentage_value) / 100
|
||||
is_in_holdback = str(random.random() < content_type_gating_holdback_percentage)
|
||||
|
||||
ExperimentData.objects.create(
|
||||
user=user,
|
||||
experiment_id=EXPERIMENT_ID,
|
||||
key=EXPERIMENT_DATA_HOLDBACK_KEY,
|
||||
value=is_in_holdback
|
||||
)
|
||||
except (ExperimentKeyValue.DoesNotExist, AttributeError):
|
||||
pass
|
||||
except IntegrityError:
|
||||
# There is a race condition when multiple enrollments happen at the same time where the ExperimentData
|
||||
# row for one enrollment is created between the duplicate check and creation for the other enrollment.
|
||||
# Since we're ignoring skipping duplicate entries anyway, this is safe to ignore.
|
||||
pass
|
||||
|
||||
@@ -25,7 +25,7 @@ from django_comment_client.tests.factories import RoleFactory
|
||||
from course_modes.models import CourseMode
|
||||
from course_modes.tests.factories import CourseModeFactory
|
||||
from courseware.tests.helpers import get_expiration_banner_text
|
||||
from experiments.models import ExperimentKeyValue
|
||||
from experiments.models import ExperimentData
|
||||
from lms.djangoapps.commerce.models import CommerceConfiguration
|
||||
from lms.djangoapps.commerce.utils import EcommerceService
|
||||
from lms.djangoapps.course_goals.api import add_course_goal, remove_course_goal
|
||||
@@ -41,7 +41,7 @@ from openedx.core.djangoapps.content.course_overviews.models import CourseOvervi
|
||||
from openedx.core.djangoapps.dark_lang.models import DarkLangConfig
|
||||
from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory
|
||||
from openedx.core.djangoapps.waffle_utils.testutils import WAFFLE_TABLES, override_waffle_flag
|
||||
from openedx.features.course_duration_limits.config import EXPERIMENT_ID
|
||||
from openedx.features.course_duration_limits.config import EXPERIMENT_DATA_HOLDBACK_KEY, EXPERIMENT_ID
|
||||
from openedx.features.course_duration_limits.models import CourseDurationLimitConfig
|
||||
from openedx.features.course_experience import (
|
||||
SHOW_REVIEWS_TOOL_FLAG,
|
||||
@@ -589,18 +589,18 @@ class TestCourseHomePageAccess(CourseHomePageTestCase):
|
||||
for mode in [CourseMode.AUDIT, CourseMode.VERIFIED]:
|
||||
CourseModeFactory.create(course_id=course.id, mode_slug=mode)
|
||||
|
||||
ExperimentKeyValue.objects.create(
|
||||
experiment_id=EXPERIMENT_ID,
|
||||
key="content_type_gating_holdback_percentage",
|
||||
value="100"
|
||||
)
|
||||
|
||||
# assert that an if an expired audit user in the holdback tries to access the course
|
||||
# they are not redirected to the dashboard
|
||||
audit_user = UserFactory(password=self.TEST_PASSWORD)
|
||||
self.client.login(username=audit_user.username, password=self.TEST_PASSWORD)
|
||||
audit_enrollment = CourseEnrollment.enroll(audit_user, course.id, mode=CourseMode.AUDIT)
|
||||
ScheduleFactory(start=THREE_YEARS_AGO, enrollment=audit_enrollment)
|
||||
ExperimentData.objects.create(
|
||||
user=audit_user,
|
||||
experiment_id=EXPERIMENT_ID,
|
||||
key=EXPERIMENT_DATA_HOLDBACK_KEY,
|
||||
value='True'
|
||||
)
|
||||
|
||||
response = self.client.get(url)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user