incr-178: ran modernize on openedx/features/content_type_gating (#20470)
* incr-178: ran modernize on openedx/features/content_type_gating * removed unused imports * ran isort on openedx/features/content_type_gating/migrations
This commit is contained in:
committed by
Michael Youngstrom
parent
7f403e8785
commit
bf47cd0cc2
@@ -3,12 +3,13 @@
|
|||||||
Django Admin pages for ContentTypeGatingConfig.
|
Django Admin pages for ContentTypeGatingConfig.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
|
|
||||||
from openedx.core.djangoapps.config_model_utils.admin import StackedConfigModelAdmin
|
from openedx.core.djangoapps.config_model_utils.admin import StackedConfigModelAdmin
|
||||||
|
|
||||||
from .models import ContentTypeGatingConfig
|
from .models import ContentTypeGatingConfig
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ Define the content_type_gating Django App.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import unicode_literals
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
from django.apps import AppConfig
|
from django.apps import AppConfig
|
||||||
|
|
||||||
|
|||||||
@@ -2,11 +2,11 @@
|
|||||||
Content Type Gate Transformer implementation.
|
Content Type Gate Transformer implementation.
|
||||||
Limits access for certain users to certain types of content.
|
Limits access for certain users to certain types of content.
|
||||||
"""
|
"""
|
||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
from openedx.core.djangoapps.content.block_structure.transformer import (
|
from openedx.core.djangoapps.content.block_structure.transformer import BlockStructureTransformer
|
||||||
BlockStructureTransformer,
|
|
||||||
)
|
|
||||||
from openedx.features.content_type_gating.helpers import CONTENT_GATING_PARTITION_ID
|
from openedx.features.content_type_gating.helpers import CONTENT_GATING_PARTITION_ID
|
||||||
from openedx.features.content_type_gating.models import ContentTypeGatingConfig
|
from openedx.features.content_type_gating.models import ContentTypeGatingConfig
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,8 @@
|
|||||||
FieldOverride that forces graded components to be only accessible to
|
FieldOverride that forces graded components to be only accessible to
|
||||||
students in the Unlocked Group of the ContentTypeGating partition.
|
students in the Unlocked Group of the ContentTypeGating partition.
|
||||||
"""
|
"""
|
||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
from lms.djangoapps.courseware.field_overrides import FieldOverrideProvider
|
from lms.djangoapps.courseware.field_overrides import FieldOverrideProvider
|
||||||
|
|||||||
@@ -1,10 +1,12 @@
|
|||||||
"""
|
"""
|
||||||
Helper functions used by both content_type_gating and course_duration_limits.
|
Helper functions used by both content_type_gating and course_duration_limits.
|
||||||
"""
|
"""
|
||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
from xmodule.partitions.partitions import Group
|
|
||||||
from course_modes.models import CourseMode
|
from course_modes.models import CourseMode
|
||||||
|
from xmodule.partitions.partitions import Group
|
||||||
|
|
||||||
# Studio generates partition IDs starting at 100. There is already a manually generated
|
# Studio generates partition IDs starting at 100. There is already a manually generated
|
||||||
# partition for Enrollment Track that uses ID 50, so we'll use 51.
|
# partition for Enrollment Track that uses ID 50, so we'll use 51.
|
||||||
|
|||||||
@@ -1,10 +1,10 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Generated by Django 1.11.16 on 2018-11-08 19:43
|
# Generated by Django 1.11.16 on 2018-11-08 19:43
|
||||||
from __future__ import unicode_literals
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
|
import django.db.models.deletion
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
import django.db.models.deletion
|
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Generated by Django 1.11.16 on 2018-11-19 14:59
|
# Generated by Django 1.11.16 on 2018-11-19 14:59
|
||||||
from __future__ import unicode_literals
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Generated by Django 1.11.16 on 2018-11-28 19:07
|
# Generated by Django 1.11.16 on 2018-11-28 19:07
|
||||||
from __future__ import unicode_literals
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Generated by Django 1.11.16 on 2018-11-28 20:21
|
# Generated by Django 1.11.16 on 2018-11-28 20:21
|
||||||
from __future__ import unicode_literals
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Generated by Django 1.11.20 on 2019-03-06 15:47
|
# Generated by Django 1.11.20 on 2019-03-06 15:47
|
||||||
from __future__ import unicode_literals
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Generated by Django 1.11.20 on 2019-03-08 14:47
|
# Generated by Django 1.11.20 on 2019-03-08 14:47
|
||||||
from __future__ import unicode_literals
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Generated by Django 1.11.20 on 2019-03-11 19:19
|
# Generated by Django 1.11.20 on 2019-03-11 19:19
|
||||||
from __future__ import unicode_literals
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
from django.db import migrations, models
|
|
||||||
import django.db.models.deletion
|
import django.db.models.deletion
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
class Migration(migrations.Migration):
|
class Migration(migrations.Migration):
|
||||||
|
|||||||
@@ -1,8 +1,9 @@
|
|||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
# Generated by Django 1.11.20 on 2019-03-13 16:34
|
# Generated by Django 1.11.20 on 2019-03-13 16:34
|
||||||
from __future__ import unicode_literals
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
from django.db import migrations, models
|
from django.db import migrations, models
|
||||||
|
|
||||||
import openedx.core.djangoapps.config_model_utils.models
|
import openedx.core.djangoapps.config_model_utils.models
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -3,20 +3,20 @@ Content Type Gating Configuration Models
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# -*- coding: utf-8 -*-
|
# -*- coding: utf-8 -*-
|
||||||
from __future__ import unicode_literals
|
from __future__ import absolute_import, unicode_literals
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.core.exceptions import ValidationError
|
from django.core.exceptions import ValidationError
|
||||||
from django.db import models
|
from django.db import models
|
||||||
|
from django.utils import timezone
|
||||||
from django.utils.encoding import python_2_unicode_compatible
|
from django.utils.encoding import python_2_unicode_compatible
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.utils import timezone
|
|
||||||
|
|
||||||
from course_modes.models import CourseMode
|
from course_modes.models import CourseMode
|
||||||
from lms.djangoapps.courseware.masquerade import (
|
from lms.djangoapps.courseware.masquerade import (
|
||||||
get_course_masquerade,
|
get_course_masquerade,
|
||||||
get_masquerading_user_group,
|
get_masquerading_user_group,
|
||||||
is_masquerading_as_specific_student,
|
is_masquerading_as_specific_student
|
||||||
)
|
)
|
||||||
from openedx.core.djangoapps.config_model_utils.models import StackedConfigurationModel
|
from openedx.core.djangoapps.config_model_utils.models import StackedConfigurationModel
|
||||||
from openedx.core.djangoapps.config_model_utils.utils import is_in_holdback
|
from openedx.core.djangoapps.config_model_utils.utils import is_in_holdback
|
||||||
|
|||||||
@@ -5,21 +5,22 @@ These are used together to allow course content to be blocked for a subset
|
|||||||
of audit learners.
|
of audit learners.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
|
|
||||||
import crum
|
import crum
|
||||||
from django.apps import apps
|
import six
|
||||||
from django.conf import settings
|
|
||||||
from django.template.loader import render_to_string
|
from django.template.loader import render_to_string
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from web_fragments.fragment import Fragment
|
from web_fragments.fragment import Fragment
|
||||||
|
|
||||||
from course_modes.models import CourseMode
|
from course_modes.models import CourseMode
|
||||||
from lms.djangoapps.commerce.utils import EcommerceService
|
from lms.djangoapps.commerce.utils import EcommerceService
|
||||||
from xmodule.partitions.partitions import UserPartition, UserPartitionError, ENROLLMENT_TRACK_PARTITION_ID
|
|
||||||
from openedx.core.lib.mobile_utils import is_request_from_mobile_app
|
from openedx.core.lib.mobile_utils import is_request_from_mobile_app
|
||||||
from openedx.features.content_type_gating.models import ContentTypeGatingConfig
|
|
||||||
from openedx.features.content_type_gating.helpers import CONTENT_GATING_PARTITION_ID, FULL_ACCESS, LIMITED_ACCESS
|
from openedx.features.content_type_gating.helpers import CONTENT_GATING_PARTITION_ID, FULL_ACCESS, LIMITED_ACCESS
|
||||||
|
from openedx.features.content_type_gating.models import ContentTypeGatingConfig
|
||||||
|
from xmodule.partitions.partitions import UserPartition, UserPartitionError
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
LOG = logging.getLogger(__name__)
|
||||||
|
|
||||||
@@ -55,7 +56,7 @@ def create_content_gating_partition(course):
|
|||||||
CONTENT_TYPE_GATING_SCHEME,
|
CONTENT_TYPE_GATING_SCHEME,
|
||||||
CONTENT_GATING_PARTITION_ID,
|
CONTENT_GATING_PARTITION_ID,
|
||||||
_get_partition_from_id(course.user_partitions, CONTENT_GATING_PARTITION_ID).name,
|
_get_partition_from_id(course.user_partitions, CONTENT_GATING_PARTITION_ID).name,
|
||||||
unicode(course.id),
|
six.text_type(course.id),
|
||||||
)
|
)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@@ -63,7 +64,7 @@ def create_content_gating_partition(course):
|
|||||||
id=CONTENT_GATING_PARTITION_ID,
|
id=CONTENT_GATING_PARTITION_ID,
|
||||||
name=_(u"Feature-based Enrollments"),
|
name=_(u"Feature-based Enrollments"),
|
||||||
description=_(u"Partition for segmenting users by access to gated content types"),
|
description=_(u"Partition for segmenting users by access to gated content types"),
|
||||||
parameters={"course_id": unicode(course.id)}
|
parameters={"course_id": six.text_type(course.id)}
|
||||||
)
|
)
|
||||||
return partition
|
return partition
|
||||||
|
|
||||||
@@ -157,8 +158,8 @@ class ContentTypeGatingPartitionScheme(object):
|
|||||||
"""
|
"""
|
||||||
return ContentTypeGatingPartition(
|
return ContentTypeGatingPartition(
|
||||||
id,
|
id,
|
||||||
unicode(name),
|
six.text_type(name),
|
||||||
unicode(description),
|
six.text_type(description),
|
||||||
[
|
[
|
||||||
LIMITED_ACCESS,
|
LIMITED_ACCESS,
|
||||||
FULL_ACCESS,
|
FULL_ACCESS,
|
||||||
|
|||||||
@@ -1,9 +1,13 @@
|
|||||||
"""
|
"""
|
||||||
Test audit user's access to various content based on content-gating features.
|
Test audit user's access to various content based on content-gating features.
|
||||||
"""
|
"""
|
||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
import json
|
import json
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
import ddt
|
import ddt
|
||||||
|
import six
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.test.client import RequestFactory
|
from django.test.client import RequestFactory
|
||||||
from django.test.utils import override_settings
|
from django.test.utils import override_settings
|
||||||
@@ -12,47 +16,38 @@ from django.utils import timezone
|
|||||||
from mock import patch
|
from mock import patch
|
||||||
|
|
||||||
from course_api.blocks.api import get_blocks
|
from course_api.blocks.api import get_blocks
|
||||||
from lms.djangoapps.discussion.django_comment_client.tests.factories import RoleFactory
|
|
||||||
from course_modes.tests.factories import CourseModeFactory
|
from course_modes.tests.factories import CourseModeFactory
|
||||||
from experiments.models import ExperimentData, 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
|
from lms.djangoapps.courseware.module_render import load_single_xblock
|
||||||
from lms.djangoapps.courseware.tests.factories import (
|
from lms.djangoapps.courseware.tests.factories import (
|
||||||
InstructorFactory,
|
|
||||||
StaffFactory,
|
|
||||||
BetaTesterFactory,
|
BetaTesterFactory,
|
||||||
OrgStaffFactory,
|
|
||||||
OrgInstructorFactory,
|
|
||||||
GlobalStaffFactory,
|
GlobalStaffFactory,
|
||||||
|
InstructorFactory,
|
||||||
|
OrgInstructorFactory,
|
||||||
|
OrgStaffFactory,
|
||||||
|
StaffFactory
|
||||||
)
|
)
|
||||||
|
from lms.djangoapps.discussion.django_comment_client.tests.factories import RoleFactory
|
||||||
from openedx.core.djangoapps.django_comment_common.models import (
|
from openedx.core.djangoapps.django_comment_common.models import (
|
||||||
FORUM_ROLE_ADMINISTRATOR,
|
FORUM_ROLE_ADMINISTRATOR,
|
||||||
FORUM_ROLE_MODERATOR,
|
|
||||||
FORUM_ROLE_GROUP_MODERATOR,
|
|
||||||
FORUM_ROLE_COMMUNITY_TA,
|
FORUM_ROLE_COMMUNITY_TA,
|
||||||
|
FORUM_ROLE_GROUP_MODERATOR,
|
||||||
|
FORUM_ROLE_MODERATOR,
|
||||||
Role
|
Role
|
||||||
)
|
)
|
||||||
from openedx.core.djangoapps.user_api.tests.factories import UserCourseTagFactory
|
from openedx.core.djangoapps.user_api.tests.factories import UserCourseTagFactory
|
||||||
from openedx.core.djangoapps.util.testing import TestConditionalContent
|
from openedx.core.djangoapps.util.testing import TestConditionalContent
|
||||||
from openedx.core.lib.url_utils import quote_slashes
|
from openedx.core.lib.url_utils import quote_slashes
|
||||||
from openedx.features.content_type_gating.helpers import CONTENT_GATING_PARTITION_ID, CONTENT_TYPE_GATE_GROUP_IDS
|
from openedx.features.content_type_gating.helpers import CONTENT_GATING_PARTITION_ID, CONTENT_TYPE_GATE_GROUP_IDS
|
||||||
from openedx.features.content_type_gating.partitions import ContentTypeGatingPartition
|
|
||||||
from openedx.features.content_type_gating.models import ContentTypeGatingConfig
|
from openedx.features.content_type_gating.models import ContentTypeGatingConfig
|
||||||
from openedx.features.course_duration_limits.config import (
|
from openedx.features.content_type_gating.partitions import ContentTypeGatingPartition
|
||||||
EXPERIMENT_DATA_HOLDBACK_KEY,
|
from openedx.features.course_duration_limits.config import EXPERIMENT_DATA_HOLDBACK_KEY, EXPERIMENT_ID
|
||||||
EXPERIMENT_ID,
|
|
||||||
)
|
|
||||||
from student.models import CourseEnrollment
|
from student.models import CourseEnrollment
|
||||||
from student.roles import CourseInstructorRole
|
from student.roles import CourseInstructorRole
|
||||||
from student.tests.factories import (
|
from student.tests.factories import TEST_PASSWORD, CourseEnrollmentFactory, UserFactory
|
||||||
CourseEnrollmentFactory,
|
|
||||||
UserFactory,
|
|
||||||
TEST_PASSWORD
|
|
||||||
)
|
|
||||||
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase
|
from xmodule.modulestore.tests.django_utils import ModuleStoreTestCase, SharedModuleStoreTestCase
|
||||||
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
|
from xmodule.modulestore.tests.factories import CourseFactory, ItemFactory
|
||||||
|
from xmodule.partitions.partitions import ENROLLMENT_TRACK_PARTITION_ID
|
||||||
|
|
||||||
METADATA = {
|
METADATA = {
|
||||||
'group_access': {
|
'group_access': {
|
||||||
@@ -77,8 +72,8 @@ def _get_fragment_from_block(block, user_id, course, request_factory, mock_get_c
|
|||||||
vertical_xblock = load_single_xblock(
|
vertical_xblock = load_single_xblock(
|
||||||
request=fake_request,
|
request=fake_request,
|
||||||
user_id=user_id,
|
user_id=user_id,
|
||||||
course_id=unicode(course.id),
|
course_id=six.text_type(course.id),
|
||||||
usage_key_string=unicode(course.scope_ids.usage_id),
|
usage_key_string=six.text_type(course.scope_ids.usage_id),
|
||||||
course=course
|
course=course
|
||||||
)
|
)
|
||||||
runtime = vertical_xblock.runtime
|
runtime = vertical_xblock.runtime
|
||||||
@@ -476,8 +471,8 @@ class TestProblemTypeAccess(SharedModuleStoreTestCase):
|
|||||||
url = reverse(
|
url = reverse(
|
||||||
'xblock_handler',
|
'xblock_handler',
|
||||||
kwargs={
|
kwargs={
|
||||||
'course_id': unicode(self.course.id),
|
'course_id': six.text_type(self.course.id),
|
||||||
'usage_id': quote_slashes(unicode(problem_location)),
|
'usage_id': quote_slashes(six.text_type(problem_location)),
|
||||||
'handler': 'xmodule_handler',
|
'handler': 'xmodule_handler',
|
||||||
'suffix': 'problem_show',
|
'suffix': 'problem_show',
|
||||||
}
|
}
|
||||||
@@ -594,7 +589,7 @@ class TestProblemTypeAccess(SharedModuleStoreTestCase):
|
|||||||
self.update_masquerade(**masquerade_config)
|
self.update_masquerade(**masquerade_config)
|
||||||
|
|
||||||
block = self.blocks_dict['problem']
|
block = self.blocks_dict['problem']
|
||||||
block_view_url = reverse('render_xblock', kwargs={'usage_key_string': unicode(block.scope_ids.usage_id)})
|
block_view_url = reverse('render_xblock', kwargs={'usage_key_string': six.text_type(block.scope_ids.usage_id)})
|
||||||
response = self.client.get(block_view_url)
|
response = self.client.get(block_view_url)
|
||||||
if is_gated:
|
if is_gated:
|
||||||
self.assertEquals(response.status_code, 404)
|
self.assertEquals(response.status_code, 404)
|
||||||
@@ -608,7 +603,7 @@ class TestProblemTypeAccess(SharedModuleStoreTestCase):
|
|||||||
masquerade_url = reverse(
|
masquerade_url = reverse(
|
||||||
'masquerade_update',
|
'masquerade_update',
|
||||||
kwargs={
|
kwargs={
|
||||||
'course_key_string': unicode(self.course.id),
|
'course_key_string': six.text_type(self.course.id),
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
response = self.client.post(
|
response = self.client.post(
|
||||||
@@ -654,7 +649,7 @@ class TestProblemTypeAccess(SharedModuleStoreTestCase):
|
|||||||
self.update_masquerade(username=user.username)
|
self.update_masquerade(username=user.username)
|
||||||
|
|
||||||
block = self.blocks_dict['problem']
|
block = self.blocks_dict['problem']
|
||||||
block_view_url = reverse('render_xblock', kwargs={'usage_key_string': unicode(block.scope_ids.usage_id)})
|
block_view_url = reverse('render_xblock', kwargs={'usage_key_string': six.text_type(block.scope_ids.usage_id)})
|
||||||
response = self.client.get(block_view_url)
|
response = self.client.get(block_view_url)
|
||||||
self.assertEquals(response.status_code, 200)
|
self.assertEquals(response.status_code, 200)
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,13 @@
|
|||||||
from datetime import timedelta, datetime
|
from __future__ import absolute_import
|
||||||
|
|
||||||
import itertools
|
import itertools
|
||||||
|
from datetime import datetime, timedelta
|
||||||
|
|
||||||
import ddt
|
import ddt
|
||||||
from django.utils import timezone
|
|
||||||
from mock import Mock
|
|
||||||
import pytz
|
import pytz
|
||||||
|
from django.utils import timezone
|
||||||
from edx_django_utils.cache import RequestCache
|
from edx_django_utils.cache import RequestCache
|
||||||
|
from mock import Mock
|
||||||
from opaque_keys.edx.locator import CourseLocator
|
from opaque_keys.edx.locator import CourseLocator
|
||||||
|
|
||||||
from course_modes.tests.factories import CourseModeFactory
|
from course_modes.tests.factories import CourseModeFactory
|
||||||
|
|||||||
@@ -1,20 +1,20 @@
|
|||||||
|
from __future__ import absolute_import
|
||||||
|
|
||||||
from datetime import datetime
|
from datetime import datetime
|
||||||
from mock import Mock, patch
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.test import RequestFactory
|
from django.test import RequestFactory
|
||||||
|
from mock import Mock, patch
|
||||||
|
from opaque_keys.edx.keys import CourseKey
|
||||||
|
|
||||||
from course_modes.tests.factories import CourseModeFactory
|
from course_modes.tests.factories import CourseModeFactory
|
||||||
from lms.djangoapps.courseware.tests.factories import GlobalStaffFactory
|
from lms.djangoapps.courseware.tests.factories import GlobalStaffFactory
|
||||||
from opaque_keys.edx.keys import CourseKey
|
|
||||||
from openedx.core.djangolib.testing.utils import CacheIsolationTestCase
|
from openedx.core.djangolib.testing.utils import CacheIsolationTestCase
|
||||||
from openedx.features.content_type_gating.helpers import CONTENT_GATING_PARTITION_ID, FULL_ACCESS, LIMITED_ACCESS
|
from openedx.features.content_type_gating.helpers import CONTENT_GATING_PARTITION_ID, FULL_ACCESS, LIMITED_ACCESS
|
||||||
from openedx.features.content_type_gating.partitions import (
|
|
||||||
create_content_gating_partition,
|
|
||||||
ContentTypeGatingPartition
|
|
||||||
)
|
|
||||||
from openedx.features.content_type_gating.models import ContentTypeGatingConfig
|
from openedx.features.content_type_gating.models import ContentTypeGatingConfig
|
||||||
|
from openedx.features.content_type_gating.partitions import ContentTypeGatingPartition, create_content_gating_partition
|
||||||
from student.tests.factories import GroupFactory
|
from student.tests.factories import GroupFactory
|
||||||
from xmodule.partitions.partitions import UserPartitionError, ENROLLMENT_TRACK_PARTITION_ID
|
from xmodule.partitions.partitions import ENROLLMENT_TRACK_PARTITION_ID, UserPartitionError
|
||||||
|
|
||||||
|
|
||||||
class TestContentTypeGatingPartition(CacheIsolationTestCase):
|
class TestContentTypeGatingPartition(CacheIsolationTestCase):
|
||||||
|
|||||||
Reference in New Issue
Block a user