Made errors on Library blocks use validate functionality.
This commit is contained in:
committed by
E. Kolpakov
parent
9f85c0f0aa
commit
80ea764c9d
@@ -14,6 +14,7 @@ from xblock.core import XBlock
|
||||
from xblock.fields import Scope, String, List, Integer, Boolean
|
||||
from xblock.fragment import Fragment
|
||||
from xmodule.modulestore.exceptions import ItemNotFoundError
|
||||
from xmodule.validation import StudioValidationMessage, StudioValidation
|
||||
from xmodule.x_module import XModule, STUDENT_VIEW
|
||||
from xmodule.studio_editable import StudioEditableModule, StudioEditableDescriptor
|
||||
from .xml_module import XmlDescriptor
|
||||
@@ -260,6 +261,40 @@ class LibraryContentModule(LibraryContentFields, XModule, StudioEditableModule):
|
||||
}))
|
||||
return fragment
|
||||
|
||||
def validate(self):
|
||||
"""
|
||||
Validates the state of this Library Content Module Instance. This
|
||||
is the override of the general XBlock method, and it will also ask
|
||||
its superclass to validate.
|
||||
"""
|
||||
validation = super(LibraryContentModule, self).validate()
|
||||
if not isinstance(validation, StudioValidation):
|
||||
validation = StudioValidation.copy(validation)
|
||||
if not self.source_libraries:
|
||||
validation.set_summary(
|
||||
StudioValidationMessage(
|
||||
StudioValidationMessage.NOT_CONFIGURED,
|
||||
_(u"A library has not yet been selected."),
|
||||
action_class='edit-button',
|
||||
action_label=_(u"Select a Library")
|
||||
)
|
||||
)
|
||||
return validation
|
||||
for library_key, version in self.source_libraries: # pylint: disable=unused-variable
|
||||
library = _get_library(self.runtime.descriptor_runtime.modulestore, library_key)
|
||||
if library is None:
|
||||
validation.set_summary(
|
||||
StudioValidationMessage(
|
||||
StudioValidationMessage.ERROR,
|
||||
_(u'Library is invalid, corrupt, or has been deleted.'),
|
||||
action_class='edit-button',
|
||||
action_label=_(u"Edit Library List")
|
||||
)
|
||||
)
|
||||
break
|
||||
|
||||
return validation
|
||||
|
||||
def author_view(self, context):
|
||||
"""
|
||||
Renders the Studio views.
|
||||
@@ -284,41 +319,31 @@ class LibraryContentModule(LibraryContentFields, XModule, StudioEditableModule):
|
||||
_('No matching content found in library, no library configured, or not yet loaded from library.')
|
||||
))
|
||||
else:
|
||||
# When shown on a unit page, don't show any sort of preview - just the status of this block.
|
||||
LibraryStatus = enum( # pylint: disable=invalid-name
|
||||
NONE=0, # no library configured
|
||||
INVALID=1, # invalid configuration or library has been deleted/corrupted
|
||||
OK=2, # library configured correctly and should be working fine
|
||||
)
|
||||
UpdateStatus = enum( # pylint: disable=invalid-name
|
||||
CANNOT=0, # Cannot update - library is not set, invalid, deleted, etc.
|
||||
NEEDED=1, # An update is needed - prompt the user to update
|
||||
UP_TO_DATE=2, # No update necessary - library is up to date
|
||||
)
|
||||
# When shown on a unit page, don't show any sort of preview - just the status of this block.
|
||||
library_ok = bool(self.source_libraries) # True if at least one source library is defined
|
||||
library_names = []
|
||||
library_status = LibraryStatus.OK
|
||||
update_status = UpdateStatus.UP_TO_DATE
|
||||
if self.source_libraries:
|
||||
for library_key, version in self.source_libraries:
|
||||
library = _get_library(self.runtime.descriptor_runtime.modulestore, library_key)
|
||||
if library is None:
|
||||
library_status = LibraryStatus.INVALID
|
||||
update_status = UpdateStatus.CANNOT
|
||||
break
|
||||
library_names.append(library.display_name)
|
||||
latest_version = library.location.library_key.version_guid
|
||||
if version is None or version != latest_version:
|
||||
update_status = UpdateStatus.NEEDED
|
||||
# else library is up to date.
|
||||
else:
|
||||
library_status = LibraryStatus.NONE
|
||||
update_status = UpdateStatus.CANNOT
|
||||
for library_key, version in self.source_libraries:
|
||||
library = _get_library(self.runtime.descriptor_runtime.modulestore, library_key)
|
||||
if library is None:
|
||||
update_status = UpdateStatus.CANNOT
|
||||
library_ok = False
|
||||
break
|
||||
library_names.append(library.display_name)
|
||||
latest_version = library.location.library_key.version_guid
|
||||
if version is None or version != latest_version:
|
||||
update_status = UpdateStatus.NEEDED
|
||||
|
||||
fragment.add_content(self.system.render_template('library-block-author-view.html', {
|
||||
'library_status': library_status,
|
||||
'LibraryStatus': LibraryStatus,
|
||||
'update_status': update_status,
|
||||
'UpdateStatus': UpdateStatus,
|
||||
'library_names': library_names,
|
||||
'library_ok': library_ok,
|
||||
'UpdateStatus': UpdateStatus,
|
||||
'update_status': update_status,
|
||||
'max_count': self.max_count,
|
||||
'mode': self.mode,
|
||||
'num_children': len(self.children), # pylint: disable=no-member
|
||||
|
||||
@@ -2,16 +2,12 @@
|
||||
from django.utils.translation import ugettext as _
|
||||
%>
|
||||
<div class="xblock-header-secondary">
|
||||
% if library_status == LibraryStatus.OK:
|
||||
% if library_ok:
|
||||
<p>${_('This component will be replaced by {mode} {max_count} components from the {num_children} matching components from {lib_names}.').format(mode=mode, max_count=max_count, num_children=num_children, lib_names=', '.join(library_names))}</p>
|
||||
% if update_status == UpdateStatus.NEEDED:
|
||||
<p><strong>${_('This component is out of date.')}</strong> <a href="#" class="library-update-btn">↻ ${_('Update now with latest components from the library')}</a></p>
|
||||
% elif update_status == UpdateStatus.UP_TO_DATE:
|
||||
<p>${_(u'✓ Up to date.')}</p>
|
||||
% endif
|
||||
% elif library_status == LibraryStatus.NONE:
|
||||
<p>${_('No library or filters configured. Press "Edit" to configure.')}</p>
|
||||
% else:
|
||||
<p>${_('Library is invalid, corrupt, or has been deleted.')}</p>
|
||||
% endif
|
||||
</div>
|
||||
|
||||
Reference in New Issue
Block a user