本文整理汇总了Python中xblock.runtime.Mixologist类的典型用法代码示例。如果您正苦于以下问题:Python Mixologist类的具体用法?Python Mixologist怎么用?Python Mixologist使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了Mixologist类的19个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于我们的系统推荐出更棒的Python代码示例。
示例1: _load_mixed_class
def _load_mixed_class(category):
"""
Load an XBlock by category name, and apply all defined mixins
"""
component_class = XBlock.load_class(category, select=settings.XBLOCK_SELECT_FUNCTION)
mixologist = Mixologist(settings.XBLOCK_MIXINS)
return mixologist.mix(component_class)
开发者ID:PaoloC68,项目名称:edx-platform,代码行数:7,代码来源:component.py
示例2: load_mixed_class
def load_mixed_class(category):
"""
Load an XBlock by category name, and apply all defined mixins
"""
component_class = XModuleDescriptor.load_class(category)
mixologist = Mixologist(settings.XBLOCK_MIXINS)
return mixologist.mix(component_class)
开发者ID:SJinLee,项目名称:edx-platform,代码行数:7,代码来源:component.py
示例3: test_multiply_mixed
def test_multiply_mixed(self):
mixalot = Mixologist([ThirdMixin, FirstMixin])
pre_mixed = mixalot.mix(self.mixologist.mix(FieldTester))
post_mixed = self.mixologist.mix(mixalot.mix(FieldTester))
assert pre_mixed.fields['field'] is FirstMixin.field
assert post_mixed.fields['field'] is ThirdMixin.field
assert FieldTester is pre_mixed.unmixed_class
assert FieldTester is post_mixed.unmixed_class
assert len(pre_mixed.__bases__) == 4 # 1 for the original class + 3 mixin classes
assert len(post_mixed.__bases__) == 4
开发者ID:edx,项目名称:XBlock,代码行数:14,代码来源:test_runtime.py
示例4: test_multiply_mixed
def test_multiply_mixed(self):
mixalot = Mixologist([ThirdMixin, FirstMixin])
pre_mixed = mixalot.mix(self.mixologist.mix(FieldTester))
post_mixed = self.mixologist.mix(mixalot.mix(FieldTester))
assert_is(pre_mixed.fields['field'], FirstMixin.field)
assert_is(post_mixed.fields['field'], ThirdMixin.field)
assert_is(FieldTester, pre_mixed.unmixed_class)
assert_is(FieldTester, post_mixed.unmixed_class)
assert_equals(4, len(pre_mixed.__bases__)) # 1 for the original class + 3 mixin classes
assert_equals(4, len(post_mixed.__bases__))
开发者ID:Maqlan,项目名称:XBlock,代码行数:14,代码来源:test_runtime.py
示例5: __init__
def __init__(self, contentstore, **kwargs):
super(ModuleStoreWriteBase, self).__init__(contentstore=contentstore, **kwargs)
# TODO: Don't have a runtime just to generate the appropriate mixin classes (cpennington)
# This is only used by partition_fields_by_scope, which is only needed because
# the split mongo store is used for item creation as well as item persistence
self.mixologist = Mixologist(self.xblock_mixins)
开发者ID:AsylumCorp,项目名称:edx-platform,代码行数:7,代码来源:__init__.py
示例6: ModuleStoreWriteBase
class ModuleStoreWriteBase(ModuleStoreReadBase, ModuleStoreWrite):
'''
Implement interface functionality that can be shared.
'''
def __init__(self, **kwargs):
super(ModuleStoreWriteBase, self).__init__(**kwargs)
# TODO: Don't have a runtime just to generate the appropriate mixin classes (cpennington)
# This is only used by partition_fields_by_scope, which is only needed because
# the split mongo store is used for item creation as well as item persistence
self.mixologist = Mixologist(self.xblock_mixins)
def partition_fields_by_scope(self, category, fields):
"""
Return dictionary of {scope: {field1: val, ..}..} for the fields of this potential xblock
:param category: the xblock category
:param fields: the dictionary of {fieldname: value}
"""
if fields is None:
return {}
cls = self.mixologist.mix(XBlock.load_class(category, select=prefer_xmodules))
result = collections.defaultdict(dict)
for field_name, value in fields.iteritems():
field = getattr(cls, field_name)
result[field.scope][field_name] = value
return result
开发者ID:BeiLuoShiMen,项目名称:edx-platform,代码行数:26,代码来源:__init__.py
示例7: TestMixologist
class TestMixologist(object):
"""Test that the Mixologist class behaves correctly."""
def setUp(self):
self.mixologist = Mixologist([FirstMixin, SecondMixin])
# Test that the classes generated by the mixologist are cached
# (and only generated once)
def test_only_generate_classes_once(self):
assert_is(
self.mixologist.mix(FieldTester),
self.mixologist.mix(FieldTester),
)
assert_is_not(
self.mixologist.mix(FieldTester),
self.mixologist.mix(TestXBlock),
)
# Test that mixins are applied in order
def test_mixin_order(self):
assert_is(1, self.mixologist.mix(FieldTester).number)
assert_is(1, self.mixologist.mix(FieldTester).fields['field'].default)
def test_unmixed_class(self):
assert_is(FieldTester, self.mixologist.mix(FieldTester).unmixed_class)
def test_mixin_fields(self):
assert_is(FirstMixin.fields['field'], FirstMixin.field)
def test_mixed_fields(self):
mixed = self.mixologist.mix(FieldTester)
assert_is(mixed.fields['field'], FirstMixin.field)
assert_is(mixed.fields['field_a'], FieldTester.field_a)
开发者ID:qvin,项目名称:XBlock,代码行数:33,代码来源:test_runtime.py
示例8: ModuleStoreWriteBase
class ModuleStoreWriteBase(ModuleStoreReadBase, ModuleStoreWrite):
'''
Implement interface functionality that can be shared.
'''
def __init__(self, **kwargs):
super(ModuleStoreWriteBase, self).__init__(**kwargs)
# TODO: Don't have a runtime just to generate the appropriate mixin classes (cpennington)
# This is only used by partition_fields_by_scope, which is only needed because
# the split mongo store is used for item creation as well as item persistence
self.mixologist = Mixologist(self.xblock_mixins)
def partition_fields_by_scope(self, category, fields):
"""
Return dictionary of {scope: {field1: val, ..}..} for the fields of this potential xblock
:param category: the xblock category
:param fields: the dictionary of {fieldname: value}
"""
if fields is None:
return {}
cls = self.mixologist.mix(XBlock.load_class(category, select=prefer_xmodules))
result = collections.defaultdict(dict)
for field_name, value in fields.iteritems():
field = getattr(cls, field_name)
result[field.scope][field_name] = value
return result
def update_item(self, xblock, user_id=None, allow_not_found=False, force=False):
"""
Update the given xblock's persisted repr. Pass the user's unique id which the persistent store
should save with the update if it has that ability.
:param allow_not_found: whether this method should raise an exception if the given xblock
has not been persisted before.
:param force: fork the structure and don't update the course draftVersion if there's a version
conflict (only applicable to version tracking and conflict detecting persistence stores)
:raises VersionConflictError: if org, offering, and version_guid given and the current
version head != version_guid and force is not True. (only applicable to version tracking stores)
"""
raise NotImplementedError
def delete_item(self, location, user_id=None, delete_all_versions=False, delete_children=False, force=False):
"""
Delete an item from persistence. Pass the user's unique id which the persistent store
should save with the update if it has that ability.
:param delete_all_versions: removes both the draft and published version of this item from
the course if using draft and old mongo. Split may or may not implement this.
:param force: fork the structure and don't update the course draftVersion if there's a version
conflict (only applicable to version tracking and conflict detecting persistence stores)
:raises VersionConflictError: if org, offering, and version_guid given and the current
version head != version_guid and force is not True. (only applicable to version tracking stores)
"""
raise NotImplementedError
开发者ID:OmarIthawi,项目名称:edraak,代码行数:56,代码来源:__init__.py
示例9: ModuleStoreWriteBase
class ModuleStoreWriteBase(ModuleStoreReadBase, ModuleStoreWrite):
'''
Implement interface functionality that can be shared.
'''
def __init__(self, contentstore, **kwargs):
super(ModuleStoreWriteBase, self).__init__(contentstore=contentstore, **kwargs)
# TODO: Don't have a runtime just to generate the appropriate mixin classes (cpennington)
# This is only used by partition_fields_by_scope, which is only needed because
# the split mongo store is used for item creation as well as item persistence
self.mixologist = Mixologist(self.xblock_mixins)
def partition_fields_by_scope(self, category, fields):
"""
Return dictionary of {scope: {field1: val, ..}..} for the fields of this potential xblock
:param category: the xblock category
:param fields: the dictionary of {fieldname: value}
"""
result = collections.defaultdict(dict)
if fields is None:
return result
cls = self.mixologist.mix(XBlock.load_class(category, select=prefer_xmodules))
for field_name, value in fields.iteritems():
field = getattr(cls, field_name)
result[field.scope][field_name] = value
return result
def create_course(self, org, course, run, user_id, fields=None, runtime=None, **kwargs):
"""
Creates any necessary other things for the course as a side effect and doesn't return
anything useful. The real subclass should call this before it returns the course.
"""
# clone a default 'about' overview module as well
about_location = self.make_course_key(org, course, run).make_usage_key('about', 'overview')
about_descriptor = XBlock.load_class('about')
overview_template = about_descriptor.get_template('overview.yaml')
self.create_item(
user_id,
about_location.course_key,
about_location.block_type,
block_id=about_location.block_id,
definition_data={'data': overview_template.get('data')},
metadata=overview_template.get('metadata'),
runtime=runtime,
continue_version=True,
)
def clone_course(self, source_course_id, dest_course_id, user_id, fields=None, **kwargs):
"""
This base method just copies the assets. The lower level impls must do the actual cloning of
content.
"""
# copy the assets
if self.contentstore:
self.contentstore.copy_all_course_assets(source_course_id, dest_course_id)
return dest_course_id
def delete_course(self, course_key, user_id, **kwargs):
"""
This base method just deletes the assets. The lower level impls must do the actual deleting of
content.
"""
# delete the assets
if self.contentstore:
self.contentstore.delete_all_course_assets(course_key)
super(ModuleStoreWriteBase, self).delete_course(course_key, user_id)
def _drop_database(self):
"""
A destructive operation to drop the underlying database and close all connections.
Intended to be used by test code for cleanup.
"""
if self.contentstore:
self.contentstore._drop_database() # pylint: disable=protected-access
super(ModuleStoreWriteBase, self)._drop_database() # pylint: disable=protected-access
def create_child(self, user_id, parent_usage_key, block_type, block_id=None, fields=None, **kwargs):
"""
Creates and saves a new xblock that as a child of the specified block
Returns the newly created item.
Args:
user_id: ID of the user creating and saving the xmodule
parent_usage_key: a :class:`~opaque_key.edx.UsageKey` identifing the
block that this item should be parented under
block_type: The type of block to create
block_id: a unique identifier for the new item. If not supplied,
a new identifier will be generated
fields (dict): A dictionary specifying initial values for some or all fields
in the newly created block
"""
item = self.create_item(user_id, parent_usage_key.course_key, block_type, block_id=block_id, fields=fields, **kwargs)
parent = self.get_item(parent_usage_key)
parent.children.append(item.location)
self.update_item(parent, user_id)
开发者ID:SPECUSA,项目名称:edx-platform,代码行数:98,代码来源:__init__.py
示例10: setup_method
def setup_method(self):
"""
Setup for each test method in this class.
"""
self.mixologist = Mixologist([FirstMixin, SecondMixin]) # pylint: disable=attribute-defined-outside-init
开发者ID:edx,项目名称:XBlock,代码行数:5,代码来源:test_runtime.py
示例11: setUp
def setUp(self):
self.mixologist = Mixologist([FirstMixin, SecondMixin])
开发者ID:Maqlan,项目名称:XBlock,代码行数:2,代码来源:test_runtime.py
示例12: TestMixologist
class TestMixologist(object):
"""Test that the Mixologist class behaves correctly."""
def setUp(self):
self.mixologist = Mixologist([FirstMixin, SecondMixin])
# Test that the classes generated by the mixologist are cached
# (and only generated once)
def test_only_generate_classes_once(self):
assert_is(
self.mixologist.mix(FieldTester),
self.mixologist.mix(FieldTester),
)
assert_is_not(
self.mixologist.mix(FieldTester),
self.mixologist.mix(TestXBlock),
)
# Test that mixins are applied in order
def test_mixin_order(self):
assert_is(1, self.mixologist.mix(FieldTester).number)
assert_is(1, self.mixologist.mix(FieldTester).fields['field'].default)
def test_unmixed_class(self):
assert_is(FieldTester, self.mixologist.mix(FieldTester).unmixed_class)
def test_mixin_fields(self):
assert_is(FirstMixin.fields['field'], FirstMixin.field)
def test_mixed_fields(self):
mixed = self.mixologist.mix(FieldTester)
assert_is(mixed.fields['field'], FirstMixin.field)
assert_is(mixed.fields['field_a'], FieldTester.field_a)
def test_duplicate_mixins(self):
singly_mixed = self.mixologist.mix(FieldTester)
doubly_mixed = self.mixologist.mix(singly_mixed)
assert_is(singly_mixed, doubly_mixed)
assert_is(FieldTester, singly_mixed.unmixed_class)
def test_multiply_mixed(self):
mixalot = Mixologist([ThirdMixin, FirstMixin])
pre_mixed = mixalot.mix(self.mixologist.mix(FieldTester))
post_mixed = self.mixologist.mix(mixalot.mix(FieldTester))
assert_is(pre_mixed.fields['field'], FirstMixin.field)
assert_is(post_mixed.fields['field'], ThirdMixin.field)
assert_is(FieldTester, pre_mixed.unmixed_class)
assert_is(FieldTester, post_mixed.unmixed_class)
assert_equals(4, len(pre_mixed.__bases__)) # 1 for the original class + 3 mixin classes
assert_equals(4, len(post_mixed.__bases__))
开发者ID:Maqlan,项目名称:XBlock,代码行数:54,代码来源:test_runtime.py
示例13: ModuleStoreWriteBase
class ModuleStoreWriteBase(ModuleStoreReadBase, ModuleStoreWrite):
'''
Implement interface functionality that can be shared.
'''
def __init__(self, **kwargs):
super(ModuleStoreWriteBase, self).__init__(**kwargs)
# TODO: Don't have a runtime just to generate the appropriate mixin classes (cpennington)
# This is only used by partition_fields_by_scope, which is only needed because
# the split mongo store is used for item creation as well as item persistence
self.mixologist = Mixologist(self.xblock_mixins)
def partition_fields_by_scope(self, category, fields):
"""
Return dictionary of {scope: {field1: val, ..}..} for the fields of this potential xblock
:param category: the xblock category
:param fields: the dictionary of {fieldname: value}
"""
if fields is None:
return {}
cls = self.mixologist.mix(XBlock.load_class(category, select=prefer_xmodules))
result = collections.defaultdict(dict)
for field_name, value in fields.iteritems():
field = getattr(cls, field_name)
result[field.scope][field_name] = value
return result
def update_item(self, xblock, user_id=None, allow_not_found=False, force=False):
"""
Update the given xblock's persisted repr. Pass the user's unique id which the persistent store
should save with the update if it has that ability.
:param allow_not_found: whether this method should raise an exception if the given xblock
has not been persisted before.
:param force: fork the structure and don't update the course draftVersion if there's a version
conflict (only applicable to version tracking and conflict detecting persistence stores)
:raises VersionConflictError: if org, offering, and version_guid given and the current
version head != version_guid and force is not True. (only applicable to version tracking stores)
"""
raise NotImplementedError
def delete_item(self, location, user_id=None, force=False):
"""
Delete an item from persistence. Pass the user's unique id which the persistent store
should save with the update if it has that ability.
:param user_id: ID of the user deleting the item
:param force: fork the structure and don't update the course draftVersion if there's a version
conflict (only applicable to version tracking and conflict detecting persistence stores)
:raises VersionConflictError: if org, offering, and version_guid given and the current
version head != version_guid and force is not True. (only applicable to version tracking stores)
"""
raise NotImplementedError
def create_and_save_xmodule(self, location, user_id, definition_data=None, metadata=None, runtime=None, fields={}):
"""
Create the new xmodule and save it.
:param location: a Location--must have a category
:param user_id: ID of the user creating and saving the xmodule
:param definition_data: can be empty. The initial definition_data for the kvs
:param metadata: can be empty, the initial metadata for the kvs
:param runtime: if you already have an xblock from the course, the xblock.runtime value
:param fields: a dictionary of field names and values for the new xmodule
"""
new_object = self.create_xmodule(location, definition_data, metadata, runtime, fields)
self.update_item(new_object, user_id, allow_not_found=True)
return new_object
开发者ID:UXE,项目名称:edx-platform,代码行数:70,代码来源:__init__.py
示例14: ModuleStoreWriteBase
class ModuleStoreWriteBase(ModuleStoreReadBase, ModuleStoreWrite):
'''
Implement interface functionality that can be shared.
'''
def __init__(self, contentstore, **kwargs):
super(ModuleStoreWriteBase, self).__init__(contentstore=contentstore, **kwargs)
# TODO: Don't have a runtime just to generate the appropriate mixin classes (cpennington)
# This is only used by partition_fields_by_scope, which is only needed because
# the split mongo store is used for item creation as well as item persistence
self.mixologist = Mixologist(self.xblock_mixins)
def partition_fields_by_scope(self, category, fields):
"""
Return dictionary of {scope: {field1: val, ..}..} for the fields of this potential xblock
:param category: the xblock category
:param fields: the dictionary of {fieldname: value}
"""
if fields is None:
return {}
cls = self.mixologist.mix(XBlock.load_class(category, select=prefer_xmodules))
result = collections.defaultdict(dict)
for field_name, value in fields.iteritems():
field = getattr(cls, field_name)
result[field.scope][field_name] = value
return result
def clone_course(self, source_course_id, dest_course_id, user_id):
"""
This base method just copies the assets. The lower level impls must do the actual cloning of
content.
"""
# copy the assets
if self.contentstore:
self.contentstore.copy_all_course_assets(source_course_id, dest_course_id)
super(ModuleStoreWriteBase, self).clone_course(source_course_id, dest_course_id, user_id)
return dest_course_id
def delete_course(self, course_key, user_id):
"""
This base method just deletes the assets. The lower level impls must do the actual deleting of
content.
"""
# delete the assets
if self.contentstore:
self.contentstore.delete_all_course_assets(course_key)
super(ModuleStoreWriteBase, self).delete_course(course_key, user_id)
def _drop_database(self):
"""
A destructive operation to drop the underlying database and close all connections.
Intended to be used by test code for cleanup.
"""
if self.contentstore:
self.contentstore._drop_database() # pylint: disable=protected-access
super(ModuleStoreWriteBase, self)._drop_database() # pylint: disable=protected-access
def create_child(self, user_id, parent_usage_key, block_type, block_id=None, fields=None, **kwargs):
"""
Creates and saves a new xblock that as a child of the specified block
Returns the newly created item.
Args:
user_id: ID of the user creating and saving the xmodule
parent_usage_key: a :class:`~opaque_key.edx.UsageKey` identifing the
block that this item should be parented under
block_type: The type of block to create
block_id: a unique identifier for the new item. If not supplied,
a new identifier will be generated
fields (dict): A dictionary specifying initial values for some or all fields
in the newly created block
"""
item = self.create_item(user_id, parent_usage_key.course_key, block_type, block_id=block_id, fields=fields, **kwargs)
parent = self.get_item(parent_usage_key)
parent.children.append(item.location)
self.update_item(parent, user_id)
@contextmanager
def bulk_write_operations(self, course_id):
"""
A context manager for notifying the store of bulk write events.
In the case of Mongo, it temporarily disables refreshing the metadata inheritance tree
until the bulk operation is completed.
"""
# TODO
# Make this multi-process-safe if future operations need it.
# Right now, only Import Course, Clone Course, and Delete Course use this, so
# it's ok if the cached metadata in the memcache is invalid when another
# request comes in for the same course.
try:
if hasattr(self, '_begin_bulk_write_operation'):
self._begin_bulk_write_operation(course_id)
yield
finally:
# check for the begin method here,
# since it's an error if an end method is not defined when a begin method is
if hasattr(self, '_begin_bulk_write_operation'):
#.........这里部分代码省略.........
开发者ID:AsylumCorp,项目名称:edx-platform,代码行数:101,代码来源:__init__.py
示例15: ModuleStoreWriteBase
class ModuleStoreWriteBase(ModuleStoreReadBase, ModuleStoreWrite):
'''
Implement interface functionality that can be shared.
'''
def __init__(self, contentstore, **kwargs):
super(ModuleStoreWriteBase, self).__init__(contentstore=contentstore, **kwargs)
# TODO: Don't have a runtime just to generate the appropriate mixin classes (cpennington)
# This is only used by partition_fields_by_scope, which is only needed because
# the split mongo store is used for item creation as well as item persistence
self.mixologist = Mixologist(self.xblock_mixins)
def partition_fields_by_scope(self, category, fields):
"""
Return dictionary of {scope: {field1: val, ..}..} for the fields of this potential xblock
:param category: the xblock category
:param fields: the dictionary of {fieldname: value}
"""
result = collections.defaultdict(dict)
if fields is None:
return result
cls = self.mixologist.mix(XBlock.load_class(category, select=prefer_xmodules))
for field_name, value in fields.iteritems():
field = getattr(cls, field_name)
result[field.scope][field_name] = value
return result
def create_course(self, org, course, run, user_id, fields=None, runtime=None, **kwargs):
"""
Creates any necessary other things for the course as a side effect and doesn't return
anything useful. The real subclass should call this before it returns the course.
"""
# clone a default 'about' overview module as well
about_location = self.make_course_key(org, course, run).make_usage_key('about', 'overview')
about_descriptor = XBlock.load_class('about')
overview_template = about_descriptor.get_template('overview.yaml')
self.create_item(
user_id,
about_location.course_key,
about_location.block_type,
block_id=about_location.block_id,
definition_data={'data': overview_template.get('data')},
metadata=overview_template.get('metadata'),
runtime=runtime,
continue_version=True,
)
def clone_course(self, source_course_id, dest_course_id, user_id, fields=None, **kwargs):
"""
This base method just copies the assets. The lower level impls must do the actual cloning of
content.
"""
# copy the assets
if self.contentstore:
self.contentstore.copy_all_course_assets(source_course_id, dest_course_id)
return dest_course_id
def delete_course(self, course_key, user_id, **kwargs):
"""
This base method just deletes the assets. The lower level impls must do the actual deleting of
content.
"""
# delete the assets
if self.contentstore:
self.contentstore.delete_all_course_assets(course_key)
super(ModuleStoreWriteBase, self).delete_course(course_key, user_id)
def _drop_database(self):
"""
A destructive operation to drop the underlying database and close all connections.
Intended to be used by test code for cleanup.
"""
if self.contentstore:
self.contentstore._drop_database() # pylint: disable=protected-access
super(ModuleStoreWriteBase, self)._drop_database() # pylint: disable=protected-access
def create_child(self, user_id, parent_usage_key, block_type, block_id=None, fields=None, **kwargs):
"""
Creates and saves a new xblock that as a child of the specified block
Returns the newly created item.
Args:
user_id: ID of the user creating and saving the xmodule
parent_usage_key: a :class:`~opaque_key.edx.UsageKey` identifing the
block that this item should be parented under
block_type: The type of block to create
block_id: a unique identifier for the new item. If not supplied,
a new identifier will be generated
fields (dict): A dictionary specifying initial values for some or all fields
in the newly created block
"""
item = self.create_item(user_id, parent_usage_key.course_key, block_type, block_id=block_id, fields=fields, **kwargs)
parent = self.get_item(parent_usage_key)
parent.children.append(item.location)
self.update_item(parent, user_id)
def _find_course_assets(self, course_key):
#.........这里部分代码省略.........
开发者ID:priceamanda1,项目名称:edx-platform,代码行数:101,代码来源:__init__.py
示例16: ModuleStoreWriteBase
class ModuleStoreWriteBase(ModuleStoreReadBase, ModuleStoreWrite):
'''
Implement interface functionality that can be shared.
'''
def __init__(self, contentstore, **kwargs):
super(ModuleStoreWriteBase, self).__init__(**kwargs)
self.contentstore = contentstore
# TODO: Don't have a runtime just to generate the appropriate mixin classes (cpennington)
# This is only used by partition_fields_by_scope, which is only needed because
# the split mongo store is used for item creation as well as item persistence
self.mixologist = Mixologist(self.xblock_mixins)
def partition_fields_by_scope(self, category, fields):
"""
Return dictionary of {scope: {field1: val, ..}..} for the fields of this potential xblock
:param category: the xblock category
:param fields: the dictionary of {fieldname: value}
"""
if fields is None:
return {}
cls = self.mixologist.mix(XBlock.load_class(category, select=prefer_xmodules))
result = collections.defaultdict(dict)
for field_name, value in fields.iteritems():
field = getattr(cls, field_name)
result[field.scope][field_name] = value
return result
def update_item(self, xblock, user_id, allow_not_found=False, force=False):
"""
Update the given xblock's persisted repr. Pass the user's unique id which the persistent store
should save with the update if it has that ability.
:param allow_not_found: whether this method should raise an exception if the given xblock
has not been persisted before.
:param force: fork the structure and don't update the course draftVersion if there's a version
conflict (only applicable to version tracking and conflict detecting persistence stores)
:raises VersionConflictError: if org, course, run, and version_guid given and the current
version head != version_guid and force is not True. (only applicable to version tracking stores)
"""
raise NotImplementedError
def delete_item(self, location, user_id, force=False):
"""
Delete an item from persistence. Pass the user's unique id which the persistent store
should save with the update if it has that ability.
:param user_id: ID of the user deleting the item
:param force: fork the structure and don't update the course draftVersion if there's a version
conflict (only applicable to version tracking and conflict detecting persistence stores)
:raises VersionConflictError: if org, course, run, and version_guid given and the current
version head != version_guid and force is not True. (only applicable to version tracking stores)
"""
raise NotImplementedError
def create_and_save_xmodule(self, location, user_id, definition_data=None, metadata=None, runtime=None, fields={}):
"""
Create the new xmodule and save it.
:param location: a Location--must have a category
:param user_id: ID of the user creating and saving the xmodule
:param definition_data: can be empty. The initial definition_data for the kvs
:param metadata: can be empty, the initial metadata for the kvs
:param runtime: if you already have an xblock from the course, the xblock.runtime value
:param fields: a dictionary of field names and values for the new xmodule
"""
new_object = self.create_xmodule(location, definition_data, metadata, runtime, fields)
self.update_item(new_object, user_id, allow_not_found=True)
return new_object
def clone_course(self, source_course_id, dest_course_id, user_id):
"""
This base method just copies the assets. The lower level impls must do the actual cloning of
content.
"""
# copy the assets
self.contentstore.copy_all_course_assets(source_course_id, dest_course_id)
super(ModuleStoreWriteBase, self).clone_course(source_course_id, dest_course_id, user_id)
return dest_course_id
def delete_course(self, course_key, user_id):
"""
This base method just deletes the assets. The lower level impls must do the actual deleting of
content.
"""
# delete the assets
self.contentstore.delete_all_course_assets(course_key)
super(ModuleStoreWriteBase, self).delete_course(course_key, user_id)
@contextmanager
def bulk_write_operations(self, course_id):
"""
A context manager for notifying the store of bulk write events.
In the case of Mongo, it temporarily disables refreshing the metadata inheritance tree
until the bulk operation is completed.
"""
#.........这里部分代码省略.........
开发者ID:AlexanderFuentes,项目名称:edx-platform,代码行数:101,代码来源:__init__.py
示例17: TestMixologist
class TestMixologist(object):
"""Test that the Mixologist class behaves correctly."""
def setup_method(self):
"""
Setup for each test method in this class.
"""
self.mixologist = Mixologist([FirstMixin, SecondMixin]) # pylint: disable=attribute-defined-outside-init
# Test that the classes generated by the mixologist are cached
# (and only generated once)
def test_only_generate_classes_once(self):
assert self.mixologist.mix(FieldTester) is self.mixologist.mix(FieldTester)
assert not self.mixologist.mix(FieldTester) is self.mixologist.mix(TestXBlock)
# Test that mixins are applied in order
def test_mixin_order(self):
assert 1 is self.mixologist.mix(FieldTester).number
assert 1 is self.mixologist.mix(FieldTester).fields['field'].default
def test_unmixed_class(self):
assert FieldTester is self.mixologist.mix(FieldTester).unmixed_class
def test_mixin_fields(self):
assert FirstMixin.fields['field'] is FirstMixin.field # pylint: disable=unsubscriptable-object
def test_mixed_fields(self):
mixed = self.mixologist.mix(FieldTester)
assert mixed.fields['field'] is FirstMixin.field
assert mixed.fields['field_a'] is FieldTester.field_a
def test_duplicate_mixins(self):
singly_mixed = self.mixologist.mix(FieldTester)
doubly_mixed = self.mixologist.mix(singly_mixed)
assert singly_mixed is doubly_mixed
assert FieldTester is singly_mixed.unmixed_class
def test_multiply_mixed(self):
mixalot = Mixologist([ThirdMixin, FirstMixin])
pre_mixed = mixalot.mix(self.mixologist.mix(FieldTester))
post_mixed = self.mixologist.mix(mixalot.mix(FieldTester))
assert pre_mixed.fields['field'] is FirstMixin.field
assert post_mixed.fields['field'] is ThirdMixin.field
assert FieldTester is pre_mixed.unmixed_class
assert FieldTester is post_mixed.unmixed_class
assert len(pre_mixed.__bases__) == 4 # 1 for the original class + 3 mixin classes
assert len(post_mixed.__bases__) == 4
开发者ID:edx,项目名称:XBlock,代码行数:50,代码来源:test_runtime.py
示例18: test_get_uses_class_name_if_block_settings_key_is_not_set
def test_get_uses_class_name_if_block_settings_key_is_not_set(self):
""" Test if settings service uses class name if block_settings_key attribute does not exist """
mixologist = Mixologist([])
block = mixologist.mix(_DummyBlock)
self.assertEqual(getattr(settings, 'XBLOCK_SETTINGS'), {"_DummyBlock": [1, 2, 3]})
self.assertEqual(self.settings_service.get_settings_bucket(block), [1, 2, 3])
开发者ID:189140879,项目名称:edx-platform,代码行数:6,代码来源:test_services.py
示例19: __init__
def __init__(self, contentstore, **kwargs):
super(ModuleStoreWriteBase, self).__init__(contentstore=contentstore, **kwargs)
self.mixologist = Mixologist(self.xblock_mixins)
开发者ID:CDOT-EDX,项目名称:edx-platform,代码行数:3,代码来源:__init__.py
注:本文中的xblock.runtime.Mixologist类示例由纯净天空整理自Github/MSDocs等源码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。 |
请发表评论