Merge pull request #19922 from edx/REVMI-108

[REVMI-108] stop bucketing new users into FBE holdback
This commit is contained in:
Matthew Piatetsky
2019-03-05 11:17:49 -05:00
committed by GitHub
3 changed files with 18 additions and 49 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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)