Files
edx-platform/lms/djangoapps/course_blocks/api.py
Calen Pennington 83d676cbfa Add Content Type Gating Behind Waffle Flag
Content Type Gating: Xblocks that have a graded component cannot be
accessed by audit track users.
  - Caveats:
    - In studio, instructors can set certain xblocks to be available to
      all users, but graded components will default to not being
      available for audit users
    - If a course does not have a verified mode option, all users will
      have access to graded content.

The Waffle Flag: The waffle flag is of for now.
  It's name is: ```content_type_gating.debug```

This Commit Does NOT Include: Displaying for a user WHY they do not have
access to a specific piece of content.  That change will be part of
another PR.
2018-10-31 12:34:48 -04:00

112 lines
4.2 KiB
Python

"""
API entry point to the course_blocks app with top-level
get_course_blocks function.
"""
from django.conf import settings
from openedx.core.djangoapps.content.block_structure.api import get_block_structure_manager
from openedx.core.djangoapps.content.block_structure.transformers import BlockStructureTransformers
from openedx.features.content_type_gating.block_transformers import ContentTypeGateTransformer
from openedx.features.course_duration_limits.config import CONTENT_TYPE_GATING_FLAG
from .transformers import (
library_content,
start_date,
user_partitions,
visibility,
load_override_data,
)
from .usage_info import CourseUsageInfo
INDIVIDUAL_STUDENT_OVERRIDE_PROVIDER = (
'lms.djangoapps.courseware.student_field_overrides.IndividualStudentOverrideProvider'
)
def has_individual_student_override_provider():
"""
check if FIELD_OVERRIDE_PROVIDERS has class
`lms.djangoapps.courseware.student_field_overrides.IndividualStudentOverrideProvider`
"""
return INDIVIDUAL_STUDENT_OVERRIDE_PROVIDER in getattr(settings, 'FIELD_OVERRIDE_PROVIDERS', ())
def get_course_block_access_transformers(user):
"""
Default list of transformers for manipulating course block structures
based on the user's access to the course blocks.
Arguments:
user (django.contrib.auth.models.User) - User object for
which the block structure is to be transformed.
"""
if CONTENT_TYPE_GATING_FLAG.is_enabled():
# [REV/Revisit] remove this duplicated code when flag is removed
course_block_access_transformers = [
library_content.ContentLibraryTransformer(),
start_date.StartDateTransformer(),
ContentTypeGateTransformer(),
user_partitions.UserPartitionTransformer(),
visibility.VisibilityTransformer(),
]
else:
course_block_access_transformers = [
library_content.ContentLibraryTransformer(),
start_date.StartDateTransformer(),
user_partitions.UserPartitionTransformer(),
visibility.VisibilityTransformer(),
]
if has_individual_student_override_provider():
course_block_access_transformers += [load_override_data.OverrideDataTransformer(user)]
return course_block_access_transformers
def get_course_blocks(
user,
starting_block_usage_key,
transformers=None,
collected_block_structure=None,
):
"""
A higher order function implemented on top of the
block_structure.get_blocks function returning a transformed block
structure for the given user starting at starting_block_usage_key.
Arguments:
user (django.contrib.auth.models.User) - User object for
which the block structure is to be transformed.
starting_block_usage_key (UsageKey) - Specifies the starting block
of the block structure that is to be transformed.
transformers (BlockStructureTransformers) - A collection of
transformers whose transform methods are to be called.
If None, get_course_block_access_transformers() is used.
collected_block_structure (BlockStructureBlockData) - A
block structure retrieved from a prior call to
BlockStructureManager.get_collected. Can be optionally
provided if already available, for optimization.
Returns:
BlockStructureBlockData - A transformed block structure,
starting at starting_block_usage_key, that has undergone the
transform methods for the given user and the course
associated with the block structure. If using the default
transformers, the transformed block structure will be
exactly equivalent to the blocks that the given user has
access.
"""
if not transformers:
transformers = BlockStructureTransformers(get_course_block_access_transformers(user))
transformers.usage_info = CourseUsageInfo(starting_block_usage_key.course_key, user)
return get_block_structure_manager(starting_block_usage_key.course_key).get_transformed(
transformers,
starting_block_usage_key,
collected_block_structure,
)