def check_for_page_type_changes(vctx, location, course, flow_id, flow_desc): from course.content import normalize_flow_desc n_flow_desc = normalize_flow_desc(flow_desc) from course.models import FlowPageData for grp in n_flow_desc.groups: for page_desc in grp.pages: fpd_with_mismatched_page_types = list( FlowPageData.objects .filter( flow_session__course=course, flow_session__flow_id=flow_id, group_id=grp.id, page_id=page_desc.id) .exclude(page_type=None) .exclude(page_type=page_desc.type) [0:1]) if fpd_with_mismatched_page_types: mismatched_fpd, = fpd_with_mismatched_page_types raise ValidationError( _("%(loc)s, group '%(group)s', page '%(page)s': " "page type ('%(type_new)s') differs from " "type used in database ('%(type_old)s')") % {"loc": location, "group": grp.id, "page": page_desc.id, "type_new": page_desc.type, "type_old": mismatched_fpd.page_type})
def check_for_page_type_changes(vctx, location, course, flow_id, flow_desc): from course.content import normalize_flow_desc n_flow_desc = normalize_flow_desc(flow_desc) from course.models import FlowPageData for grp in n_flow_desc.groups: for page_desc in grp.pages: fpd_with_mismatched_page_types = list( FlowPageData.objects .filter( flow_session__course=course, flow_session__flow_id=flow_id, group_id=grp.id, page_id=page_desc.id) .exclude(page_type=None) .exclude(page_type=page_desc.type) [0:1]) if fpd_with_mismatched_page_types: mismatched_fpd, = fpd_with_mismatched_page_types raise ValidationError( _("%(loc)s, group '%(group)s', page '%(page)s': " "page type ('%(type_new)s') differs from " "type used in database ('%(type_old)s')") % {"loc": location, "group": grp.id, "page": page_desc.id, "type_new": page_desc.type, "type_old": mismatched_fpd.page_type})
def validate_flow_desc(vctx, location, flow_desc): validate_struct( vctx, location, flow_desc, required_attrs=[ ("title", str), ("description", "markup"), ], allowed_attrs=[ ("completion_text", "markup"), ("rules", Struct), ("groups", list), ("pages", list), ("notify_on_submit", list), # deprecated (moved to grading rule) ("max_points", (int, float)), ("max_points_enforced_cap", (int, float)), ("bonus_points", (int, float)), ] ) if hasattr(flow_desc, "rules"): validate_flow_rules(vctx, location, flow_desc.rules) # {{{ check for presence of 'groups' or 'pages' if ( (not hasattr(flow_desc, "groups") and not hasattr(flow_desc, "pages")) or (hasattr(flow_desc, "groups") and hasattr(flow_desc, "pages"))): raise ValidationError( string_concat("%(location)s: ", _("must have either 'groups' or 'pages'")) % {'location': location}) # }}} if hasattr(flow_desc, "pages"): from course.content import normalize_flow_desc flow_desc = normalize_flow_desc(flow_desc) assert not hasattr(flow_desc, "pages") assert hasattr(flow_desc, "groups") # {{{ check for non-emptiness flow_has_page = False for i, grp in enumerate(flow_desc.groups): group_has_page = False if not isinstance(grp.pages, list): raise ValidationError( string_concat( "%(location)s, ", _("group %(group_index)d ('%(group_id)s'): " "'pages' is not a list")) % { 'location': location, 'group_index': i+1, 'group_id': grp.id}) for page in grp.pages: group_has_page = flow_has_page = True break if not group_has_page: raise ValidationError( string_concat( "%(location)s, ", _("group %(group_index)d ('%(group_id)s'): " "no pages found")) % { 'location': location, 'group_index': i+1, 'group_id': grp.id}) if not flow_has_page: raise ValidationError(_("%s: no pages found") % location) # }}} # {{{ check group id uniqueness group_ids = set() for grp in flow_desc.groups: if grp.id in group_ids: raise ValidationError( string_concat("%(location)s: ", _("group id '%(group_id)s' not unique")) % {'location': location, 'group_id': grp.id}) group_ids.add(grp.id) # }}} for i, grp in enumerate(flow_desc.groups): validate_flow_group(vctx, "%s, group %d ('%s')" % (location, i+1, grp.id), grp) validate_markup(vctx, location, flow_desc.description) if hasattr(flow_desc, "completion_text"): validate_markup(vctx, location, flow_desc.completion_text) if hasattr(flow_desc, "notify_on_submit"): for i, item in enumerate(flow_desc.notify_on_submit): if not isinstance(item, six.string_types): raise ValidationError( string_concat( "%s, ", _("notify_on_submit: item %d is not a string")) % (location, i+1)) for attr in ["max_points", "max_points_enforced_cap", "bonus_points"]: if hasattr(flow_desc, attr): vctx.add_warning(location, _("Attribute '%s' is deprecated as part of a flow. " "Specify it as part of a grading rule instead.") % attr)
def validate_flow_desc(vctx, location, flow_desc): validate_struct( vctx, location, flow_desc, required_attrs=[ ("title", str), ("description", "markup"), ], allowed_attrs=[ ("completion_text", "markup"), ("rules", Struct), ("groups", list), ("pages", list), ("notify_on_submit", list), # deprecated (moved to grading rule) ("max_points", (int, float)), ("max_points_enforced_cap", (int, float)), ("bonus_points", (int, float)), ] ) if hasattr(flow_desc, "rules"): validate_flow_rules(vctx, location, flow_desc.rules) # {{{ check for presence of 'groups' or 'pages' if ( (not hasattr(flow_desc, "groups") and not hasattr(flow_desc, "pages")) or (hasattr(flow_desc, "groups") and hasattr(flow_desc, "pages"))): raise ValidationError( string_concat("%(location)s: ", _("must have either 'groups' or 'pages'")) % {'location': location}) # }}} if hasattr(flow_desc, "pages"): from course.content import normalize_flow_desc flow_desc = normalize_flow_desc(flow_desc) assert not hasattr(flow_desc, "pages") assert hasattr(flow_desc, "groups") # {{{ check for non-emptiness flow_has_page = False for i, grp in enumerate(flow_desc.groups): group_has_page = False if not isinstance(grp.pages, list): raise ValidationError( string_concat( "%(location)s, ", _("group %(group_index)d ('%(group_id)s'): " "'pages' is not a list")) % { 'location': location, 'group_index': i+1, 'group_id': grp.id}) for page in grp.pages: group_has_page = flow_has_page = True break if not group_has_page: raise ValidationError( string_concat( "%(location)s, ", _("group %(group_index)d ('%(group_id)s'): " "no pages found")) % { 'location': location, 'group_index': i+1, 'group_id': grp.id}) if not flow_has_page: raise ValidationError(_("%s: no pages found") % location) # }}} # {{{ check group id uniqueness group_ids = set() for grp in flow_desc.groups: if grp.id in group_ids: raise ValidationError( string_concat("%(location)s: ", _("group id '%(group_id)s' not unique")) % {'location': location, 'group_id': grp.id}) group_ids.add(grp.id) # }}} for i, grp in enumerate(flow_desc.groups): validate_flow_group(vctx, "%s, group %d ('%s')" % (location, i+1, grp.id), grp) validate_markup(vctx, location, flow_desc.description) if hasattr(flow_desc, "completion_text"): validate_markup(vctx, location, flow_desc.completion_text) if hasattr(flow_desc, "notify_on_submit"): for i, item in enumerate(flow_desc.notify_on_submit): if not isinstance(item, six.string_types): raise ValidationError( string_concat( "%s, ", _("notify_on_submit: item %d is not a string")) % (location, i+1)) for attr in ["max_points", "max_points_enforced_cap", "bonus_points"]: if hasattr(flow_desc, attr): vctx.add_warning(location, _("Attribute '%s' is deprecated as part of a flow. " "Specify it as part of a grading rule instead.") % attr)
def validate_flow_desc(ctx, location, flow_desc): validate_struct(ctx, location, flow_desc, required_attrs=[ ("title", str), ("description", "markup"), ], allowed_attrs=[ ("completion_text", "markup"), ("rules", Struct), ("groups", list), ("pages", list), ]) if hasattr(flow_desc, "rules"): validate_flow_rules(ctx, location, flow_desc.rules) # {{{ check for presence of 'groups' or 'pages' if ((not hasattr(flow_desc, "groups") and not hasattr(flow_desc, "pages")) or (hasattr(flow_desc, "groups") and hasattr(flow_desc, "pages"))): raise ValidationError( string_concat("%(location)s: ", _("must have either 'groups' or 'pages'")) % {'location': location}) # }}} if hasattr(flow_desc, "pages"): from course.content import normalize_flow_desc flow_desc = normalize_flow_desc(flow_desc) assert not hasattr(flow_desc, "pages") assert hasattr(flow_desc, "groups") # {{{ check for non-emptiness flow_has_page = False for i, grp in enumerate(flow_desc.groups): group_has_page = False for page in grp.pages: group_has_page = flow_has_page = True break if not group_has_page: raise ValidationError( string_concat( "%(location)s, ", _("group %(group_index)d ('%(group_id)d'): " "no pages found")) % { 'location': location, 'group_index': i + 1, 'group_id': grp.id }) if not flow_has_page: raise ValidationError(_("%s: no pages found") % location) # }}} # {{{ check group id uniqueness group_ids = set() for grp in flow_desc.groups: if grp.id in group_ids: raise ValidationError( string_concat("%(location)s: ", _("group id '%(group_id)s' not unique")) % { 'location': location, 'group_id': grp.id }) group_ids.add(grp.id) # }}} for i, grp in enumerate(flow_desc.groups): validate_flow_group(ctx, "%s, group %d ('%s')" % (location, i + 1, grp.id), grp) validate_markup(ctx, location, flow_desc.description) if hasattr(flow_desc, "completion_text"): validate_markup(ctx, location, flow_desc.completion_text)
def validate_flow_desc(ctx, location, flow_desc): validate_struct( ctx, location, flow_desc, required_attrs=[ ("title", str), ("description", "markup"), ], allowed_attrs=[ ("completion_text", "markup"), ("rules", Struct), ("groups", list), ("pages", list), ] ) if hasattr(flow_desc, "rules"): validate_flow_rules(ctx, location, flow_desc.rules) # {{{ check for presence of 'groups' or 'pages' if ( (not hasattr(flow_desc, "groups") and not hasattr(flow_desc, "pages")) or (hasattr(flow_desc, "groups") and hasattr(flow_desc, "pages"))): raise ValidationError( string_concat("%(location)s: ", _("must have either 'groups' or 'pages'")) % {'location': location}) # }}} if hasattr(flow_desc, "pages"): from course.content import normalize_flow_desc flow_desc = normalize_flow_desc(flow_desc) assert not hasattr(flow_desc, "pages") assert hasattr(flow_desc, "groups") # {{{ check for non-emptiness flow_has_page = False for i, grp in enumerate(flow_desc.groups): group_has_page = False for page in grp.pages: group_has_page = flow_has_page = True break if not group_has_page: raise ValidationError( string_concat( "%(location)s, ", _("group %(group_index)d ('%(group_id)d'): " "no pages found")) % { 'location': location, 'group_index': i+1, 'group_id': grp.id}) if not flow_has_page: raise ValidationError(_("%s: no pages found") % location) # }}} # {{{ check group id uniqueness group_ids = set() for grp in flow_desc.groups: if grp.id in group_ids: raise ValidationError( string_concat("%(location)s: ", _("group id '%(group_id)s' not unique")) % {'location': location, 'group_id': grp.id}) group_ids.add(grp.id) # }}} for i, grp in enumerate(flow_desc.groups): validate_flow_group(ctx, "%s, group %d ('%s')" % (location, i+1, grp.id), grp) validate_markup(ctx, location, flow_desc.description) if hasattr(flow_desc, "completion_text"): validate_markup(ctx, location, flow_desc.completion_text)