diff --git a/cms/djangoapps/contentstore/config/waffle.py b/cms/djangoapps/contentstore/config/waffle.py index ff91a4b1f6..298718dfc9 100644 --- a/cms/djangoapps/contentstore/config/waffle.py +++ b/cms/djangoapps/contentstore/config/waffle.py @@ -4,12 +4,8 @@ waffle switches for the contentstore app. """ -from openedx.core.djangoapps.waffle_utils import ( - CourseWaffleFlag, - WaffleFlag, - WaffleFlagNamespace, - WaffleSwitchNamespace -) +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace, WaffleSwitchNamespace +from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag # Namespace WAFFLE_NAMESPACE = u'studio' diff --git a/cms/djangoapps/contentstore/tasks.py b/cms/djangoapps/contentstore/tasks.py index d9991ad108..651412db91 100644 --- a/cms/djangoapps/contentstore/tasks.py +++ b/cms/djangoapps/contentstore/tasks.py @@ -9,20 +9,16 @@ import os import shutil import tarfile from datetime import datetime -from math import ceil from tempfile import NamedTemporaryFile, mkdtemp from ccx_keys.locator import CCXLocator -from celery import group from celery.task import task from celery.utils.log import get_task_logger -from celery_utils.persist_on_failure import LoggedPersistOnFailureTask from django.conf import settings from django.contrib.auth import get_user_model from django.contrib.auth.models import User from django.core.exceptions import SuspiciousOperation from django.core.files import File -from django.core.files.base import ContentFile from django.test import RequestFactory from django.utils.text import get_valid_filename from django.utils.translation import ugettext as _ @@ -32,7 +28,6 @@ from organizations.models import OrganizationCourse from path import Path as path from pytz import UTC from six import iteritems, text_type -from six.moves import range from user_tasks.models import UserTaskArtifact, UserTaskStatus from user_tasks.tasks import UserTask @@ -57,12 +52,6 @@ from xmodule.modulestore.django import modulestore from xmodule.modulestore.exceptions import DuplicateCourseError, ItemNotFoundError from xmodule.modulestore.xml_exporter import export_course_to_xml, export_library_to_xml from xmodule.modulestore.xml_importer import import_course_from_xml, import_library_from_xml -from xmodule.video_module.transcripts_utils import ( - Transcript, - TranscriptsGenerationException, - clean_video_id, - get_transcript_from_contentstore -) User = get_user_model() diff --git a/cms/djangoapps/contentstore/tests/test_course_settings.py b/cms/djangoapps/contentstore/tests/test_course_settings.py index 7cc2455fa4..f9f494d24c 100644 --- a/cms/djangoapps/contentstore/tests/test_course_settings.py +++ b/cms/djangoapps/contentstore/tests/test_course_settings.py @@ -15,6 +15,7 @@ from crum import set_current_request from django.conf import settings from django.test import RequestFactory from django.test.utils import override_settings +from edx_toggles.toggles.testutils import override_waffle_flag from milestones.models import MilestoneRelationshipType from milestones.tests.utils import MilestonesTestCaseMixin from mock import Mock, patch @@ -30,7 +31,6 @@ from cms.djangoapps.models.settings.course_metadata import CourseMetadata from cms.djangoapps.models.settings.encoder import CourseSettingsEncoder from cms.djangoapps.models.settings.waffle import MATERIAL_RECOMPUTE_ONLY_FLAG from course_modes.models import CourseMode -from edx_toggles.toggles.testutils import override_waffle_flag from openedx.core.djangoapps.models.course_details import CourseDetails from student.roles import CourseInstructorRole, CourseStaffRole from student.tests.factories import UserFactory diff --git a/cms/djangoapps/contentstore/views/course.py b/cms/djangoapps/contentstore/views/course.py index 2a7f4a5af6..ccc04088c1 100644 --- a/cms/djangoapps/contentstore/views/course.py +++ b/cms/djangoapps/contentstore/views/course.py @@ -23,6 +23,7 @@ from django.urls import reverse from django.utils.translation import ugettext as _ from django.views.decorators.csrf import ensure_csrf_cookie from django.views.decorators.http import require_GET, require_http_methods +from edx_toggles.toggles import WaffleSwitchNamespace from milestones import api as milestones_api from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey @@ -43,7 +44,6 @@ from openedx.core.djangoapps.credit.api import get_credit_requirements, is_credi from openedx.core.djangoapps.credit.tasks import update_credit_course_requirements from openedx.core.djangoapps.models.course_details import CourseDetails from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers -from openedx.core.djangoapps.waffle_utils import WaffleSwitchNamespace from openedx.core.djangolib.js_utils import dump_js_escaped_json from openedx.core.lib.course_tabs import CourseTabPluginManager from openedx.core.lib.courses import course_image_url diff --git a/cms/djangoapps/contentstore/views/helpers.py b/cms/djangoapps/contentstore/views/helpers.py index cfa681c8b0..2c51df6867 100644 --- a/cms/djangoapps/contentstore/views/helpers.py +++ b/cms/djangoapps/contentstore/views/helpers.py @@ -2,7 +2,6 @@ Helper methods for Studio views. """ -import hashlib from uuid import uuid4 import six @@ -17,7 +16,6 @@ from edxmako.shortcuts import render_to_string from openedx.core.toggles import ENTRANCE_EXAMS from xmodule.modulestore.django import modulestore from xmodule.tabs import StaticTab -from xmodule.x_module import DEPRECATION_VSCOMPAT_EVENT from ..utils import reverse_course_url, reverse_library_url, reverse_usage_url diff --git a/cms/djangoapps/contentstore/views/item.py b/cms/djangoapps/contentstore/views/item.py index f71d3dee35..a4ba2a9a40 100644 --- a/cms/djangoapps/contentstore/views/item.py +++ b/cms/djangoapps/contentstore/views/item.py @@ -21,6 +21,7 @@ from edx_proctoring.api import ( get_exam_configuration_dashboard_url ) from edx_proctoring.exceptions import ProctoredExamNotFoundException +from edx_toggles.toggles import WaffleSwitch from help_tokens.core import HelpUrlExpert from opaque_keys.edx.keys import CourseKey from opaque_keys.edx.locator import LibraryUsageLocator @@ -36,7 +37,6 @@ from cms.djangoapps.xblock_config.models import CourseEditLTIFieldsEnabledFlag from cms.lib.xblock.authoring_mixin import VISIBILITY_VIEW from edxmako.shortcuts import render_to_string from openedx.core.djangoapps.schedules.config import COURSE_UPDATE_WAFFLE_FLAG -from openedx.core.djangoapps.waffle_utils import WaffleSwitch from openedx.core.lib.gating import api as gating_api from openedx.core.lib.xblock_utils import hash_resource, request_token, wrap_xblock, wrap_xblock_aside from static_replace import replace_static_urls diff --git a/cms/djangoapps/contentstore/views/tests/test_course_index.py b/cms/djangoapps/contentstore/views/tests/test_course_index.py index e6d91c8497..ec6b86e906 100644 --- a/cms/djangoapps/contentstore/views/tests/test_course_index.py +++ b/cms/djangoapps/contentstore/views/tests/test_course_index.py @@ -23,7 +23,6 @@ from cms.djangoapps.contentstore.tests.utils import CourseTestCase from cms.djangoapps.contentstore.utils import add_instructor, reverse_course_url, reverse_usage_url from course_action_state.managers import CourseRerunUIStateManager from course_action_state.models import CourseRerunState -from openedx.core.djangoapps.waffle_utils import WaffleSwitchNamespace from openedx.core.djangoapps.waffle_utils.testutils import WAFFLE_TABLES from student.auth import has_course_author_access from student.roles import CourseStaffRole, GlobalStaff, LibraryUserRole diff --git a/cms/djangoapps/contentstore/views/tests/test_item.py b/cms/djangoapps/contentstore/views/tests/test_item.py index 4d7216eb71..e276c55474 100644 --- a/cms/djangoapps/contentstore/views/tests/test_item.py +++ b/cms/djangoapps/contentstore/views/tests/test_item.py @@ -13,6 +13,7 @@ from django.test import TestCase from django.test.client import RequestFactory from django.urls import reverse from edx_proctoring.exceptions import ProctoredExamNotFoundException +from edx_toggles.toggles.testutils import override_waffle_switch from mock import Mock, PropertyMock, patch from opaque_keys import InvalidKeyError from opaque_keys.edx.asides import AsideUsageKeyV2 @@ -35,7 +36,6 @@ from cms.djangoapps.contentstore.tests.utils import CourseTestCase from cms.djangoapps.contentstore.utils import reverse_course_url, reverse_usage_url from cms.djangoapps.contentstore.views import item as item_module from lms_xblock.mixin import NONSENSICAL_ACCESS_RESTRICTION -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_switch from student.tests.factories import UserFactory from xblock_django.models import XBlockConfiguration, XBlockStudioConfiguration, XBlockStudioConfigurationFlag from xblock_django.user_service import DjangoXBlockUserService diff --git a/cms/djangoapps/contentstore/views/tests/test_videos.py b/cms/djangoapps/contentstore/views/tests/test_videos.py index 8e88f96eb6..b92b030e37 100644 --- a/cms/djangoapps/contentstore/views/tests/test_videos.py +++ b/cms/djangoapps/contentstore/views/tests/test_videos.py @@ -9,7 +9,6 @@ import json import re from contextlib import contextmanager from datetime import datetime -from functools import wraps import dateutil.parser import ddt @@ -17,6 +16,8 @@ import pytz import six from django.conf import settings from django.test.utils import override_settings +from edx_toggles.toggles import WaffleSwitch +from edx_toggles.toggles.testutils import override_waffle_flag, override_waffle_switch from edxval.api import ( create_or_update_transcript_preferences, create_or_update_video_transcript, @@ -33,17 +34,13 @@ from waffle.testutils import override_flag from cms.djangoapps.contentstore.models import VideoUploadConfig from cms.djangoapps.contentstore.tests.utils import CourseTestCase from cms.djangoapps.contentstore.utils import reverse_course_url -from edx_toggles.toggles.testutils import override_waffle_flag from openedx.core.djangoapps.profile_images.tests.helpers import make_image_file from openedx.core.djangoapps.video_pipeline.config.waffle import ( DEPRECATE_YOUTUBE, ENABLE_DEVSTACK_VIDEO_UPLOADS, waffle_flags ) -from openedx.core.djangoapps.video_pipeline.models import VEMPipelineIntegration -from openedx.core.djangoapps.waffle_utils import WaffleSwitch from openedx.core.djangoapps.waffle_utils.models import WaffleFlagCourseOverrideModel -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_switch from xmodule.modulestore.tests.factories import CourseFactory from ..videos import ( diff --git a/cms/djangoapps/contentstore/views/videos.py b/cms/djangoapps/contentstore/views/videos.py index 4f54e5e020..df10617a5a 100644 --- a/cms/djangoapps/contentstore/views/videos.py +++ b/cms/djangoapps/contentstore/views/videos.py @@ -41,6 +41,7 @@ from edxval.api import ( from opaque_keys.edx.keys import CourseKey from pytz import UTC +from edx_toggles.toggles import WaffleFlagNamespace, WaffleSwitchNamespace from edxmako.shortcuts import render_to_response from openedx.core.djangoapps.video_config.models import VideoTranscriptEnabledFlag from openedx.core.djangoapps.video_pipeline.config.waffle import ( @@ -48,7 +49,7 @@ from openedx.core.djangoapps.video_pipeline.config.waffle import ( ENABLE_DEVSTACK_VIDEO_UPLOADS, waffle_flags ) -from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag, WaffleFlagNamespace, WaffleSwitchNamespace +from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag from util.json_request import JsonResponse, expect_json from xmodule.video_module.transcripts_utils import Transcript diff --git a/common/djangoapps/student/__init__.py b/common/djangoapps/student/__init__.py index 3ff722059e..2cfddfdd32 100644 --- a/common/djangoapps/student/__init__.py +++ b/common/djangoapps/student/__init__.py @@ -3,7 +3,7 @@ Student app helpers and settings """ -from openedx.core.djangoapps.waffle_utils import WaffleSwitchNamespace +from edx_toggles.toggles import WaffleSwitchNamespace # Namespace for student app waffle switches STUDENT_WAFFLE_NAMESPACE = WaffleSwitchNamespace(name='student') diff --git a/common/djangoapps/student/admin.py b/common/djangoapps/student/admin.py index 50e7ebf0fe..ab9b546b8b 100644 --- a/common/djangoapps/student/admin.py +++ b/common/djangoapps/student/admin.py @@ -22,12 +22,15 @@ from django.utils.translation import ugettext_lazy as _ from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey -from openedx.core.djangoapps.waffle_utils import WaffleSwitch +from edx_toggles.toggles import WaffleSwitch from openedx.core.lib.courses import clean_course_id from student import STUDENT_WAFFLE_NAMESPACE from student.models import ( AccountRecovery, + AccountRecoveryConfiguration, AllowedAuthUser, + BulkChangeEnrollmentConfiguration, + BulkUnenrollConfiguration, CourseAccessRole, CourseEnrollment, CourseEnrollmentAllowed, @@ -40,10 +43,7 @@ from student.models import ( RegistrationCookieConfiguration, UserAttribute, UserProfile, - UserTestGroup, - BulkUnenrollConfiguration, - AccountRecoveryConfiguration, - BulkChangeEnrollmentConfiguration + UserTestGroup ) from student.roles import REGISTERED_ACCESS_ROLES from xmodule.modulestore.django import modulestore diff --git a/common/djangoapps/student/tests/test_admin_views.py b/common/djangoapps/student/tests/test_admin_views.py index 02f125179d..868e0161c8 100644 --- a/common/djangoapps/student/tests/test_admin_views.py +++ b/common/djangoapps/student/tests/test_admin_views.py @@ -15,18 +15,18 @@ from django.forms import ValidationError from django.test import TestCase, override_settings from django.urls import reverse from django.utils.timezone import now +from edx_toggles.toggles.testutils import override_waffle_switch from mock import Mock from pytz import UTC - -from openedx.core.djangoapps.content.course_overviews.tests.factories import CourseOverviewFactory -from openedx.core.djangoapps.site_configuration.tests.mixins import SiteMixin -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_switch from student.admin import COURSE_ENROLLMENT_ADMIN_SWITCH, AllowedAuthUserForm, CourseEnrollmentForm, UserAdmin from student.models import AllowedAuthUser, CourseEnrollment, LoginFailures from student.tests.factories import CourseEnrollmentFactory, UserFactory from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory +from openedx.core.djangoapps.content.course_overviews.tests.factories import CourseOverviewFactory +from openedx.core.djangoapps.site_configuration.tests.mixins import SiteMixin + class AdminCourseRolesPageTest(SharedModuleStoreTestCase): """Test the django admin course roles form saving data in db. diff --git a/common/djangoapps/student/tests/test_views.py b/common/djangoapps/student/tests/test_views.py index d2e229d63f..ed895af31a 100644 --- a/common/djangoapps/student/tests/test_views.py +++ b/common/djangoapps/student/tests/test_views.py @@ -17,6 +17,7 @@ from django.test import TestCase from django.test.utils import override_settings from django.urls import reverse from django.utils.timezone import now +from edx_toggles.toggles.testutils import override_waffle_flag from milestones.tests.utils import MilestonesTestCaseMixin from mock import patch from opaque_keys import InvalidKeyError @@ -25,7 +26,6 @@ from pyquery import PyQuery as pq from six.moves import range from course_modes.models import CourseMode -from edx_toggles.toggles.testutils import override_waffle_flag from entitlements.tests.factories import CourseEntitlementFactory from lms.djangoapps.certificates.tests.factories import GeneratedCertificateFactory from openedx.core.djangoapps.catalog.tests.factories import ProgramFactory diff --git a/common/djangoapps/student/views/dashboard.py b/common/djangoapps/student/views/dashboard.py index 4cf1018a0b..4e1719db26 100644 --- a/common/djangoapps/student/views/dashboard.py +++ b/common/djangoapps/student/views/dashboard.py @@ -16,6 +16,7 @@ from django.utils.translation import ugettext as _ from django.views.decorators.csrf import ensure_csrf_cookie from edx_django_utils import monitoring as monitoring_utils from edx_django_utils.plugins import get_plugins_view_context +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace from opaque_keys.edx.keys import CourseKey from pytz import UTC from six import iteritems, text_type @@ -42,12 +43,10 @@ from openedx.core.djangoapps.programs.utils import ProgramDataExtender, ProgramP from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers from openedx.core.djangoapps.user_api.accounts.utils import is_secondary_email_feature_enabled from openedx.core.djangoapps.util.maintenance_banner import add_maintenance_banner -from openedx.core.djangoapps.waffle_utils import WaffleFlag, WaffleFlagNamespace from openedx.core.djangolib.markup import HTML, Text -from openedx.features.enterprise_support.api import get_dashboard_consent_notification from openedx.features.enterprise_support.api import ( get_dashboard_consent_notification, - get_enterprise_learner_portal_enabled_message, + get_enterprise_learner_portal_enabled_message ) from student.api import COURSE_DASHBOARD_PLUGIN_VIEW_NAME from student.helpers import cert_info, check_verify_status_by_course, get_resume_urls_for_enrollments diff --git a/common/lib/xmodule/xmodule/seq_module.py b/common/lib/xmodule/xmodule/seq_module.py index 984ae85097..1210294b97 100644 --- a/common/lib/xmodule/xmodule/seq_module.py +++ b/common/lib/xmodule/xmodule/seq_module.py @@ -19,13 +19,12 @@ from pkg_resources import resource_string from pytz import UTC from six import text_type from web_fragments.fragment import Fragment - from xblock.completable import XBlockCompletionMode from xblock.core import XBlock from xblock.exceptions import NoSuchServiceError from xblock.fields import Boolean, Integer, List, Scope, String -from openedx.core.djangoapps.waffle_utils import WaffleFlag +from edx_toggles.toggles import WaffleFlag from openedx.core.lib.graph_traversals import traverse_pre_order from .exceptions import NotFoundError diff --git a/lms/djangoapps/certificates/tests/test_signals.py b/lms/djangoapps/certificates/tests/test_signals.py index 3efdf947bb..b95058cb82 100644 --- a/lms/djangoapps/certificates/tests/test_signals.py +++ b/lms/djangoapps/certificates/tests/test_signals.py @@ -7,6 +7,11 @@ and disabling for instructor-paced courses. import ddt import mock import six +from edx_toggles.toggles import WaffleSwitch +from edx_toggles.toggles.testutils import override_waffle_switch +from student.tests.factories import CourseEnrollmentFactory, UserFactory +from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase +from xmodule.modulestore.tests.factories import CourseFactory from lms.djangoapps.certificates import api as certs_api from lms.djangoapps.certificates.models import ( @@ -20,11 +25,6 @@ from lms.djangoapps.grades.course_grade_factory import CourseGradeFactory from lms.djangoapps.grades.tests.utils import mock_passing_grade from lms.djangoapps.verify_student.models import IDVerificationAttempt, SoftwareSecurePhotoVerification from openedx.core.djangoapps.certificates.config import waffle -from openedx.core.djangoapps.waffle_utils import WaffleSwitch -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_switch -from student.tests.factories import CourseEnrollmentFactory, UserFactory -from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase -from xmodule.modulestore.tests.factories import CourseFactory AUTO_CERTIFICATE_GENERATION_SWITCH = WaffleSwitch(waffle.waffle(), waffle.AUTO_CERTIFICATE_GENERATION) diff --git a/lms/djangoapps/certificates/tests/test_webview_views.py b/lms/djangoapps/certificates/tests/test_webview_views.py index aa2327a769..fa1d47d88e 100644 --- a/lms/djangoapps/certificates/tests/test_webview_views.py +++ b/lms/djangoapps/certificates/tests/test_webview_views.py @@ -17,6 +17,7 @@ from mock import patch from urllib.parse import urlencode from course_modes.models import CourseMode +from edx_toggles.toggles import WaffleSwitch from edx_toggles.toggles.testutils import override_waffle_switch from lms.djangoapps.badges.events.course_complete import get_completion_badge from lms.djangoapps.badges.tests.factories import ( @@ -46,7 +47,6 @@ from openedx.core.djangoapps.site_configuration.tests.test_util import ( with_site_configuration, with_site_configuration_context ) -from openedx.core.djangoapps.waffle_utils import WaffleSwitch from openedx.core.djangolib.js_utils import js_escaped_string from openedx.core.djangolib.testing.utils import CacheIsolationTestCase from openedx.core.lib.tests.assertions.events import assert_event_matches diff --git a/lms/djangoapps/course_api/__init__.py b/lms/djangoapps/course_api/__init__.py index 514905f0b9..c520da14b0 100644 --- a/lms/djangoapps/course_api/__init__.py +++ b/lms/djangoapps/course_api/__init__.py @@ -1,7 +1,7 @@ """ Course API """ -from openedx.core.djangoapps.waffle_utils import WaffleSwitch, WaffleSwitchNamespace +from edx_toggles.toggles import WaffleSwitch, WaffleSwitchNamespace WAFFLE_SWITCH_NAMESPACE = WaffleSwitchNamespace(name='course_list_api_rate_limit') diff --git a/lms/djangoapps/course_api/blocks/tests/test_api.py b/lms/djangoapps/course_api/blocks/tests/test_api.py index bf8d261866..ba73088ca1 100644 --- a/lms/djangoapps/course_api/blocks/tests/test_api.py +++ b/lms/djangoapps/course_api/blocks/tests/test_api.py @@ -8,17 +8,17 @@ from itertools import product import ddt import six from django.test.client import RequestFactory +from edx_toggles.toggles.testutils import override_waffle_switch from mock import patch - -from openedx.core.djangoapps.content.block_structure.api import clear_course_from_cache -from openedx.core.djangoapps.content.block_structure.config import STORAGE_BACKING_FOR_CACHE, waffle_switch -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_switch from student.tests.factories import UserFactory from xmodule.modulestore import ModuleStoreEnum from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase from xmodule.modulestore.tests.factories import SampleCourseFactory, check_mongo_calls from xmodule.modulestore.tests.sample_courses import BlockInfo +from openedx.core.djangoapps.content.block_structure.api import clear_course_from_cache +from openedx.core.djangoapps.content.block_structure.config import STORAGE_BACKING_FOR_CACHE, waffle_switch + from ..api import get_blocks diff --git a/lms/djangoapps/course_api/blocks/toggles.py b/lms/djangoapps/course_api/blocks/toggles.py index 628cabe3dc..dc4312363d 100644 --- a/lms/djangoapps/course_api/blocks/toggles.py +++ b/lms/djangoapps/course_api/blocks/toggles.py @@ -3,8 +3,7 @@ Toggles for Course API. """ -from openedx.core.djangoapps.waffle_utils import WaffleFlag, WaffleFlagNamespace - +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace COURSE_BLOCKS_API_NAMESPACE = WaffleFlagNamespace(name=u'course_blocks_api') diff --git a/lms/djangoapps/course_home_api/toggles.py b/lms/djangoapps/course_home_api/toggles.py index 7d27c15314..a85092963a 100644 --- a/lms/djangoapps/course_home_api/toggles.py +++ b/lms/djangoapps/course_home_api/toggles.py @@ -2,8 +2,9 @@ Toggles for course home experience. """ +from edx_toggles.toggles import WaffleFlagNamespace from lms.djangoapps.experiments.flags import ExperimentWaffleFlag -from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag, WaffleFlagNamespace +from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='course_home') diff --git a/lms/djangoapps/courseware/tests/test_module_render.py b/lms/djangoapps/courseware/tests/test_module_render.py index 86b7109327..420c3ed303 100644 --- a/lms/djangoapps/courseware/tests/test_module_render.py +++ b/lms/djangoapps/courseware/tests/test_module_render.py @@ -14,8 +14,10 @@ import ddt import pytz import six from bson import ObjectId +from capa.tests.response_xml_factory import OptionResponseXMLFactory from completion import waffle as completion_waffle from completion.models import BlockCompletion +from course_modes.models import CourseMode from django.conf import settings from django.contrib.auth.models import AnonymousUser from django.http import Http404, HttpResponse @@ -26,6 +28,8 @@ from django.urls import reverse from edx_proctoring.api import create_exam, create_exam_attempt, update_attempt_status from edx_proctoring.runtime import set_runtime_service from edx_proctoring.tests.test_services import MockCertificateService, MockCreditService, MockGradesService +from edx_toggles.toggles import WaffleSwitch +from edx_toggles.toggles.testutils import override_waffle_switch from edx_when.field_data import DateLookupFieldData from freezegun import freeze_time from milestones.tests.utils import MilestonesTestCaseMixin @@ -35,6 +39,8 @@ from opaque_keys.edx.keys import CourseKey, UsageKey from pyquery import PyQuery from six import text_type from six.moves import range +from student.models import CourseEnrollment, anonymous_id_for_user +from verify_student.tests.factories import SoftwareSecurePhotoVerificationFactory from web_fragments.fragment import Fragment from xblock.completable import CompletableXBlockMixin from xblock.core import XBlock, XBlockAside @@ -42,9 +48,22 @@ from xblock.field_data import FieldData from xblock.fields import ScopeIds from xblock.runtime import DictKeyValueStore, KvsFieldData, Runtime from xblock.test.tools import TestRuntime +from xblock_django.models import XBlockConfiguration +from xmodule.capa_module import ProblemBlock +from xmodule.html_module import AboutBlock, CourseInfoBlock, HtmlBlock, StaticTabBlock +from xmodule.lti_module import LTIDescriptor +from xmodule.modulestore import ModuleStoreEnum +from xmodule.modulestore.django import modulestore +from xmodule.modulestore.tests.django_utils import ( + TEST_DATA_MIXED_MODULESTORE, + ModuleStoreTestCase, + SharedModuleStoreTestCase +) +from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory, ToyCourseFactory, check_mongo_calls +from xmodule.modulestore.tests.test_asides import AsideTestType +from xmodule.video_module import VideoBlock +from xmodule.x_module import STUDENT_VIEW, CombinedSystem, XModule, XModuleDescriptor -from capa.tests.response_xml_factory import OptionResponseXMLFactory -from course_modes.models import CourseMode from lms.djangoapps.courseware import module_render as render from lms.djangoapps.courseware.access_response import AccessResponse from lms.djangoapps.courseware.courses import get_course_info_section, get_course_with_access @@ -66,31 +85,13 @@ from openedx.core.djangoapps.credit.api import set_credit_requirement_status, se from openedx.core.djangoapps.credit.models import CreditCourse from openedx.core.djangoapps.oauth_dispatch.jwt import create_jwt_for_user from openedx.core.djangoapps.oauth_dispatch.tests.factories import AccessTokenFactory, ApplicationFactory -from openedx.core.djangoapps.waffle_utils import WaffleSwitch -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_switch from openedx.core.lib.courses import course_image_url from openedx.core.lib.gating import api as gating_api from openedx.core.lib.url_utils import quote_slashes -from student.models import CourseEnrollment, anonymous_id_for_user -from verify_student.tests.factories import SoftwareSecurePhotoVerificationFactory -from xblock_django.models import XBlockConfiguration -from xmodule.capa_module import ProblemBlock -from xmodule.html_module import AboutBlock, CourseInfoBlock, HtmlBlock, StaticTabBlock -from xmodule.lti_module import LTIDescriptor -from xmodule.modulestore import ModuleStoreEnum -from xmodule.modulestore.django import modulestore -from xmodule.modulestore.tests.django_utils import ( - TEST_DATA_MIXED_MODULESTORE, - ModuleStoreTestCase, - SharedModuleStoreTestCase -) -from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory, ToyCourseFactory, check_mongo_calls -from xmodule.modulestore.tests.test_asides import AsideTestType -from xmodule.video_module import VideoBlock -from xmodule.x_module import STUDENT_VIEW, CombinedSystem, XModule, XModuleDescriptor TEST_DATA_DIR = settings.COMMON_TEST_DATA_ROOT +# pylint: disable=feature-toggle-needs-doc ENABLE_COMPLETION_TRACKING_SWITCH = WaffleSwitch( completion_waffle.waffle(), completion_waffle.ENABLE_COMPLETION_TRACKING, __name__ ) diff --git a/lms/djangoapps/courseware/toggles.py b/lms/djangoapps/courseware/toggles.py index 04e9520e81..36d354bf61 100644 --- a/lms/djangoapps/courseware/toggles.py +++ b/lms/djangoapps/courseware/toggles.py @@ -2,8 +2,9 @@ Toggles for courseware in-course experience. """ +from edx_toggles.toggles import WaffleFlagNamespace from lms.djangoapps.experiments.flags import ExperimentWaffleFlag -from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag, WaffleFlagNamespace +from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag # Namespace for courseware waffle flags. WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='courseware') diff --git a/lms/djangoapps/courseware/views/index.py b/lms/djangoapps/courseware/views/index.py index 5dac77e8d5..9ddac75e29 100644 --- a/lms/djangoapps/courseware/views/index.py +++ b/lms/djangoapps/courseware/views/index.py @@ -8,7 +8,6 @@ View for Courseware Index import logging import six -from six.moves import urllib from django.conf import settings from django.contrib.auth.views import redirect_to_login from django.db import transaction @@ -22,8 +21,10 @@ from django.views.decorators.cache import cache_control from django.views.decorators.csrf import ensure_csrf_cookie from django.views.generic import View from edx_django_utils.monitoring import set_custom_attributes_for_course_key +from edx_toggles.toggles import WaffleSwitchNamespace from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey, UsageKey +from six.moves import urllib from web_fragments.fragment import Fragment from edxmako.shortcuts import render_to_response, render_to_string @@ -36,13 +37,12 @@ from openedx.core.djangoapps.crawlers.models import CrawlersConfig from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY from openedx.core.djangoapps.user_api.preferences.api import get_user_preference from openedx.core.djangoapps.util.user_messages import PageLevelMessages -from openedx.core.djangoapps.waffle_utils import WaffleSwitchNamespace from openedx.core.djangolib.markup import HTML, Text from openedx.features.course_experience import ( COURSE_ENABLE_UNENROLLED_ACCESS_FLAG, DISABLE_COURSE_OUTLINE_PAGE_FLAG, - default_course_url_name, RELATIVE_DATES_FLAG, + default_course_url_name ) from openedx.features.course_experience.urls import COURSE_HOME_VIEW_NAME from openedx.features.course_experience.views.course_sock import CourseSockFragmentView @@ -55,12 +55,7 @@ from xmodule.x_module import PUBLIC_VIEW, STUDENT_VIEW from ..access import has_access from ..access_utils import check_public_access -from ..courses import ( - check_course_access_with_redirect, - get_course_with_access, - get_current_child, - get_studio_url -) +from ..courses import check_course_access_with_redirect, get_course_with_access, get_current_child, get_studio_url from ..entrance_exams import ( course_has_entrance_exam, get_entrance_exam_content, @@ -71,15 +66,10 @@ from ..masquerade import check_content_start_date_for_masquerade_user, setup_mas from ..model_data import FieldDataCache from ..module_render import get_module_for_descriptor, toc_for_course from ..permissions import MASQUERADE_AS_STUDENT -from ..toggles import ( - COURSEWARE_MICROFRONTEND_COURSE_TEAM_PREVIEW, - REDIRECT_TO_COURSEWARE_MICROFRONTEND, -) +from ..toggles import COURSEWARE_MICROFRONTEND_COURSE_TEAM_PREVIEW, REDIRECT_TO_COURSEWARE_MICROFRONTEND from ..url_helpers import get_microfrontend_url - from .views import CourseTabView - log = logging.getLogger("edx.courseware.views.index") TEMPLATE_IMPORTS = {'urllib': urllib} diff --git a/lms/djangoapps/email_marketing/signals.py b/lms/djangoapps/email_marketing/signals.py index 402bc2f6d5..82b8655394 100644 --- a/lms/djangoapps/email_marketing/signals.py +++ b/lms/djangoapps/email_marketing/signals.py @@ -16,16 +16,20 @@ from six import text_type import third_party_auth from course_modes.models import CourseMode -from .models import EmailMarketingConfiguration -from lms.djangoapps.email_marketing.tasks import get_email_cookies_via_sailthru, update_user, update_user_email +from edx_toggles.toggles import WaffleSwitchNamespace +from lms.djangoapps.email_marketing.tasks import ( + get_email_cookies_via_sailthru, + update_course_enrollment, + update_user, + update_user_email +) from openedx.core.djangoapps.lang_pref import LANGUAGE_KEY from openedx.core.djangoapps.user_authn.cookies import CREATE_LOGON_COOKIE from openedx.core.djangoapps.user_authn.views.register import REGISTER_USER -from openedx.core.djangoapps.waffle_utils import WaffleSwitchNamespace from student.signals import SAILTHRU_AUDIT_PURCHASE from util.model_utils import USER_FIELD_CHANGED -from lms.djangoapps.email_marketing.tasks import update_course_enrollment +from .models import EmailMarketingConfiguration log = logging.getLogger(__name__) diff --git a/lms/djangoapps/experiments/utils.py b/lms/djangoapps/experiments/utils.py index 4d4ea98bbf..05cc3ceda0 100644 --- a/lms/djangoapps/experiments/utils.py +++ b/lms/djangoapps/experiments/utils.py @@ -11,16 +11,16 @@ from django.utils.timezone import now from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey -from course_modes.models import format_course_price, get_cosmetic_verified_display_price, CourseMode -from lms.djangoapps.courseware.access import has_staff_access_to_preview_mode -from lms.djangoapps.courseware.utils import verified_upgrade_deadline_link, can_show_verified_upgrade +from course_modes.models import CourseMode, format_course_price, get_cosmetic_verified_display_price +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace from entitlements.models import CourseEntitlement from lms.djangoapps.commerce.utils import EcommerceService +from lms.djangoapps.courseware.access import has_staff_access_to_preview_mode +from lms.djangoapps.courseware.utils import can_show_verified_upgrade, verified_upgrade_deadline_link from openedx.core.djangoapps.catalog.utils import get_programs from openedx.core.djangoapps.django_comment_common.models import Role from openedx.core.djangoapps.schedules.models import Schedule -from openedx.core.djangoapps.waffle_utils import WaffleFlag, WaffleFlagNamespace -from openedx.features.course_duration_limits.access import get_user_course_expiration_date, get_user_course_duration +from openedx.features.course_duration_limits.access import get_user_course_duration, get_user_course_expiration_date from student.models import CourseEnrollment from xmodule.partitions.partitions_service import get_all_partitions_for_course, get_user_partition_groups diff --git a/lms/djangoapps/experiments/views_custom.py b/lms/djangoapps/experiments/views_custom.py index 95445816a4..df920d5359 100644 --- a/lms/djangoapps/experiments/views_custom.py +++ b/lms/djangoapps/experiments/views_custom.py @@ -6,9 +6,8 @@ The Discount API Views should return information about discounts that apply to t import six - -from django.utils.decorators import method_decorator from django.http import HttpResponseBadRequest +from django.utils.decorators import method_decorator from edx_rest_framework_extensions.auth.jwt.authentication import JwtAuthentication from edx_rest_framework_extensions.auth.session.authentication import SessionAuthenticationAllowInactiveUser from opaque_keys import InvalidKeyError @@ -16,21 +15,19 @@ from opaque_keys.edx.keys import CourseKey from rest_framework.response import Response from rest_framework.views import APIView +from course_modes.models import get_cosmetic_verified_display_price +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace +from lms.djangoapps.commerce.utils import EcommerceService +from lms.djangoapps.courseware.utils import can_show_verified_upgrade +from lms.djangoapps.experiments.stable_bucketing import stable_bucketing_hash_group from openedx.core.djangoapps.content.course_overviews.models import CourseOverview from openedx.core.djangoapps.cors_csrf.decorators import ensure_csrf_cookie_cross_domain -from openedx.core.djangoapps.waffle_utils import WaffleFlag, WaffleFlagNamespace from openedx.core.lib.api.authentication import BearerAuthenticationAllowInactiveUser from openedx.core.lib.api.permissions import ApiKeyHeaderPermissionIsAuthenticated from openedx.core.lib.api.view_utils import DeveloperErrorViewMixin - -from lms.djangoapps.courseware.utils import can_show_verified_upgrade -from course_modes.models import get_cosmetic_verified_display_price -from lms.djangoapps.commerce.utils import EcommerceService -from lms.djangoapps.experiments.stable_bucketing import stable_bucketing_hash_group from student.models import CourseEnrollment from track import segment - # .. toggle_name: experiments.mobile_upsell_rev934 # .. toggle_type: flag # .. toggle_default: False diff --git a/lms/djangoapps/grades/config/waffle.py b/lms/djangoapps/grades/config/waffle.py index 5280de8ee4..f57db2f87e 100644 --- a/lms/djangoapps/grades/config/waffle.py +++ b/lms/djangoapps/grades/config/waffle.py @@ -4,12 +4,8 @@ waffle switches for the Grades app. """ -from openedx.core.djangoapps.waffle_utils import ( - CourseWaffleFlag, - WaffleFlagNamespace, - WaffleSwitch, - WaffleSwitchNamespace -) +from edx_toggles.toggles import WaffleFlagNamespace, WaffleSwitch, WaffleSwitchNamespace +from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag # Namespace WAFFLE_NAMESPACE = u'grades' diff --git a/lms/djangoapps/instructor/toggles.py b/lms/djangoapps/instructor/toggles.py index 3e4e58a423..4b71e980ed 100644 --- a/lms/djangoapps/instructor/toggles.py +++ b/lms/djangoapps/instructor/toggles.py @@ -2,7 +2,8 @@ Waffle flags for instructor dashboard. """ -from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag, WaffleFlagNamespace, WaffleFlag +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace +from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag WAFFLE_NAMESPACE = 'instructor' # Namespace for instructor waffle flags. diff --git a/lms/djangoapps/instructor_task/config/waffle.py b/lms/djangoapps/instructor_task/config/waffle.py index fae907ce94..05e7762d80 100644 --- a/lms/djangoapps/instructor_task/config/waffle.py +++ b/lms/djangoapps/instructor_task/config/waffle.py @@ -3,7 +3,8 @@ 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 edx_toggles.toggles import WaffleFlagNamespace, WaffleSwitchNamespace +from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag WAFFLE_NAMESPACE = 'instructor_task' INSTRUCTOR_TASK_WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name=WAFFLE_NAMESPACE) diff --git a/lms/djangoapps/verify_student/toggles.py b/lms/djangoapps/verify_student/toggles.py index 3df8a34854..85642a1745 100644 --- a/lms/djangoapps/verify_student/toggles.py +++ b/lms/djangoapps/verify_student/toggles.py @@ -2,7 +2,7 @@ Toggles for verify_student app """ -from openedx.core.djangoapps.waffle_utils import WaffleFlagNamespace, WaffleFlag +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace # Namespace for verify_students waffle flags. WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='verify_student') diff --git a/openedx/core/djangoapps/certificates/config/waffle.py b/openedx/core/djangoapps/certificates/config/waffle.py index 8ecd11bc68..5cac3bd9ee 100644 --- a/openedx/core/djangoapps/certificates/config/waffle.py +++ b/openedx/core/djangoapps/certificates/config/waffle.py @@ -4,7 +4,7 @@ waffle switches for the Certificates app. """ -from openedx.core.djangoapps.waffle_utils import WaffleSwitchNamespace +from edx_toggles.toggles import WaffleSwitchNamespace # Namespace WAFFLE_NAMESPACE = u'certificates' diff --git a/openedx/core/djangoapps/certificates/tests/test_api.py b/openedx/core/djangoapps/certificates/tests/test_api.py index 7cf4f508ac..ba47c71d3e 100644 --- a/openedx/core/djangoapps/certificates/tests/test_api.py +++ b/openedx/core/djangoapps/certificates/tests/test_api.py @@ -7,15 +7,15 @@ from datetime import datetime, timedelta import ddt import pytz import waffle -from django.test import TestCase - from course_modes.models import CourseMode +from django.test import TestCase +from edx_toggles.toggles import WaffleSwitch +from edx_toggles.toggles.testutils import override_waffle_switch +from student.tests.factories import CourseEnrollmentFactory, UserFactory + from openedx.core.djangoapps.certificates import api from openedx.core.djangoapps.certificates.config import waffle as certs_waffle from openedx.core.djangoapps.content.course_overviews.tests.factories import CourseOverviewFactory -from openedx.core.djangoapps.waffle_utils import WaffleSwitch -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_switch -from student.tests.factories import CourseEnrollmentFactory, UserFactory # TODO: Copied from lms.djangoapps.certificates.models, diff --git a/openedx/core/djangoapps/content/block_structure/config/__init__.py b/openedx/core/djangoapps/content/block_structure/config/__init__.py index c0df1cbe6d..2d1a1596ec 100644 --- a/openedx/core/djangoapps/content/block_structure/config/__init__.py +++ b/openedx/core/djangoapps/content/block_structure/config/__init__.py @@ -4,7 +4,7 @@ waffle switches for the Block Structure framework. """ -from openedx.core.djangoapps.waffle_utils import WaffleSwitch, WaffleSwitchNamespace +from edx_toggles.toggles import WaffleSwitch, WaffleSwitchNamespace from openedx.core.lib.cache_utils import request_cached from .models import BlockStructureConfiguration diff --git a/openedx/core/djangoapps/content/block_structure/tests/test_manager.py b/openedx/core/djangoapps/content/block_structure/tests/test_manager.py index 04d0c9a57e..cfdf68fb1a 100644 --- a/openedx/core/djangoapps/content/block_structure/tests/test_manager.py +++ b/openedx/core/djangoapps/content/block_structure/tests/test_manager.py @@ -6,8 +6,7 @@ Tests for manager.py import ddt import six from django.test import TestCase - -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_switch +from edx_toggles.toggles.testutils import override_waffle_switch from ..block_structure import BlockStructureBlockData from ..config import RAISE_ERROR_WHEN_NOT_FOUND, STORAGE_BACKING_FOR_CACHE, waffle_switch diff --git a/openedx/core/djangoapps/content/block_structure/tests/test_signals.py b/openedx/core/djangoapps/content/block_structure/tests/test_signals.py index ebea9613e6..ca47fb2eeb 100644 --- a/openedx/core/djangoapps/content/block_structure/tests/test_signals.py +++ b/openedx/core/djangoapps/content/block_structure/tests/test_signals.py @@ -4,10 +4,9 @@ Unit tests for the Course Blocks signals import ddt +from edx_toggles.toggles.testutils import override_waffle_switch from mock import patch from opaque_keys.edx.locator import CourseLocator, LibraryLocator - -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_switch from xmodule.modulestore.exceptions import ItemNotFoundError from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase from xmodule.modulestore.tests.factories import CourseFactory diff --git a/openedx/core/djangoapps/content/block_structure/tests/test_store.py b/openedx/core/djangoapps/content/block_structure/tests/test_store.py index 5db54bd0fb..85772578db 100644 --- a/openedx/core/djangoapps/content/block_structure/tests/test_store.py +++ b/openedx/core/djangoapps/content/block_structure/tests/test_store.py @@ -4,8 +4,8 @@ Tests for block_structure/cache.py import ddt +from edx_toggles.toggles.testutils import override_waffle_switch -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_switch from openedx.core.djangolib.testing.utils import CacheIsolationTestCase from ..config import STORAGE_BACKING_FOR_CACHE, waffle_switch diff --git a/openedx/core/djangoapps/coursegraph/management/commands/tests/test_dump_to_neo4j.py b/openedx/core/djangoapps/coursegraph/management/commands/tests/test_dump_to_neo4j.py index 4576332a13..7431a90392 100644 --- a/openedx/core/djangoapps/coursegraph/management/commands/tests/test_dump_to_neo4j.py +++ b/openedx/core/djangoapps/coursegraph/management/commands/tests/test_dump_to_neo4j.py @@ -10,6 +10,9 @@ import ddt import mock import six from django.core.management import call_command +from edx_toggles.toggles.testutils import override_waffle_switch +from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase +from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory import openedx.core.djangoapps.content.block_structure.config as block_structure_config from openedx.core.djangoapps.content.block_structure.signals import update_block_structure_on_course_publish @@ -22,10 +25,7 @@ from openedx.core.djangoapps.coursegraph.tasks import ( should_dump_course, strip_branch_and_version ) -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_switch from openedx.core.djangolib.testing.utils import skip_unless_lms -from xmodule.modulestore.tests.django_utils import SharedModuleStoreTestCase -from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory class TestDumpToNeo4jCommandBase(SharedModuleStoreTestCase): diff --git a/openedx/core/djangoapps/models/config/waffle.py b/openedx/core/djangoapps/models/config/waffle.py index 716c562966..e8c63af4c5 100644 --- a/openedx/core/djangoapps/models/config/waffle.py +++ b/openedx/core/djangoapps/models/config/waffle.py @@ -4,11 +4,8 @@ waffle switches for the course_details view. """ -from openedx.core.djangoapps.waffle_utils import ( - CourseWaffleFlag, - WaffleFlagNamespace, - WaffleSwitchNamespace -) +from edx_toggles.toggles import WaffleFlagNamespace, WaffleSwitchNamespace +from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag COURSE_DETAIL_WAFFLE_NAMESPACE = 'course_detail' COURSE_DETAIL_WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name=COURSE_DETAIL_WAFFLE_NAMESPACE) diff --git a/openedx/core/djangoapps/programs/__init__.py b/openedx/core/djangoapps/programs/__init__.py index e46cc090b7..ee3bbba585 100644 --- a/openedx/core/djangoapps/programs/__init__.py +++ b/openedx/core/djangoapps/programs/__init__.py @@ -10,7 +10,7 @@ this package should be kept small, thin, and stateless. """ default_app_config = 'openedx.core.djangoapps.programs.apps.ProgramsConfig' -from openedx.core.djangoapps.waffle_utils import WaffleSwitch, WaffleSwitchNamespace +from edx_toggles.toggles import WaffleSwitch, WaffleSwitchNamespace PROGRAMS_WAFFLE_SWITCH_NAMESPACE = WaffleSwitchNamespace(name='programs') diff --git a/openedx/core/djangoapps/schedules/config.py b/openedx/core/djangoapps/schedules/config.py index e574d4ea72..42f5b567ea 100644 --- a/openedx/core/djangoapps/schedules/config.py +++ b/openedx/core/djangoapps/schedules/config.py @@ -3,10 +3,8 @@ Contains configuration for schedules app """ -from openedx.core.djangoapps.waffle_utils import ( - WaffleFlagNamespace, CourseWaffleFlag, WaffleFlag, - WaffleSwitch, WaffleSwitchNamespace, -) +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace, WaffleSwitch, WaffleSwitchNamespace +from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='schedules') WAFFLE_SWITCH_NAMESPACE = WaffleSwitchNamespace(name='schedules') diff --git a/openedx/core/djangoapps/schedules/tests/test_signals.py b/openedx/core/djangoapps/schedules/tests/test_signals.py index ea01baac59..77cfe2d16d 100644 --- a/openedx/core/djangoapps/schedules/tests/test_signals.py +++ b/openedx/core/djangoapps/schedules/tests/test_signals.py @@ -7,13 +7,13 @@ import datetime import ddt import pytest +from edx_toggles.toggles.testutils import override_waffle_flag from mock import patch from pytz import utc from testfixtures import LogCapture from course_modes.models import CourseMode from course_modes.tests.factories import CourseModeFactory -from edx_toggles.toggles.testutils import override_waffle_flag from lms.djangoapps.courseware.models import DynamicUpgradeDeadlineConfiguration from openedx.core.djangoapps.schedules.models import ScheduleExperience from openedx.core.djangoapps.schedules.signals import CREATE_SCHEDULE_WAFFLE_FLAG, log diff --git a/openedx/core/djangoapps/user_api/accounts/toggles.py b/openedx/core/djangoapps/user_api/accounts/toggles.py index 621d13048d..4c4f07bedd 100644 --- a/openedx/core/djangoapps/user_api/accounts/toggles.py +++ b/openedx/core/djangoapps/user_api/accounts/toggles.py @@ -2,8 +2,8 @@ Toggles for accounts related code. """ +from edx_toggles.toggles import WaffleFlag from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers -from openedx.core.djangoapps.waffle_utils import WaffleFlag # .. toggle_name: order_history.redirect_to_microfrontend # .. toggle_implementation: WaffleFlag diff --git a/openedx/core/djangoapps/user_api/config/waffle.py b/openedx/core/djangoapps/user_api/config/waffle.py index 579cfd7fa3..94708949e5 100644 --- a/openedx/core/djangoapps/user_api/config/waffle.py +++ b/openedx/core/djangoapps/user_api/config/waffle.py @@ -5,7 +5,7 @@ Waffle flags and switches to change user API functionality. from django.utils.translation import ugettext_lazy as _ -from openedx.core.djangoapps.waffle_utils import WaffleSwitchNamespace +from edx_toggles.toggles import WaffleSwitchNamespace SYSTEM_MAINTENANCE_MSG = _(u'System maintenance in progress. Please try again later.') WAFFLE_NAMESPACE = u'user_api' diff --git a/openedx/core/djangoapps/user_authn/config/waffle.py b/openedx/core/djangoapps/user_authn/config/waffle.py index 933d3cf395..0e95b2b5ce 100644 --- a/openedx/core/djangoapps/user_authn/config/waffle.py +++ b/openedx/core/djangoapps/user_authn/config/waffle.py @@ -3,7 +3,7 @@ Waffle flags and switches for user authn. """ -from openedx.core.djangoapps.waffle_utils import WaffleSwitch, WaffleSwitchNamespace +from edx_toggles.toggles import WaffleSwitch, WaffleSwitchNamespace _WAFFLE_NAMESPACE = u'user_authn' _WAFFLE_SWITCH_NAMESPACE = WaffleSwitchNamespace(name=_WAFFLE_NAMESPACE, log_prefix=u'UserAuthN: ') diff --git a/openedx/core/djangoapps/user_authn/views/register.py b/openedx/core/djangoapps/user_authn/views/register.py index de1010fe55..b4cc541c03 100644 --- a/openedx/core/djangoapps/user_authn/views/register.py +++ b/openedx/core/djangoapps/user_authn/views/register.py @@ -21,12 +21,11 @@ from django.utils.translation import get_language from django.utils.translation import ugettext as _ from django.views.decorators.csrf import csrf_exempt, ensure_csrf_cookie from django.views.decorators.debug import sensitive_post_parameters -from ipware.ip import get_ip +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace from pytz import UTC from ratelimit.decorators import ratelimit from requests import HTTPError from rest_framework.response import Response -from rest_framework.throttling import AnonRateThrottle from rest_framework.views import APIView from six import text_type from social_core.exceptions import AuthAlreadyAssociated, AuthException @@ -57,7 +56,6 @@ from openedx.core.djangoapps.user_authn.views.registration_form import ( RegistrationFormFactory, get_registration_extension_form ) -from openedx.core.djangoapps.waffle_utils import WaffleFlag, WaffleFlagNamespace from student.helpers import ( AccountValidationError, authenticate_new_user, diff --git a/openedx/core/djangoapps/user_authn/views/tests/test_login.py b/openedx/core/djangoapps/user_authn/views/tests/test_login.py index c86e206e30..99886392a5 100644 --- a/openedx/core/djangoapps/user_authn/views/tests/test_login.py +++ b/openedx/core/djangoapps/user_authn/views/tests/test_login.py @@ -18,7 +18,10 @@ from django.http import HttpResponse from django.test.client import Client from django.test.utils import override_settings from django.urls import NoReverseMatch, reverse +from edx_toggles.toggles.testutils import override_waffle_switch from mock import patch +from student.tests.factories import RegistrationFactory, UserFactory, UserProfileFactory +from util.password_policy_validators import DEFAULT_MAX_PASSWORD_LENGTH from openedx.core.djangoapps.password_policy.compliance import ( NonCompliantPasswordException, @@ -32,12 +35,9 @@ from openedx.core.djangoapps.user_authn.views.login import ( AllowedAuthUser, _check_user_auth_flow ) -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_switch from openedx.core.djangolib.testing.utils import CacheIsolationTestCase, skip_unless_lms from openedx.core.djangoapps.site_configuration.tests.mixins import SiteMixin from openedx.core.lib.api.test_utils import ApiTestCase -from student.tests.factories import RegistrationFactory, UserFactory, UserProfileFactory -from util.password_policy_validators import DEFAULT_MAX_PASSWORD_LENGTH @ddt.ddt diff --git a/openedx/core/djangoapps/user_authn/views/tests/test_logistration.py b/openedx/core/djangoapps/user_authn/views/tests/test_logistration.py index cac9e02b2e..8a5cc6d78f 100644 --- a/openedx/core/djangoapps/user_authn/views/tests/test_logistration.py +++ b/openedx/core/djangoapps/user_authn/views/tests/test_logistration.py @@ -4,6 +4,7 @@ from datetime import datetime, timedelta from http.cookies import SimpleCookie +from urllib.parse import urlencode import ddt import mock @@ -20,12 +21,9 @@ from django.urls import reverse from django.utils.translation import ugettext as _ from freezegun import freeze_time from pytz import UTC -from six.moves.urllib.parse import urlencode # pylint: disable=import-error from course_modes.models import CourseMode -from edx_toggles.toggles.testutils import override_waffle_flag from lms.djangoapps.branding.api import get_privacy_url -from openedx.core.djangoapps.site_configuration.tests.factories import SiteConfigurationFactory, SiteFactory from openedx.core.djangoapps.site_configuration.tests.mixins import SiteMixin from openedx.core.djangoapps.theming.tests.test_util import with_comprehensive_theme_context from openedx.core.djangoapps.user_authn.views.login_form import login_and_registration_form @@ -125,7 +123,7 @@ class LoginAndRegistrationTest(ThirdPartyAuthTestMixin, UrlResetMixin, ModuleSto Test that rate limiting for logistration enpoints works as expected. """ login_url = reverse('signin_user') - for i in range(5): + for _ in range(5): response = self.client.get(login_url) self.assertEqual(response.status_code, 200) diff --git a/openedx/core/djangoapps/util/waffle.py b/openedx/core/djangoapps/util/waffle.py index 4d90de31fd..dd99ed5536 100644 --- a/openedx/core/djangoapps/util/waffle.py +++ b/openedx/core/djangoapps/util/waffle.py @@ -3,7 +3,7 @@ Waffle flags and switches """ -from openedx.core.djangoapps.waffle_utils import WaffleSwitchNamespace +from edx_toggles.toggles import WaffleSwitchNamespace WAFFLE_NAMESPACE = u'open_edx_util' diff --git a/openedx/core/djangoapps/video_pipeline/config/waffle.py b/openedx/core/djangoapps/video_pipeline/config/waffle.py index 1cb9e88f9c..f52eca95b4 100644 --- a/openedx/core/djangoapps/video_pipeline/config/waffle.py +++ b/openedx/core/djangoapps/video_pipeline/config/waffle.py @@ -3,7 +3,8 @@ This module contains configuration settings via waffle flags for the Video Pipeline app. """ -from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag, WaffleFlag, WaffleFlagNamespace +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace +from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag # Videos Namespace WAFFLE_NAMESPACE = 'videos' diff --git a/openedx/core/djangoapps/waffle_utils/__init__.py b/openedx/core/djangoapps/waffle_utils/__init__.py index 72e6912856..6b29b76702 100644 --- a/openedx/core/djangoapps/waffle_utils/__init__.py +++ b/openedx/core/djangoapps/waffle_utils/__init__.py @@ -6,7 +6,6 @@ import logging from opaque_keys.edx.keys import CourseKey -# pylint: disable=unused-import from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace, WaffleSwitch, WaffleSwitchNamespace log = logging.getLogger(__name__) diff --git a/openedx/core/lib/request_utils.py b/openedx/core/lib/request_utils.py index be3862cc21..77072b3b30 100644 --- a/openedx/core/lib/request_utils.py +++ b/openedx/core/lib/request_utils.py @@ -12,8 +12,8 @@ from opaque_keys import InvalidKeyError from opaque_keys.edx.keys import CourseKey from six.moves.urllib.parse import urlparse +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers -from openedx.core.djangoapps.waffle_utils import WaffleFlag, WaffleFlagNamespace # accommodates course api urls, excluding any course api routes that do not fall under v*/courses, such as v1/blocks. COURSE_REGEX = re.compile(r'^(.*?/courses/)(?!v[0-9]+/[^/]+){}'.format(settings.COURSE_ID_PATTERN)) diff --git a/openedx/core/tests/test_admin_view.py b/openedx/core/tests/test_admin_view.py index d7f3cae626..4f02167bf5 100644 --- a/openedx/core/tests/test_admin_view.py +++ b/openedx/core/tests/test_admin_view.py @@ -6,10 +6,10 @@ This is not inside a django app because it is a global property of the system. from django.test import Client, TestCase from django.urls import reverse +from edx_toggles.toggles.testutils import override_waffle_switch +from student.tests.factories import TEST_PASSWORD, UserFactory from openedx.core.djangoapps.user_authn.views.login import ENABLE_LOGIN_USING_THIRDPARTY_AUTH_ONLY -from openedx.core.djangoapps.waffle_utils.testutils import override_waffle_switch -from student.tests.factories import TEST_PASSWORD, UserFactory class TestAdminView(TestCase): diff --git a/openedx/features/course_experience/__init__.py b/openedx/features/course_experience/__init__.py index 40be566219..fe1ca1dd9f 100644 --- a/openedx/features/course_experience/__init__.py +++ b/openedx/features/course_experience/__init__.py @@ -6,9 +6,9 @@ from django.utils.translation import ugettext as _ from edx_django_utils.monitoring import set_custom_attribute from waffle import flag_is_active +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace from lms.djangoapps.experiments.flags import ExperimentWaffleFlag from openedx.core.djangoapps.util.user_messages import UserMessageCollection -from openedx.core.djangoapps.waffle_utils import WaffleFlag, WaffleFlagNamespace from openedx.core.djangoapps.waffle_utils import CourseWaffleFlag # Namespace for course experience waffle flags. 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 bdb35d3265..542b68ac74 100644 --- a/openedx/features/course_experience/tests/views/test_course_home.py +++ b/openedx/features/course_experience/tests/views/test_course_home.py @@ -14,13 +14,13 @@ from django.http import QueryDict from django.urls import reverse from django.utils.http import urlquote_plus from django.utils.timezone import now +from edx_toggles.toggles.testutils import override_waffle_flag from pytz import UTC from waffle.models import Flag from waffle.testutils import override_flag from course_modes.models import CourseMode from course_modes.tests.factories import CourseModeFactory -from edx_toggles.toggles.testutils import override_waffle_flag from experiments.models import ExperimentData from lms.djangoapps.commerce.models import CommerceConfiguration from lms.djangoapps.commerce.utils import EcommerceService @@ -45,7 +45,7 @@ from openedx.core.djangoapps.django_comment_common.models import ( FORUM_ROLE_MODERATOR ) from openedx.core.djangoapps.schedules.tests.factories import ScheduleFactory -from openedx.core.djangoapps.waffle_utils.testutils import WAFFLE_TABLES, override_waffle_flag +from openedx.core.djangoapps.waffle_utils.testutils import WAFFLE_TABLES from openedx.core.djangolib.markup import HTML from openedx.features.course_duration_limits.models import CourseDurationLimitConfig from openedx.features.course_experience import ( @@ -1020,6 +1020,7 @@ class CourseHomeFragmentViewTests(ModuleStoreTestCase): mock.Mock(return_value=(HTML("DISCOUNT_PRICE"), True)) ) def test_upgrade_message_discount(self): + # pylint: disable=no-member CourseEnrollment.enroll(self.user, self.course.id, CourseMode.AUDIT) with override_waffle_flag(SHOW_UPGRADE_MSG_ON_COURSE_HOME, True): diff --git a/openedx/features/course_experience/tests/views/test_course_sock.py b/openedx/features/course_experience/tests/views/test_course_sock.py index 1ac8bd2b0a..8dd8b012a2 100644 --- a/openedx/features/course_experience/tests/views/test_course_sock.py +++ b/openedx/features/course_experience/tests/views/test_course_sock.py @@ -5,9 +5,9 @@ Tests for course verification sock import ddt import mock +from edx_toggles.toggles.testutils import override_waffle_flag from course_modes.models import CourseMode -from edx_toggles.toggles.testutils import override_waffle_flag from lms.djangoapps.commerce.models import CommerceConfiguration from openedx.core.djangolib.markup import HTML from openedx.features.course_experience import DISPLAY_COURSE_SOCK_FLAG diff --git a/openedx/features/course_experience/waffle.py b/openedx/features/course_experience/waffle.py index a00dab3a9a..3df104005f 100644 --- a/openedx/features/course_experience/waffle.py +++ b/openedx/features/course_experience/waffle.py @@ -3,7 +3,7 @@ Miscellaneous waffle switches that both LMS and Studio need to access """ -from openedx.core.djangoapps.waffle_utils import WaffleSwitchNamespace +from edx_toggles.toggles import WaffleSwitchNamespace # Namespace WAFFLE_NAMESPACE = u'course_experience' diff --git a/openedx/features/discounts/applicability.py b/openedx/features/discounts/applicability.py index 42f12d0d18..3d8536265a 100644 --- a/openedx/features/discounts/applicability.py +++ b/openedx/features/discounts/applicability.py @@ -12,16 +12,16 @@ not other discounts like coupons or enterprise/program offers configured in ecom from datetime import datetime, timedelta +import pytz from crum import get_current_request, impersonate from django.utils import timezone from django.utils.dateparse import parse_datetime -import pytz +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace from course_modes.models import CourseMode from entitlements.models import CourseEntitlement from experiments.models import ExperimentData from lms.djangoapps.experiments.stable_bucketing import stable_bucketing_hash_group -from openedx.core.djangoapps.waffle_utils import WaffleFlag, WaffleFlagNamespace from openedx.features.discounts.models import DiscountPercentageConfig, DiscountRestrictionConfig from student.models import CourseEnrollment from track import segment diff --git a/openedx/features/discounts/tests/test_applicability.py b/openedx/features/discounts/tests/test_applicability.py index 716ce212cc..7a8bdb88eb 100644 --- a/openedx/features/discounts/tests/test_applicability.py +++ b/openedx/features/discounts/tests/test_applicability.py @@ -9,12 +9,12 @@ import pytest import pytz from django.contrib.sites.models import Site from django.utils.timezone import now +from edx_toggles.toggles.testutils import override_waffle_flag from enterprise.models import EnterpriseCustomer, EnterpriseCustomerUser from mock import Mock, patch from course_modes.models import CourseMode from course_modes.tests.factories import CourseModeFactory -from edx_toggles.toggles.testutils import override_waffle_flag from entitlements.tests.factories import CourseEntitlementFactory from experiments.models import ExperimentData from openedx.core.djangoapps.content.course_overviews.models import CourseOverview diff --git a/openedx/features/enterprise_support/utils.py b/openedx/features/enterprise_support/utils.py index 5e0f3f6fc9..4acbc4d299 100644 --- a/openedx/features/enterprise_support/utils.py +++ b/openedx/features/enterprise_support/utils.py @@ -10,8 +10,9 @@ from django.conf import settings from django.urls import NoReverseMatch, reverse from django.utils.translation import ugettext as _ from edx_django_utils.cache import TieredCache, get_cache_key +from edx_toggles.toggles import WaffleFlag from enterprise.api.v1.serializers import EnterpriseCustomerBrandingConfigurationSerializer -from enterprise.models import EnterpriseCustomerUser, EnterpriseCustomer +from enterprise.models import EnterpriseCustomer, EnterpriseCustomerUser from social_django.models import UserSocialAuth import third_party_auth @@ -19,7 +20,6 @@ from lms.djangoapps.branding.api import get_privacy_url from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers from openedx.core.djangoapps.user_authn.cookies import standard_cookie_settings from openedx.core.djangolib.markup import HTML, Text -from openedx.core.djangoapps.waffle_utils import WaffleFlag from student.helpers import get_next_url_for_login_page ENTERPRISE_HEADER_LINKS = WaffleFlag('enterprise', 'enterprise_header_links', __name__) diff --git a/openedx/features/learner_profile/tests/views/test_learner_profile.py b/openedx/features/learner_profile/tests/views/test_learner_profile.py index ec97ac1450..64e841e282 100644 --- a/openedx/features/learner_profile/tests/views/test_learner_profile.py +++ b/openedx/features/learner_profile/tests/views/test_learner_profile.py @@ -10,10 +10,10 @@ from django.conf import settings from django.test import override_settings from django.test.client import RequestFactory from django.urls import reverse +from edx_toggles.toggles.testutils import override_waffle_flag from opaque_keys.edx.locator import CourseLocator from course_modes.models import CourseMode -from edx_toggles.toggles.testutils import override_waffle_flag from lms.djangoapps.certificates.api import is_passing_status from lms.djangoapps.certificates.tests.factories import GeneratedCertificateFactory from lms.envs.test import CREDENTIALS_PUBLIC_SERVICE_URL diff --git a/openedx/features/learner_profile/toggles.py b/openedx/features/learner_profile/toggles.py index 208bcb45fc..2f17298696 100644 --- a/openedx/features/learner_profile/toggles.py +++ b/openedx/features/learner_profile/toggles.py @@ -3,9 +3,8 @@ Toggles for Learner Profile page. """ +from edx_toggles.toggles import WaffleFlag, WaffleFlagNamespace from openedx.core.djangoapps.site_configuration import helpers as configuration_helpers -from openedx.core.djangoapps.waffle_utils import WaffleFlag, WaffleFlagNamespace - # Namespace for learner profile waffle flags. WAFFLE_FLAG_NAMESPACE = WaffleFlagNamespace(name='learner_profile') diff --git a/openedx/tests/completion_integration/test_models.py b/openedx/tests/completion_integration/test_models.py index ea15f4f03d..34505141ba 100644 --- a/openedx/tests/completion_integration/test_models.py +++ b/openedx/tests/completion_integration/test_models.py @@ -10,9 +10,9 @@ from django.core.exceptions import ValidationError from django.test import TestCase from opaque_keys.edx.keys import CourseKey, UsageKey from six.moves import range, zip +from student.tests.factories import CourseEnrollmentFactory, UserFactory from openedx.core.djangolib.testing.utils import skip_unless_lms -from student.tests.factories import CourseEnrollmentFactory, UserFactory SELECT = 1 UPDATE = 1