class TimeLimitFields(object): beginning_at = Float(help="The time this timer was started", scope=Scope.user_state) ending_at = Float(help="The time this timer will end", scope=Scope.user_state) accomodation_code = String(help="A code indicating accommodations to be given the student", scope=Scope.user_state) time_expired_redirect_url = String(help="Url to redirect users to after the timelimit has expired", scope=Scope.settings) duration = Float(help="The length of this timer", scope=Scope.settings) suppress_toplevel_navigation = Boolean(help="Whether the toplevel navigation should be suppressed when viewing this module", scope=Scope.settings)
class VideoFields(object): """Fields for `VideoModule` and `VideoDescriptor`.""" display_name = String( display_name="Display Name", help="This name appears in the horizontal navigation at the top of the page.", scope=Scope.settings, # it'd be nice to have a useful default but it screws up other things; so, # use display_name_with_default for those default="Video" ) data = String( help="XML data for the problem", default='', scope=Scope.content ) position = Integer(help="Current position in the video", scope=Scope.user_state, default=0) show_captions = Boolean(help="This controls whether or not captions are shown by default.", display_name="Show Captions", scope=Scope.settings, default=True) youtube_id_1_0 = String(help="This is the Youtube ID reference for the normal speed video.", display_name="Default Speed", scope=Scope.settings, default="OEoXaMPEzfM") youtube_id_0_75 = String(help="The Youtube ID for the .75x speed video.", display_name="Speed: .75x", scope=Scope.settings, default="") youtube_id_1_25 = String(help="The Youtube ID for the 1.25x speed video.", display_name="Speed: 1.25x", scope=Scope.settings, default="") youtube_id_1_5 = String(help="The Youtube ID for the 1.5x speed video.", display_name="Speed: 1.5x", scope=Scope.settings, default="") start_time = Float(help="Time the video starts", display_name="Start Time", scope=Scope.settings, default=0.0) end_time = Float(help="Time the video ends", display_name="End Time", scope=Scope.settings, default=0.0) source = String(help="The external URL to download the video. This appears as a link beneath the video.", display_name="Download Video", scope=Scope.settings, default="") track = String(help="The external URL to download the subtitle track. This appears as a link beneath the video.", display_name="Download Track", scope=Scope.settings, default="")
class PeerGradingFields(object): use_for_single_location = Boolean( display_name="Show Single Problem", help='When True, only the single problem specified by "Link to Problem Location" is shown. ' 'When False, a panel is displayed with all problems available for peer grading.', default=USE_FOR_SINGLE_LOCATION, scope=Scope.settings ) link_to_location = String( display_name="Link to Problem Location", help='The location of the problem being graded. Only used when "Show Single Problem" is True.', default=LINK_TO_LOCATION, scope=Scope.settings ) is_graded = Boolean( display_name="Graded", help='Defines whether the student gets credit for grading this problem. Only used when "Show Single Problem" is True.', default=IS_GRADED, scope=Scope.settings ) due_date = Date(help="Due date that should be displayed.", default=None, scope=Scope.settings) grace_period_string = String(help="Amount of grace to give on the due date.", default=None, scope=Scope.settings) max_grade = Integer( help="The maximum grade that a student can receive for this problem.", default=MAX_SCORE, scope=Scope.settings, values={"min": 0} ) student_data_for_location = Dict( help="Student data for a given peer grading problem.", scope=Scope.user_state ) weight = Float( display_name="Problem Weight", help="Defines the number of points each problem is worth. If the value is not set, each problem is worth one point.", scope=Scope.settings, values={"min": 0, "step": ".1"} )
class VideoFields(object): """Fields for `VideoModule` and `VideoDescriptor`.""" position = Integer(help="Current position in the video", scope=Scope.user_state, default=0) show_captions = Boolean( help="This controls whether or not captions are shown by default.", display_name="Show Captions", scope=Scope.settings, default=True) youtube_id_1_0 = String( help="This is the Youtube ID reference for the normal speed video.", display_name="Default Speed", scope=Scope.settings, default="OEoXaMPEzfM") youtube_id_0_75 = String(help="The Youtube ID for the .75x speed video.", display_name="Speed: .75x", scope=Scope.settings, default="") youtube_id_1_25 = String(help="The Youtube ID for the 1.25x speed video.", display_name="Speed: 1.25x", scope=Scope.settings, default="") youtube_id_1_5 = String(help="The Youtube ID for the 1.5x speed video.", display_name="Speed: 1.5x", scope=Scope.settings, default="") start_time = Float(help="Time the video starts", display_name="Start Time", scope=Scope.settings, default=0.0) end_time = Float(help="Time the video ends", display_name="End Time", scope=Scope.settings, default=0.0) source = String( help= "The external URL to download the video. This appears as a link beneath the video.", display_name="Download Video", scope=Scope.settings, default="") track = String( help= "The external URL to download the subtitle track. This appears as a link beneath the video.", display_name="Download Track", scope=Scope.settings, default="")
class TestFields(object): # Will be returned by editable_metadata_fields. max_attempts = Integer(scope=Scope.settings, default=1000, values={ 'min': 1, 'max': 10 }) # Will not be returned by editable_metadata_fields because filtered out by non_editable_metadata_fields. due = Date(scope=Scope.settings) # Will not be returned by editable_metadata_fields because is not Scope.settings. student_answers = Dict(scope=Scope.user_state) # Will be returned, and can override the inherited value from XModule. display_name = String(scope=Scope.settings, default='local default', display_name='Local Display Name', help='local help') # Used for testing select type, effect of to_json method string_select = CrazyJsonString(scope=Scope.settings, default='default value', values=[{ 'display_name': 'first', 'value': 'value a' }, { 'display_name': 'second', 'value': 'value b' }]) # Used for testing select type float_select = Float(scope=Scope.settings, default=.999, values=[1.23, 0.98]) # Used for testing float type float_non_select = Float(scope=Scope.settings, default=.999, values={ 'min': 0, 'step': .3 }) # Used for testing that Booleans get mapped to select type boolean_select = Boolean(scope=Scope.settings) # Used for testing Lists list_field = List(scope=Scope.settings, default=[])
class LmsNamespace(Namespace): """ Namespace that defines fields common to all blocks used in the LMS """ hide_from_toc = Boolean( help="Whether to display this module in the table of contents", default=False, scope=Scope.settings ) graded = Boolean( help="Whether this module contributes to the final course grade", default=False, scope=Scope.settings ) format = String( help="What format this module is in (used for deciding which " "grader to apply, and what to show in the TOC)", scope=Scope.settings, ) start = Date( help="Start time when this module is visible", default=datetime.fromtimestamp(0, UTC), scope=Scope.settings ) due = Date(help="Date that this problem is due by", scope=Scope.settings) source_file = String(help="source file name (eg for latex)", scope=Scope.settings) giturl = String(help="url root for course data git repository", scope=Scope.settings) xqa_key = String(help="DO NOT USE", scope=Scope.settings) ispublic = Boolean(help="Whether this course is open to the public, or only to admins", scope=Scope.settings) graceperiod = Timedelta( help="Amount of time after the due date that submissions will be accepted", scope=Scope.settings ) showanswer = String( help="When to show the problem answer to the student", scope=Scope.settings, default="finished" ) rerandomize = String( help="When to rerandomize the problem", default="never", scope=Scope.settings ) days_early_for_beta = Float( help="Number of days early to show content to beta users", default=None, scope=Scope.settings )
class PeerGradingFields(object): use_for_single_location = Boolean( display_name="Show Single Problem", help= 'When True, only the single problem specified by "Link to Problem Location" is shown. ' 'When False, a panel is displayed with all problems available for peer grading.', default=False, scope=Scope.settings) link_to_location = String( display_name="Link to Problem Location", help= 'The location of the problem being graded. Only used when "Show Single Problem" is True.', default="", scope=Scope.settings) graded = Boolean( display_name="Graded", help= 'Defines whether the student gets credit for grading this problem. Only used when "Show Single Problem" is True.', default=False, scope=Scope.settings) due = Date(help="Due date that should be displayed.", default=None, scope=Scope.settings) grace_period_string = String( help="Amount of grace to give on the due date.", default=None, scope=Scope.settings) student_data_for_location = Dict( help="Student data for a given peer grading problem.", scope=Scope.user_state) weight = Float( display_name="Problem Weight", help= "Defines the number of points each problem is worth. If the value is not set, each problem is worth one point.", scope=Scope.settings, values={ "min": 0, "step": ".1" }, default=1) display_name = String(display_name="Display Name", help="Display name for this module", scope=Scope.settings, default="Peer Grading Interface") data = String(help="Html contents to display for this module", default='<peergrading></peergrading>', scope=Scope.content)
class CombinedOpenEndedFields(object): display_name = String( display_name="Display Name", help="This name appears in the horizontal navigation at the top of the page.", default="Open Response Assessment", scope=Scope.settings ) current_task_number = Integer( help="Current task that the student is on.", default=0, scope=Scope.user_state ) task_states = List( help="List of state dictionaries of each task within this module.", scope=Scope.user_state ) state = String( help="Which step within the current task that the student is on.", default="initial", scope=Scope.user_state ) graded = Boolean( display_name="Graded", help='Defines whether the student gets credit for grading this problem.', default=False, scope=Scope.settings ) student_attempts = Integer( help="Number of attempts taken by the student on this problem", default=0, scope=Scope.user_state ) ready_to_reset = Boolean( help="If the problem is ready to be reset or not.", default=False, scope=Scope.user_state ) max_attempts = Integer( display_name="Maximum Attempts", help="The number of times the student can try to answer this problem.", default=1, scope=Scope.settings, values={"min" : 1 } ) accept_file_upload = Boolean( display_name="Allow File Uploads", help="Whether or not the student can submit files as a response.", default=False, scope=Scope.settings ) skip_spelling_checks = Boolean( display_name="Disable Quality Filter", help="If False, the Quality Filter is enabled and submissions with poor spelling, short length, or poor grammar will not be peer reviewed.", default=False, scope=Scope.settings ) due = Date( help="Date that this problem is due by", default=None, scope=Scope.settings ) graceperiod = Timedelta( help="Amount of time after the due date that submissions will be accepted", default=None, scope=Scope.settings ) version = VersionInteger(help="Current version number", default=DEFAULT_VERSION, scope=Scope.settings) data = String(help="XML data for the problem", scope=Scope.content, default=DEFAULT_DATA) weight = Float( display_name="Problem Weight", help="Defines the number of points each problem is worth. If the value is not set, each problem is worth one point.", scope=Scope.settings, values={"min" : 0 , "step": ".1"}, default=1 ) min_to_calibrate = Integer( display_name="Minimum Peer Grading Calibrations", help="The minimum number of calibration essays each student will need to complete for peer grading.", default=3, scope=Scope.settings, values={"min" : 1, "max" : 20, "step" : "1"} ) max_to_calibrate = Integer( display_name="Maximum Peer Grading Calibrations", help="The maximum number of calibration essays each student will need to complete for peer grading.", default=6, scope=Scope.settings, values={"min" : 1, "max" : 20, "step" : "1"} ) peer_grader_count = Integer( display_name="Peer Graders per Response", help="The number of peers who will grade each submission.", default=3, scope=Scope.settings, values={"min" : 1, "step" : "1", "max" : 5} ) required_peer_grading = Integer( display_name="Required Peer Grading", help="The number of other students each student making a submission will have to grade.", default=3, scope=Scope.settings, values={"min" : 1, "step" : "1", "max" : 5} ) markdown = String( help="Markdown source of this module", default=textwrap.dedent("""\ [prompt] <h3>Censorship in the Libraries</h3> <p>'All of us can think of a book that we hope none of our children or any other children have taken off the shelf. But if I have the right to remove that book from the shelf -- that work I abhor -- then you also have exactly the same right and so does everyone else. And then we have no books left on the shelf for any of us.' --Katherine Paterson, Author </p> <p> Write a persuasive essay to a newspaper reflecting your vies on censorship in libraries. Do you believe that certain materials, such as books, music, movies, magazines, etc., should be removed from the shelves if they are found offensive? Support your position with convincing arguments from your own experience, observations, and/or reading. </p> [prompt] [rubric] + Ideas - Difficult for the reader to discern the main idea. Too brief or too repetitive to establish or maintain a focus. - Attempts a main idea. Sometimes loses focus or ineffectively displays focus. - Presents a unifying theme or main idea, but may include minor tangents. Stays somewhat focused on topic and task. - Presents a unifying theme or main idea without going off on tangents. Stays completely focused on topic and task. + Content - Includes little information with few or no details or unrelated details. Unsuccessful in attempts to explore any facets of the topic. - Includes little information and few or no details. Explores only one or two facets of the topic. - Includes sufficient information and supporting details. (Details may not be fully developed; ideas may be listed.) Explores some facets of the topic. - Includes in-depth information and exceptional supporting details that are fully developed. Explores all facets of the topic. + Organization - Ideas organized illogically, transitions weak, and response difficult to follow. - Attempts to logically organize ideas. Attempts to progress in an order that enhances meaning, and demonstrates use of transitions. - Ideas organized logically. Progresses in an order that enhances meaning. Includes smooth transitions. + Style - Contains limited vocabulary, with many words used incorrectly. Demonstrates problems with sentence patterns. - Contains basic vocabulary, with words that are predictable and common. Contains mostly simple sentences (although there may be an attempt at more varied sentence patterns). - Includes vocabulary to make explanations detailed and precise. Includes varied sentence patterns, including complex sentences. + Voice - Demonstrates language and tone that may be inappropriate to task and reader. - Demonstrates an attempt to adjust language and tone to task and reader. - Demonstrates effective adjustment of language and tone to task and reader. [rubric] [tasks] (Self), ({4-12}AI), ({9-12}Peer) [tasks] """), scope=Scope.settings )
class VideoFields(object): """Fields for `VideoModule` and `VideoDescriptor`.""" display_name = String(display_name="Display Name", help="Display name for this module.", default="Video", scope=Scope.settings) position = Integer(help="Current position in the video", scope=Scope.user_state, default=0) show_captions = Boolean( help="This controls whether or not captions are shown by default.", display_name="Show Captions", scope=Scope.settings, default=True) # TODO: This should be moved to Scope.content, but this will # require data migration to support the old video module. youtube_id_1_0 = String( help="This is the Youtube ID reference for the normal speed video.", display_name="Youtube ID", scope=Scope.settings, default="OEoXaMPEzfM") youtube_id_0_75 = String(help="The Youtube ID for the .75x speed video.", display_name="Youtube ID for .75x speed", scope=Scope.settings, default="") youtube_id_1_25 = String(help="The Youtube ID for the 1.25x speed video.", display_name="Youtube ID for 1.25x speed", scope=Scope.settings, default="") youtube_id_1_5 = String(help="The Youtube ID for the 1.5x speed video.", display_name="Youtube ID for 1.5x speed", scope=Scope.settings, default="") start_time = Float(help="Start time for the video.", display_name="Start Time", scope=Scope.settings, default=0.0) end_time = Float(help="End time for the video.", display_name="End Time", scope=Scope.settings, default=0.0) source = String( help= "The external URL to download the video. This appears as a link beneath the video.", display_name="Download Video", scope=Scope.settings, default="") html5_sources = List( help= "A list of filenames to be used with HTML5 video. The first supported filetype will be displayed.", display_name="Video Sources", scope=Scope.settings, default=[]) track = String( help= "The external URL to download the subtitle track. This appears as a link beneath the video.", display_name="Download Track", scope=Scope.settings, default="") sub = String( help="The name of the subtitle track (for non-Youtube videos).", display_name="HTML5 Subtitles", scope=Scope.settings, default="")
class CapaFields(object): """ Define the possible fields for a Capa problem """ display_name = String( display_name="Display Name", help= "This name appears in the horizontal navigation at the top of the page.", scope=Scope.settings, # it'd be nice to have a useful default but it screws up other things; so, # use display_name_with_default for those default="Blank Advanced Problem") attempts = Integer( help="Number of attempts taken by the student on this problem", default=0, scope=Scope.user_state) max_attempts = Integer( display_name="Maximum Attempts", help= ("Defines the number of times a student can try to answer this problem. " "If the value is not set, infinite attempts are allowed."), values={"min": 0}, scope=Scope.settings) due = Date(help="Date that this problem is due by", scope=Scope.settings) graceperiod = Timedelta( help= "Amount of time after the due date that submissions will be accepted", scope=Scope.settings) showanswer = String( display_name="Show Answer", help=("Defines when to show the answer to the problem. " "A default value can be set in Advanced Settings."), scope=Scope.settings, default="finished", values=[{ "display_name": "Always", "value": "always" }, { "display_name": "Answered", "value": "answered" }, { "display_name": "Attempted", "value": "attempted" }, { "display_name": "Closed", "value": "closed" }, { "display_name": "Finished", "value": "finished" }, { "display_name": "Past Due", "value": "past_due" }, { "display_name": "Never", "value": "never" }]) force_save_button = Boolean( help="Whether to force the save button to appear on the page", scope=Scope.settings, default=False) rerandomize = Randomization( display_name="Randomization", help= "Defines how often inputs are randomized when a student loads the problem. " "This setting only applies to problems that can have randomly generated numeric values. " "A default value can be set in Advanced Settings.", default="never", scope=Scope.settings, values=[{ "display_name": "Always", "value": "always" }, { "display_name": "On Reset", "value": "onreset" }, { "display_name": "Never", "value": "never" }, { "display_name": "Per Student", "value": "per_student" }]) data = String(help="XML data for the problem", scope=Scope.content, default="<problem></problem>") correct_map = Dict( help="Dictionary with the correctness of current student answers", scope=Scope.user_state, default={}) input_state = Dict( help="Dictionary for maintaining the state of inputtypes", scope=Scope.user_state) student_answers = Dict( help="Dictionary with the current student responses", scope=Scope.user_state) done = Boolean(help="Whether the student has answered the problem", scope=Scope.user_state) seed = Integer(help="Random seed for this student", scope=Scope.user_state) weight = Float( display_name="Problem Weight", help= ("Defines the number of points each problem is worth. " "If the value is not set, each response field in the problem is worth one point." ), values={ "min": 0, "step": .1 }, scope=Scope.settings) markdown = String(help="Markdown source of this module", default=None, scope=Scope.settings) source_code = String( help= "Source code for LaTeX and Word problems. This feature is not well-supported.", scope=Scope.settings)
class CombinedOpenEndedFields(object): display_name = String( display_name="Display Name", help= "This name appears in the horizontal navigation at the top of the page.", default="Open Ended Grading", scope=Scope.settings) current_task_number = Integer(help="Current task that the student is on.", default=0, scope=Scope.user_state) task_states = List( help="List of state dictionaries of each task within this module.", scope=Scope.user_state) state = String( help="Which step within the current task that the student is on.", default="initial", scope=Scope.user_state) student_attempts = Integer( help="Number of attempts taken by the student on this problem", default=0, scope=Scope.user_state) ready_to_reset = Boolean( help="If the problem is ready to be reset or not.", default=False, scope=Scope.user_state) attempts = Integer( display_name="Maximum Attempts", help="The number of times the student can try to answer this problem.", default=1, scope=Scope.settings, values={"min": 1}) is_graded = Boolean(display_name="Graded", help="Whether or not the problem is graded.", default=False, scope=Scope.settings) accept_file_upload = Boolean( display_name="Allow File Uploads", help="Whether or not the student can submit files as a response.", default=False, scope=Scope.settings) skip_spelling_checks = Boolean( display_name="Disable Quality Filter", help= "If False, the Quality Filter is enabled and submissions with poor spelling, short length, or poor grammar will not be peer reviewed.", default=False, scope=Scope.settings) due = Date(help="Date that this problem is due by", default=None, scope=Scope.settings) graceperiod = String( help= "Amount of time after the due date that submissions will be accepted", default=None, scope=Scope.settings) version = VersionInteger(help="Current version number", default=DEFAULT_VERSION, scope=Scope.settings) data = String(help="XML data for the problem", scope=Scope.content) weight = Float( display_name="Problem Weight", help= "Defines the number of points each problem is worth. If the value is not set, each problem is worth one point.", scope=Scope.settings, values={ "min": 0, "step": ".1" }) markdown = String(help="Markdown source of this module", scope=Scope.settings)