diff --git a/lms/djangoapps/grades/scores.py b/lms/djangoapps/grades/scores.py index 86832ef156..22e378bda6 100644 --- a/lms/djangoapps/grades/scores.py +++ b/lms/djangoapps/grades/scores.py @@ -108,20 +108,23 @@ def get_score(submissions_scores, csm_scores, persisted_block, block): _get_score_from_persisted_or_latest_block(persisted_block, block, weight) ) - assert weighted_possible is not None - has_valid_denominator = weighted_possible > 0.0 - graded = _get_graded_from_block(persisted_block, block) if has_valid_denominator else False + if weighted_possible is None or weighted_earned is None: + return None - return ProblemScore( - raw_earned, - raw_possible, - weighted_earned, - weighted_possible, - weight, - graded, - display_name=display_name_with_default_escaped(block), - module_id=block.location, - ) + else: + has_valid_denominator = weighted_possible > 0.0 + graded = _get_graded_from_block(persisted_block, block) if has_valid_denominator else False + + return ProblemScore( + raw_earned, + raw_possible, + weighted_earned, + weighted_possible, + weight, + graded, + display_name=display_name_with_default_escaped(block), + module_id=block.location, + ) def weighted_score(raw_earned, raw_possible, weight): @@ -191,7 +194,10 @@ def _get_score_from_persisted_or_latest_block(persisted_block, block, weight): else: raw_possible = block.transformer_data[GradesTransformer].max_score - return (raw_earned, raw_possible) + weighted_score(raw_earned, raw_possible, weight) + if raw_possible is None: + return (raw_earned, raw_possible) + (None, None) + else: + return (raw_earned, raw_possible) + weighted_score(raw_earned, raw_possible, weight) def _get_weight_from_block(persisted_block, block): diff --git a/lms/djangoapps/grades/transformer.py b/lms/djangoapps/grades/transformer.py index df2e0a4b37..481c2e700c 100644 --- a/lms/djangoapps/grades/transformer.py +++ b/lms/djangoapps/grades/transformer.py @@ -3,6 +3,7 @@ Grades Transformer """ from django.test.client import RequestFactory from functools import reduce as functools_reduce +from logging import getLogger from courseware.model_data import FieldDataCache from courseware.module_render import get_module_for_descriptor @@ -11,6 +12,9 @@ from openedx.core.lib.block_structure.transformer import BlockStructureTransform from openedx.core.djangoapps.util.user_utils import SystemUser +log = getLogger(__name__) + + class GradesTransformer(BlockStructureTransformer): """ The GradesTransformer collects grading information and stores it on @@ -119,8 +123,10 @@ class GradesTransformer(BlockStructureTransformer): Collect the `max_score` from the given module, storing it as a `transformer_block_field` associated with the `GradesTransformer`. """ - score = module.max_score() - block_structure.set_transformer_block_field(module.location, cls, 'max_score', score) + max_score = module.max_score() + block_structure.set_transformer_block_field(module.location, cls, 'max_score', max_score) + if max_score is None: + log.warning("GradesTransformer: max_score is None for {}".format(module.location)) @staticmethod def _iter_scorable_xmodules(block_structure):