refactor: inheritable authoring mixin callbacks for editing & duplication (#33756)
This commit is contained in:
committed by
GitHub
parent
238dca732e
commit
78b691b56a
@@ -13,6 +13,7 @@ from django.views.decorators.http import require_http_methods
|
||||
from opaque_keys.edx.keys import CourseKey
|
||||
from web_fragments.fragment import Fragment
|
||||
|
||||
from cms.djangoapps.contentstore.utils import load_services_for_studio
|
||||
from cms.lib.xblock.authoring_mixin import VISIBILITY_VIEW
|
||||
from common.djangoapps.edxmako.shortcuts import render_to_string
|
||||
from common.djangoapps.student.auth import (
|
||||
@@ -47,7 +48,6 @@ from .preview import get_preview_fragment
|
||||
from cms.djangoapps.contentstore.xblock_storage_handlers.view_handlers import (
|
||||
handle_xblock,
|
||||
create_xblock_info,
|
||||
load_services_for_studio,
|
||||
get_block_info,
|
||||
get_xblock,
|
||||
delete_orphans,
|
||||
|
||||
@@ -45,7 +45,7 @@ from openedx.core.lib.xblock_utils import (
|
||||
wrap_xblock_aside
|
||||
)
|
||||
|
||||
from ..utils import get_visibility_partition_info, StudioPermissionsService
|
||||
from ..utils import StudioPermissionsService, get_visibility_partition_info
|
||||
from .access import get_user_role
|
||||
from .session_kv_store import SessionKeyValueStore
|
||||
|
||||
|
||||
@@ -305,13 +305,10 @@ def _update_with_callback(xblock, user, old_metadata=None, old_content=None):
|
||||
old_metadata = own_metadata(xblock)
|
||||
if old_content is None:
|
||||
old_content = xblock.get_explicitly_set_fields_by_scope(Scope.content)
|
||||
if hasattr(xblock, "editor_saved"):
|
||||
load_services_for_studio(xblock.runtime, user)
|
||||
xblock.editor_saved(user, old_metadata, old_content)
|
||||
load_services_for_studio(xblock.runtime, user)
|
||||
xblock.editor_saved(user, old_metadata, old_content)
|
||||
xblock_updated = modulestore().update_item(xblock, user.id)
|
||||
if hasattr(xblock_updated, "post_editor_saved"):
|
||||
load_services_for_studio(xblock_updated.runtime, user)
|
||||
xblock_updated.post_editor_saved(user, old_metadata, old_content)
|
||||
xblock_updated.post_editor_saved(user, old_metadata, old_content)
|
||||
return xblock_updated
|
||||
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ from web_fragments.fragment import Fragment
|
||||
from xblock.core import XBlock, XBlockMixin
|
||||
from xblock.fields import String, Scope
|
||||
|
||||
|
||||
log = logging.getLogger(__name__)
|
||||
|
||||
VISIBILITY_VIEW = 'visibility_view'
|
||||
@@ -21,6 +22,7 @@ class AuthoringMixin(XBlockMixin):
|
||||
"""
|
||||
Mixin class that provides authoring capabilities for XBlocks.
|
||||
"""
|
||||
|
||||
def _get_studio_resource_url(self, relative_url):
|
||||
"""
|
||||
Returns the Studio URL to a static resource.
|
||||
@@ -51,3 +53,17 @@ class AuthoringMixin(XBlockMixin):
|
||||
scope=Scope.settings,
|
||||
enforce_type=True,
|
||||
)
|
||||
|
||||
def editor_saved(self, user, old_metadata, old_content) -> None: # pylint: disable=unused-argument
|
||||
"""
|
||||
Called right *before* the block is written to the DB. Can be used, e.g., to modify fields before saving.
|
||||
|
||||
By default, is a no-op. Can be overriden in subclasses.
|
||||
"""
|
||||
|
||||
def post_editor_saved(self, user, old_metadata, old_content) -> None: # pylint: disable=unused-argument
|
||||
"""
|
||||
Called right *after* the block is written to the DB. Can be used, e.g., to spin up followup tasks.
|
||||
|
||||
By default, is a no-op. Can be overriden in subclasses.
|
||||
"""
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
Mixin to support editing in Studio.
|
||||
"""
|
||||
from xblock.core import XBlock, XBlockMixin
|
||||
|
||||
from xmodule.x_module import AUTHOR_VIEW, STUDENT_VIEW
|
||||
|
||||
|
||||
@@ -12,6 +13,7 @@ class StudioEditableBlock(XBlockMixin):
|
||||
|
||||
This class is only intended to be used with an XBlock!
|
||||
"""
|
||||
|
||||
has_author_view = True
|
||||
|
||||
def render_children(self, context, fragment, can_reorder=False, can_add=False):
|
||||
@@ -49,47 +51,6 @@ class StudioEditableBlock(XBlockMixin):
|
||||
"""
|
||||
return AUTHOR_VIEW if has_author_view(block) else STUDENT_VIEW
|
||||
|
||||
# Some parts of the code use getattr to dynamically check for the following methods on subclasses.
|
||||
# We'd like to refactor so that we can actually declare them here as overridable methods.
|
||||
# For now, we leave them here as documentation.
|
||||
# See https://github.com/openedx/edx-platform/issues/33715.
|
||||
#
|
||||
# def editor_saved(self, old_metadata, old_content) -> None: # pylint: disable=unused-argument
|
||||
# """
|
||||
# Called right *before* the block is written to the DB. Can be used, e.g., to modify fields before saving.
|
||||
#
|
||||
# By default, is a no-op. Can be overriden in subclasses.
|
||||
# """
|
||||
#
|
||||
# def post_editor_saved(self, old_metadata, old_content) -> None: # pylint: disable=unused-argument
|
||||
# """
|
||||
# Called right *after* the block is written to the DB. Can be used, e.g., to spin up followup tasks.
|
||||
#
|
||||
# By default, is a no-op. Can be overriden in subclasses.
|
||||
# """
|
||||
#
|
||||
# def studio_post_duplicate(self, store, source_block) -> bool: # pylint: disable=unused-argument
|
||||
# """
|
||||
# Called when a the block is duplicated. Can be used, e.g., for special handling of child duplication.
|
||||
#
|
||||
# Returns 'True' if children have been handled and thus shouldn't be handled by the standard
|
||||
# duplication logic.
|
||||
#
|
||||
# By default, is a no-op. Can be overriden in subclasses.
|
||||
# """
|
||||
# return False
|
||||
#
|
||||
# def studio_post_paste(self, store, source_node) -> bool: # pylint: disable=unused-argument
|
||||
# """
|
||||
# Called after a block is copy-pasted. Can be used, e.g., for special handling of child duplication.
|
||||
#
|
||||
# Returns 'True' if children have been handled and thus shouldn't be handled by the standard
|
||||
# duplication logic.
|
||||
#
|
||||
# By default, is a no-op. Can be overriden in subclasses.
|
||||
# """
|
||||
# return False
|
||||
|
||||
|
||||
def has_author_view(block):
|
||||
"""
|
||||
|
||||
Reference in New Issue
Block a user