lti_passports=List(help="LTI tools passports as id:client_key:client_secret",scope=Scope.settings)
lti_passports=List(
display_name=_("LTI Passports"),
help=_("Enter the passports for course LTI tools in the following format: \"id\":\"client_key:client_secret\"."),
scope=Scope.settings
)
textbooks=TextbookList(help="List of pairs of (title, url) for textbooks used in this course",
default=[],scope=Scope.content)
...
...
@@ -171,7 +175,11 @@ class CourseFields(object):
default=datetime(2030,1,1,tzinfo=UTC()),
scope=Scope.settings)
end=Date(help="Date that this class ends",scope=Scope.settings)
advertised_start=String(help="Date that this course is advertised to start",scope=Scope.settings)
advertised_start=String(
display_name=_("Course Advertised Start Date"),
help=_("Enter the date you want to advertise as the course start date, if this date is different from the set start date. To advertise the set start date, enter null."),
scope=Scope.settings
)
grading_policy=Dict(help="Grading policy definition for this class",
default={"GRADER":[
{
...
...
@@ -206,26 +214,108 @@ class CourseFields(object):
"Pass":0.5
}},
scope=Scope.content)
show_calculator=Boolean(help="Whether to show the calculator in this course",default=False,scope=Scope.settings)
display_name=String(help="Display name for this module",default="Empty",display_name=_("Display Name"),scope=Scope.settings)
course_edit_method=String(help="Method with which this course is edited.",default="Studio",scope=Scope.settings)
show_chat=Boolean(help="Whether to show the chat widget in this course",default=False,scope=Scope.settings)
show_calculator=Boolean(
display_name=_("Show Calculator"),
help=_("Enter true or false. When true, students can see the calculator in the course."),
default=False,
scope=Scope.settings
)
display_name=String(
help=_("Enter the name of the course as it should appear in the edX.org course list."),
default="Empty",
display_name=_("Course Display Name"),
scope=Scope.settings
)
course_edit_method=String(
display_name=_("Course Editor"),
help=_("Enter the method by which this course is edited (\"XML\" or \"Studio\")."),
default="Studio",
scope=Scope.settings,
deprecated=True# Deprecated because someone would not edit this value within Studio.
)
show_chat=Boolean(
display_name=_("Show Chat Widget"),
help=_("Enter true or false. When true, students can see the chat widget in the course."),
default=False,
scope=Scope.settings
)
tabs=CourseTabList(help="List of tabs to enable in this course",scope=Scope.settings,default=[])
end_of_course_survey_url=String(help="Url for the end-of-course survey",scope=Scope.settings)
discussion_blackouts=List(help="List of pairs of start/end dates for discussion blackouts",scope=Scope.settings)
discussion_topics=Dict(help="Map of topics names to ids",scope=Scope.settings)
discussion_sort_alpha=Boolean(scope=Scope.settings,default=False,help="Sort forum categories and subcategories alphabetically.")
announcement=Date(help="Date this course is announced",scope=Scope.settings)
advanced_modules=List(help="Beta modules used in your course",scope=Scope.settings)
end_of_course_survey_url=String(
display_name=_("Course Survey URL"),
help=_("Enter the URL for the end-of-course survey. If your course does not have a survey, enter null."),
scope=Scope.settings
)
discussion_blackouts=List(
display_name="Discussion Blackout Dates",
help=_("Enter pairs of dates between which students cannot post to discussion forums, formatted as \"YYYY-MM-DD-YYYY-MM-DD\". To specify times as well as dates, format the pairs as \"YYYY-MM-DDTHH:MM-YYYY-MM-DDTHH:MM\" (be sure to include the \"T\" between the date and time)."),
scope=Scope.settings
)
discussion_topics=Dict(
display_name=_("Discussion Topic Mapping"),
help=_("Enter discussion categories in the following format: \"CategoryName\": {\"id\": \"i4x-InstitutionName-CourseNumber-course-CourseRun\"}. For example, one discussion category may be \"Lydian Mode\": {\"id\": \"i4x-UniversityX-MUS101-course-2014_T1\"}."),
help=_("Enter true or false. If true, discussion categories and subcategories are sorted alphabetically. If false, they are sorted chronologically.")
)
announcement=Date(
display_name=_("Course Announcement Date"),
help=_("Enter the date to announce your course."),
scope=Scope.settings
)
cohort_config=Dict(
display_name=_("Cohort Configuration"),
help=_("Cohorts are not currently supported by edX."),
scope=Scope.settings
)
is_new=Boolean(
display_name=_("Course Is New"),
help=_("Enter true or false. If true, the course appears in the list of new courses on edx.org, and a New! badge temporarily appears next to the course image."),
scope=Scope.settings
)
no_grade=Boolean(
display_name=_("Course Not Graded"),
help=_("Enter true or false. If true, the course will not be graded."),
default=False,
scope=Scope.settings
)
disable_progress_graph=Boolean(
display_name=_("Disable Progress Graph"),
help=_("Enter true or false. If true, students cannot view the progress graph."),
default=False,
scope=Scope.settings
)
pdf_textbooks=List(
display_name=_("PDF Textbooks"),
help=_("List of dictionaries containing pdf_textbook configuration"),scope=Scope.settings
)
html_textbooks=List(
display_name=_("HTML Textbooks"),
help=_("For HTML textbooks that appear as separate tabs in the courseware, enter the name of the tab (usually the name of the book) as well as the URLs and titles of all the chapters in the book."),
scope=Scope.settings
)
remote_gradebook=Dict(
display_name=_("Remote Gradebook"),
help=_("Enter the remote gradebook mapping. Only use this setting when REMOTE_GRADEBOOK_URL has been specified."),
help=_("Enter true or false. If true, students can create discussion posts that are anonymous to all users."),
scope=Scope.settings,default=True
)
allow_anonymous_to_peers=Boolean(
display_name=_("Allow Anonymous Discussion Posts to Peers"),
help=_("Enter true or false. If true, students can create discussion posts that are anonymous to other students. This setting does not make posts anonymous to course staff."),
scope=Scope.settings,default=False
)
advanced_modules=List(
display_name=_("Advanced Module List"),
help=_("Enter the names of the advanced components to use in your course."),
scope=Scope.settings
)
has_children=True
checklists=List(scope=Scope.settings,
default=[
...
...
@@ -342,22 +432,33 @@ class CourseFields(object):
"action_text":_("Edit Course Schedule & Details"),
help=_("Enter the heading that you want students to see above your course handouts on the Course Info page. Your course handouts appear in the right panel of the page."),
scope=Scope.settings,default='Course Handouts')
show_timezone=Boolean(
help="True if timezones should be shown on dates in the courseware. Deprecated in favor of due_date_display_format.",
scope=Scope.settings,default=True
)
due_date_display_format=String(
help="Format supported by strftime for displaying due dates. Takes precedence over show_timezone.",
display_name=_("Due Date Display Format"),
help=_("Enter the format due dates are displayed in. Due dates must be in MM-DD-YYYY, DD-MM-YYYY, YYYY-MM-DD, or YYYY-DD-MM format."),
scope=Scope.settings,default=None
)
enrollment_domain=String(help="External login method associated with user accounts allowed to register in course",
scope=Scope.settings)
certificates_show_before_end=Boolean(help="True if students may download certificates before course end",
scope=Scope.settings,
default=False)
enrollment_domain=String(
display_name=_("External Login Domain"),
help=_("Enter the external login method students can use for the course."),
scope=Scope.settings
)
certificates_show_before_end=Boolean(
display_name=_("Certificates Downloadable Before End"),
help=_("Enter true or false. If true, students can download certificates before the course ends, if they've met certificate requirements."),
scope=Scope.settings,
default=False
)
course_image=String(
help="Filename of the course image",
display_name=_("Course About Page Image"),
help=_("Edit the name of the course image file. You must upload this file on the Files & Uploads page. You can also set the course image on the Settings & Details page."),
scope=Scope.settings,
# Ensure that courses imported from XML keep their image
default="images_course_image.jpg"
...
...
@@ -365,12 +466,14 @@ class CourseFields(object):
## Course level Certificate Name overrides.
cert_name_short=String(
help="Sitewide name of completion statements given to students (short).",
help=_("Between quotation marks, enter the short name of the course to use on the certificate that students receive when they complete the course."),
display_name=_("Certificate Name (Short)"),
scope=Scope.settings,
default=""
)
cert_name_long=String(
help="Sitewide name of completion statements given to students (long).",
help=_("Between quotation marks, enter the long name of the course to use on the certificate that students receive when they complete the course."),
display_name=_("Certificate Name (Long)"),
scope=Scope.settings,
default=""
)
...
...
@@ -384,30 +487,55 @@ class CourseFields(object):
# way to add in course-specific styling. There needs to be a discussion
# about the right way to do this, but arjun will address this ASAP. Also
# note that the courseware template needs to change when this is removed.
css_class=String(help="DO NOT USE THIS",scope=Scope.settings,default="")
css_class=String(
display_name=_("CSS Class for Course Reruns"),
help=_("Allows courses to share the same css class across runs even if they have different numbers."),
scope=Scope.settings,default="",
deprecated=True
)
# TODO: This is a quick kludge to allow CS50 (and other courses) to
# specify their own discussion forums as external links by specifying a
# "discussion_link" in their policy JSON file. This should later get
# folded in with Syllabus, Course Info, and additional Custom tabs in a
# more sensible framework later.
discussion_link=String(help="DO NOT USE THIS",scope=Scope.settings)
discussion_link=String(
display_name=_("Discussion Forum External Link"),
help=_("Allows specification of an external link to replace discussion forums."),
scope=Scope.settings,
deprecated=True
)
# TODO: same as above, intended to let internal CS50 hide the progress tab
# until we get grade integration set up.
# Explicit comparison to True because we always want to return a bool.
hide_progress_tab=Boolean(help="DO NOT USE THIS",scope=Scope.settings)
hide_progress_tab=Boolean(
display_name=_("Hide Progress Tab"),
help=_("Allows hiding of the progress tab."),
scope=Scope.settings,
deprecated=True
)
display_organization=String(help="An optional display string for the course organization that will get rendered in the LMS",
help=_("Enter the course organization that you want to appear in the courseware. This setting overrides the organization that you entered when you created the course. To use the organization that you entered when you created the course, enter null."),
scope=Scope.settings
)
display_coursenumber=String(help="An optional display string for the course number that will get rendered in the LMS",
scope=Scope.settings)
display_coursenumber=String(
display_name=_("Course Number Display String"),
help=_("Enter the course number that you want to appear in the courseware. This setting overrides the course number that you entered when you created the course. To use the course number that you entered when you created the course, enter null."),
scope=Scope.settings
)
max_student_enrollments_allowed=Integer(help="Limit the number of students allowed to enroll in this course.",
scope=Scope.settings)
max_student_enrollments_allowed=Integer(
display_name=_("Course Maximum Student Enrollment"),
help=_("Enter the maximum number of students that can enroll in the course. To allow an unlimited number of students, enter null."),
scope=Scope.settings
)
allow_public_wiki_access=Boolean(help="Whether to allow an unenrolled user to view the Wiki",
allow_public_wiki_access=Boolean(display_name=_("Allow Public Wiki Access"),
help=_("Enter true or false. If true, edX users can view the course wiki even if they're not enrolled in the course."),
@@ -11,6 +11,9 @@ from xblock.runtime import KeyValueStore, KvsFieldData
fromxmodule.fieldsimportDate,Timedelta
# Make '_' a no-op so we can scrape strings
_=lambdatext:text
classUserPartitionList(List):
"""Special List class for listing UserPartitions"""
...
...
@@ -36,7 +39,8 @@ class InheritanceMixin(XBlockMixin):
scope=Scope.settings
)
due=Date(
help="Date that this problem is due by",
display_name=_("Due Date"),
help=_("Enter the default date by which problems are due."),
scope=Scope.settings,
)
extended_due=Date(
...
...
@@ -48,68 +52,93 @@ class InheritanceMixin(XBlockMixin):
scope=Scope.user_state,
)
course_edit_method=String(
help="Method with which this course is edited.",
default="Studio",scope=Scope.settings
display_name=_("Course Editor"),
help=_("Enter the method by which this course is edited (\"XML\" or \"Studio\")."),
default="Studio",
scope=Scope.settings,
deprecated=True# Deprecated because user would not change away from Studio within Studio.
)
giturl=String(
help="url root for course data git repository",
display_name=_("GIT URL"),
help=_("Enter the URL for the course data GIT repository."),
scope=Scope.settings,
deprecated=True# Deprecated because GIT workflow users do not use Studio.
)
xqa_key=String(
display_name=_("XQA Key"),
help=_("This setting is not currently supported."),scope=Scope.settings,
deprecated=True
)
annotation_storage_url=String(
help=_("Enter the secret string for annotation storage. The textannotation, videoannotation, and imageannotation advanced modules require this string."),
scope=Scope.settings,
default="http://your_annotation_storage.com",
display_name=_("URL for Annotation Storage")
)
annotation_token_secret=String(
help=_("Enter the location of the annotation storage server. The textannotation, videoannotation, and imageannotation advanced modules require this setting."),
scope=Scope.settings,
default="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
display_name=_("Secret Token String for Annotation")
)
xqa_key=String(help="DO NOT USE",scope=Scope.settings)
annotation_storage_url=String(help="Location of Annotation backend",scope=Scope.settings,default="http://your_annotation_storage.com",display_name="Url for Annotation Storage")
annotation_token_secret=String(help="Secret string for annotation storage",scope=Scope.settings,default="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",display_name="Secret Token String for Annotation")
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",
display_name=_("Show Answer"),
help=_("Specify when the Show Answer button appears for each problem. Valid values are \"always\", \"answered\", \"attempted\", \"closed\", \"finished\", \"past_due\", and \"never\"."),
scope=Scope.settings,
default="finished",
)
rerandomize=String(
help="When to rerandomize the problem",
display_name=_("Randomization"),
help=_("Specify how often variable values in a problem are randomized when a student loads the problem. Valid values are \"always\", \"onreset\", \"never\", and \"per_student\". This setting only applies to problems that have randomly generated numeric values."),
scope=Scope.settings,
default="never",
)
days_early_for_beta=Float(
help="Number of days early to show content to beta users",
display_name=_("Days Early for Beta Users"),
help=_("Enter the number of days before the start date that beta users can access the course."),
scope=Scope.settings,
default=None,
)
static_asset_path=String(
help="Path to use for static assets - overrides Studio c4x://",
display_name=_("Static Asset Path"),
help=_("Enter the path to use for files on the Files & Uploads page. This value overrides the Studio default, c4x://."),
scope=Scope.settings,
default='',
)
text_customization=Dict(
help="String customization substitutions for particular locations",
display_name=_("Text Customization"),
help=_("Enter string customization substitutions for particular locations."),
scope=Scope.settings,
)
use_latex_compiler=Boolean(
help="Enable LaTeX templates?",
display_name=_("Enable LaTeX Compiler"),
help=_("Enter true or false. If true, you can use the LaTeX templates for HTML components and advanced Problem components."),
default=False,
scope=Scope.settings
)
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."),
display_name=_("Maximum Attempts"),
help=_("Enter the maximum number of times a student can try to answer problems. This is a course-wide setting, but you can specify a different number when you create an individual problem. To allow unlimited attempts, enter null."),
values={"min":0},scope=Scope.settings
)
matlab_api_key=String(
display_name="Matlab API key",
help="Enter the API key provided by MathWorks for accessing the MATLAB Hosted Service. "
"This key is granted for exclusive use by this course for the specified duration. "
"Please do not share the API key with other courses and notify MathWorks immediately "
"if you believe the key is exposed or compromised. To obtain a key for your course, "
"or to report and issue, please contact moocsupport@mathworks.com",
display_name=_("Matlab API key"),
help=_("Enter the API key provided by MathWorks for accessing the MATLAB Hosted Service. "
"This key is granted for exclusive use in this course for the specified duration. "
"Do not share the API key with other courses. Notify MathWorks immediately "
"if you believe the key is exposed or compromised. To obtain a key for your course, "
"or to report an issue, please contact moocsupport@mathworks.com"),
scope=Scope.settings
)
# This is should be scoped to content, but since it's defined in the policy
# file, it is currently scoped to settings.
user_partitions=UserPartitionList(
help="The list of group configurations for partitioning students in content experiments.",
display_name=_("Experiment Group Configurations"),
help=_("Enter the configurations that govern how students are grouped for content experiments."),